PWM

给RT-Thread添加PWM驱动框架

发布于 2018-05-07 22:22:16


# PWM驱动框架

PWM(脉冲宽度调制)

简单的 PWM 主要两个参数:

频率
占空比

一般用在背光灯等要求不高的地方。

高级特性不太适合通用框架
同步模式
死区控制

# RT-Thread的PWM实现

1. 为省空间,所以的PWM通道合并为一个设备: RTDeviceClassMiscellaneous
2. 使用pos参数作为通道号
3. 支持以纳秒为单位设置周期(频率)和占空比。

## 配置

`
struct rt
pwmconfiguration
{
rt
uint32t period; / unit:ns 1ns~4.29s:1Ghz~0.23hz /
rt
uint32t pulse; / unit:ns (pulse<=period) /
};
<br/><br/>之所以单位没有使用赫兹,是因为占空比尽可能不使用浮点数。<br/>所以统一使用纳秒比较好。<br/><br/>## write<br/><br/>
rt
sizet rtdevicewrite(rtdevicet dev,
rt
offt pos,
const void *buffer,
rt
sizet size);
`

使用通用的 rt
devicewrite 来配置PWM。
pos参数为通道编号,每次只能配置一个通道。
传入的size单位为字节,大小为 sizeof(struct rt
pwmconfiguration)

## read

`
rt
sizet rtdeviceread (rtdevicet dev,
rt
offt pos,
void *buffer,
rt
sizet size);
`

使用通用的 rt
devicewrite 来获取当前的PWM配置。
pos参数为通道编号,每次只能获取一个通道。
传入的size单位为字节,大小为 sizeof(struct rt
pwm_configuration)



查看更多

关注者
0
被浏览
5.7k
12 个回答
aozima
aozima 2018-05-07
拒绝白嫖,拒绝键盘侠!
    本帖最后由 aozima 于 2018-5-7 22:57 编辑


驱动示例与测试

dev = rt_device_find("pwm");
rt_device_open(dev, RT_DEVICE_FLAG_RDWR);

configuration.period = 1000*1000; /* 1ms ==> 1Khz */
configuration.pulse = configuration.period / 2; /* 50% duty */
rt_device_write(dev, channel, &configuration, sizeof(struct rt_pwm_configuration));


下载附件[driver_pwm_example.zip]



bernard
bernard 2018-05-09
这个是否也包含一份contrl接口,上层应用可以更容易理解,或使用?
bernard
bernard 2018-05-09
另外也需要一份规范的底层驱动接口。
aozima
aozima 2018-06-06
拒绝白嫖,拒绝键盘侠!
    本帖最后由 aozima 于 2018-6-6 10:59 编辑


一些更新:

1。 添加 control 接口,定义3条control命令。


<br/>#define PWM_CMD_ENABLE (128 + 0) //使能PWM<br/>#define PWM_CMD_SET (128 + 1) //设置PWM参数<br/>#define PWM_CMD_GET (128 + 2) //获取PWM参数<br/>



2. 原来的write/read接口修改为仅配置 pulse (占空比)
相应的,在驱动实现中,write时需要先读取出原来的配置,然后更新pulse后再写入到设备中去。
Hubert_Xie
Hubert_Xie 2018-06-06
aozima 发表于 2018-6-6 10:57
一些更新:

1。 添加 control 接口,定义3条control命令。


更新后的源码在哪里下载呢?
aozima
aozima 2018-06-06
拒绝白嫖,拒绝键盘侠!
Hubert_Xie 发表于 2018-6-6 14:30
更新后的源码在哪里下载呢?


这是更新后的代码,也可以在 https://github.com/aozima/rt-thread/tree/adc_pwm_dev 这个分支中获取。

正在整理中,欢迎拍砖。


下载附件[driver_pwm_example_0606.zip]


Hubert_Xie
Hubert_Xie 2018-06-07
aozima 发表于 2018-6-6 14:48
这是更新后的代码,也可以在 https://github.com/aozima/rt-thread/tree/adc_pwm_dev 这个分支中获取。

...


这个框架为什么不合并到主分支呢?
aozima
aozima 2018-06-07
拒绝白嫖,拒绝键盘侠!
Hubert_Xie 发表于 2018-6-7 09:37
这个框架为什么不合并到主分支呢?


这不正在发出来供review一下嘛,没太大问题就去发PR。
所以敬请吐槽!
Kevin_EE
Kevin_EE 2018-06-09
刚接触RTT PWM 请问这个PWM的输出端口是哪些,比如要把PWM通道对应到IO口上,需要怎么设置呢
rt_gouzi
rt_gouzi 2019-04-30
Kevin_EE 发表于 2018-6-9 15:08
刚接触RTT PWM 请问这个PWM的输出端口是哪些,比如要把PWM通道对应到IO口上,需要怎么设置呢 ...


在PWM的驱动文件中可以配置引脚
rt_gouzi
rt_gouzi 2019-04-30
Kevin_EE 发表于 2018-6-9 15:08
刚接触RTT PWM 请问这个PWM的输出端口是哪些,比如要把PWM通道对应到IO口上,需要怎么设置呢 ...


在PWM的驱动文件中可以配置引脚
Tonny
Tonny 2019-06-06
你好,我看了下这份驱动是不是不能设置PWM波的起始高低电平?不知道是不是我没看懂。如果不能设置的话,当初是有什么考量,所以没有实现这一功能呢?

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览