N32G452是国民技术推出的一款基于ARM Cortex-M4内核的高性能MCU,主频可达120MHz。它具备低功耗、丰富外设和安全功能,广泛应用于物联网和智能设备。本文将介绍如何基于N32G452设计一个简单的智能照明系统,通过按键、光敏传感器和PWM控制LED灯的亮度,实现自动化照明控制。
系统功能- 光线检测:通过光敏传感器实时检测环境亮度。
- 手动控制:按键用于切换LED灯的工作模式(自动/手动)。
- PWM调光:根据环境光强,自动调整LED灯亮度。
- 低功耗模式:长时间无操作时进入低功耗状态。
硬件设计- MCU:N32G452
- 光敏传感器:用于检测环境亮度
- LED灯:控制灯光亮度
- 按键:切换手动/自动模式
- 电源:5V USB供电
代码实现- #include "n32g45x.h"
- #include "stdio.h"
- void SystemClock_Config(void);
- void GPIO_Config(void);
- void ADC_Config(void);
- void TIM3_PWM_Config(void);
- void Enter_LowPower_Mode(void);
- volatile uint8_t mode = 0; // 0: 自动模式, 1: 手动模式
- volatile uint16_t adc_value = 0;
- int main(void) {
- HAL_Init();
- SystemClock_Config();
- GPIO_Config();
- ADC_Config();
- TIM3_PWM_Config();
- while (1) {
- // 检测按键状态切换模式
- if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
- mode = !mode; // 切换模式
- HAL_Delay(300); // 防抖
- }
- // 读取光敏传感器的ADC值
- HAL_ADC_Start(&hadc);
- HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);
- adc_value = HAL_ADC_GetValue(&hadc);
- if (mode == 0) { // 自动模式
- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, adc_value / 4); // PWM调光
- } else { // 手动模式
- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 512); // 固定亮度
- }
- HAL_Delay(100); // 避免频繁更新
- }
- }
- void SystemClock_Config(void) {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLM = 8;
- RCC_OscInitStruct.PLL.PLLN = 336;
- RCC_OscInitStruct.PLL.PLLP = 2;
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
- }
- void GPIO_Config(void) {
- __HAL_RCC_GPIOB_CLK_ENABLE();
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = GPIO_PIN_0;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- }
- void ADC_Config(void) {
- __HAL_RCC_ADC1_CLK_ENABLE();
- ADC_HandleTypeDef hadc = {0};
- hadc.Instance = ADC1;
- hadc.Init.ScanConvMode = DISABLE;
- hadc.Init.ContinuousConvMode = ENABLE;
- hadc.Init.DiscontinuousConvMode = DISABLE;
- hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- hadc.Init.NbrOfConversion = 1;
- HAL_ADC_Init(&hadc);
- }
- void TIM3_PWM_Config(void) {
- __HAL_RCC_TIM3_CLK_ENABLE();
- TIM_HandleTypeDef htim3 = {0};
- TIM_OC_InitTypeDef sConfigOC = {0};
- htim3.Instance = TIM3;
- htim3.Init.Prescaler = 84 - 1;
- htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim3.Init.Period = 1023;
- HAL_TIM_PWM_Init(&htim3);
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
- HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
- }
项目亮点- 自动化照明
使用光敏传感器动态控制LED灯亮度,避免浪费电能。
- 手动切换功能
用户可通过按键切换自动和手动模式,灵活应对不同需求。
- 低功耗设计
系统在长时间无操作时可进入低功耗模式,延长电池续航时间。
- 代码简洁
采用HAL库简化代码编写,易于维护和扩展。
总结基于国民技术N32G452 MCU的智能照明控制系统充分展示了MCU的强大功能和灵活性。通过自动化控制和手动切换相结合,系统可以适应多种使用场景,并且代码结构简洁,适合初学者和开发者参考。
|