嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家9 V/ G3 w+ d+ w! C& B, g* f0 H

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
( s# j! [  Z6 ~- h' J: v* [3 |2 L6 h/*                                                                          */
3 Z: e6 P% c+ l, h) j" T  g9 E/*              宏定义                                                      */3 q9 ^* Q) |. u) x+ m
/*                                                                          */
/ l0 N, U; G; O! }5 t0 U5 d/****************************************************************************/
  f. x7 b3 H+ _* J/ R// 软件断点
, r1 [. V3 A6 |$ L#define SW_BREAKPOINT     asm(" SWBP 0 ");
/ g( \1 a0 z- {' o+ F* d
2 @2 H2 ]7 K9 Z$ g1 P// 时钟分频
* e) \9 j8 J" x# ]) |2 d% }* N#define CLOCK_DIV_VAL     228/ V. [  _9 q# m, o8 |

" j# {% W. `+ N, V% N1 V& d/****************************************************************************/
9 y4 K+ c" L4 l. `/ e3 w/*                                                                          */
  F: w; \, q& p% I7 P. N& H4 A/ ?. v' o/*              全局变量                                                    */) P1 ?. i3 z1 ^& `/ n+ c/ r7 p
/*                                                                          *// r, P3 N2 R. ^8 w6 y, n2 T; p
/****************************************************************************/8 y+ P/ Z; M: ~: f
ECAPCONTEXT ECAPResult;
7 m% b. _9 R+ A. e  p& `0 e: T  {& G# j, c
/****************************************************************************/
' R) m: T1 y- ?1 u# I" w3 P/*                                                                          */' E. c7 u$ ~5 j( X) |/ ~
/*              函数声明                                                    */! ]% E- ]' |& f
/*                                                                          */- l5 j) w' i$ P, P. \! o
/****************************************************************************/
, D; K" ?+ k% M// 外设使能配置
2 D$ c3 N3 T) E, v" C: Avoid PSCInit(void);
$ K2 {# p; k- @- M  A& W3 p0 o. K( L  `
// GPIO 管脚复用配置0 _5 V/ F  ]' Q* Z. S6 V& f9 P
void GPIOBankPinMuxSet();
! N! u- n7 h& b; K' b- O$ h
; S+ M% v$ R. P- Z3 d/ \- y// 产生波形0 [6 I- w; b/ \7 u) s6 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
' X' a( A  s6 W. v) W; Nvoid ChopperWaveform(void);
3 l9 a$ U& \5 n( A1 ]. r% `* B# g% I: `& i
// ECAP初始化和读函数
7 s0 T! d9 w: r0 f) _% tvoid ECAPInit(void);! y: d2 ]  f, J0 |8 F) D5 G4 c8 r" Y* g9 M
unsigned int ECAPRead(void);
4 }5 q* S/ D% q  e9 ^( G# [7 L+ X
//ARM 中断初始化5 u5 f& G6 C) ~& O4 ^2 _
void InterruptInit(void);# R6 T% i+ L9 Y; _  B3 o

0 I5 z+ J0 X( _// PWM 中断初始化+ E% x/ t& Q/ [9 Y7 D
void PWMInterruptInit(void);* g% K  S( J6 s9 N% y5 t5 T- n
// 中断服务函数
& t( n3 i' ]+ Q  d. p// PWM 事件
. Q0 n) ]* D- v4 |void PWMEventIsr(void);
: B+ s( Y' u% T" @' v// PWM 错误控制事件
' U- N  ~& E$ K5 h( N0 }4 I  S, ?void PWMTZIsr(void);0 T. O/ V/ n8 y0 S' i6 `5 z

& ?9 w' f7 w: P" ?. t% `5 K/****************************************************************************/" }5 Z) ~  v" B. [" j7 ]
/*                                                                          */6 n2 d' B. _: ]0 c+ e7 q0 J
/*              主函数                                                      */
) a' Z6 U7 |% B' B& o7 D/*                                                                          *// q. b& g5 z# w  Z$ H" J: k
/****************************************************************************/% j$ P0 o. w/ c7 t( `' E  Y
int main(void)
  h/ s4 Y: i9 \{
) o+ l  A4 b; u        // 外设使能配置- [6 B% O% p& a* X% e; A, d
        PSCInit();
; S6 }+ \) a+ C5 U% l1 Y5 C2 e* ]. y
        // 初始化串口终端 使用串口2
3 _+ L1 I: B& W3 v$ j        UARTStdioInit();- ^$ n5 D/ S, b. z: z# y7 R
       
1 @2 p* j6 B: q+ a' k$ D        // GPIO 管脚复用配置
% J, Y+ @+ N" _: C# M2 x        GPIOBankPinMuxSet();
, }8 x+ `/ m) b+ Q
) g* p% [% @! A  ~" v) q5 z. t        // ARM 中断初始化
* i0 Z% g8 e* e        InterruptInit();
, f* m$ K7 S) S2 h' P
) z" \3 T8 O! `& O- ~7 i& x+ |5 T$ P        // PWM 中断初始化
- e& ]( m7 E3 {$ J/ ?/ ]        PWMInterruptInit();
1 U1 L# T8 [2 f& N8 C8 _
' `5 I: x, U7 A+ v        unsigned char i;
0 }  q) W# M% `2 J6 t, _: E: p        unsigned int j;
( z' \3 z; r* a9 J+ E+ y; Y4 d
% i4 w- W9 D* W# D% D' p        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);0 z, a6 O: x  p# A" t- H. s  i/ K
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 r% h- m3 t) t' K# Q# ?/ n  i        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);( b7 c6 a! f+ z5 i( f; F. v+ [0 D. J
        // 产生波形# Z5 `$ J! {6 |; L& M
        PWM1ABasic(25000,50);
7 ~: N  @' D# M: u9 S  q2 k1 J4 C4 I9 H$ `
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);. {/ F0 Z. C8 A
        UARTPuts("------------------------------------------------------------\r\n", -1);" e2 V5 C# `- w. q7 A$ e

4 E" K7 p: M/ Y$ b7 Y  q: q% O8 H) m8 g. X! ^2 Y3 V3 b

9 L6 P3 _5 n4 M$ n, W        UARTPuts("------------------------------------------------------------\r\n", -1);- ?: h  {* G- j- O
        UARTPuts("                    C6748 ECAP Test\r\n", -1);, T( j  _7 S3 a) Y# R) N
        // ECAP 捕获初始化  u! y5 b; a3 R/ W9 G
        ECAPInit();
- j; G$ \' z0 d' Q: k  L  K        UARTPuts("Initialize ECAP.......\r\n",-1);
7 d8 U* r' v! l2 @        for(i=0;i<5;i++)
% z# h; i2 Q! Y! Z% r6 Q& j        {
; p. i( K8 c" y$ Z& m                    for(j=0x00FFFFFF;j>0;j--);            // 延时, S: l1 |) \( r, F* `5 y. T
                    ECAPRead();. E6 M1 O3 T2 B1 k6 o
        }
7 e# Z  w. Q' ^/ B        UARTPuts("\r\n",-1);
# d' d& q& W; {/ r2 v& u# e# U        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
6 q7 y$ N. A3 r1 i8 p# E) U' j1 a+ G        UARTPuts("------------------------------------------------------------\r\n", -1);
# D- y0 ^, }" D! q
$ b2 y3 r' {2 D- Z  n) x' ^        // 主循环
% i+ {' a' G# w5 G. x: Q4 o/ y        for(;;)7 A1 e8 ~* _' O  c- o$ a7 }
        {
) g" N7 W1 U; M3 n  c$ b  L+ O' e$ d( [6 y
        }6 `7 \, M! i) |4 k3 o
}( e! Z. E5 K- Q2 a' F" o

* O1 {. n" j; J2 u4 X/****************************************************************************/
8 z8 d+ Y. U+ I/*                                                                          */% [" o6 ?, [. ~0 c
/*              PSC 初始化                                                  */# A& {2 |4 t# w0 N  `6 k4 ~2 u
/*                                                                          */
) \4 M4 H" W0 }1 }% M; Y* N/****************************************************************************/  ]/ y" t: {5 k  h# {5 P, z
void PSCInit(void)
" h$ ~; g& D. e. m9 f* c) Z2 a) z& z{6 c7 b" L; Y6 V- L
        // 使能  EHRPWM 和 ECAP 模块
+ j8 k7 x8 f" t* `        // 对相应外设模块的使能也可以在 BootLoader 中完成) ]% {2 T4 c& U* P, \+ J4 c
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  u; b" Y4 L) y4 J    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ D. ^$ d4 a, |$ t5 c}( e2 i6 s3 g9 L! D+ g& N3 `
2 t, R# O( }" c8 u5 c6 b+ v3 F
/****************************************************************************/7 Z: {9 e1 O  U1 O# S( L& y7 V
/*                                                                          */
& y, U; x! u1 [; i$ U  q) u/*              GPIO 管脚复用配置                                           *// J" R# K, @1 }' S9 a% C
/*                                                                          */
! \# ?0 \5 m! G1 X/****************************************************************************/5 o4 i# M: C1 U: I& z
void GPIOBankPinMuxSet(void)* j5 k0 X) y) p, ~6 f
{# O. D1 r4 e! M% r
        EHRPWM1PinMuxSetup();: {! b$ A: o" H

: q0 R* R6 S. L! S( q2 k$ C        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)$ y1 v) W5 \2 v% h
        // 作为捕获功能时管脚方向为输入
2 ?2 L6 W) E, x; c  }( x        // 作为辅助脉宽调制时管脚方向为输出
% d& `3 T* C) x! U0 p/ i8 G    // ECAP2 / APWM2' W' x6 o/ ^# q* X1 \
        ECAPPinMuxSetup(2);
1 ]4 H: S* u! P" j+ m0 B9 r1 j2 f. h+ b, B: G0 D5 Z. }+ }
        // ECAP2 / APWM2方向设置为输入
* M0 z6 u( R1 h$ {7 q5 {        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
! \' n9 T( x5 u: _}
* w- ~8 L& ~! j) y- D6 S
6 |. H5 {0 c5 B; F8 X$ s* _, r/****************************************************************************/# M! y. Z: M! j3 s
/*                                                                          */( c( {$ `5 u, l: C
/*              PWM 输出波形                                                */4 Q* s) x0 P. M* @
/*                                                                          */
( X* C1 J. r8 z1 Y4 o$ J/****************************************************************************/
. B* ?# l( q* z: i) |/ p  Y/ Jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 b# r- d0 X  C9 t% V7 k+ k$ s
{# p1 U5 V& r" @% s  z
    // 时间基准配置
' {" d. a9 b$ @& u+ H! w5 f* w    // 时钟配置
% \6 y! M7 ~& E! H: V    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);' |' K  e9 R2 ]! d

+ I; c8 N0 e, `1 d, r* J    // 配置周期
* V0 a3 U: {+ b; T  M    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* M# m! q1 P% N                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 E  j/ N; ^: [# n, l- E  K& H
0 C/ u* a7 O& P$ q    // 禁用输入同步信号) E- g3 R5 J; O, }3 p9 Y/ l
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);. m& p' T+ ]5 o

, N  H% S6 ?( R! B5 c( h    // 禁用输出同步信号
2 z2 D& e2 T+ ^- w3 s    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 d) \- Z8 V/ ^3 ~/ m- l6 X, L, y- F
    // 仿真(DEBUG)模式行为配置' Z) Z: z( A8 M
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);1 A- w, ?' @9 R0 w; A- l; R
& G7 w9 V5 i9 v3 d/ q( ]8 L- y
    // 配置计数比较器子模块
; [4 z7 |' x+ O1 h% L' h    // 加载比较器 A 值% _9 S2 @' q9 i* s& J+ m
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; ?- P8 H' \' Y) Y
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);  l5 C: _; u& _6 \

7 k" c3 `9 ^3 V, p3 q) e1 |" i  o    // 加载比较器 B 值
) [+ n/ z3 T! k- G9 `    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. Y5 d" K" \  ?3 K1 D4 D3 H" t
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# W+ \# d+ C( [$ l& {! F  M

; q1 N( J7 V2 F    // 功能限定配置(输出引脚触发方式设定)
- h8 O6 g  n, z* c4 _/ n4 s    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 A2 _$ P; c) b% \+ x4 u! d    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 Y7 S: }2 w* ~9 ~. m                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 J. Y$ U! R$ Y! E# {( K                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ x* }' ?* q) C" M- J' c% g/ Q% q
1 B+ z0 Z. w8 h5 L" s    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 ?: x% N5 |- U+ m1 Y6 K- B4 x    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 d9 A/ u' X8 ], c7 B# ?2 q2 R$ q0 R! {  |5 v5 [. Q4 R( u
    // 禁用斩波子模块
* o+ G& g0 {( M: `4 T+ {    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 I# v! P7 R0 n6 T9 d$ _" F* L
2 {& s4 t$ Q, g# F' S    // 禁用错误控制事件( U' p! t& H0 }4 J: F9 B* }8 t
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: s# _( c% t1 y) n" c  ~
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);, ~: U) \3 r7 B5 ~) L

; w$ f) M  i+ `    // 事件触发配置
; e+ b% y, _  s& O$ d, p) G" d    // 每三次事件发生产生中断& k$ p, N9 b; x7 s( Q" K- K
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ R) V7 i7 q8 @/ X    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件: G: e8 P: @8 H; p
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);. t+ T* _8 Q: V7 w
    // 使能中断
$ c; C, {- i7 }: i1 @/ f    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);" `, k$ S* L/ l9 ]8 @% j

5 ?5 _! d4 _# S9 P$ E5 @  z* G    // 禁用高精度子模块' @- j5 m: w3 L
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 s9 R5 t  ~" G3 d5 n5 r9 m9 _- W; \$ z, L& Z! ]
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);4 ^- e0 a* P1 ]7 p* r! ]4 l
}* J" H2 ]" }( Z% s# n4 c
% I' }3 x& l7 O2 V
void ChopperWaveform(void)
& L! W& `6 H6 g7 L+ V, L1 U{+ ~* H- C: l) I' t
    // 50% 占空比- E( {  S: z) M+ b
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 M- [, `1 [4 {: X
    // 4 分频
; B! ], G- E& e9 q! h6 l    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);8 u! i- D& A6 B% J+ d
    // 单个脉冲宽度4 w2 @  h% p4 z0 ?, Y; }0 q
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 W# M3 g, C. ~; K    // 使能斩波子模块
  p9 j8 o3 |* v$ I    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 z* o9 x" _. _: h}
# r' k# ~7 g) `* T' i) T8 L7 P1 }8 v/ q$ L
/****************************************************************************/
0 T0 a' y3 K/ @# f+ `# n/*                                                                          */
% E" r3 w5 ]; G4 \8 [3 |/*              PWM 中断初始化                                              */
& w& n8 B' ?8 i) U/*                                                                          */+ c/ N7 }- M1 |% D  R
/****************************************************************************/3 X) ~/ ^5 n5 H6 ]
void PWMInterruptInit(void)( o: k- I" i9 y  E, Q9 \  T
{
, U+ z1 M, x! \: ]6 B& I. i2 E' {( j/ d+ @        // 注册中断服务函数
4 m+ i9 {1 R7 o        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);! P5 |8 c4 \# F0 ]
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 d4 T& s* G" Z7 z" S- c. k; a6 H+ [; `0 Y
        // 映射中断& ], B2 j* b; }- Z1 V
        IntChannelSet(SYS_INT_EHRPWM1, 2);' D' `6 Q' Y/ r
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);% ?  G6 y- l" p' i3 ~; S( z, x- Y
6 d, l1 P. I. j9 w4 \3 t
        // 使能中断& J- c% |( Y4 J* S/ z8 Z
        IntSystemEnable(SYS_INT_EHRPWM1);
- E. N6 p' B" `! t8 k        IntSystemEnable(SYS_INT_EHRPWM1TZ);4 A; V$ b$ h) l
}
6 n/ t/ D$ F  I! f. h% Y, \
' V2 |# Q5 i4 q. P% p+ l5 j/****************************************************************************/
; T. A) j9 v7 P  i- C( c1 ^. h/*                                                                          */
9 Z; i% f- k4 j8 M7 e/ `/*              ARM 中断初始化                                              */
+ h$ e0 |: }  E/*                                                                          */
4 |+ {8 s5 r- r: ?3 ^% j/****************************************************************************/
- A; [& i& l) F2 r: w" Ovoid InterruptInit(void)
) i/ p0 S0 ]& ?- l{
! R7 M' a! N2 M% @, S& r        // 初始化 ARM 中断控制器
5 z( \9 M8 t7 }        IntAINTCInit();
! j7 f5 ?! \8 P* i6 b
5 s' z' j. ]1 W! I! s/ R        // 使能 IRQ(CPSR)
/ h1 F6 m+ U3 h8 X5 q8 \7 F3 `/ o        IntMasterIRQEnable();4 L% d, C* H6 X5 C0 s& K

7 o' `2 M$ d6 E% G6 P        // 使能中断(AINTC GER)
# {# F" P0 w6 M        IntGlobalEnable();# e5 a  K, |; O9 L

) v6 L! j! a* Q# k+ X, c. l3 N/ l        // 使能中断(AINTC HIER)' [. F, l8 h3 {5 ]/ h- r$ D6 ~
        IntIRQEnable();, R; T- M' M  w
}
5 {% Z7 Z3 A  _0 z7 v4 N$ @6 p
; h9 `: L9 l5 a+ `' R% y2 @
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
: b% w3 Z3 X! [6 H  {/*                                                                          */
. P$ D2 p8 ^6 j  K+ S/*              中断服务函数                                                */
! q, Q: g$ x6 g2 R2 @+ {/*                                                                          */
9 F. k2 E6 m$ L/ d3 z- O/****************************************************************************/
/ }$ Z: k' b+ c5 _2 ^" |void PWMEventIsr(void)
4 O7 A7 Z, q9 W- T{( I  C% |! V, A$ R! m+ g5 }! w
        IntSystemStatusClear(SYS_INT_EHRPWM1);
4 B8 u  C2 n8 y* X5 y
, x. t( D, a% t# B) G* S" P    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 ^: e5 M" S0 G+ ~! f}
6 \3 l! A: L" C/ B, c8 e
& X4 Z$ H& {% V% r: |* ?void PWMTZIsr(void)3 A# f- ]% v: ~8 J( O% K
{
6 I8 z! f! S; v* J3 \/ z        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);9 F. g, t  e7 }9 e( L, a( a  G: H% P
0 n- B+ ^7 }/ f
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' n( o5 Y% I6 B}
( H: L% [4 t! c- @9 S) b2 X' W( ~, ?5 }( \7 z
/****************************************************************************/0 N/ x" U3 \# N& ]# E1 M
/*                                                                          */( r! W; h- b  a# J5 s7 D1 g' t- `/ |
/*              初始化捕获模块                                              */
; L8 [0 p. ?& ^* Z, R/ \/*                                                                          */
: e. i# k; H% K" x, j6 C/****************************************************************************/& V8 L; Q  |9 u+ K5 [2 e
void ECAPInit(void)1 n' g: f5 f4 k3 n
{
- E" N; D* \' t        /*-----设置 ECCTL1-----*/
' l1 j6 `) j. _        // 使能CAP寄存器装载
- t* C+ A* `2 E  @3 Z        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. z4 L# A8 t+ p/ z/ c# A- S' g        // 设置预分频值.
; D# V4 T& Z' W+ L* y9 H! R        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# w; s& E4 u0 p( I        // 上升沿触发捕获事件" @7 \: T! k9 t7 z2 }0 \
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);3 e1 d/ R8 W3 I  e! C
        // 输入捕获后重新装载计数器值.
7 s" X% m- i, _) y$ e$ j        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);/ s2 A8 s* d9 a8 U0 O

$ x/ n" o7 J( l        /*-----设置 ECCTL2-----*/
1 i: H' F# t& W3 P- O" n5 ]% H        // 连续模式
! x$ L5 `; p) M        ECAPContinousModeConfig(SOC_ECAP_2_REGS);- \( Z& d- l$ k* d* P1 v
        // ECAP计数器TSCTR持续计数( P- x; i. R. S9 p" E" l, E
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 ^+ |2 e$ j; \; m/ U2 k        // 禁用同步输出和同步输入
+ i! G( q! Z; L9 U1 i; G' w% y# R, Y        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 G/ J9 c' `+ r( ?$ W" g5 q8 z        // 配置 ECAP 2 为 CAPTURE 模式
5 w: x. I8 K. w/ k3 e        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);( H; \& ^2 ]1 U& V8 b+ W, |' n
( Q& U+ ^8 e2 K+ j4 d2 S" z
        // 使能中断
9 Q$ j. y  K5 p- C8 i//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, X# h0 \& T, Y* ~6 i  N( O# b9 F( }9 F  O: Z}
/ b7 s, n& X2 [' k( `0 \4 g
. I* k6 L: Y. c8 X/****************************************************************************/* z& ^6 \4 ^; B* a" w! [) d8 W- b
/*                                                                          */
7 _4 ^! j0 k. \8 g/ P/*              取得捕获结果                                                */9 {6 ~- y8 P+ C# Q, Y& q' I
/*                                                                          */
9 z- g- J. U4 E7 l0 L! c/ ?( B/****************************************************************************/" D& ?. s5 q. c' ~1 [# P0 O1 D: W
unsigned int ECAPRead(void)
4 o# u7 m9 q3 d, q# H0 ^$ w/ z$ e& f{
! K" ]! F! P9 I/ V3 Z; h3 A& ^+ S& V        unsigned int capvalue;
7 D" {' |& N" a# d; c( ]( q% g        unsigned long frequency;
. L9 t. c- e: U! m" O7 b2 N5 _* B9 \& \$ D- y9 s
        // Event1 中断标志/ _& P0 N. S4 }# m9 }8 v0 ]+ Z$ G6 r% O
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
+ c' l5 \( Q) u. _# L        {& M, J4 |7 C2 U
                // 取得捕获计数1 y3 _$ b2 e* k9 p
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( S5 k0 \  T5 W% A. |# h                capvalue = ECAPResult.cap1;. B: @& o, k! ]

0 g, B$ ^& u6 K& Q% d                // CAPTRUE 模块 228M 时钟主频
9 ?# ~6 }" j/ t4 b' y                frequency  =  228000000/capvalue;1 S( C( i% [8 m! B8 W1 [
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ ]5 }9 e* ^9 t& ?$ x2 [
8 V4 B+ Y% _0 N8 w                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 H4 Z. r8 U; p3 I; l//                IntEventClear(SYS_INT_ECAP2);
! ]3 H) `$ Z7 N# N        }
* i  O# E' x! b2 j* f  Q        return frequency;* S9 J4 s9 ~; _% `' i0 ~
}% p" _9 Y$ C. F, C& Z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Y2 k2 P7 j$ S- k, R) W[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