本帖最后由 qiao--- 于 2024-1-29 02:03 编辑
前言:
本次测评的是测评板子的PWM输出功能。有兴趣的可以结合我以前另外一个Linux板卡的测评一起来看,大家应该可以找到些相同之处。
我之前两期Linux板卡的PWM测评:
【STM32MP135F-DK】3-舵机驱动与pwm脉冲宽度调制功能测试 https://bbs.eeworld.com.cn/thread-1265432-1-1.html
【STM32MP135F-DK】4-舵机应用代码编写分享 https://bbs.eeworld.com.cn/thread-1266084-1-1.html
测评Luckfox的PWM功能,我们分为以下几个步骤
- 检查系统是否有可用的pwm节点。
- 如果有查看对应的引脚,如果没有修改设备树
- 编写舵机控制代码
- 查看现象和波形图
1.检查系统是否有可用的pwm节点
我们到l/sys/class/pwm目录下看看是否有支持的PWM通道。
可以看到是有4个pwm节点是可用的。
但是虽然说有4个节点可用,但是我们并不知道这4个节点中的pwm通道的引脚都是对应对的什么那我们自然也无法用引脚来控制舵机。所以接下来如论如何还是需要看看设备树,因为设备树可以详细的记录这些信息。如果这里没有可用的节点更要看设备树,因为我们需要修改设备树来获取可用的pwm节点。
2.查看设备树/修改设备树
我们打开虚拟机,来到我们之前拉取的SDK。设备树文件在我们之前拉取SDK目录下的luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts下面。我们找到该板子的设备树文件rv1106g-luckfox-pico-pro-max.dts。我们找到记录着PWM信息的节点。
可以看到这些都记录着PWM节点信息,但是被打开的只有PWM5、PWM6、PWM10、PWM11。而这些刚好对应着我们系统中的pwmchip5、pwmchip6、pwmchip10、pwmchip11。
我用PWM5(pwmchip5)举例子,比如我想用这个节点,该怎么来找通道的引脚呢。我们看到PWM5节点下面有一个pinctrl-0,这个是描述设备的电气属性,一般是有引脚,引脚的上下拉等等。
我们看到它引用了一个节点pwm5m1_pins,这中pinctrl节点一般在pinctrl.dtsi文件下面,我们找到rv1106-pinctrl.dtsi文件下面找到这个节点,如下图:
可以看到我们需要用的引脚为PB0。如果我们要把这个pwm通道改为其他的通道,我们直接引用pinctrl.dtsi文件下PWM5的其他节点,比如我用pwm5m0_pins节点。如下图
我们光改这里还不行,我们还需要将其他引用这个信息的节点注释掉才行,然后把它编译替换掉原来的设备树。这个过程我之前的测评讲过,大家可以看看我前言中提到的两个文章。
找到对应的引脚后我们先简单的测试一下是不是能够正常的输出波形。我们进入系统输入下面的代码看看波形对不对
cd /sys/class/pwm/pwmchip5
echo 0 > export
echo 20000000 > pwm0/period
echo 10000000 > pwm0/duty_cycle
echo 1 > pwm0/enable
可以看的出来波形是正确的,说明我们操作没有错。
3.编写舵机控制代码
我在之前的测评中有讲过这个控制代码的思路。大家不懂的可以留言,也可以看看以前的测评,这里就把我之前写的截图下来放上。
代码如下(我把代码文件放在附件):
int main(int argc,char *argv[]){
int fd;
int angle;
long duty_cycle;
if(argc != 2){
printf("use err,please use %s + -90 / -45 / 0 / 45 / 90\n",
argv[0]);
}
if(access(file_path,F_OK)){
fd = open("/sys/class/pwm/pwmchip5/export",O_WRONLY);
if(fd <=0){
perror("open error");
exit(-1);
return fd;
}
if(1!=write(fd,"0",1)){
perror("write error");
close(fd);
exit(-1);
}
close(fd);
}
angle = atoi(argv[1]);
duty_cycle = 2000000.0/180.0*angle+500000;
char duty_cycle_str [10];
sprintf(duty_cycle_str,"%d",duty_cycle);
if(pwm_config("period","20000000"))
exit(-1);
if(pwm_config("duty_cycle",duty_cycle_str))
exit(-1);
if(pwm_config("enable","1"))
exit(-1);
return 0;
}
4.查看现象和波形图
我们把写好的代码交叉编译一下拷贝到板子系统上运行看看现象。
IMG_8329
总结:通过编写程序可以控制舵机转向0到180度的任意角度,pwm输出的波形很稳定,该板子的pwm脉冲宽度的稳定性较好。
附件: