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;
}