10. PWM操作指南¶
10.1. PWM的操作准备如下:¶
使用SDK发布的kernel。
10.2. 操作过程¶
插入模块:cv180x则Insmod cv180x_pwm.ko,cv181x则insmod cv181x_pwm.ko。
在控制台下运行PMW读写命令或者自行在内核态或者用户态编写PWM读写程序,就可以对PWM进行输入输出操作。
PWM 操作在定频时钟100MHz,共有16路,每路可单独控制 (PWM0不可控)。
Cv180X/CV181X共有4个PWM Chip (pwmchip0/ pwmchip4/ pwmchip8/ pwmchip12), 每个Chip控制4路PWM讯号, 总共可控制16路PWM讯号(PWM0不可控). 电路图上以 pwm0~pwm15表示
- 在Linux sysfs中, pwm0~pwm15的device node各自如下:
pwm0~pwm3→/sys/class/pwm/pwmchip0/pwm0~3pwm4~pwm7→/sys/class/pwm/pwmchip4/pwm0~3pwm8~pwm11→/sys/class/pwm/pwmchip8/pwm0~3pwm12~pwm15→/sys/class/pwm/pwmchip12/pwm0~3
pwmchip0 的 pwm0~3 对应电路图上的pwm0~3
pwmchip4 的 pwm0~3 对应电路图上的pwm4~7
pwmchip8 的 pwm0~3 对应电路图上的pwm8~11
pwmchip12 的 pwm0~3 对应电路图上的pwm12~15
- p.s. pwmchipX中的子节点pwm0~3在 echo {0~3} > /sys/class/pwm/pwmchipX/export 后才会出现;
如何得知当前操控的pwm对应电路图编号: pwmchipID + pwmID
例:操作pwmchip12/pwm1 节点(chipID=12, pwmID=1; 12+1=13),就是操控电路图中的pwm13。
10.3. 操作示例¶
10.3.1. PWM操作命令示例:¶
步骤1:
在控制面板使用echo命令,配置待操作的PWM编号, 此例為PWM1:
echo 1 > /sys/class/pwm/pwmchip0/export
步骤2:
设置PWM一个周期的持续时间,单位为ns:
echo 1000000 >/sys/class/pwm/pwmchip0/pwm1/period
步骤3:
设置一个周期中的”ON”时间,单位为ns,即占空比=duty_cycle/period=50% :
echo 500000 >/sys/class/pwm/pwmchip0/pwm1/duty_cycle
步骤4:
设置PWM使能
echo 1 >/sys/class/pwm/pwmchip0/pwm1/enable
10.3.2. 通过文件IO操作程序示例:¶
用户态GPIO读写操作程序示例:
步骤1: 配置待操作的PWM编号, 以PWM1為例:
fd = open("/sys/class/pwm/pwmchip0/export", O_WRONLY);
if(fd < 0)
{
dbmsg("open export error\n");
return -1;
}
ret = write(fd, "1", strlen("0"));
if(ret < 0)
{
dbmsg("Export pwm1 error\n");
return -1;
}
步骤2: 设置PWM一个周期的持续时间,单位为ns:
fd_period = open("/sys/class/pwm/pwmchip0/pwm1/period", O_RDWR);
ret = write(fd_period, "1000000”,strlen("1000000”));
if(ret < 0)
{
dbmsg("Set period error\n");
return -1;
}
步骤3: 设置一个周期中的”ON”时间,单位为ns: (此例占空比为50%)
fd_duty = open("/sys/class/pwm/pwmchip0/pwm1/duty_cycle", O_RDWR);
ret = write(fd_duty, "500000", strlen("500000"));
if(ret < 0)
{
dbmsg("Set period error\n");
return -1;
}
步骤4: 设置PWM使能
fd_enable = open("/sys/class/pwm/pwmchip0/pwm1/enable", O_RDWR);
ret = write(fd_enable, "1", strlen("1"));
if(ret < 0)
{
dbmsg("enable pwm0 error\n");
return -1;
}