找回密码
 注册
关于网站域名变更的通知
查看: 668|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-5-31 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近,我收到了一个使用OK1028A-C输出pwm方波的需求.但是发现OK1028平台没有相关的说明,于是我着手写下了这篇文章。
: f4 _1 N/ k1 ~9 ]/ S" b1 N, D! b

& o0 _% o4 I4 U8 c  {在查阅OK1028A-C原理图和《QorIQ LS1028A Reference Manual》后得知,LS1028默认有8个FlexTimer (FTM) ,每个FTM有8路pwm。) w1 y0 x" V8 i! m

7 p  n( l! ^& W2 Q/ o+ _
( |2 C4 q/ |* K0 Z) w! N
9 X  y1 J) i: U5 l( I
/ m) ^* ~9 Z) ]$ i, \
! N! Q# D/ A2 h3 T/ o默认背光采用的是FTM1产生的pwm,我们使用FTM7做pwm测试。
( j2 Y1 k% l9 Q: E! C
2 H. S9 O- u( g" L' ~$ p
如下图所示:( C2 J" ^" B& H, `4 [8 U

7 H( R7 A( b) R6 G5 L; s, }
1 I- N  I; O7 v; y3 _3 Q" ?; y0 {# U% E% \1 D# }. j8 L
' s8 C5 l9 H5 c  L

9 o9 f; x& i3 |5 {5 V3 yLS1028 RCWSR12寄存器的12-14为I2C4的管脚复用。
' S, H5 ~5 d0 e0 J
+ _4 x1 k6 t& c1 o. E
如下图所示:+ W: V  K0 X+ b& g/ k

5 m& p1 |6 B; z9 v  V2 n! L- V* J4 Y, f0 F8 F& h& B: L
3 X: v7 P  M( [, w0 L2 K7 j, Y2 B

3 `1 x. n8 v+ H3 K/ r; o, [
3 h& Q0 ?: `9 WI2C4管脚可以复用为六种管脚功能。OK1028A-C将管脚设置为can2 的rx 和tx ,在原理图《OK1028A-C_V1.1》中可以看到T6_CAN2_RX、U7_CAN2_TX。4 }1 L7 B. `7 }2 x+ [
  D. O3 P" o% i) e3 x
我们可以通过修改rcw文件,将I2C4设置为pwm管脚。
+ r1 C" ]+ K+ F
4 d6 ^6 V7 v+ U* e
OK1028A-C默认是支持pwm功能的,所以我们无需移植驱动,所做的工作只是修改pinmux和在设备树中增加pwm的相应设备节点即可。修改packages/firmware! Z3 J/ i7 n! b: A2 {

6 ?6 U3 U8 U, ~0 C" }3 g! ~. b  {9 _9 M/rcw/ls1028ardb/RSQPP0x85bb/rcw1500gpu600.rcw中IIC4_PMUX的设置,将pin设置为pwm输出。
- k! O7 v5 e0 L

, C+ {8 C; V5 ?# }! y5 w将IIC4_PMUX=2修改为 IIC4_PMUX=4: D& Z9 F9 g9 Q1 w9 b# C9 G6 p! C

( V2 M, \0 \- g& O' B. i) [如下图所示:
+ g$ H6 y! g( v* c# C

. q+ G9 `" G# ~8 P& c2 e3 e7 X* D$ G2 @. |- E8 \

* n8 o0 ^# g, w  o4 x
. _- S& J# Q  O: j- t6 p: j- y0 B2 B! K6 @1 g6 h
完成上述设置后我们需要修改设备树代码,增加PWM配置。我们的修改的文件路径如下:
6 n5 [; a5 x5 \3 c+ k
5 Z+ u' ]  v( ^( T; a( p
packages/linux/linux/arch/ARM64/boot/dts/freescale/fsl-ls1028a.dtsi。% s5 D. ~! E0 e  H

, A' Z4 M5 D/ ~! ?7 [, {( \然后添加pwm7设备
9 c8 D2 m( @% p" s4 p5 |

$ L& s; Q% R4 C1 kPwm7: pwm@2860000 {7 l. F8 S4 i0 P8 d4 b) n

- O, I. f$ d( V                        compatible = "fsl,ls1028a-ftm-pwm";
6 a6 q! D1 y. r0 U

* Q  ], @" Y* X" n. H# ^* x3 r                        reg = <0x0 0x2860000 0x0 0x10000>;5 D+ B8 e  W- H4 _! n1 ?
8 X, i! d3 F: V6 N2 J3 {8 y# l
                        #pwm-cells = <3>;- ~+ W  J6 j  \& r6 `& k& o
: l9 r( _( p3 p4 ~" A
                        clock-names = "ftm_sys";
2 G+ B* u5 k( ~7 w
8 X6 S$ L% y3 n$ S+ b7 ^. v
                        clocks = <&ftm_sysclk>;: q9 j) C( Y/ N# Y& _

8 H/ w: _7 A' s3 |% t                };
9 l9 c6 X6 l0 A" P2 S4 Y' ~

# `3 C! N: @% W1 u如下图所示:
1 N' ?/ A) _- q/ g" R7 x
  j2 E6 ]4 k  Z, |) e. f% s

5 E0 o$ d% m' b. K2 e
; N- ^. @- Z. K8 m- @0 x- j5 x7 S! }9 L0 N7 \) ]
+ K, u" Y8 h, R7 E5 j0 h
▐  启动OK1028A-C系统. C! M8 |8 d; ~5 H# H: ^* M

! m5 c$ t; V# _3 r) O& ]' u& Wroot@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备5 G$ g$ p' {) P/ k. c4 B# [
* g/ V5 V( D# a
如下图所示:- O* A% H) S! C7 p* l3 |3 N
+ r7 `5 `% z, l! T+ B6 R( Y

7 D/ M- t! H3 X$ N5 Y8 l+ r6 B( j- [- v& f% p9 l# p
/ S5 q+ Z$ H# B9 Y
9 k# C$ _2 r$ H  O, A
我们现在打开了一个pwm控制器,可以看到FTM1支持8个通道,而背光使用的是pwm-1通道。将我们修改后的设备树文件和firmware编译,烧写到飞凌LS1028A-C开发板,启动系统。
, z/ e) K9 g" `. b: t# h

! C+ P+ L* \; ~7 n$ [root@forlinx:~#cat /sys/kernel/debug/pwm 查看我们当前的pwm设备。2 O1 p! L5 A( ?( h! Q- A7 v8 Q
; M* N( Z5 G! _4 k: I, R( r, f6 D( g
如下图所示:* q: J6 [( @' z  M2 }
" E# w% J) s% q
( m. r$ e' \8 i

- f& j. i+ W7 t; T
% U; A7 G: K: b2 }* M! |  r9 ?: R4 A% v0 b( [3 |
此时,虽然我们添加的pwm设备打开了,但和pwm0设备还是有差别的,新添加的pwm设备的每一路通道都没有设置周期和占空比。
$ T5 M$ _% k' x5 t
; V0 p: k3 l5 M9 M; L- h2 e" @
所以下一步我们不需要再增加驱动代码,而是利用sys即可直接设置pwm参数。Pwmchip8是我们添加的pwm设备。5 {# l7 P, p3 {8 }# r, a
) }0 c0 N7 p0 L% D/ n
% t' t5 P8 H& t7 ^+ R* n' I

: n5 c9 A4 }6 l0 T8 k" \2 S1 F3 ?& f* l' E

) F1 B1 q& @; O3 b( G7 \6 H/ b8 P& H4 K▐  使能使用的pwm通道* q% r+ p. r; T/ F/ [

3 I8 S* h& M5 S3 P8 u; Croot@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道1  2 k, j- L% x4 M4 Z
1 }5 r4 c9 B4 W$ U! t4 d9 g0 w
root@forlinx:~#echo 2 > /sys/class/pwm/pwmchip8/export 初始化 pwm通道27 d, f9 [) |0 c. M( q+ ~

: \/ x, u6 I  G3 H* J% Mroot@forlinx:~#cat /sys/kernel/debug/pwm命令查看我们当前的pwm设备:  e1 ?' \& T$ r9 T9 ]
9 L. C1 H/ Y  j. O8 P8 W

! G! G7 p5 C% {, F! B# g3 d% I& n, f  X5 `8 L; x. g+ F
8 b1 {" b( l% G% K5 ]

. |2 ~& d0 [7 W( s- M. g$ z如果想取消相应pwm通道的话,可以使用“echo 1 > /sys/class/pwm/pwmchip8/unexport”
+ L) m4 Y( p9 U) Q/ V2 H3 ?
# B, d) i0 t$ `& t9 B! p! u9 Q, u
“echo 2 > /sys/class/pwm/pwmchip8/unexport”命令。; o4 f: d: E9 E( N

) ?* U" X1 p$ D* Y& G因为我们每次只能使能一路pwm,所以先配置和打开pwm1。$ N0 Q7 }- Q! w+ p* e
# ?( C$ X$ `: _- ~
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period 配置pwm1 period为1000000,单位为ns,即1kHZ。
" u( V/ z  C8 T/ V+ Z

' d0 J9 n, @6 b4 d! R5 c5 vroot@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle 配置 duty_cycle 为500000,一个周期中on的时间即占空比,单位为ns,占空比50%
6 |3 u  X/ x$ U" x) P% I
- B! e; z- C: o7 k
root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable 使能
- y# G" T1 f+ c) J) E0 b( W& n; j
8 N. I3 a; B1 x5 U7 T$ L# x5 b' p
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm1/{enable,period,duty_cycle} 命令可以查看我们的pwm使能状态,周期,和占空比。! ^2 d& x4 F( v' n/ {/ A1 H

4 X! j/ l: Q. j1 Q* G* {' [如下图所示:( Z3 M( a/ a" F6 a( d7 _8 D- o
7 O! v& k  w5 O) t

" y8 |7 f1 H  ?2 n& H% q6 q8 J/ `4 |. N1 M
* r' P3 p; F/ x! T: u) h, u

! d, C8 ]" }1 u# i7 D9 [- g, ^▐  用示波器测试T6_CAN2_RX产生1khz的方波
% L, |. U* o0 i- f* F% i2 O1 M

& N( F. Y/ `+ `% ^5 {( ]. j由于每次只能使能一路pwm,所以我们要使能pwm2,就需要先关闭pwm1。
. u/ E0 {, `+ V* @) t* S  W; i

6 ?% Z7 c7 ^& O8 K; O# uroot@forlinx:~#echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable
/ I- n- G1 O+ l# q+ G8 y/ j" A
1 c! c2 c- o- |
root@forlinx:~#echo 1000000 > /sys/class/pwm/pwmchip8/pwm2/period 配置period为1000000
$ J7 ~4 c3 \* a! ?7 I! @* B; y

. [* p2 N0 q; u& ?2 u: c6 |root@forlinx:~#echo 500000 > /sys/class/pwm/pwmchip8/pwm2/duty_cycle 配置duty_cycle为500000。root@forlinx:~#echo 1 > /sys/class/pwm/pwmchip8/pwm2/enable 使能
5 ^& Y7 Z( `4 f" D6 O; Q
8 R: \6 K! O$ o6 F3 p6 X0 Y
root@forlinx:~#cat/sys/class/pwm/pwmchip8/pwm2/{enable,period,duty_cycle}1 s) ^4 D' D  B) _: N' p$ V6 @

6 T" @) k5 r- E: P% g/ Q9 \% \% h- o
0 q1 `- A! x! O* s
  ~& F. ?# C) v, F9 B: M8 T6 a% z+ r' ]. m7 a- {3 |

% p9 f, E7 ?) ~1 r▐  用示波器测试U7_CAN2_TX产生1khz的方波4 H% a9 H2 L" x* ]- b0 H* f

9 f2 V( `9 m1 X在我们使用OK1028A-C时,由于管脚复用,很多功能模块的管脚没有引出,但是模块的驱动是支持的。这种情况下,我们只需要修改rcw相应的pinmux配置和设备树文件就可以使用相应的功能了。# S" Y" f( X* N% B

, [( q# |& I* x* j. X* J6 L3 ~3 ]- k

该用户从未签到

2#
发表于 2021-6-1 09:58 | 只看该作者
LS1028A开发板如何输出PWM方波
/ R" e5 c; y3 X) j6 g1 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 11:35 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表