飞凌嵌入式LS1028A开发板如何输出PWM方波

[复制链接]
8876|0
手机看帖
扫描二维码
随时随地手机跟帖
柠檬籽儿|  楼主 | 2021-5-31 15:04 | 显示全部楼层 |阅读模式
最近,我收到了一个使用OK1028A-C输出pwm方波的需求.但是发现OK1028平台没有相关的说明,于是我着手写下了这篇**。

在查阅OK1028A-C原理图和《QorIQ LS1028A Reference Manual》后得知,LS1028默认有8个FlexTimer (FTM) ,每个FTM有8路pwm。

v2-0041eaecb5c24980db630260c6d6d33d_720w.png



默认背光采用的是FTM1产生的pwm,我们使用FTM7做pwm测试。

如下图所示:

v2-7c44a6b4822bc5dfaefe143658a7da54_720w.png



LS1028 RCWSR12寄存器的12-14为I2C4的管脚复用。

如下图所示:

v2-a7f7564ac3b79d1d83079d959c7f19be_720w.png



I2C4管脚可以复用为六种管脚功能。OK1028A-C将管脚设置为can2 的rx 和tx ,在原理图《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。

我们可以通过修改rcw文件,将I2C4设置为pwm管脚。

OK1028A-C默认是支持pwm功能的,所以我们无需移植驱动,所做的工作只是修改pinmux和在设备树中增加pwm的相应设备节点即可。修改packages/firmware

/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的设置,将pin设置为pwm输出。

将IIC4_PMUX=2修改为 IIC4_PMUX=4

如下图所示:

v2-8c06f14c65aea8ce4c505047e2b4633e_720w.png



完成上述设置后我们需要修改设备树代码,增加PWM配置。我们的修改的文件路径如下:

packages/linux/linux/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi。

然后添加pwm7设备

Pwm7: pwm@2860000 {

                        compatible = "fsl,ls1028a-ftm-pwm";

                        reg = <0x0 0x2860000 0x0 0x10000>;

                        #pwm-cells = <3>;

                        clock-names = "ftm_sys";

                        clocks = <&ftm_sysclk>;

                };

如下图所示:

v2-aa254ac73ea34093792540da6f03fc8e_720w.png



▐  启动OK1028A-C系统

root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备

如下图所示:

v2-4c08941e43f515188b73e7cb86916c95_720w.png



我们现在打开了一个pwm控制器,可以看到FTM1支持8个通道,而背光使用的是pwm-1通道。将我们修改后的设备树文件和firmware编译,烧写到飞凌LS1028A-C开发板,启动系统。

root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。

如下图所示:

v2-b006edbec004ef9ee784ccb04ad135d1_720w.png



此时,虽然我们添加的pwm设备打开了,但和pwm0设备还是有差别的,新添加的pwm设备的每一路通道都没有设置周期和占空比。

所以下一步我们不需要再增加驱动代码,而是利用sys即可直接设置pwm参数。Pwmchip8是我们添加的pwm设备。

v2-add2f0bb757277875b0406716b623312_720w.png



▐  使能使用的pwm通道

root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道1  

root@forlinx:~#echo 2 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道2

root@forlinx:~#cat /sys/kernel/debug/pwm命令查看我们当前的pwm设备:

v2-2e1c89756e44b8cefea8ece1065f67e0_720w.png



如果想取消相应pwm通道的话,可以使用“echo 1 > /sys/class/pwm/pwmchip8/unexport”

“echo 2 > /sys/class/pwm/pwmchip8/unexport”命令。

因为我们每次只能使能一路pwm,所以先配置和打开pwm1。

root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1 period为1000000,单位为ns,即1kHZ。

root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 为500000,一个周期中on的时间即占空比,单位为ns,占空比50%

root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable 使能

root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable,period,duty_cycle} 命令可以查看我们的pwm使能状态,周期,和占空比。

如下图所示:

v2-7386c2df97741e3363ab16f69131fae7_720w.png



▐  用示波器测试T6_CAN2_RX产生1khz的方波

由于每次只能使能一路pwm,所以我们要使能pwm2,就需要先关闭pwm1。

root@forlinx:~#echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable

root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm2/period 配置period为1000000

root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm2/duty_cycle 配置duty_cycle为500000。root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm2/enable 使能

root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}

v2-7a1763d80b4d275769411432dd51e05b_720w.png



▐  用示波器测试U7_CAN2_TX产生1khz的方波

在我们使用OK1028A-C时,由于管脚复用,很多功能模块的管脚没有引出,但是模块的驱动是支持的。这种情况下,我们只需要修改rcw相应的pinmux配置和设备树文件就可以使用相应的功能了。


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

106

帖子

0

粉丝