您当前的位置: 首页 >  linux

韦东山

暂无认证

  • 0浏览

    0关注

    506博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Linux应用开发【第十一章】PWM编程应用开发

韦东山 发布时间:2021-12-13 15:00:45 ,浏览量:0

文章目录
  • 11 PWM编程应用开发
    • 11.1 PWM概述
      • 11.1.1 PWM的参数说明
    • 11.2 用户层查看PWM
    • 11.3 PWM的SYSFS使用
    • 11.4 PWM应用编程
      • 11.4.1 修改设备树
      • 11.4.2 修改配置文件
      • 11.4.3 添加驱动
      • 11.4.4 运行测试

11 PWM编程应用开发 11.1 PWM概述

​ PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

​ PWM信号把模拟信号转化为数字电路所需要的编码,现在基本是采用数字电路,因此在很多场合都采用PWM信号,我们经常见到的就是交流调光电路,也可以说是无级调速,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率,要不然会出现闪烁现象。除了在调光电路应用,还有在直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等都会有应用。

11.1.1 PWM的参数说明

https://www.kernel.org/doc/Documentation/pwm.txt period PWM信号的总周期(读/写)。 值以纳秒为单位,是活动和非活动的总和 PWM的时间。

duty_cycle(占空比) PWM信号的有效时间(读/写)。 值以纳秒为单位,且必须小于周期。 在NORMAL模式下,表示一个周期内高电平持续的时间 在INVERTED模式下,表示一个周期中低电平持续的时间

polarity 改变PWM信号的极性(读/写)。 写入此属性仅在PWM芯片支持更改时才有效 极性。只有PWM不能改变极性 启用。值是字符串“normal”或“inversed”。

enable 启用/禁用PWM信号(读/写)。

  • 0 - 禁用
  • 1 - 启用
11.2 用户层查看PWM

​ 如果在内核配置中启用了CONFIG_SYSFS,则会提供一个简单的sysfs接口来使用用户空间的PWM。它在/ sys / class / pwm /中公开。每个被探测的PWM控制器/芯片将被输出为pwmchipN,其中N是PWM芯片的基础。你在目录里面会发现:

 1 echo 0 > /sys/class/pwm/pwmchip0/export /*设置PWM4输出,调出pwm0目录下设备节点,用于以下配置 */
 2 echo 1000000 >/sys/class/pwm/pwmchip0/pwm0/period /*设置PWM4一个周期的持续时间,单位为ns,即1K Hz */
 3 echo 500000 >/sys/class/pwm/pwmchip0/pwm0/duty_cycle /*设置一个周期中的”ON”时间,单位为ns,即占空比=duty_cycle/period=50% */
 4 echo 1 >/sys/class/pwm/pwmchip0/pwm0/enable /*设置PWM4使能 */
11.3 PWM的SYSFS使用
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define dbmsg(fmt, args ...) printf("%s[%d]: "fmt"\n", __FUNCTION__, __LINE__,##args)

#define DUTY              "duty"
#define PERIOD            "1000000"
#define DUTYCYCLE         "500000"
#define LENGTH            100

int fd_period = 0,fd_duty = 0,fd_enable = 0,duty_m = 0;

int usage()
{
    printf("usage:\n");
    printf("./pwm-sysfs-test duty  : 0-->static; 1-->dynamic \n");   
    return 0;
}

int pwm_setup()
{
  int fd,ret;

  fd = open("/sys/class/pwm/pwmchip0/export", O_WRONLY);
  if(fd             
关注
打赏
1658827356
查看更多评论
0.0838s