在电子产品设计中,精确地控制直流风扇的转速是一个常见需求,特别是在散热管理和功耗优化中。本文将以 STM32G431 微控制器为例,讲解如何通过 PWM(脉宽调制)信号来实现风扇转速的精确控制。STM32G431 是一款基于 ARM Cortex-M4 内核的高性能 MCU,具有丰富的外设资源,适合用于实时控制和电机驱动等应用。
1. 硬件连接在实际连接中,风扇的 PWM 控制引脚需要与 STM32 的一个定时器输出通道相连,同时为风扇提供合适的电源。下面是一个典型的连接方法:
- STM32G431 的 TIM1_CH1 引脚连接到风扇的 PWM 输入引脚。
- 风扇电源通过稳压电路供电(例如 12V)。
- 地线需与 MCU 共地。
2. 配置思路实现风扇转速控制的关键是生成合适的 PWM 信号,控制步骤如下:
- 配置 STM32 的时钟,确保定时器运行在合适频率。
- 初始化 TIM1 定时器,将其设置为 PWM 模式。
- 设置 PWM 的占空比,根据占空比调整风扇转速。
- 编写代码实现风扇速度的动态调整。
3. 代码实现以下代码展示了如何使用 STM32CubeMX 生成初始化代码,并基于 HAL 库实现风扇的 PWM 控制。
#include "main.h"
// 定义 PWM 占空比变量
uint16_t pwmDutyCycle = 50; // 初始占空比为 50%
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
// TIM1 句柄定义
TIM_HandleTypeDef htim1;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
// 启动 TIM1 PWM 输出
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1) {
// 模拟调整 PWM 占空比
for (pwmDutyCycle = 0; pwmDutyCycle <= 100; pwmDutyCycle += 10) {
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwmDutyCycle);
HAL_Delay(500); // 每次调整后延迟 500ms
}
}
}
static void MX_TIM1_Init(void) {
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 80 - 1; // 80 MHz 主频分频到 1 MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 100 - 1; // PWM 频率为 10 kHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 50; // 初始占空比为 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8; // TIM1_CH1 对应的引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SystemClock_Config(void) {
// 配置时钟,具体配置根据需求调整
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 8;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
}
4. 总结通过上述代码,STM32G431 可以生成一个 PWM 信号,用于控制风扇的转速。代码中定时器的设置灵活,可根据实际需求调整频率和占空比范围。将 PWM 信号接入风扇的控制引脚,即可实现动态转速调整。
|