rtthread studio与正点原子apollo[4]--PWM设备
前言
本文介绍RT-Thread中PWM设备的使用,由于PWM功能是由定时器提供,故放在定时器后介绍 。
一、PWM简介
PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。
PWM产生的原理:设置定时器的计数模式,上图为向上计数,确定计数周期值ARR和比较值CCR,当定时器开始工作时,计数值会与CCR比较,当二者值相等时,PWM输出端口的电平会发生跳变;当计数值增加到ARR时,PWM输出端口电平会再次跳变,同时计数值归零,循环往复,在PWM输出端口就会输出周期性的方波。
PWM波有一个重要的概念:占空比,脉冲宽度(高电平或低电平,有效信号)与周期值的比值。占空比的取值为0%~100%,占空比越小,输出有效信号越小,占空比越大,输出有效信号越大。
如下图,假设PWM输出端口连接LED灯,三种情况下,占空比越大,输出的平均电压越高,LED灯的亮度也就越高。
二、RT-Thread访问PWM设备
1.API函数介绍
PWM设备的相关API和使用方法参考官方文档
访问PWM设备
使用步骤主要分三步:
(1)查找PWM设备
#define PWM_DEV_NAME "pwm3" /* PWM 设备名称 */
struct rt_device_pwm *pwm_dev; /* PWM 设备句柄 */
/* 查找设备 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
(2)设置PWM周期和脉冲宽度
rt_uint32_t period, pulse;
period = 500000; /* 周期为0.5ms,单位为纳秒ns */
pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
(3)使能PWM功能
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
当需要停止PWM功能时,需要关闭PWM功能,可以降低系统功耗
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
2.PWM功能实用举例
(1)RT-Thread studio中创建工程,并启动定时器和PWM功能
由于PWM功能是定时器实现的,因此需要启动PWM功能的同时启动定时器功能
(2)打开board.h文件,按提示进行配置
第一步:按(1)配置
第二步:按(2)配置
第三步:实用stm32cubemx产生初始化代码,并把定时器和PWM的初始化代码拷贝到board.c中
第四步:打开stm32f7xx_hal_config.h文件,启动相关硬件功能
至此,工程需要配置的内容基本完成。
(3)以PWM输出控制LED为例,编写功能代码
完整的功能代码如下
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define PWM_DEV_NAME "pwm3"//定义PWM设备名称
#define PWM_DEV_CHANNEL 3//定义PWM的输出通道
struct rt_device_pwm *pwm_dev;//定义PWM设备句柄
rt_uint32_t period=500000;//PWM周期值,单位ms
rt_uint8_t dir=1;
rt_uint32_t pulse=0;//脉宽初值
static int pwm_sample(void)
{
pwm_dev=(struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);//查找PWM设备
if(pwm_dev==RT_NULL)
{
rt_kprintf("PWM sample run failed! can't find s% device!\n",PWM_DEV_NAME);
return RT_ERROR;
}
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);//设置PWM参数
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);//启动PWM功能
return RT_EOK;
}
int main(void)
{
pwm_sample();
while (1)
{
rt_thread_mdelay(50);
if(dir)
{
pulse+=5000;
}
else
{
pulse-=5000;
}
if(pulse>=period)
{
dir=0;
}
if(pulse==0)
{
dir=1;
}
rt_pwm_set(pwm_dev,PWM_DEV_CHANNEL,period,pulse);//更新PWM参数
}
return RT_EOK;
}
需要注意两个文件,确保定时器和PWM的配置
pwm_config.h文件中,根据实际情况配置使用的定时器,PWM名称及通道,如果文件没有相应代码,可按照文件仿写。
tim_config.h中配置定时器,如果没有相应代码,可按照文件内容仿写。
总结
本文介绍了RT-Thread中PWM设备的使用方法及注意事项。