RTTHREAD STUDIO PWM 配置

RTTHREAD STUDIO PWM 配置

PWM 设备
PWM 简介
PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。

RTTHREAD STUDIO PWM 配置_第1张图片
上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比如低电平。当计数值达到最大值是,计数器从0开始重新计数,又回到最初的电平状态。高电平持续时间(脉冲宽度)和周期时间的比值就是占空比,范围为0~100%。上图高电平的持续时间刚好是周期时间的一半,所以占空比为50%。

一个比较常用的pwm控制情景就是用来调节灯或者屏幕的亮度,根据占空比的不同,就可以完成亮度的调节。PWM调节亮度并不是持续发光的,而是在不停地点亮、熄灭屏幕。当亮、灭交替够快时,肉眼就会认为一直在亮。在亮、灭的过程中,灭的状态持续时间越长,屏幕给肉眼的观感就是亮度越低。亮的时间越长,灭的时间就相应减少,屏幕就会变亮。

配置步骤

1.开启pwm驱动配置
RTTHREAD STUDIO PWM 配置_第2张图片
2.在配置文件board.h里开启pwm设备及定义通道
RTTHREAD STUDIO PWM 配置_第3张图片
3.如果使用的是定时器TIM1,则需要在pwm_config.h里添加定义PWM1_CONFIG定义,默认不带PWM1_CONFIG的定义,其他的自带有配置的则不需要此步骤
将以下代码复制进pwm_config.h里

#ifdef BSP_USING_PWM1
#ifndef PWM1_CONFIG
#define PWM1_CONFIG                             \
    {                                           \
       .tim_handle.Instance     = TIM1,         \
       .name                    = "pwm1",       \
       .channel                 = 0            \
    }
#endif /* PWM1_CONFIG */
#endif /* BSP_USING_PWM1 */

RTTHREAD STUDIO PWM 配置_第4张图片
4.实现两个方法void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)和void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)便可以测试了,实现代码和测试代码如下

/*
 * 程序清单:这是一个 PWM 设备使用例程
 * 例程导出了 pwm_led_sample 命令到控制终端
 * 命令调用格式:pwm_led_sample
 * 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
*/

#include 
#include 
#include 
#include 
 #define PWM_DEV_NAME        "pwm1"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL         1 /* PWM设备输出通道 */
struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */



/******************实现下面两个方法************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
{
    /*根据不同的定时器使能相应的时钟*/
  if(htim_pwm->Instance==TIM1)
  {
    __HAL_RCC_TIM1_CLK_ENABLE();
  }

}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
    /**TIM1 GPIO Configuration          根据引脚配置*/
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim->Instance==TIM1)
  {
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}
/******************************************************************************/
static int pwm_led_sample(int argc, char *argv[])
{
    rt_uint32_t period, pulse, dir;

    period = 500000;    /* 周期为0.5ms,单位为纳秒ns */
    dir = 1;            /* PWM脉冲宽度值的增减方向 */
    pulse = 0;          /* 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;
    }

    /* 设置PWM周期和脉冲宽度默认值 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
    /* 使能设备 */
    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

    while (1)
    {
        rt_thread_mdelay(50);
        if (dir)
        {
            pulse += 5000;      /* 从0值开始每次增加5000ns */
        }
        else
        {
            pulse -= 5000;      /* 从最大值开始每次减少5000ns */
        }
        if (pulse >= period)
        {
            dir = 0;
        }
        if (0 == pulse)
        {
            dir = 1;
        }
        /* 设置PWM周期和脉冲宽度 */
        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
    }
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);


接下来就可以测试了
在这里插入图片描述
会看到led灯亮度像呼吸一样变化。
您觉得有用可以赏我三瓜俩枣,有问题可以备注。我有空会回您!
RTTHREAD STUDIO PWM 配置_第5张图片

你可能感兴趣的:(单片机,stm32,time)