嵌入式技术论坛
直播中

王超

7年用户 1304经验值
私信 关注
[经验]

RT-Thread系统的PWM驱动框架设计实现

PWM驱动框架
PWM(脉冲宽度调制)
简单的 PWM 主要两个参数:
频率
占空比
一般用在背光灯等要求不高的地方。
高级特性不太适合通用框架
同步模式
死区控制
RT-Thread的PWM实现
为省空间,所以的PWM通道合并为一个设备: RT_Device_Class_Miscellaneous
使用pos参数作为通道号
支持以纳秒为单位设置周期(频率)和占空比。
配置
struct rt_pwm_configuration
{
    rt_uint32_t period; /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
    rt_uint32_t pulse;  /* unit:ns (pulse<=period) */
};
之所以单位没有使用赫兹,是因为占空比尽可能不使用浮点数。 所以统一使用纳秒比较好。
write
rt_size_t rt_device_write(rt_device_t dev,
                          rt_off_t    pos,
                          const void *buffer,
                          rt_size_t   size);
使用通用的 rt_device_write 来配置PWM。 pos参数为通道编号,每次只能配置一个通道。 传入的size单位为字节,大小为 sizeof(struct rt_pwm_configuration)
read
rt_size_t rt_device_read (rt_device_t dev,
                          rt_off_t    pos,
                          void       *buffer,
                          rt_size_t   size);
使用通用的 rt_device_write 来获取当前的PWM配置。 pos参数为通道编号,每次只能获取一个通道。 传入的size单位为字节,大小为sizeof(struct rt_pwm_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));
一些更新:
1。 添加 control 接口,定义3条control命令。

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

2. 原来的write/read接口修改为仅配置 pulse (占空比)
相应的,在驱动实现中,write时需要先读取出原来的配置,然后更新pulse后再写入到设备中去。

原作者:aozima

更多回帖

发帖
×
20
完善资料,
赚取积分