[N32G45x] 基于国民技术N32G452的智能照明控制系统设计

[复制链接]
 楼主| 万图 发表于 2024-10-15 08:36 | 显示全部楼层 |阅读模式
N32G452是国民技术推出的一款基于ARM Cortex-M4内核的高性能MCU,主频可达120MHz。它具备低功耗、丰富外设和安全功能,广泛应用于物联网和智能设备。本文将介绍如何基于N32G452设计一个简单的智能照明系统,通过按键、光敏传感器和PWM控制LED灯的亮度,实现自动化照明控制。

系统功能
  • 光线检测:通过光敏传感器实时检测环境亮度。
  • 手动控制:按键用于切换LED灯的工作模式(自动/手动)。
  • PWM调光:根据环境光强,自动调整LED灯亮度。
  • 低功耗模式:长时间无操作时进入低功耗状态。

硬件设计
  • MCU:N32G452
  • 光敏传感器:用于检测环境亮度
  • LED灯:控制灯光亮度
  • 按键:切换手动/自动模式
  • 电源:5V USB供电

代码实现
  1. #include "n32g45x.h"
  2. #include "stdio.h"

  3. void SystemClock_Config(void);
  4. void GPIO_Config(void);
  5. void ADC_Config(void);
  6. void TIM3_PWM_Config(void);
  7. void Enter_LowPower_Mode(void);

  8. volatile uint8_t mode = 0;  // 0: 自动模式, 1: 手动模式
  9. volatile uint16_t adc_value = 0;

  10. int main(void) {
  11.     HAL_Init();
  12.     SystemClock_Config();
  13.     GPIO_Config();
  14.     ADC_Config();
  15.     TIM3_PWM_Config();

  16.     while (1) {
  17.         // 检测按键状态切换模式
  18.         if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
  19.             mode = !mode;  // 切换模式
  20.             HAL_Delay(300);  // 防抖
  21.         }

  22.         // 读取光敏传感器的ADC值
  23.         HAL_ADC_Start(&hadc);
  24.         HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);
  25.         adc_value = HAL_ADC_GetValue(&hadc);

  26.         if (mode == 0) {  // 自动模式
  27.             __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, adc_value / 4);  // PWM调光
  28.         } else {  // 手动模式
  29.             __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 512);  // 固定亮度
  30.         }

  31.         HAL_Delay(100);  // 避免频繁更新
  32.     }
  33. }

  34. void SystemClock_Config(void) {
  35.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  36.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  37.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  38.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  39.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  40.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  41.     RCC_OscInitStruct.PLL.PLLM = 8;
  42.     RCC_OscInitStruct.PLL.PLLN = 336;
  43.     RCC_OscInitStruct.PLL.PLLP = 2;
  44.     HAL_RCC_OscConfig(&RCC_OscInitStruct);

  45.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1;
  46.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  47.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  48.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  49.     HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  50. }

  51. void GPIO_Config(void) {
  52.     __HAL_RCC_GPIOB_CLK_ENABLE();
  53.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  54.     GPIO_InitStruct.Pin = GPIO_PIN_0;
  55.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  56.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  57.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  58. }

  59. void ADC_Config(void) {
  60.     __HAL_RCC_ADC1_CLK_ENABLE();
  61.     ADC_HandleTypeDef hadc = {0};
  62.     hadc.Instance = ADC1;
  63.     hadc.Init.ScanConvMode = DISABLE;
  64.     hadc.Init.ContinuousConvMode = ENABLE;
  65.     hadc.Init.DiscontinuousConvMode = DISABLE;
  66.     hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  67.     hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  68.     hadc.Init.NbrOfConversion = 1;
  69.     HAL_ADC_Init(&hadc);
  70. }

  71. void TIM3_PWM_Config(void) {
  72.     __HAL_RCC_TIM3_CLK_ENABLE();
  73.     TIM_HandleTypeDef htim3 = {0};
  74.     TIM_OC_InitTypeDef sConfigOC = {0};

  75.     htim3.Instance = TIM3;
  76.     htim3.Init.Prescaler = 84 - 1;
  77.     htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  78.     htim3.Init.Period = 1023;
  79.     HAL_TIM_PWM_Init(&htim3);

  80.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  81.     sConfigOC.Pulse = 0;
  82.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  83.     HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

  84.     HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  85. }
项目亮点
  • 自动化照明
    使用光敏传感器动态控制LED灯亮度,避免浪费电能。
  • 手动切换功能
    用户可通过按键切换自动和手动模式,灵活应对不同需求。
  • 低功耗设计
    系统在长时间无操作时可进入低功耗模式,延长电池续航时间。
  • 代码简洁
    采用HAL库简化代码编写,易于维护和扩展。


总结基于国民技术N32G452 MCU的智能照明控制系统充分展示了MCU的强大功能和灵活性。通过自动化控制和手动切换相结合,系统可以适应多种使用场景,并且代码结构简洁,适合初学者和开发者参考。

公羊子丹 发表于 2024-10-16 07:46 来自手机 | 显示全部楼层
这个系统不错,可以装在卧室里当夜灯用。
周半梅 发表于 2024-10-16 07:46 来自手机 | 显示全部楼层
用N32G452做控制确实很合适,性能和性价比都挺好。
帛灿灿 发表于 2024-10-16 07:46 来自手机 | 显示全部楼层
看完后想把它做成书架灯,用起来肯定方便。
童雨竹 发表于 2024-10-16 07:46 来自手机 | 显示全部楼层
能加个红外传感器吗?晚上有人经过自动亮灯就更智能了。
Wordsworth 发表于 2024-10-16 07:47 来自手机 | 显示全部楼层
我觉得低功耗模式这一点很重要,适合电池供电的设备。
Pulitzer 发表于 2024-10-16 07:47 来自手机 | 显示全部楼层
我有个类似的项目,但用的是N32G4系列,感觉可以优化下代码。
Bblythe 发表于 2024-10-16 07:47 来自手机 | 显示全部楼层
PWM调光功能太实用了,LED灯亮度控制很平滑。
Uriah 发表于 2024-10-16 07:47 来自手机 | 显示全部楼层
有没有试过用蓝牙控制?远程开关灯可能更方便。
Clyde011 发表于 2024-10-16 07:48 来自手机 | 显示全部楼层
以后我也试试HAL库,之前一直在用裸机代码开发。
suncat0504 发表于 2024-10-29 15:13 | 显示全部楼层
LED灯使用PWM调光,平滑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

152

主题

5795

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部