嵌入式开发者社区

标题: 请问一下怎么产生PWM波 [打印本页]

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家1 T6 Q( k5 g; b. q

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
8 m0 ~4 L+ S* ]  y/*                                                                          */( B/ `9 g- }& Z
/*              宏定义                                                      */
; A5 J- `/ v( A& }+ c/ M/*                                                                          */
8 u7 j% `* S9 P: e, F( o/****************************************************************************/
3 X- G8 d8 Y& r/ r// 软件断点
7 M2 b( |/ k4 C9 ~#define SW_BREAKPOINT     asm(" SWBP 0 ");: z$ |& h  J- _( ]; o
! H8 M- V& w1 O8 ]4 n  a
// 时钟分频( _! C$ e! P/ [2 x, x. l
#define CLOCK_DIV_VAL     228/ N" G4 k: w! [' P5 z/ D
) ^9 \6 B* z5 h; H$ ~% M/ ]
/****************************************************************************/" X8 s3 \  R" a% \: z/ G
/*                                                                          */
6 a0 e9 B. N3 y7 k. D) Y/*              全局变量                                                    */+ U  B0 ?1 a' T3 b" o
/*                                                                          */2 @# l  P. H4 f1 L7 |8 ^
/****************************************************************************/
; g2 O7 M$ U% ?/ A# }- z1 D+ KECAPCONTEXT ECAPResult;
8 K! e8 w, S; n' o! S! N
$ q, t6 ~" A" L1 F4 v  h# A( b* \/****************************************************************************/% D' H7 P( V( ?* d. V
/*                                                                          */: K; e4 b$ \! m/ A
/*              函数声明                                                    */$ ^& v. I" o. }  e
/*                                                                          */
. X) y2 B6 V/ z1 w# y* I4 d; x/****************************************************************************/$ I3 Y9 ?* x) n, S: Z3 n- f3 B* e
// 外设使能配置
0 f6 _; q8 k: j9 t' Y2 rvoid PSCInit(void);
* M' r5 ]9 E# y3 N! @: h) u' X  x9 h+ Q  s/ E# p- q$ R4 d7 d9 i) L
// GPIO 管脚复用配置" E6 @( r, i  B8 {" g# O
void GPIOBankPinMuxSet();
) U. H6 g# a1 g, T3 D" ^
3 O0 I# X3 r% p4 ?/ a' ^. Y4 g// 产生波形
8 r: p1 _# x5 tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) D7 p- r" L& n3 Y: y
void ChopperWaveform(void);
/ s4 I& B* t$ w2 l8 J: J9 T. ~% d; ^/ j7 W( }
// ECAP初始化和读函数
5 I% l, L; @: Ivoid ECAPInit(void);
$ d3 _6 y' @) n% ]) o8 R% C+ ounsigned int ECAPRead(void);8 j8 n: L# K6 r; J$ s0 ?

  b" @: ]$ s: W4 B5 \//ARM 中断初始化
0 s7 s5 z4 n* U1 T9 q" N4 t( k3 Bvoid InterruptInit(void);
2 A, ]1 W- Q" g+ z8 A* }, c3 ]' S5 G- f: ?
// PWM 中断初始化7 Q3 t! ?- y* R: ]4 V8 V0 V
void PWMInterruptInit(void);. ]2 Q: P7 L9 t: E! e- {
// 中断服务函数
! O  H' J" i8 z. a: A& e' y// PWM 事件
5 S* E7 p1 E( m7 x" I, hvoid PWMEventIsr(void);
0 ^( b$ m# u5 @) z* A& Q% S# y// PWM 错误控制事件
$ ?4 T( ^2 ]0 P  `! hvoid PWMTZIsr(void);/ Y) o$ a# ^8 f- X1 i

, Q4 o0 F7 n4 ]4 b. ~/****************************************************************************/8 J2 r% C% D* S# D3 d& p9 G& F
/*                                                                          */+ B! |& z" Q' d* Y! V2 U0 W
/*              主函数                                                      */
3 P1 ~. x* R, Q3 H" }/*                                                                          */
6 w* I0 g' i# n2 z" ~/****************************************************************************/
) y' f- |  u' ]; [$ l& U3 hint main(void)- P, M; ^' E9 X. g" z4 L! k$ w
{
" z& V7 y  ]( i! D, l3 ]% a; A, H        // 外设使能配置7 Y4 d: H. t7 a! t8 y
        PSCInit();% n+ p9 J- J1 @  j, N
1 A, p5 a3 s" h8 p
        // 初始化串口终端 使用串口24 H( @, e+ p( Y: l& V- N/ ?: q1 C
        UARTStdioInit();
; \2 c+ A) ^4 f; P8 D        + C% ~! K' I8 M( D! }9 ^0 _0 g
        // GPIO 管脚复用配置. p* [2 F7 X! X7 h+ N
        GPIOBankPinMuxSet();. s9 v8 G9 t1 m

5 A4 C* \/ J6 ]3 |, W        // ARM 中断初始化
% @# X" _% N: F: C4 X$ @        InterruptInit();
. s2 _  c' {" M" D0 v, K4 u; F8 X) S% e
        // PWM 中断初始化! e- W  _3 D6 z% u  Y
        PWMInterruptInit();
( u. ?5 J6 z+ x7 _8 F" Z( c4 `
. H" I7 M. W" d6 p        unsigned char i;# }9 T4 R) C9 L' T( f8 f4 z
        unsigned int j;9 ^: L; y8 a! x. G% Q, A
7 T! w2 w6 ^4 v9 A9 u4 ?
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 O' k; M" P7 J0 R$ h6 {( i        UARTPuts("------------------------------------------------------------\r\n", -1);$ P( v9 \* [7 F5 D- Y7 d8 Y
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);$ f3 y5 g: v( ?& |' h
        // 产生波形
" r1 z- B1 ]$ ]5 p# H        PWM1ABasic(25000,50);
9 Z# B% i& b8 p# w; E' I
" n' \% k# e) i        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
! t" ?5 D# _1 q' V& a        UARTPuts("------------------------------------------------------------\r\n", -1);
9 H' g2 ^4 a2 V% w: [  @# w: s' H6 T) Q3 P% [/ S; r% O  P* i4 t: S
$ @9 k+ }! R& b! M; P

7 d0 l1 k2 e7 A        UARTPuts("------------------------------------------------------------\r\n", -1);
) F9 A* r& F' u7 b5 v7 d        UARTPuts("                    C6748 ECAP Test\r\n", -1);3 j$ }. |. t. b9 ^" p! U3 g1 d2 h, N
        // ECAP 捕获初始化8 \0 H5 E' Y* H0 X' Q# y
        ECAPInit();
- H# q" V0 u1 I1 b8 d5 a( n        UARTPuts("Initialize ECAP.......\r\n",-1);
8 v& N+ ], y1 `% z        for(i=0;i<5;i++)
$ J8 [8 \# k( D: Y; o( b        {: x" _% w! m4 _# c6 W: v: d" V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 k! h2 J5 y* x' Q' g, M& W9 h                    ECAPRead();/ \3 L1 u: h! X1 ~' ]+ n2 E, \
        }* I9 w' e* P, |' Q) ^8 E$ _
        UARTPuts("\r\n",-1);# M9 ]$ H0 x0 F: p) R( s
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);' I7 d& i, e2 h) U% i
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 A2 n; s" f: Y% X/ N! `, C# h$ U! Z. @
        // 主循环
3 y+ G& N# j3 {& m# Y7 [8 i        for(;;)
( d7 [( `6 y# @6 }! ]5 v        {
  _9 j  i# i- F; t+ R# p  f* G, r! [8 l- J% q
        }: J7 N2 L3 }9 w' w# O2 R* q) T  L& }
}% \- x' G, f. k1 {- ?. d
% @- D1 l+ @9 C8 N
/****************************************************************************/
2 z0 j* ~3 R$ q+ [/*                                                                          */
% t3 s7 x; U# i2 S: W9 |2 S/*              PSC 初始化                                                  */
, F$ H/ U" x2 Q" M4 Y' @6 \/*                                                                          */
' M8 _9 k! m# x3 B( x/****************************************************************************/
! C0 ^8 C2 W8 I% c5 c& ?) @void PSCInit(void)4 t! l7 H( a8 a9 ?/ `3 w4 f6 X
{) d0 @" H8 A: J: b
        // 使能  EHRPWM 和 ECAP 模块, n  ^3 s. n6 I, ?! z& {/ I
        // 对相应外设模块的使能也可以在 BootLoader 中完成
3 D' d& t' m; P! D    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);0 }0 A/ Q8 H! a4 B0 P3 h7 {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 l% V. N5 b4 R) p8 {! y% R" U  i}& f' n5 T1 ?& _/ X
2 j8 H4 |. T4 M  N8 \$ q* b
/****************************************************************************/0 I5 m; }0 q, k! E7 \' d. U
/*                                                                          */+ r$ P' `6 z7 w) B7 p, A  L
/*              GPIO 管脚复用配置                                           */* x3 m; c* Y* H5 {
/*                                                                          */) ?9 }! l+ E3 B- ]+ {
/****************************************************************************/8 c1 C! X3 v! H& ~- P6 A
void GPIOBankPinMuxSet(void)4 I8 L! M! C& B+ L
{
' A/ I$ I9 u( l+ g2 q3 ?        EHRPWM1PinMuxSetup();- \3 G# W. i  U
' V2 _% b" B3 O3 r- L7 R
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# _1 {% U6 n% _3 y3 ^1 j        // 作为捕获功能时管脚方向为输入8 _$ h' H, W# L" I0 r  N% I
        // 作为辅助脉宽调制时管脚方向为输出
7 }$ n" j; r4 W2 M: }    // ECAP2 / APWM2; d8 s9 a, x; L1 D! o4 O
        ECAPPinMuxSetup(2);: p* z( o6 i; t- N

8 N6 F  Y! T  p, [        // ECAP2 / APWM2方向设置为输入
+ z6 d( h, i+ E' F7 n/ x        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
+ I+ A" i6 j. I0 E2 G0 F2 B}
, `+ c! u2 m* t, _) ?7 y5 b; U
9 ?* v4 j& Q+ f- ]" J1 j' m0 m/****************************************************************************/
7 g9 R0 m( C/ X. ~. G; E/*                                                                          */
) Q/ `8 Z" S: N8 p3 E, n/*              PWM 输出波形                                                */% E+ e! J2 K; Q) B9 E
/*                                                                          */+ p/ v8 o6 [! l" Q$ Q9 X  x# u; \
/****************************************************************************/% S  M7 G- u  G- d; t. Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 k7 x- P" x" v( N
{
7 i* q  ^) a. ]- d    // 时间基准配置
8 ?4 a+ @/ D& U, o    // 时钟配置
+ n% {0 ]7 T9 }3 [    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);" ^3 s: E& p; |4 }
6 [# s) \, t8 D7 N4 g
    // 配置周期/ `% C7 ~7 {9 ?0 L
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* I1 a/ ?+ \% k8 G+ y                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 |9 J/ Q- m8 p( c3 Q

& H' P- l. F  s2 n- j/ b6 z& X4 v    // 禁用输入同步信号
/ h! x7 y* V. E5 Z    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);0 b4 M$ w& a. E3 i2 R5 ^

8 u$ I! P2 r2 f& Y# w0 c    // 禁用输出同步信号
4 q5 O# q: k2 K( f0 c8 @" K4 x    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);: f; T% A% G4 H( l- _" P
8 Q( t1 w4 d+ a5 W/ `" x
    // 仿真(DEBUG)模式行为配置% g, M3 p: v& c9 U7 O' j# g
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);& [, Q# J0 A4 l  @- F: |8 `
. T7 D' z" l" s) Y4 d) N; u3 h
    // 配置计数比较器子模块! K6 q5 T* p" Q, i# {  g
    // 加载比较器 A 值, k, q% k3 w: \& }9 Y3 z1 p, P
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' m" O3 V! o$ Y( m+ S* A
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 j% c7 q' Z% U9 P

( i0 Y+ n9 C% @6 H/ a6 S0 G    // 加载比较器 B 值* e; F' x! ~0 [7 q/ k# G4 Q: ~! j
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
- d$ F1 `' t" i# A7 v5 }& s, d  L                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 z, y0 f0 m  E5 x' w$ U8 A$ w8 ~( s* a' H0 K& w
    // 功能限定配置(输出引脚触发方式设定)
) {$ d2 v- g+ t: t2 D6 Y& v7 }* e    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 ]/ g0 k/ b; D8 j9 I. Z5 Q8 g
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. z- l) i/ N0 c' _$ N1 _8 V1 v
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
, q7 i9 x6 D- c" f: Z4 d% J# Q! U- k                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);/ M( @, a4 T4 _5 J+ [0 u1 M  [8 u
9 t9 m6 z% O) i- l" P, v
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块) v3 @# i3 F* t3 I3 r# Q& O4 }- `" t0 t! g
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 m" h  ?; f  N, u: H0 q: z

% d+ F* w  q/ b: L# Y1 n    // 禁用斩波子模块% t0 D. \% O7 }2 I( q4 v* t6 [( p
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 F+ w5 I% r3 e: T, v2 a& z" ~0 d0 Y% E+ K, [2 g
    // 禁用错误控制事件: C7 R% l) q4 P6 r0 f0 m
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);' ]7 q9 I, S8 ?# a3 u# }
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 Y& I' u3 v( p( I! N& A( p. U
' V* w: ]! ]) L: ]' d  _+ }* a    // 事件触发配置" i* Y9 P- R$ q4 Y; d
    // 每三次事件发生产生中断
5 b4 W' `! D- K7 v) z/ j/ @" s    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);5 k5 M' m0 q5 y# W
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件% k/ j6 ?. T, [! i) L! g( k
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ ^6 y; U6 I. n; B3 e
    // 使能中断
, H- J( t" w" b1 m: @    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);! m5 v5 A; J. d2 M4 e7 ]
9 B6 Z2 y$ n- `# ~# j9 S5 p
    // 禁用高精度子模块3 s! [3 C2 t3 u' v$ p  y  U
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);: w& W2 N% e; y# m0 w

4 y3 e5 B1 N& b, i' G9 m    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 z1 n5 o& T* X}9 C+ n( ~: v6 R9 a% S& @+ B5 `
5 x0 M& Y8 [" w6 h" C( X$ w
void ChopperWaveform(void)
4 ^, y' O' w4 L* R{
0 }# E8 m4 H1 U5 f    // 50% 占空比
4 G  ]! }4 S8 l4 u! P; u" w  {8 K    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 E( O. Q' T4 [/ }4 ^0 F    // 4 分频
" `$ W  K& l9 ^! W    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& y) M: g! d* I9 M/ U+ f# z    // 单个脉冲宽度
5 Z- Z' L0 i, _- f% S$ M4 {7 y: p    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# f7 x1 e( V; z& R1 s- \7 Q    // 使能斩波子模块' h0 P' e* \  X
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! y5 f; t( @4 _0 X  S, M}
/ X5 \3 C7 e6 I# h# P+ ]
" S4 x" R+ p, E  O9 x/****************************************************************************/
( E3 ?0 S. v( V+ g# w/*                                                                          */
" u: E( ]! G$ Z) N/*              PWM 中断初始化                                              */
1 }2 K  Z; Z5 p/*                                                                          */
3 Y& h' x! d, y, f& ^/ j% n/****************************************************************************/
, R& y# Z+ T1 n  u6 tvoid PWMInterruptInit(void)
" P. B2 t4 p, P. R% a8 d7 b) K4 G{
2 u, a. A) Q) J# d$ E: q( U# `% l        // 注册中断服务函数
+ @) v$ q; x, }4 s        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
$ l, H  D& l( H3 d; K% G4 P        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);! }1 D: K- h" n2 D9 B7 H  ^

1 Q* S  V$ D  H. \' n( o' G6 I        // 映射中断
* t9 e: m. l8 q- {        IntChannelSet(SYS_INT_EHRPWM1, 2);+ y; C7 n1 {3 k3 B2 A
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 U  E" a; C8 {0 y& ~4 o4 H3 G$ [; L; C9 T
        // 使能中断
0 ^1 Q- i  {( N  h, f; A9 t* Q2 E        IntSystemEnable(SYS_INT_EHRPWM1);
  ~1 w3 \) j& G, R8 z        IntSystemEnable(SYS_INT_EHRPWM1TZ);) ~. ~% c% L. R
}
* H0 W' k; q7 I# I0 M, o2 w
' w8 t0 s/ a7 Z6 g. q( S0 S/****************************************************************************/
7 j' C; l+ g( ?- \: T8 B/*                                                                          */
7 h* b5 I# D4 e7 f' a* X: m- E/*              ARM 中断初始化                                              */: d3 E' b# U# ]
/*                                                                          */: ^9 b) Z3 D! M2 `6 q  n5 m
/****************************************************************************/% U8 E2 s0 d. V5 s4 U9 I! i. w
void InterruptInit(void)' L8 l& h) G% p8 n, D6 S5 m, R6 p
{, B1 {% `0 `# M' l( M
        // 初始化 ARM 中断控制器* g3 g6 _% `4 H8 R- C9 e
        IntAINTCInit();9 n5 |" I/ z8 f; B, k

2 r' ]0 X! P8 w' d$ s; L4 R        // 使能 IRQ(CPSR)
3 v% [1 J: w/ I6 |4 e) I4 o        IntMasterIRQEnable();
8 F* O( Y3 q7 D! f0 g: m9 ]; i( B$ N. U
" e, L. K7 s) C$ q        // 使能中断(AINTC GER)$ y% l; M8 t1 U! ~7 d: i0 A  @
        IntGlobalEnable();
7 N' @1 U; v- l8 |: o
+ _! P& s* |* y, ^        // 使能中断(AINTC HIER)
6 C- ~/ b0 t0 _" u2 I# }! \3 n        IntIRQEnable();5 f& D  F5 H; R6 k7 A
}& u, B8 r$ T" v* i" n

$ g' Z$ X) C) u/ _2 L
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& m& ~* @; B! \" t
/*                                                                          */. b% z9 Y6 O+ e- f4 {& X# P
/*              中断服务函数                                                */6 @- z8 z! F4 k( E8 e
/*                                                                          */
, R  R; a' s" E  v3 D; W/****************************************************************************/% J$ M3 }/ G* h$ ]8 [
void PWMEventIsr(void)( _- Q: X. r! t  M2 I
{
2 E8 `; J2 a0 i        IntSystemStatusClear(SYS_INT_EHRPWM1);
( `/ d$ S0 R6 \: b4 i& Y0 e2 |0 {1 P2 E0 S5 b. P1 ~+ ?; }
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" R. ?% x/ v( R% T& n2 C
}
! I) m7 w# v. ?# F! J9 O+ z/ a8 Y6 `. Q
void PWMTZIsr(void)4 F$ v; p1 O7 V& e
{/ ?7 n  W* w; J0 @4 G- z
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 K) I. s! |' w0 Y8 [1 R. @# x" s- u' C% `
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! E8 O+ _% n3 a- _6 H( b* ?}; L, G' S3 ?# s7 \, ~) b# h+ ?2 p
+ X  [* L) ^% h. [- I8 R+ D
/****************************************************************************/9 L# X5 A) V8 C8 @/ e
/*                                                                          */
( C! C+ y" ]+ p' V) h4 e9 a/*              初始化捕获模块                                              *// B4 A- _% D6 W
/*                                                                          */& t2 z9 ~$ J) N6 O/ {
/****************************************************************************/
$ \. f& r. u7 F: S' Uvoid ECAPInit(void)
- p$ T* }& u' O0 a{$ L, ^6 ~1 `9 Y. Q, H/ z
        /*-----设置 ECCTL1-----*/
6 R* C& P) j9 ?- l4 ^' |0 w" B        // 使能CAP寄存器装载
3 b' N- b* D+ W, {        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);  T& Q) r4 v# W) P, R
        // 设置预分频值.
1 v+ R* r. G9 c% C        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
  d; M; [% u2 n/ e( w4 A        // 上升沿触发捕获事件& _* `# X; b6 R% L; `9 u/ B6 U7 H
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 D. d# U7 b% F( I        // 输入捕获后重新装载计数器值.! u' T4 W4 Q/ [( p3 @8 j4 e
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);- o+ C2 |2 Y6 I2 w- x

8 ]' C( K9 s) G9 H        /*-----设置 ECCTL2-----*/
: m  q7 N2 S9 }5 p/ F, d* `        // 连续模式# ]( w1 Z) G1 o: V$ I" k
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
! F" `+ i/ C% {3 J+ d4 h        // ECAP计数器TSCTR持续计数5 |6 C/ F7 N0 W$ g
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
- n' i0 O: A& l( i        // 禁用同步输出和同步输入
4 E1 |* l2 I6 n) c8 _        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);( @4 t! C7 E# ]5 j
        // 配置 ECAP 2 为 CAPTURE 模式
) X. K% n: o* n7 N        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 s1 z+ X# Q9 ]7 ?$ ?. l5 z2 z8 b4 n; }( h  \3 x3 L& ?6 f
        // 使能中断
& H5 R+ o$ o; Y* w0 m3 Z. ?//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
' y) a* f+ h5 w' k8 s}+ z2 O- l" l9 \! C3 q
- A* V1 }1 x1 w
/****************************************************************************/
# z& P8 z4 Z) n  S1 N/*                                                                          */
  m) ~0 R3 j" g% }/*              取得捕获结果                                                */  ^* Q8 d; W6 f$ U$ D' z9 L
/*                                                                          */- E: ^  M6 T# P, n7 s5 |. K
/****************************************************************************/4 }0 i  r& g' a' z& B/ d4 Z0 f
unsigned int ECAPRead(void)% T; L8 K) H3 J1 e9 {. p
{9 \  O# W! ]4 \$ s. E/ x# u, ]0 _1 D  R
        unsigned int capvalue;. i/ ~+ }, h  T- H- u9 ^
        unsigned long frequency;
# i+ r5 p  \* q. ]: |' N$ _
  L; u$ E( r& K/ R        // Event1 中断标志
% P, G" d" }2 I4 i7 J: B7 O6 w        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))$ l8 p) R9 |0 ~; F, b1 O6 i
        {% ]: J, @4 T0 Z3 i+ _9 t
                // 取得捕获计数, q3 M8 Q5 @  y& n  G  R; E
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 Z" b) Y9 M$ O4 ^, @, ]                capvalue = ECAPResult.cap1;1 y2 ?% p* [. x/ c
4 L6 g! V5 d) z6 ~& Q( i# K1 \* n
                // CAPTRUE 模块 228M 时钟主频
' W5 U" K! J9 J, U0 b5 Z                frequency  =  228000000/capvalue;, w# J8 Z2 g1 }/ m( I  f; z
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; i( x2 X. S4 T0 R# }
4 }. U8 I8 m2 M! H4 p                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
7 G& F/ ?! _  E8 Q$ W7 e3 S+ j+ m//                IntEventClear(SYS_INT_ECAP2);0 a; ?* }7 _1 p4 F/ Z# a
        }/ d: W- \1 ~7 @) a( R  e
        return frequency;
8 e: i( h8 x( n}
, u! S9 e8 d1 _+ x
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 t: S8 ^! b& E[attach]4202[/attach]
作者: 浙江第一帅    时间: 2018-11-1 21:27
可以给我发一份吗
作者: 广州创龙莫工    时间: 2018-11-2 08:51
如需获取相关资料,请发送您的客户信息到我们的技术支持邮箱:support@tronlong.com,我们会给您提供相关的网盘链接。




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4