RT-Thread中使用PWM——控制风扇

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周期和脉冲宽度
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值