# PWM驱动框架
PWM(脉冲宽度调制)
简单的 PWM 主要两个参数:
频率
占空比
一般用在背光灯等要求不高的地方。
高级特性不太适合通用框架
同步模式
死区控制
# RT-Thread的PWM实现
1. 为省空间,所以的PWM通道合并为一个设备: RTDeviceClassMiscellaneous
2. 使用pos参数作为通道号
3. 支持以纳秒为单位设置周期(频率)和占空比。
## 配置
`
struct rtpwmconfiguration
{
rtuint32t period; / unit:ns 1ns~4.29s:1Ghz~0.23hz /
rtuint32t pulse; / unit:ns (pulse<=period) /
};<br/><br/>之所以单位没有使用赫兹,是因为占空比尽可能不使用浮点数。<br/>所以统一使用纳秒比较好。<br/><br/>## write<br/><br/>
rtsizet rtdevicewrite(rtdevicet dev,
rtofft pos,
const void *buffer,
rtsizet size);
`
使用通用的 rtdevicewrite 来配置PWM。
pos参数为通道编号,每次只能配置一个通道。
传入的size单位为字节,大小为 sizeof(struct rtpwmconfiguration)
## read
`
rtsizet rtdeviceread (rtdevicet dev,
rtofft pos,
void *buffer,
rtsizet size);
`
使用通用的 rtdevicewrite 来获取当前的PWM配置。
pos参数为通道编号,每次只能获取一个通道。
传入的size单位为字节,大小为 sizeof(struct rtpwm_configuration)
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));
<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/>
Hubert_Xie 发表于 2018-6-6 14:30
更新后的源码在哪里下载呢?
aozima 发表于 2018-6-6 14:48
这是更新后的代码,也可以在 https://github.com/aozima/rt-thread/tree/adc_pwm_dev 这个分支中获取。
...