PWM 使用¶
AIO-1688JD4 开发板上对外只引出一个 PWM(FAN), 但 Core-1688JD4 的金手指引出了多路 PWM, 在控制台下运行 PMW 读写命令或者自行在内核态或者用户态编写 PWM 读写程序, 就可以对 PWM 进行输入输出操作;
PWM 操作在定频时钟 100MHz,共有 20 路,每路可单独控制;
BM1688共有 5 个 PWM IP (pwmchip0/ pwmchip4/ pwmchip8/ pwmchip12/ pwmchip16), 各 IP 控制 4 路讯号, 总共可控制 20 路讯号;
在 Linux sysfs 中, pwm0~pwm3 的 device node 各自如下:
/sys/class/pwm/pwmchip0/pwm0~3
在 Linux sysfs 中, pwm4~pwm7 的 device node 各自如下:
/sys/class/pwm/pwmchip4/pwm0~3
以风扇的设备树配置为例:
&fan0 {
compatible = "pwm-fan";
#cooling-cells = <2>;
pwms = <&pwm2 3 1000000 0>;
cooling-levels = <255 170 100 1>; // max 1
};
其中的 pwms = <&pwm2 3 1000000 0>;
表示使用 PIN 脚中的 PWM11
, 因为 pwm2
为第三组,3
表示第四个通道,由此得出:3 x 4 = 12(0~11)
以此类推
操作示例¶
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
通过文件 IO 操作程序示例:¶
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;
}