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