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 IP (pwmprocessor0/ pwmprocessor4/ pwmprocessor8/ pwmprocessor12), 各IP控制4路讯号, 总共可控制16路讯号(PWM0不可控). 电路图上以 pwm0~pwm15表示
在Linux sysfs中, pwm0~pwm3的device node各自如下:
/sys/class/pwm/pwmprocessor0/pwm0~3
在Linux sysfs中, pwm4~pwm7的device node各自如下:
/sys/class/pwm/pwmprocessor:mark:4/pwm0~3
以此类推
10.3. 操作示例¶
10.3.1. PWM操作命令示例:¶
步骤1:
在控制面板使用echo命令,配置待操作的PWM编号, 此例為PWM1:
echo 1 > /sys/class/pwm/pwmprocessor0/export
步骤2:
设置PWM一个周期的持续时间,单位为ns:
echo 1000000 >/sys/class/pwm/pwmprocessor0/pwm1/period
步骤3:
设置一个周期中的”ON”时间,单位为ns,即占空比=duty_cycle/period=50% :
echo 500000 >/sys/class/pwm/pwmprocessor0/pwm1/duty_cycle
步骤4:
设置PWM使能
echo 1 >/sys/class/pwm/pwmprocessor0/pwm1/enable
10.3.2. 通过文件IO操作程序示例:¶
用户态GPIO读写操作程序示例:
步骤1: 配置待操作的PWM编号, 以PWM1為例:
fd = open("/sys/class/pwm/pwmprocessor0/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/pwmprocessor0/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/pwmprocessor0/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/pwmprocessor0/pwm1/enable", O_RDWR);
ret = write(fd_enable, "1", strlen("1"));
if(ret < 0)
{
dbmsg("enable pwm0 error\n");
return -1;
}