嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& w2 P2 k1 @+ _% x7 Z0 }  Q( r
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/) t  r+ p, d, Q2 y, t: w  z, t
/*                                                                          */
$ Q# y! w7 u6 {$ F7 |: v. K/*              宏定义                                                      */7 y7 m: f( c" o7 `0 V' [
/*                                                                          */
' t& h2 ~3 s6 W: U% q& N1 M/****************************************************************************/
6 d# q; V+ v- p: ]- x( t% U8 O// 软件断点
, V, F7 j8 l' f" }- y#define SW_BREAKPOINT     asm(" SWBP 0 ");
% G% F( S& R( v! O
) F6 I" A7 ]& b& z! Z// 时钟分频5 Z& n7 N! x6 H0 |- M! s% H
#define CLOCK_DIV_VAL     228, ~& B8 N# x( k9 ~
! R7 v8 ^/ e/ f% ~. U; Q+ v7 M! U
/****************************************************************************/
5 \3 ?% t+ v1 Q7 y/*                                                                          */3 e, `8 _! J# A/ A1 V0 c/ q" ]
/*              全局变量                                                    */5 C2 E& g2 d0 a' k
/*                                                                          */
2 Q2 g5 A/ C& p8 ~/ T! d( s9 n/****************************************************************************/
: r8 M1 ^& V$ t! x3 z5 X. TECAPCONTEXT ECAPResult;
0 G6 B6 \" W: S/ ?  K% p, N% s& G% J. E( ?8 u' D
/****************************************************************************/
  q; C4 m* @* C2 I4 v: Y& a/*                                                                          */
9 a/ B! S1 E" t6 R/*              函数声明                                                    */
/ Y; o; w1 }9 ?/*                                                                          */
- ?- t8 I) K) P% {/****************************************************************************/
5 a6 e$ M2 [3 N// 外设使能配置2 V  x( S5 J4 i
void PSCInit(void);- R5 F; g9 d9 e8 y! }# i

5 m* S( C" G4 b7 s4 B: `// GPIO 管脚复用配置
4 s9 c1 [' f6 V% T# B: m2 Uvoid GPIOBankPinMuxSet();
4 M1 p. V' q: I/ s) a7 O2 _& E  I' D' n' C6 L3 L4 y
// 产生波形5 U0 Q9 {$ _4 x, [# C1 P! X' {
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);4 g: x% Q$ S' y' T- Y
void ChopperWaveform(void);
; ?& y$ L" `+ P# Z: v
5 I+ l$ ^. u0 s$ V+ D6 {// ECAP初始化和读函数
, X8 T( d$ D1 \void ECAPInit(void);
6 b! ]5 S& t) z4 Y7 f# zunsigned int ECAPRead(void);9 u% b3 Y- R6 ]9 B; f
4 ]+ C# v: f: B/ |) q9 X! G7 s
//ARM 中断初始化
: b: P! r$ `1 }$ k" g  Kvoid InterruptInit(void);. A. ^4 K' ]8 I( D: b  F
, z+ k' P! u" D' }% g$ k% Z, S
// PWM 中断初始化
, N" R, J5 r: J( D4 H& Yvoid PWMInterruptInit(void);
) L* A; ]' _  W& b1 E1 V) H/ R// 中断服务函数
* n- {, L9 F; ^5 h// PWM 事件2 w. A; s* V" R+ |- _- S' |. U
void PWMEventIsr(void);
, C% s# D1 [- Y* q; f7 |// PWM 错误控制事件
$ l& @5 O# A* j: {/ Pvoid PWMTZIsr(void);2 a- m) i7 h6 y" ]! T  m( w

# [# u" |2 z( X' }2 c7 n1 K( }/****************************************************************************/# [! C9 E3 S2 D
/*                                                                          */# Y1 _, }+ _8 `
/*              主函数                                                      */
" h6 y9 B4 L; Y/*                                                                          */
3 s( O2 G; D' C3 r9 y/****************************************************************************/1 c0 W% C2 j  M. u
int main(void)& z( d+ r/ w0 s
{, f+ R% B3 f* S! H
        // 外设使能配置- a: ^) D% U* `
        PSCInit();& {$ ]# K7 z5 L7 q8 e& v: ]
1 K) H# p+ v7 w
        // 初始化串口终端 使用串口27 x0 W" g2 ~9 {+ ^0 a9 D. {
        UARTStdioInit();9 f0 V7 J4 ^" S3 b
       
+ c8 j% K* A3 r1 @2 ~6 @) ~7 C        // GPIO 管脚复用配置
2 q' U" _) M# P$ ~" t        GPIOBankPinMuxSet();3 i9 Z  M& ^" V% }, I" T* T

- m0 B0 ?% I! H) ?+ |7 t        // ARM 中断初始化: ^% i& E9 c- N2 I# h3 b) C* A, Z0 V
        InterruptInit();# A# L6 y3 x$ x- K" \9 B' r: Z% R
1 R' K0 w+ W9 H
        // PWM 中断初始化
# U2 t2 `! h) b1 O/ A        PWMInterruptInit();
5 `: G4 J2 {  ?
5 b! K. g% ?; A% _4 s        unsigned char i;7 A# g( O$ Q6 r  U8 y8 G& U3 p0 z
        unsigned int j;5 _3 ~5 z0 y+ h) r3 R

5 B" ?- a; t. D/ }- E% k4 L        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
% g. U: c! h( a7 l/ I* A! E3 }        UARTPuts("------------------------------------------------------------\r\n", -1);
3 @7 O  k9 w3 F6 I7 U) [        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ c* Z4 r! D( Y: L0 R6 O$ Y% }3 ~        // 产生波形
6 ^8 U8 ~1 Y& G* F3 D        PWM1ABasic(25000,50);; E3 S1 A8 X; y7 `4 ^
' `7 l3 \% h4 d7 u6 {% t! U
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);6 _6 |* \3 G9 H6 \+ b
        UARTPuts("------------------------------------------------------------\r\n", -1);, {: I0 p+ T0 U) O" j
2 \* S2 I; r& v% A
4 F6 j( y- x/ x2 P4 x3 {2 B

2 W1 a9 i! i3 b& y/ F' j( Y' d" C        UARTPuts("------------------------------------------------------------\r\n", -1);2 k* L! K4 m  r% w: A
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
" a8 d+ Y/ m# V        // ECAP 捕获初始化
1 M) q0 F$ e3 A6 r$ E0 B$ l        ECAPInit();* K4 W) q& N* u
        UARTPuts("Initialize ECAP.......\r\n",-1);
0 c$ B3 g0 x3 y8 A  P0 X        for(i=0;i<5;i++)$ i( @$ S5 K1 k; ]% s9 q, T
        {
& Y% V! u7 T$ [1 o$ R6 m+ ?                    for(j=0x00FFFFFF;j>0;j--);            // 延时& u2 J- ]& s4 z4 Q8 R
                    ECAPRead();8 e) V8 e# E) {, V  V' J
        }
& W; g2 g1 Y& }$ d: [2 v+ j        UARTPuts("\r\n",-1);
; M; T$ s4 t, f" Q+ c        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
: f& Q: J4 ]/ @7 s$ o+ e$ o        UARTPuts("------------------------------------------------------------\r\n", -1);9 \& j+ I; R1 b# a

4 w& X3 D2 W1 P6 ^" d3 X, A        // 主循环/ ^/ ?" k; m) a5 c6 j& q3 E7 R! c+ V  m
        for(;;)
8 w0 [5 D3 Q6 i7 g+ i" R9 n+ o        {
6 k2 D0 B3 j! R$ _$ d" x9 x
( ?, T# m$ G, u$ m        }: A9 B0 k" N3 ]) y  P/ Q/ h
}7 _2 u5 |$ w( m9 M5 f! ]
3 ~8 u0 S3 t3 f! [+ l
/****************************************************************************/
; h8 U. t0 r7 }/ z1 ^1 ~/*                                                                          */$ Q$ S3 A, g: i; O) |( d# x
/*              PSC 初始化                                                  */
) Q; E+ i! V+ y. V/*                                                                          */
" B0 Q) K1 e: r! _$ N/****************************************************************************/
4 F  y8 A3 s# F4 gvoid PSCInit(void)9 [- F6 x% g1 E+ B% i
{& }: ?/ q( p9 `; a' A+ _
        // 使能  EHRPWM 和 ECAP 模块
  h* O) N$ E6 j0 S/ Z        // 对相应外设模块的使能也可以在 BootLoader 中完成
9 k3 U* [% _; {- t; }    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: z) G8 \. P) W3 B0 v; V1 V. z8 }    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" {2 g+ E: Z# i3 l8 D5 }9 ?  H8 n
}( A! X+ N& ~! h9 S0 Z% W% d6 h

3 F0 ^4 a9 N2 @, r( @* B/****************************************************************************/: }0 @* K& f" f+ r7 G
/*                                                                          */
& E- {/ S( p% s# V1 I; m' s/*              GPIO 管脚复用配置                                           */" V$ S6 {- n3 s( R, d" S3 W& t* F
/*                                                                          */$ M1 U) a4 J) ^% `5 E3 B& A) g
/****************************************************************************/
7 ^8 E% h) f+ `/ u+ Hvoid GPIOBankPinMuxSet(void)
4 d3 Y% z7 v8 `& [& F/ f0 ]{: A" Z! w2 G7 {/ F
        EHRPWM1PinMuxSetup();
* e% Q. E4 e$ _* P8 L9 X2 I  V- }" z! Y7 `/ K& B, L1 P" ]
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP), q7 y7 J( P& E! v7 {7 R$ z( H1 C
        // 作为捕获功能时管脚方向为输入
0 G5 X! E9 t' D2 j- g# y' J( ?        // 作为辅助脉宽调制时管脚方向为输出# y; m( d0 h+ M: d- H" H
    // ECAP2 / APWM2& ]& D; M. b3 t  ]( ]
        ECAPPinMuxSetup(2);0 c" `6 r, z0 H

. R* t3 y8 l/ H5 T: P& C) w$ H        // ECAP2 / APWM2方向设置为输入. h; `+ @: J2 x5 }/ U* e+ s
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]1 K2 `; F* y$ B% a& X
}8 ~4 _* d+ Y: q: ^. ?% k' ?/ ]

$ T% Q  [( P6 Q/****************************************************************************/
, \$ Y% h9 P% S; z/*                                                                          */- |! w0 O) X9 h; O4 Y
/*              PWM 输出波形                                                */
5 c) O6 X$ L6 H! E& D/*                                                                          */, g8 o: i3 d6 E9 H, i8 s! [+ u8 i+ O
/****************************************************************************/
# \2 Z8 h. `  o" |  `void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
7 k( |: R7 N5 U9 M+ ?. b{
3 ~5 K3 |/ S3 `$ j3 f4 @. d2 N    // 时间基准配置" D2 E. A! W& W$ h  p6 d7 G
    // 时钟配置; V1 k: E- u1 q' k& T% i
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);/ s; N/ }; `4 C& R7 P7 a

9 ^6 Y% a) A& Q. Z7 F    // 配置周期, M$ `& x5 ^; X$ D- f
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! v- P" b* \7 j& b                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);( G1 g& S$ t% G/ R  E) E

" b9 Z9 _( t9 I3 k' m6 `9 p    // 禁用输入同步信号
* |/ E8 f+ o3 y. U$ J7 u    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 r& D% s3 g2 b6 g8 Y/ l7 ~6 N

/ s, [/ }. j! X9 S+ O+ p    // 禁用输出同步信号/ \* J+ i, h. x
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);1 H: f4 M, e2 W3 u- _$ W
! t8 u& h) E) q1 v' v2 Q6 h  C
    // 仿真(DEBUG)模式行为配置
4 E* b6 z5 D8 q( S: `0 S" J    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( U# t5 S' o+ A! F( e9 s% z
3 Y7 d2 ~, f  K. V    // 配置计数比较器子模块1 A& B' d6 y) K3 J& S
    // 加载比较器 A 值
  O* x9 o& R9 x- D0 S8 |2 P    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,% E) n4 M$ N7 i
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 x- a1 M2 o+ _; u5 i/ ~9 R* q+ R) g# o# }9 D' |4 X# e3 P' r, @, a
    // 加载比较器 B 值
% q" R% H6 m& q) C1 l    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,* b; B" Y5 W- M( l, x! v# t; C
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);/ P+ C9 b: P8 K3 _8 c  N4 ~# F
4 ]4 E7 A3 G4 A% g/ i
    // 功能限定配置(输出引脚触发方式设定)' y: V) y" s1 }* O
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 v' F5 T7 c& T9 s0 j5 K7 k    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 m0 q- Y. i3 q( q0 X- v( U7 T  _                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,# C3 t& l, f- Q. M! M4 i/ i! [
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);; s3 z/ R6 h( u
, v( ^; L/ U+ M# p
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
: o. S3 S# d/ B- ^4 Q2 d9 j, I    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' s# o- a0 P- ]+ t: Q* `* G! w; F: E
' O- W( a# g* X( c+ k* l) P2 Q    // 禁用斩波子模块
! K! k8 g: j' D7 f& }    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) D5 G& `$ w" M" e' T" `$ L7 ]$ p3 {) p' Q
    // 禁用错误控制事件" f5 k) u8 h- j  j3 h
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& r& G: i& f$ p6 ~    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ p. s1 X( D! g; J
  ?, q. M3 C- k5 Y, O- L    // 事件触发配置
$ {) o" f+ J- R3 d0 c+ f; \    // 每三次事件发生产生中断
% h7 d  w7 H$ Z' ~2 V9 W6 S& {- p    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ u: ?; d7 @( h) V, C
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件" Z1 _! t% Q3 Q8 W7 L, o$ k7 K
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ q( c2 j% K* {
    // 使能中断
2 J% r0 G1 l! S6 S& H    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);+ G" ^' M5 _- d( g

- s9 e3 Z& I, h. X. C: ~0 Y    // 禁用高精度子模块
% z( m  m% c2 W  }, u: O2 E4 p$ ?) e    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- f, a- E' z2 E0 n; [' n- j
' v  y2 u- }4 e& i& {    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);# L# J" [  f: e- w, m% ~$ V$ l
}
% N4 o: a6 S5 Z& R
1 y+ C% I+ S$ f* H$ \void ChopperWaveform(void)3 C0 |! Q7 x8 J8 ^! V+ P/ i
{
8 y# y, t$ v$ n3 j/ P    // 50% 占空比+ q& e/ H& u! E$ q
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);" {- A' a" I3 ^) k0 c% W
    // 4 分频: @2 l1 V: @5 V! a8 }
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);1 t) M% |* a/ K, Z8 C) ~
    // 单个脉冲宽度
5 f" i) l5 ^: [* {    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 ?/ D, u: w1 ?
    // 使能斩波子模块
3 ?, [6 k$ C  z: P    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 d. |$ L& R* }9 q, G}
! ^- W5 m% F( D1 N$ v, P# f' D) x) [# Y- \& c
/****************************************************************************/4 E% R9 x6 ^5 y  ^
/*                                                                          */' U* `6 w8 P( k3 ]5 H  w% ^
/*              PWM 中断初始化                                              */
# _5 n- [, n2 b/*                                                                          */
  G6 Y  j3 ~: R( y" t/****************************************************************************/
$ g! r0 C: K: n" u! A3 T  X. Tvoid PWMInterruptInit(void)1 E4 N1 j% z3 h( U( L- P# H; |! Z( _
{0 s( f9 ?3 ]3 i$ L- N% V
        // 注册中断服务函数
' r; P; f( |$ Z) c        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: w8 m6 Z! J1 d4 |0 C        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 R; @& Q& i+ G) R' B, V
* V9 O& M: O) h3 ?        // 映射中断
) k7 k  C; g+ ~* q3 y: S) H0 M; j        IntChannelSet(SYS_INT_EHRPWM1, 2);) f( [$ a2 T" |
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);; g) ]$ T0 _5 {2 Q2 D# ], I% X( ?

! @8 r9 p" a& N% h5 ]1 W% `        // 使能中断4 ?( \! S6 G+ h3 _' X
        IntSystemEnable(SYS_INT_EHRPWM1);
* @1 G4 f1 I$ M6 V, e& ], T        IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 w1 T, ~- _5 \  `! [5 `}
4 B1 x: i+ H; x( y7 R3 a- s5 t
9 Z3 q5 ^, m% e0 O3 g. I6 ~1 n6 D/****************************************************************************/$ e& @% F6 O6 ]( \
/*                                                                          *// p9 Q& l: e$ f3 |& p
/*              ARM 中断初始化                                              */7 E6 y+ y7 S4 I, `! Y- ~; C
/*                                                                          */
% j9 r; m7 x) o$ w2 y/****************************************************************************/
6 ?" P# {  S# g  i/ t! bvoid InterruptInit(void)
9 ]! e% {. a3 G' z( x, _1 ^7 A' r{. u' v% R7 W. o# n! I5 b6 S
        // 初始化 ARM 中断控制器
0 f! |$ Z/ }! e        IntAINTCInit();
: J7 J0 G; G2 T3 G
" P4 a( u- W: C3 B* W+ b5 x        // 使能 IRQ(CPSR)
- H6 W% e9 j$ s# _/ ~; ~        IntMasterIRQEnable();& i0 W5 `, W6 Z

0 M, f2 c9 Y, P+ T1 B$ ^        // 使能中断(AINTC GER)
- L! M; }* }$ g, B* D. U3 v        IntGlobalEnable();: c* j5 F2 j$ s) i$ {( p

. y+ @* m! c) U; L1 |, F0 u        // 使能中断(AINTC HIER)1 s' q  i* Z! d5 Y/ }
        IntIRQEnable();9 _' z: m* y. ~% v7 H) G
}
  H1 @" Q5 L, t$ v
# C) `* ~; Q9 ~$ o. ?
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
6 h0 V0 T1 P4 f( h2 A/*                                                                          */
( _2 Y, s, j( c0 S7 K/*              中断服务函数                                                */
1 l6 ]$ r# K5 f* s; M/*                                                                          */
" w. l5 {' s: B( p3 w# c' C0 U: j/ v/****************************************************************************/
4 Z0 k" Y. v5 A5 A$ dvoid PWMEventIsr(void)7 x2 p" Y' W3 l
{
3 {1 @7 J) s" [" J        IntSystemStatusClear(SYS_INT_EHRPWM1);
. J4 [8 ~/ s: C
) G8 x, w9 I# c* U0 M4 i5 b    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# z& q( ]/ z$ q1 V4 s( x6 P}4 ~7 G5 @* L% ^# o0 a

7 l( r! v) M* l# z. m- ^7 X/ ivoid PWMTZIsr(void), ]5 |9 E( h& p9 V+ F
{* F+ L* N" P2 H5 E! O: m  b" u
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);" i6 N/ ]) ~5 Q8 d; i2 f3 B

# z# o2 f) m  r7 a4 r8 Y9 ]0 d    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! t/ D. v7 H& B" U: g- s5 F. N}
" W/ E: X1 m( {" d# O
( }$ o. ^" k6 e6 X/****************************************************************************// L1 C$ u1 u# B4 T" F6 r
/*                                                                          */9 d' t6 p- V1 `9 w6 e# C1 o, {
/*              初始化捕获模块                                              */
  c$ e0 V7 s1 M" n/ B/*                                                                          */3 A8 ^6 |) o5 n! ^( C
/****************************************************************************/$ Q! A# Q; a, w
void ECAPInit(void)" ?1 `& P, r# U& ~2 z7 f/ j: `2 u- y
{0 m" a% I; Z/ h' l
        /*-----设置 ECCTL1-----*/
% O# r& z( T* t" N/ F        // 使能CAP寄存器装载+ z, b/ z) `2 H; T% p. F- O
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);2 l* ^1 H8 \5 ?1 r# e3 R5 f' F
        // 设置预分频值.
  }  v/ M) k- e6 q3 m        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);+ V( ~3 Z2 U: r- C; m; v7 ]2 {
        // 上升沿触发捕获事件
, h# _3 ]9 v% l7 S1 K        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* p7 a  o6 ]- ?) ?        // 输入捕获后重新装载计数器值.
' b) \7 o( r3 H9 A( D        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);( V$ s/ j) g1 z% q0 u
, R+ L' B* N' q' D" \2 s4 Q6 O7 ~
        /*-----设置 ECCTL2-----*/
, y: U/ P% b. z4 b        // 连续模式
; d8 K# D1 ~5 w6 ]4 U8 o        ECAPContinousModeConfig(SOC_ECAP_2_REGS);2 A; H+ K' i& A$ N
        // ECAP计数器TSCTR持续计数
) `3 l( G! M* S+ P1 N3 N6 C. g        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& K, v) i7 f' @3 A        // 禁用同步输出和同步输入9 e& @2 K8 d. H" m. }# k
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
. p9 d5 e( U: N/ K) J        // 配置 ECAP 2 为 CAPTURE 模式7 L3 ]9 z! s  w1 |- D: B! t( {1 ^0 W
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
1 p7 c! T" u0 q  N% J# U* }, k  f
. v9 G/ F/ u9 S$ r2 [        // 使能中断- z. d; E- j. Q0 w3 U, Z* G
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
7 Z/ [0 Y1 Y# a9 V}" o4 q  ]1 |, M1 y
2 {/ P; e2 `* X. N
/****************************************************************************/
; k2 {6 P* Q/ m  t- v" _6 ~+ K/*                                                                          */# \) Y7 Z. h% G4 X
/*              取得捕获结果                                                */
( \$ s2 A8 N$ {5 J# I6 ^1 ^- P9 P/*                                                                          */* T0 m( o( X: r
/****************************************************************************/7 f; k$ I# d9 W  Y4 i! `1 K! g
unsigned int ECAPRead(void)
; Z$ ~- I) B9 d  S1 G1 E7 d{
' Z0 L* u% g* O! v3 u2 H! v        unsigned int capvalue;
0 c; L1 D" f; I# o/ j. G) k6 j# t  I        unsigned long frequency;& v/ c) H9 x8 s3 W

- o/ |; t# u/ ~1 b7 D        // Event1 中断标志
" ~% O$ j: J8 y& q        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
# D) s, h4 R& C+ t$ g- h        {
2 B! j, k2 f' c: ~( b) I                // 取得捕获计数+ K" G) a  T! `; l9 G1 f8 x
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);# a+ e) b+ {" O4 l5 B
                capvalue = ECAPResult.cap1;
5 k4 Z' m. e5 {0 w& J) h  n9 A) j. |4 h- [
                // CAPTRUE 模块 228M 时钟主频
9 `4 N5 \  L8 u. O9 t                frequency  =  228000000/capvalue;
, `- p' ?3 R! u' o4 p' G                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);% w2 B& U8 u& p! I: N3 p' c9 [/ S. Z
0 G: H/ n3 g/ h1 Y7 K" `3 |2 B
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);) @. x- h  W" s+ X6 h
//                IntEventClear(SYS_INT_ECAP2);- Q: Z) `8 ]! [
        }# l0 s1 ]& Y+ F1 t
        return frequency;
& [' `3 f; u# {6 O, W}
  ]+ t: m* l0 K% J$ r% F8 S  u
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。& X: X8 m! j2 S( D. S
[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