linux使用pwm控制舵机
开发环境:使用原子STM32MP157开发板平台+ubuntu
最近自己画的mp157的板子使用了PB5这个管脚来控制舵机,先基于原子的开发板调试下功能。
PB5为TIM3的CH2,在原子的开发板上该pin被用来SPDIF_TX,所以需要先基于原子的内核修改设备树,关闭SPDIF相关的配置,添加TMI3 CH2的配置。
修改设备树
1.添加PB5 的pinctrl信息:
pwm3_pins_a: pwm3-0 {
pins {
pinmux = <STM32_PINMUX('B', 5, AF2)>; /* TIM3_CH2 */
bias-pull-down;
drive-push-pull;
slew-rate = <0>;
};
};
pwm3_sleep_pins_a: pwm3-sleep-0 {
pins {
pinmux = <STM32_PINMUX('B', 5, ANALOG)>; /* TIM3_CH2 */
};
};
2.向timer3追加配置并使能timer3
&timers3 {
status = "okay";
/* spare all DMA channels since they are not needed for PWM output */
/delete-property/dmas;
/delete-property/dma-names;
pwm3: pwm {
pinctrl-0 = <&pwm3_pins_a>;
pinctrl-1 = <&pwm3_sleep_pins_a>;
pinctrl-names = "default", "sleep";
#pwm-cells = <2>;
status = "okay";
};
};
timer工作在pwm模式下无需使用DMA相关功能,故删除相关节点
3. 原来PB5相关引用全部屏蔽掉
原子开发板PB5是用来给SPDIF相关音频接口使用的,所以给相关音频和sai接口的dts配置关闭。
sai4 sound 等节点status = "disabled";
如此我们的内核timer3 ch2就可以正常工作了
配置定时器
下一步我们需要在用户空间配置定时器输出我们想要的频率和占空比。
进入到/sys/class/pwm/pwmchip0/下,看到完整路径中物理地址是40001000的就是我们的定时器3。
// 1代表ch2, 0-3对应ch1-4
echo 1 > /sys/class/pwm/pwmchip0/export
//设置周期时间 20ms = 20000us = 20000000ns
echo 20000000 > /sys/class/pwm/pwmchip0/pwm1/period
//设置ON时间为0.5ms 对应舵机0度
echo 500000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle
//设置ON时间为2.5ms 对应舵机180度
echo 2500000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle
//打开pwm输出
echo 1 > /sys/class/pwm/pwmchip0/pwm1/enable
//如果需要调整极性可以按照如下设置
echo "inversed" > /sys/class/pwm/pwmchip0/pwm1/polarity
至此可以通过设置duty_cycle 控制舵机 了