嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家7 D( n. L" @( ~) F! k3 b- b4 L$ x

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  N" v, U; a2 t( X7 W- S  i
/*                                                                          */
( G& t, x8 I% j( r$ d& _3 k/*              宏定义                                                      */: o9 M+ _, b$ d  f& O0 B: k
/*                                                                          */7 l' i5 [. L2 ]8 X% u
/****************************************************************************/7 L# l5 `! d# b2 S' z0 b* c: g* a
// 软件断点6 s( o: [) M9 ~( p) q3 N: K& L) y
#define SW_BREAKPOINT     asm(" SWBP 0 ");
( I' k# ~% D( |, V% {0 S( X2 T* a1 j3 y- c& N
// 时钟分频2 B, t& k+ b, ~1 s' B6 U) k" Q1 R
#define CLOCK_DIV_VAL     228
5 X2 \% x* K( }% y/ \1 h- I$ W/ c  ?3 c' j5 I$ `; M& L5 ^3 V
/****************************************************************************/
' x) Q6 {) T8 r; N* t2 D/*                                                                          */+ F% D6 V8 ^. a# u$ \4 ]0 f
/*              全局变量                                                    *// M6 {$ g" j* P5 B
/*                                                                          */
# f4 A3 I, W/ t2 y7 e. r' \/****************************************************************************/2 K! w2 n* Q! W( z1 }! _
ECAPCONTEXT ECAPResult;2 I3 t8 z, Q7 c8 ^6 Z. [

, B! [0 C' f$ p5 a9 g% V/****************************************************************************/2 R* r% O, i0 l  y. R
/*                                                                          */) c, ~0 t" I0 r6 Y0 D
/*              函数声明                                                    */
0 G4 U7 a6 n+ R- G& `& E! X/*                                                                          */3 h2 \# q6 F! S
/****************************************************************************/
$ y6 \  O$ Q" x# o// 外设使能配置: m: x, e2 @% _8 o: e
void PSCInit(void);
; M2 x% F# \( z) k
) E2 `1 j  ]. T' c4 F  s// GPIO 管脚复用配置% O3 |% p3 k& }9 w) {3 M) b
void GPIOBankPinMuxSet();
3 U' u/ e# i4 p# F( U5 e2 ]) z' \9 n. r9 {3 z* u. d- w9 ^. F+ b
// 产生波形
$ `: w( l5 L6 J1 f* w2 Z  a, Avoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 A" @( j3 M8 t1 o' `( w; u) u
void ChopperWaveform(void);* F$ A% e" G1 d# B; Z
$ g, G3 g3 x+ j+ X  f  D
// ECAP初始化和读函数& e& ^9 ?; V, A; G1 }
void ECAPInit(void);
$ L& ~! I# U0 f: vunsigned int ECAPRead(void);0 ]9 s$ X+ k! r8 P9 K
7 D% j' n4 T" ?" _% x/ O" }; t
//ARM 中断初始化/ v1 R6 q4 \' E7 E
void InterruptInit(void);1 U* _* W$ P" B5 V& W% x; T% \
6 I2 i' n# M7 d" y! L+ M4 ?
// PWM 中断初始化
2 \& @5 }0 y+ vvoid PWMInterruptInit(void);. }. K% n9 O. g, t7 ]
// 中断服务函数6 t1 ^. j* ~* L, K+ o
// PWM 事件
! E0 O6 C, N- `* Y1 \/ ^9 Fvoid PWMEventIsr(void);, D4 d$ ]9 q; t' F) i* @# c- a
// PWM 错误控制事件
7 @# @! t+ U. c, }! y! [  w, avoid PWMTZIsr(void);+ s5 r: g5 _6 F  f" T( M  Y

7 {6 K  P) [' I/****************************************************************************/4 `; y& M( i1 _; U( S
/*                                                                          */
0 M$ S% \1 [$ Z; f8 R5 n/*              主函数                                                      */: ?  b) X. L$ N7 H" S
/*                                                                          */
: n2 J2 I9 v& k! }7 T" n6 v/****************************************************************************/
( B1 t1 J+ v* l! N: S- D: q1 Aint main(void); l* w1 t. w! z& K1 O: k6 a/ ]' D
{
* N3 |. O' y* w; }* K. Q/ c        // 外设使能配置
- u' @' H* b1 B5 N' W        PSCInit();& g* d! q' N5 ]( |. c8 w

3 R& `& O5 d0 Y4 K$ ~        // 初始化串口终端 使用串口2
' x+ x! \+ ^( p$ X        UARTStdioInit();
9 n4 C% J* b2 U( Q. j( Q" r3 b4 x        $ y) f* K6 c' g! |) I
        // GPIO 管脚复用配置
  i1 a, y4 k( N" G3 x  V        GPIOBankPinMuxSet();
% h+ q9 K9 `7 r0 ~% h! a9 q' x) T% O: X" V2 t) S9 G) Q
        // ARM 中断初始化
$ d  G2 d8 e2 `# R8 w; G        InterruptInit();
. s' K) G" a8 ]6 Q7 T6 R+ U0 h3 E6 o2 Q9 h! G' t9 C
        // PWM 中断初始化
/ {9 B6 S( N; B: [7 z& s  {        PWMInterruptInit();4 Q6 D( Q3 n2 C( [' J

" y) h1 |& ~, S% M        unsigned char i;# {2 D, A$ t% V) f! U! U
        unsigned int j;8 ]7 e2 c6 ^% i
/ O& B5 W9 y0 a3 H/ ?  I
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);/ Z0 A5 D& L$ D1 i3 y
        UARTPuts("------------------------------------------------------------\r\n", -1);
+ N, `, b8 I: G( _! e        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);* V; U! R( s# D: X6 u: S6 Y
        // 产生波形% P7 t  {- W3 I; x& C
        PWM1ABasic(25000,50);
( l8 l* V4 s- S7 t1 r$ r. E$ b. _0 ]  U% m- U! t" b
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
$ B3 N3 N0 a) d4 ^        UARTPuts("------------------------------------------------------------\r\n", -1);
7 f+ {5 N/ Y* `1 l6 N. e' C+ Z1 @. @* j/ G; X

% N2 e3 T9 V& B: n6 ]( O) w$ V$ Z
, z) a" Q' N7 Y" z/ `8 |. G        UARTPuts("------------------------------------------------------------\r\n", -1);5 ]3 X; d1 v* E5 U4 W5 C
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
$ l$ f0 q' i" |6 B( l9 C5 F        // ECAP 捕获初始化
) m; r6 }; g( Z        ECAPInit();* P7 X5 I9 Q( S7 R3 m
        UARTPuts("Initialize ECAP.......\r\n",-1);
' B+ w9 C8 ^4 E: [7 S. E# r        for(i=0;i<5;i++)
, k& D3 Z: M" N* J% g, ^        {7 d  y' i% X* j7 Y4 e% K* {
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
, s2 F. ?. b) N$ K6 ]                    ECAPRead();
& G. d4 Q! I- w: A. P; N        }
: P* e+ X; q3 ?7 n5 X: v        UARTPuts("\r\n",-1);' z8 Y: D  ?9 G2 ?
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
/ q1 O) i" [: j0 \& X        UARTPuts("------------------------------------------------------------\r\n", -1);, `- {: v2 S: b) k+ q

' W. j, c8 \# Q: \3 A4 J$ h9 i        // 主循环" W: Q+ Y5 J& T9 p( c3 ~
        for(;;)% \* C4 j5 ^! c( Y2 S/ h
        {- ?9 g7 g. _) c- V2 [# z
7 w4 y# }- @0 F6 U
        }6 p/ T: X5 V' Y0 M+ T
}
* J8 {$ l0 I  u# W9 _% |7 I' P* I% c2 }9 y+ f0 ?
/****************************************************************************/
$ J. `2 p, j" q. l! i# p' p/*                                                                          */
, m% Q/ A6 g! H# d/*              PSC 初始化                                                  */
$ T% O2 ^1 H" |2 O/*                                                                          */
0 s2 G0 u4 V" |5 V& r8 D! ?' X. u/****************************************************************************/
2 E- V. ?' W! r6 Y) Dvoid PSCInit(void)
2 F# ?* }, w# q7 x$ D+ q' y8 M6 c{3 G' ]6 o6 ?! c# q6 g
        // 使能  EHRPWM 和 ECAP 模块: d+ `% @( S- L
        // 对相应外设模块的使能也可以在 BootLoader 中完成1 s4 o& b. Z2 a, Z
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( c1 v& ?1 j9 Q4 {( h, {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 r* ^9 U  E' _  x}+ O5 }( v) M0 G8 P6 ]

: N4 N/ f  e& F/****************************************************************************/
+ H3 [/ v$ [% `9 @9 N4 b# i2 `# g$ Y$ o/*                                                                          */2 O. y& i+ O- S+ [% s: I3 f
/*              GPIO 管脚复用配置                                           */; B) d, G, G* ~- n( ^( C
/*                                                                          */
/ u3 L5 W5 Y+ o: p5 j8 q! {' C/****************************************************************************/
6 V, G" `# h. P& ?. [) Ovoid GPIOBankPinMuxSet(void)
* w6 y6 u, M5 R. t$ X( W. ]{& X4 b/ S  K2 K+ ?* z2 ]  S
        EHRPWM1PinMuxSetup();1 d2 U  G/ R2 r5 y# F: i
" R1 _4 G3 y& J. X8 s. I6 @
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 H& i* e% P' V! z. Z& m: y        // 作为捕获功能时管脚方向为输入8 U- {* U# G# U* B' v' q/ S: t
        // 作为辅助脉宽调制时管脚方向为输出9 y" A, L8 B/ z: v) `
    // ECAP2 / APWM2
$ }3 I7 S$ S0 y9 G# l% X$ m        ECAPPinMuxSetup(2);0 Y4 g+ I$ W7 s/ i9 k
& I, Z& J/ j9 g' J7 J
        // ECAP2 / APWM2方向设置为输入3 n; t) o; |5 u' X2 X
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]" L6 d7 i* S( y  L
}- K. e2 Y+ r2 N5 ^" `/ S( d6 e
4 v2 {, A) N0 `0 {% E$ Z9 C; I
/****************************************************************************/
6 y4 u* u! F/ x% n4 U2 r1 m/ a2 N/*                                                                          */% E( y6 D; v+ Z% j3 v8 u- ^
/*              PWM 输出波形                                                */' n) ?! @# v! w2 f( l; r
/*                                                                          */
1 C0 N2 T. r; v6 M0 Y/****************************************************************************/
" k6 L8 f( d8 J* H, u5 Z( r& evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)# B1 {, E1 a- u# l: o7 s
{9 V3 N% P  Q# K: g
    // 时间基准配置& V) G/ g7 x& w3 d
    // 时钟配置
* F) ]( D5 y1 X0 L+ ~' Q    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- l7 O( R3 \6 ?; }* {$ v! I
2 G+ {& o+ z; j. k1 w( [: S    // 配置周期
2 w5 N5 s, b) R    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,) p* s( t3 W! f  V: G
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);3 y" ?" H. [/ O& w" k
# }5 ?: R) w5 t. p/ Q. C8 m
    // 禁用输入同步信号* f4 f+ t$ B, _6 W2 r
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; ]7 _( y5 |" ^
; q; w0 d5 w. n5 W3 p    // 禁用输出同步信号
! q* P9 a) P7 A3 o2 D8 v/ c8 ?    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) L6 W! ~% }6 S0 A" H+ u/ x: e# n6 U9 t$ O! y2 e; A, ~
    // 仿真(DEBUG)模式行为配置
: ~. b9 E! y# I6 P8 [2 B* {    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- I* ]8 U1 L' F( w' _8 v6 d
$ R7 [; k0 B9 X6 x, r    // 配置计数比较器子模块
0 h/ r* A0 ?  W    // 加载比较器 A 值4 E3 U$ g# J) _- }! |- O$ b
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,: \/ t0 z6 E3 a
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 d9 f7 D. X9 c8 D% n
, R  _$ z, y( A3 h3 y
    // 加载比较器 B 值' W6 U: c" t! ~7 l$ k5 l
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 ^% B# n, Q- i  _2 Y                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 m7 F7 j- ?2 m+ t3 i+ y' r. B; G& r$ t
    // 功能限定配置(输出引脚触发方式设定)
! I* e8 W% V. r" u3 _    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出. W5 _" j& j! F# o$ O
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: i) o2 J  r" x1 _5 I* P
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
& U# w/ S1 k9 Q' I3 Z7 s: G8 X                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 A  ^3 ^5 x) p; J6 ~/ U
" _; p$ H+ ]* {6 o5 p& l    // 禁用(旁路,信号直接输出到斩波子模块)死区模块: j8 l1 I  [! j& j. a
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);0 q; K0 Z4 O! [7 T6 ~
) M% \9 e- d) G+ {3 P
    // 禁用斩波子模块) _" I- q5 U* l' Z0 t
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);  c( x& d& S1 X) z/ Z0 Q4 C

8 L& K8 ?: _5 V% }; G7 w. b    // 禁用错误控制事件
9 ?+ ^$ L! b8 T1 O8 v    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. c5 i! _) O* d8 n    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ E5 h: @9 e) S& y1 B( K6 t% e4 [( H' i9 b
    // 事件触发配置
3 f# x$ `, {! V! }! C3 C3 v4 W    // 每三次事件发生产生中断
) i, y/ r5 U' j    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);/ |6 |1 l* D# B2 ^% O) d* b
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, b. X; c& Q- @" W1 _    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
9 m$ @- ?7 U! J: c/ g7 c5 @3 \    // 使能中断% E: \; j( A- _* d
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" f8 v6 X/ y7 ]% Z
0 l, H7 M$ O: m7 ]. c    // 禁用高精度子模块
1 H- U& P; o, _! \    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);8 x! V0 m6 d. u3 u8 h
5 ~3 m' j3 v6 Z5 G2 D: E5 ~0 o
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 b. L6 k1 P0 t7 O6 s}2 |1 C1 a. ^5 S1 k3 ^
7 J+ Y& g; Q/ |4 o7 d
void ChopperWaveform(void)
! [7 S# t0 H; W( D{
! ?2 E0 s: ^: H% P" r    // 50% 占空比+ ~7 n3 I1 }" N4 L4 a
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 z: a& {% f8 O    // 4 分频; N; x! ^  k1 a5 ]8 u0 u# h
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
7 J: J  W& o8 i2 e2 R    // 单个脉冲宽度
, a4 ?+ F5 K, A    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
" X, D. i+ l0 f! F    // 使能斩波子模块
- p. V) ^% K: s7 r: B    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 ]. d; e, C9 P* q6 x}( O* b) G5 j! H5 m* x
4 V' |: R; ]) p. ]
/****************************************************************************/) C  @: N6 C5 L. v* a* ?0 \' Y
/*                                                                          */3 S, i3 U& J9 x" B$ z6 n$ e
/*              PWM 中断初始化                                              */
- r/ u9 O# ?7 ~, I3 K  ~/*                                                                          */
! F+ d; V. E( o, G/****************************************************************************/
8 i; c( T. _, C0 l2 ~( s  Evoid PWMInterruptInit(void)
" h9 R. b0 I8 j# J: R{
! ~2 |; w: U2 u8 \2 m( w% R* G$ w' ]" Z        // 注册中断服务函数! r: s  ]5 S1 W) _0 W. \* l! q2 [
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
" p1 b4 n, x& i" Z! s0 \        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
' N7 c4 L4 O% ]( ?* p+ C  E+ I6 I" n; Y. B4 Q9 C
        // 映射中断; o- F5 w2 h' X! z( ^
        IntChannelSet(SYS_INT_EHRPWM1, 2);2 u9 V! y( ~. y
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
, d8 l2 X& `  W  G( E6 F+ L' j2 {4 h# C5 j, j( B! Y  c
        // 使能中断! M' t; R5 t1 A! S) V: P. A
        IntSystemEnable(SYS_INT_EHRPWM1);
: p7 c$ [* u+ C8 d6 d        IntSystemEnable(SYS_INT_EHRPWM1TZ);( O" q6 O8 L; V, j9 j% @( {7 N
}
4 h/ A9 b) U9 O  s- V! F" _5 m
( `2 z2 y! f0 s/****************************************************************************/. R! R- D! S5 _& F; P) X  T
/*                                                                          */
8 ~0 e$ h/ w, t0 B' o9 i# t% t$ \/*              ARM 中断初始化                                              */
- s& x1 v& L6 g! c/*                                                                          */
% X0 r: x+ N% [/****************************************************************************/" O% a$ H% L5 H3 g9 z, N
void InterruptInit(void)* L! o! H7 C. T
{* s# ^: F0 `- Y- L
        // 初始化 ARM 中断控制器
! ]( _* \5 i" r1 f        IntAINTCInit();8 f% ?: {! N: I, l

: N: m, f- u: ^9 b0 v' j9 b        // 使能 IRQ(CPSR)
; F" N8 W1 n; h        IntMasterIRQEnable();: \! k) D8 u; `$ l9 `3 R
6 v$ l9 f# K' N. ^) F+ ?
        // 使能中断(AINTC GER)
7 ~: p$ D- ]) u7 g        IntGlobalEnable();$ a4 U# O" g' X2 e9 Y- S8 l9 r

- C3 A( ?. S, k0 i  f5 W+ P( s        // 使能中断(AINTC HIER)
! [2 E9 h3 F( I* g, K3 O/ q        IntIRQEnable();
: u& f4 z5 W" l: b6 X9 J}
5 _" @9 Y2 I6 @" ~( o7 K, n3 i
! L$ f8 I0 K$ T- F" Q+ G
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/: P  R! b7 I) s7 {: B# S
/*                                                                          */
4 K5 i; O% V& y! W; I/*              中断服务函数                                                */! b, W. G( e( W0 s
/*                                                                          */
5 D6 n% N' ?* h: \/****************************************************************************/& K+ A3 o8 A( o% z. A4 k
void PWMEventIsr(void)
1 @% e3 ?) K: z9 d* w{
4 e3 G! |6 q' u9 y7 [' ?        IntSystemStatusClear(SYS_INT_EHRPWM1);* W3 S# ?4 o$ b" R5 d

1 v, A* I4 i% x; z    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
9 r9 u5 R5 g  J, g}+ V( R$ K8 a. C$ @+ [: j) U
! `/ M: Z6 a, g( j* P
void PWMTZIsr(void)# y% Y8 s: b- U7 D* B6 G$ [0 e
{3 Q9 z! R1 c6 w8 g3 r2 i+ R
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);) y. {) w# G0 F9 H+ b
  }) o' Z2 c/ i' B
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);- I& y$ U% x/ l
}
: w* C& d% ]- g3 Y8 M
4 ~3 D2 q3 C5 D7 _9 _# y- i. f$ |/****************************************************************************/1 X3 h' z: x5 P
/*                                                                          */2 W7 D  J% n7 l3 `
/*              初始化捕获模块                                              */6 K6 G" a- E- ?& s: C
/*                                                                          */
3 R; N$ x* n% u' H- M4 _/****************************************************************************/3 J. h8 ?2 K: t* V
void ECAPInit(void)3 j1 b& L$ N6 K$ q
{$ g1 ^% b/ W4 [8 V1 `$ B, n
        /*-----设置 ECCTL1-----*/
( j3 @# N# H1 E8 [) X& p0 O        // 使能CAP寄存器装载
& h3 A0 Q' r1 J        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. g. Y+ j1 C* P% w4 t" x        // 设置预分频值.
7 I3 K* k- `6 `" I+ [( t        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 X- H# _/ ?; G        // 上升沿触发捕获事件
8 c6 {5 C4 f' q8 _' t( l  p        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);% I/ Z: I" k; Z
        // 输入捕获后重新装载计数器值.
7 q: ?0 w% P/ ~3 Z        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 W& y' S! C' D3 z
9 L3 e9 i  a) \# Y4 [5 C4 r        /*-----设置 ECCTL2-----*/# W( ?1 W/ \8 {* d( `# F! Q
        // 连续模式% I% X, v* n! I) O0 c) e7 O  x
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);0 d8 G1 p& L# h0 X+ ^2 k$ B9 q+ D
        // ECAP计数器TSCTR持续计数
. @- a- y3 n$ ^        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
, z  f& R6 T- U8 O% K9 H  e& {        // 禁用同步输出和同步输入! v- m/ H9 p+ M. P4 J
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 X& P( D: p0 v8 ^" |7 F# ^        // 配置 ECAP 2 为 CAPTURE 模式
0 x. D* D( c: a0 j, A7 ?* n6 l        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ V: f) l1 X: u" R8 Z/ {$ ^( {# ~* ^8 r6 y+ o, z& ~& A  G$ G0 [
        // 使能中断% ]- O) n2 o$ |! ^" x+ b# z1 o2 R
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);3 y  R+ B% q) ~- z
}
0 L5 F' ~$ m8 b0 |/ b8 {: ]5 c  f+ M& ^8 d
/****************************************************************************/
! c/ f6 y" p# z4 `/*                                                                          */9 O7 l8 G+ Y; x  F7 d4 o
/*              取得捕获结果                                                */" e6 s: V; b2 i1 X2 u
/*                                                                          */6 i: z/ \' @/ {
/****************************************************************************/
4 e+ c7 p% y7 d# t% }4 T3 a, }unsigned int ECAPRead(void)
9 l' x8 L0 P9 ?( @# b* Q{3 x5 N. u0 l1 y# _. f  E
        unsigned int capvalue;
9 D+ }; E& z7 J! u        unsigned long frequency;
; A* }9 H2 N* m, {+ V$ L- o. ~0 R* p' i9 f
        // Event1 中断标志& t) d) L4 m. G7 z  c2 Q' [8 r
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))& l6 J5 w; {/ o
        {* W/ \, B; W2 L
                // 取得捕获计数" ?4 M2 n2 o! A8 j
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);1 A2 h; o  \  g" e
                capvalue = ECAPResult.cap1;( ~8 N: K1 f- i4 k6 F8 y' S% g

6 |! u9 Z6 p8 f! \                // CAPTRUE 模块 228M 时钟主频
5 A8 V# G- q- c6 i5 O0 t/ I                frequency  =  228000000/capvalue;4 n  c/ h6 O3 n7 C" E$ Q; p
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 n5 ~+ e5 M( _8 h, D) Q# G$ [
* O( g: z3 G* Y  z! a* F! m0 I
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);% U( W+ ?  o  r5 v
//                IntEventClear(SYS_INT_ECAP2);
8 ^1 {( j8 L  j8 H2 k3 X6 ]        }! a9 @6 p# x: S5 C( ]
        return frequency;9 }1 H9 R7 a# E2 D: l( |# V) Y
}
3 Y* ~& Y/ Z+ i8 R0 V
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。  i+ l( n$ ?' Y! H( f8 j
[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