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的强大功能和灵活性。通过自动化控制和手动切换相结合,系统可以适应多种使用场景,并且代码结构简洁,适合初学者和开发者参考。
|