RT-Thread中使用PWM——控制风扇
1. 配置PWM设备驱动和宏定义
在RT-Thread Setting 配置界面中开启PWM和HWTIMER
配置完成后在rtconfig.h
中确认设备驱动宏定义。
在drivers目录下stm32f4xx_hal_conf_bak.h
(名字可能不一样)中查看HAL_TIM_MODULE_ENABLED 和 HAL_PWR_MODULE_ENABLED是否已经打开,如果没有就手动打开
在board.h
增加 #define BSP_USING_PWM4
和 #define BSP_USING_PWM4_CH1
宏定义
在board.h
增加#define BSP_USING_TIM4
宏定义
2. 使用Cube MX生成TIM和PWM驱动代码
用的是PB6
在Cube MX文件夹的main.c
中复制void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
、void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
、void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
三个函数到drv_pwm.c
中
注意要注释掉原有的extern void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
!!!
3. 线程测试
线程入口函数如下:
/* pwm风扇控制线程入口函数 */
static void pwm_fan_thread_entry(void *parameter)
{
rt_uint32_t period, pulse, dir;
period = 40000; // 周期为0.04ms,单位为纳秒ns 0.04ms周期对应频率 25kHZ
dir = 1; // PWM脉冲宽度值的增减方向
pulse = 4000; // PWM脉冲宽度值,单位为纳秒ns 占空比
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); // 查找设备
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
rt_kprintf("pwm sample run ! find %s device!\n", PWM_DEV_NAME);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); // 设置PWM周期和脉冲宽度默认值
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); // 使能设备
/* 控制占空比进行调速 */
while (1)
{
rt_thread_mdelay(50);
if (dir)
{
pulse += 0; // 从0值开始每次增加??ns 代码上为0,即 不调速
}
else
{
pulse -= 0; // 从最大值开始每次减少??ns 代码上为0,即 不调速
}
if (pulse >= period)
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); // 设置PWM周期和脉冲宽度
}
}