嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" m$ D0 }/ |1 P5 l. v# y& L: l' I
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/# g2 F, Q: `+ s8 J
/*                                                                          */2 n9 c+ X/ o2 t$ a" E
/*              宏定义                                                      */: H/ a  Q2 l3 v2 H& C; Q) Y
/*                                                                          */  F8 U  c( ?1 `+ G
/****************************************************************************/" r* {) }7 C9 \2 \- L
// 软件断点9 k5 O9 \4 ?5 N6 \
#define SW_BREAKPOINT     asm(" SWBP 0 ");" G# _8 a2 s" T0 o: O+ n
0 x, B, f! \1 v1 H0 {+ h+ j
// 时钟分频
# a2 ?/ D9 l8 G, h& J4 n. o0 Q- B#define CLOCK_DIV_VAL     2287 h1 H( w4 G) l# `" g+ S" @9 B  m

' `. k# ]2 H- h: f0 K% l$ y1 G) ^/****************************************************************************/2 M. L/ A) o$ y) c
/*                                                                          */
; ~0 R" Y) V' V, C1 a- S4 J/*              全局变量                                                    */
7 V! A. e1 C( q# V/*                                                                          */
! x3 W9 V+ n) e2 A  C) y8 e& m2 {4 x/****************************************************************************/* G# }- v$ t% N
ECAPCONTEXT ECAPResult;
. h+ W3 _1 D; G& Q. b9 j7 Y7 o; \' Q# z+ g5 @
/****************************************************************************/% N/ H# j9 h: L+ a: a# U) J% A
/*                                                                          */5 B4 H5 I; `. A( ~0 {% _; d1 q
/*              函数声明                                                    */! g5 Q( N+ W  N+ L
/*                                                                          */; W! E, X+ L+ d0 U- g& x( Y
/****************************************************************************/- O( T- m" z9 Y6 |7 R
// 外设使能配置" Y/ f/ b, n9 g! h0 A; K8 f
void PSCInit(void);, \! x, I! C0 A0 ?$ [* ?
! w4 c4 W$ {, v6 N9 j" b5 j
// GPIO 管脚复用配置
2 C7 l/ c# }  h7 avoid GPIOBankPinMuxSet();
- j+ \0 N$ w- {6 I" n* q# s# a/ u1 ?
// 产生波形6 {" `2 E& _0 A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 n& L& Q, v0 G1 B  _3 B: C5 Yvoid ChopperWaveform(void);
  k' Z3 \6 ~* C+ Y4 o6 n, @! {, }
0 z4 y7 B$ n8 a- w& f) e9 H1 _+ n// ECAP初始化和读函数) ~7 C, _. o  {/ y: G
void ECAPInit(void);5 X) X1 N% C* b
unsigned int ECAPRead(void);' ~& S: G9 J; v7 _: s/ Z
  Q4 L2 I; E3 D$ A
//ARM 中断初始化" Y0 X* ?5 o. [: c* m% N
void InterruptInit(void);
' `1 b/ U$ n% @( E% }! Q
; f" Z8 F- ?' n; n$ F0 {// PWM 中断初始化* f4 {% V1 v& \# W9 Q! K) ?
void PWMInterruptInit(void);
) z: l- a8 g! V& O( G9 C// 中断服务函数
4 D: b1 j- `+ D( ?3 l// PWM 事件
- i5 i4 J3 n2 R7 F+ i( W+ S/ rvoid PWMEventIsr(void);9 w, G" W% _! w- s
// PWM 错误控制事件
4 O2 D  O2 Q$ S) Z3 I0 W' lvoid PWMTZIsr(void);2 k1 L6 [# q, p

! L, |/ p3 s! o9 V  ^: O/ V/****************************************************************************/
! L, c+ U4 m* K$ k2 `( V( C7 s/*                                                                          */7 ]* g1 V+ U7 T9 p! i0 K2 v
/*              主函数                                                      *// g; `/ X3 M9 [
/*                                                                          */
2 a5 L- S- {; c; ^7 q/****************************************************************************/
' _" x4 Y" J2 Gint main(void), F0 `, N5 B) r. r* h$ U/ f" D
{
2 |9 B4 o; D# U8 i  C  P0 L        // 外设使能配置. }! w: E2 c5 B9 ~" q
        PSCInit();9 F  K5 E3 ?" O( C6 q) Z
1 S, K0 Q3 K" n
        // 初始化串口终端 使用串口2
& j6 E6 W( C5 U0 V. [- N        UARTStdioInit();
, M8 Q8 s* R& s' E* I. p        ! ]+ j7 ~0 U. f3 v; o
        // GPIO 管脚复用配置
1 L: M5 \! v8 f2 A5 s( Z! E2 Y        GPIOBankPinMuxSet();1 T% P" V8 C$ q& j5 ^  s
6 E! `4 s" }* x& C; [
        // ARM 中断初始化
/ o2 j1 ^2 |8 Y8 F; D        InterruptInit();
! y( Z. F# m% K" ^
. [- y- e4 _/ s6 ~        // PWM 中断初始化# P( K  z- c& N5 Y# N: ]) E9 M
        PWMInterruptInit();
3 u$ ^* `) a% S; h; ]: s1 U/ L- R1 G: ?* M4 g! N* ~
        unsigned char i;
( m* ]8 C" W& W$ _7 K        unsigned int j;9 t2 l8 M2 f) f- P$ X! a7 M" @/ p

, S' ]  K- e0 R/ z: A3 P  ]" g        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);/ V0 F  Q# I1 ^& ]
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 x. n* c) E* a3 C/ C        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
4 T" _. e6 R$ E, |( Y9 s8 t        // 产生波形4 d$ p% ]7 Y6 W) Y* j5 v( @
        PWM1ABasic(25000,50);4 B9 F* C% G3 q# @
: t; v1 j  n6 }8 `
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);' T# C+ F! X! x
        UARTPuts("------------------------------------------------------------\r\n", -1);
- q) X7 Z: f+ [8 D
" v1 s$ G4 o. \# D4 o4 |
0 R. @) w3 l& C; ^7 Q' I( d) l
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 U3 `6 f! r# S0 U) e  T        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 _: G9 }9 S% ?! z
        // ECAP 捕获初始化- L' ?4 J  f& V& X
        ECAPInit();
5 q2 P, E* i% R5 f# I' \2 y  Q, U        UARTPuts("Initialize ECAP.......\r\n",-1);
1 T! g6 a. y% F# f# X        for(i=0;i<5;i++)
2 S7 S4 t" T; ?0 F/ s        {
: ^6 p  ~' a  P                    for(j=0x00FFFFFF;j>0;j--);            // 延时9 s& v1 k3 M  U1 L
                    ECAPRead();% c7 C+ h: a$ ]7 Z/ }7 K
        }) r% P3 c8 D2 O5 J4 v
        UARTPuts("\r\n",-1);
3 @2 v2 @0 H& z2 S: l  H        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);: V9 C1 }9 j' \+ _, F! p% E
        UARTPuts("------------------------------------------------------------\r\n", -1);
$ r, f: f" e6 ^# _8 \* ^
  s9 y7 w; I  J. D( ?( J1 h        // 主循环
4 I# z/ o6 M( b: [2 j/ V: V        for(;;)
' U, ]; H- J) {/ r4 W+ @        {
2 ]+ |: M1 ^0 F3 J' D: w) w" \  E8 t9 ^0 N
        }  R, Y& {9 ^8 K3 F# r4 s
}; u9 \' c7 B- b3 Q( O( E7 P
7 D- k4 z+ G9 ?, z6 [
/****************************************************************************/
1 \; n$ G! E, d( C& W; I# [+ [( l/*                                                                          */
% g9 o( P5 U2 \0 y. [/*              PSC 初始化                                                  */
; R1 L: m# {# L8 \# Y/*                                                                          */, \$ o8 N2 T" ^+ W
/****************************************************************************/
' q2 W; [" u& @+ }void PSCInit(void)# X3 I# b# D6 n9 f: f, n8 l
{
. Y: b$ V9 V, l/ o$ L        // 使能  EHRPWM 和 ECAP 模块4 g# w' c' f, y
        // 对相应外设模块的使能也可以在 BootLoader 中完成, X& N% j& a8 [+ c
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; S) t0 t6 g: k& X2 L8 j
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- b) v7 t0 I7 c- w
}
) b: [# e1 q0 i# x6 Y1 _+ T
" R8 b( P$ g* F6 N! q* I/****************************************************************************/8 k' P8 J( q$ Q2 o5 g7 N  J
/*                                                                          */
3 `7 a! I0 d0 c: t% d! Y/*              GPIO 管脚复用配置                                           */" E2 P  ^2 p  K* I9 D: j8 U+ m1 m
/*                                                                          */
, z' e! Y& S) |/****************************************************************************/4 G6 W: z1 S8 g( Y
void GPIOBankPinMuxSet(void)( |+ v) Q$ l' B# L- U* \
{+ n" o, L+ C1 B) B1 o4 s0 q% h
        EHRPWM1PinMuxSetup();' _# [% w7 P- `

) t- i9 |% X* d' |8 \  O2 l        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 K3 I" \, c# o- y7 J# m8 k
        // 作为捕获功能时管脚方向为输入' A" ~1 z5 k, z; G9 R
        // 作为辅助脉宽调制时管脚方向为输出
1 ?6 X" F( B2 B" v  Y. g    // ECAP2 / APWM23 i/ @0 a; g' v8 @2 u
        ECAPPinMuxSetup(2);
: o" J. @  i/ a" J* b
' G6 T4 K0 P! U        // ECAP2 / APWM2方向设置为输入
; a. c3 P! R0 ]5 Q6 i7 E+ }3 p        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
4 d: U! `, ~2 L& N- H; S. S}
9 K+ g# R( x* w* \
+ Q1 A6 P5 ~/ L* s  y/****************************************************************************/" q1 _- o% k! \6 @
/*                                                                          */6 E0 y( K, `4 c: J+ o0 Z
/*              PWM 输出波形                                                */. a* J* b7 X: e9 @
/*                                                                          */
1 y- ]* r( f, x* j% T8 ^/****************************************************************************/. C' F& q: s9 z2 I! W. A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- j- K4 F2 |+ o
{0 m/ R3 @! t- @8 X0 |
    // 时间基准配置7 x& x& q3 r" D' R
    // 时钟配置
* t4 B6 h* f7 \5 V$ F    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. m, ?# _3 K: \* J# B  G
( n/ ^* x  Q8 y3 Y5 ~% D. C    // 配置周期
$ Z" D: F4 R& ^' W0 K, B- j; J2 e    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL," F) x$ F% _! E3 @8 y3 F
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ ?  y1 h/ P% {) I2 [; v3 o5 ]. K1 Y
    // 禁用输入同步信号
6 f% _, a5 o7 I! b, S; r3 _& ~* J    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);) x/ m- X( B: l  C4 w# }: b7 i9 y7 Z3 _3 K
) F9 k4 ]+ p0 z
    // 禁用输出同步信号9 c' v7 f) f2 I4 l% Y9 |! \! A
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# Z; w/ o! W* h& Z* @5 e
8 P/ M+ z: A+ v/ B4 i
    // 仿真(DEBUG)模式行为配置4 X0 U7 I$ l6 l7 _1 ]: ]
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
5 P! R4 N$ f: M& ?; L( A( B' a4 K4 R/ Z, k& G. `4 R, @
    // 配置计数比较器子模块" j# r  A5 B* v) ~+ B/ I. A
    // 加载比较器 A 值$ c: C5 p' D/ O- F3 {0 T  l5 t/ o
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,8 F7 s. [9 r) H
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 E9 ^+ w- i0 h5 |

) O! g) Y: V; t4 P- u    // 加载比较器 B 值
% J  t3 H) n2 A0 f* H4 N    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 C2 c. w3 R- x0 Z) }
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 n3 v$ M7 }6 S$ k5 l2 O# n8 h; z9 K' Y. [
    // 功能限定配置(输出引脚触发方式设定)% z% u& A: j" P. [
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出7 ~7 z& p! ]2 O# v
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,9 L5 t  _- g8 X% Q
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
; v( _  x3 I$ V! E                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);* q% Z/ K  ^3 r7 R+ X7 @8 |

" H1 \* M% L( b" L    // 禁用(旁路,信号直接输出到斩波子模块)死区模块7 r& J" ^/ R3 p& C. c
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);3 N  }: W1 r. y$ K7 B6 @

6 j2 N. A% |! c( K    // 禁用斩波子模块
1 }+ d7 _- Y5 O    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);7 e9 ^5 {4 S/ Q' i7 G% R$ g4 Z

8 n. X( U& h( ?  O# p+ ^' B. J    // 禁用错误控制事件% d- O( h( U  [7 ~; z- c( M
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. n3 o. i4 m0 P% ^* v5 Q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);9 v0 L0 o' ~# ]4 b
8 r1 m0 i2 W. s% C) R  O  J
    // 事件触发配置! x7 }& `% `/ \: ~9 a& s; {
    // 每三次事件发生产生中断# F! a9 j, U- D
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* E/ M- {  @3 a3 x, S
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 R2 h  m+ `, \* ^& q
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) b" ]8 n* Z6 f+ T1 p, q! Q+ E    // 使能中断7 Q9 N6 K+ i/ h
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 I$ O( d7 u) x. W# H+ y9 \' X( h
! l: ]  y0 K2 z! }+ O
    // 禁用高精度子模块% K# e/ s! [3 x3 w
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' }9 D. G' O, t' c, _
9 ~( N( a) q# ~& p  }5 m; e6 E! F
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 t& D' l# n1 O2 x9 d& Y
}- P  V* x4 m" {8 n! w" ~6 N

8 m6 W( T) E( s8 K; dvoid ChopperWaveform(void)0 R1 S% D$ s5 d& _0 B
{% v& W# L  P$ C. m4 ^; A
    // 50% 占空比
" X3 x* R0 T* p. [& k7 c+ g& ~    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);7 Y5 B! g! K5 `+ x4 P
    // 4 分频5 S. ~: D. p6 o% f7 Q
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
  w! K. z7 n7 c7 M3 p2 i    // 单个脉冲宽度
9 f/ I& L; V3 R& I1 T7 v( J% Q% r    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) ^% }/ e+ Z8 U4 ]% G$ \
    // 使能斩波子模块
/ D* u: U; h) e+ R4 U    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);, H  v" z0 c5 E
}
) V& e( `  Y) G! z7 o7 j
" d& T1 o/ v6 s/ }7 M3 f/****************************************************************************/% B6 F& q7 O9 A2 g/ _3 _
/*                                                                          */
  _% ~' M1 b; \2 |* P- c6 o/*              PWM 中断初始化                                              */2 N1 X% b- F& [" t8 b
/*                                                                          */+ a8 x1 N2 k% P: Z9 G& G
/****************************************************************************/
& y& K  g1 t0 I8 pvoid PWMInterruptInit(void)
! E. b( f# J) q6 D' x* n* i( ?3 a4 S{
; S& e% G% k: `( R: F! N& F9 l" |        // 注册中断服务函数5 `( K! E& R; m" W7 O0 x
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 i" ~) O% c) e        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 g" z, H, J* }$ m- o

# s( Z3 L" d- D2 s5 ^/ r0 G+ D        // 映射中断
% R6 u0 d3 O( L- A2 X        IntChannelSet(SYS_INT_EHRPWM1, 2);
, @2 M1 T! P# N' r( B6 y/ q' O" r        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# v2 L' F8 y5 g/ [7 {0 O
6 i6 Q+ |; {8 z2 p. x; O! p/ r        // 使能中断
9 x1 S& k4 ^& k! t. W0 I& u        IntSystemEnable(SYS_INT_EHRPWM1);
( u  }! ^. Y" E& ?* f! D        IntSystemEnable(SYS_INT_EHRPWM1TZ);& |. }/ ~; B" \$ K- u
}- R  ^1 j+ h  b6 |. F. l9 K/ \
$ D( _' X. I# m6 p. @, s' j
/****************************************************************************/
- e5 ]9 w# r/ U' S% G, h2 `/*                                                                          */( z& R- c8 \- N
/*              ARM 中断初始化                                              */
( I- p2 W, F0 b+ \/*                                                                          */( c, C# D2 C! q% V% F! Q
/****************************************************************************/
3 [. U' G9 A  dvoid InterruptInit(void)
. Y- t8 ~8 \; _/ F{
+ Z+ G- J  d9 _        // 初始化 ARM 中断控制器9 q8 Y  G7 n! c  p
        IntAINTCInit();4 _- ?. X* n. d
. e5 k1 _' ^" Y- C3 q0 m" q$ k
        // 使能 IRQ(CPSR)
1 _- W' d  K2 ]5 l) ~+ d        IntMasterIRQEnable();/ B5 C) T4 }" \3 Y0 D

7 b5 c- E6 h3 N* W        // 使能中断(AINTC GER)2 p& y3 N2 u) d: t
        IntGlobalEnable();9 [$ J8 O* [7 ?+ `4 P

4 M* s: O+ U! K! Z* h! s- }1 o9 ?        // 使能中断(AINTC HIER)& `! y: \0 C4 i. j7 c& |
        IntIRQEnable();3 t8 z/ }! ^$ o3 h
}# n! ~" L! i9 n
' y' {( w( ^4 }% D0 e3 ^

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
( B* m8 j  H+ a/*                                                                          */4 c) L/ t7 P. A1 F% L1 a
/*              中断服务函数                                                */
4 h+ Z* b5 S% Q7 _1 l. Z7 ~6 h* @/*                                                                          */
) i0 v' S% n8 I' P7 P! M) o% |! b/****************************************************************************/5 O- k5 z6 s- |
void PWMEventIsr(void)
$ `$ h' @$ G% \) B  u# g{
( Y: I. A0 K  H$ [        IntSystemStatusClear(SYS_INT_EHRPWM1);9 m$ @6 m- |7 X

9 Z8 G4 j( @. h, r  B  I    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);! [; `  _2 d% f9 i; Z, s2 |  W
}6 q3 e7 w2 V( I% J
% B% ]: r6 g6 W1 g
void PWMTZIsr(void)' H8 o6 E& a( o
{
# X8 k; }# Z' Z. @        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);' d; V6 ~' ^# {% Z( f' v
9 {8 a/ ^* g+ C  k, V0 I
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 \2 ^& U+ d( c}
: A0 L' ~- _0 E9 J  Y3 p
7 U# F. X. V& B* D/****************************************************************************/
- V; M3 ]2 A. I1 N- S. s3 s/*                                                                          */% {  T9 n1 x0 M$ {% f# Q( F
/*              初始化捕获模块                                              */9 a; M% `1 \$ N, O( i( W
/*                                                                          */
. r5 a# \3 u( J( A1 J. f5 e1 s& X/****************************************************************************/, J& }+ a- a2 Y9 e
void ECAPInit(void)
8 d; y0 ?4 M- c: p# `: d# S, i( T{4 [0 A: O+ ?' o3 ?5 `, ]
        /*-----设置 ECCTL1-----*/: _8 m2 z$ j& `! v
        // 使能CAP寄存器装载6 J% J0 Y2 h' I! n$ z5 ]
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);; n0 U( A3 j" o9 p% V% F- ^! w
        // 设置预分频值.. O( a$ e( ?$ V! H9 }3 G; A
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. Y  D: `$ |. q" O) j* d/ F        // 上升沿触发捕获事件
1 z! \6 l0 y, f5 U: N( B, b        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 U/ a$ A8 I/ c- z        // 输入捕获后重新装载计数器值.
" r. `- i; N4 D" {        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);& a: @" r& ~8 A& U) \2 Y

5 c3 b) W: V$ E9 e0 ]7 x. {        /*-----设置 ECCTL2-----*/
, ~2 Z( O& \: q* X; h  m        // 连续模式
' q4 R, x- Q2 w" O% l        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 J4 W" y7 b, y" m  ?        // ECAP计数器TSCTR持续计数2 N% i* }9 e. U) W$ I5 ^3 ]
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);$ Y" A, {, U- _4 t* G3 \
        // 禁用同步输出和同步输入+ x4 t/ }& g3 H2 k, }
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);% x* ~5 v9 E9 `% I" n" Q& O
        // 配置 ECAP 2 为 CAPTURE 模式
% ]  ~$ B6 [" E% h        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% g, A) Z/ W' m, i. X. ?  }3 N$ D2 c, N' g% {
        // 使能中断
/ g' d3 S6 j; I6 z7 H6 `7 R  [//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);. v5 @! P) u6 H7 {$ V& _
}
5 H0 F" b6 k1 g# J
; R! l2 M3 k3 H2 Y, t/****************************************************************************/
# V+ i+ k0 s" {8 j/*                                                                          */
8 w, f; a* v/ h/*              取得捕获结果                                                */$ c3 Q) t/ M7 d0 m8 G) ]
/*                                                                          */
" |% f9 o; l% m2 K6 v" X9 L/****************************************************************************/
  x% J4 B( e+ eunsigned int ECAPRead(void)
- l- k& ?1 F& K) w{
$ e* y6 O0 {, B1 t) d: |        unsigned int capvalue;6 [) D* w  T9 ^0 O. `' C' C1 C
        unsigned long frequency;
! x2 T* r* j& ?4 d: x) N5 ]/ r* b. Q- v
        // Event1 中断标志3 B& j# `+ }8 `. p# ?7 q1 d: `
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))) X" ]8 J! ?1 x9 D
        {' p& }/ O+ Q+ G; w! o7 ~
                // 取得捕获计数* a* o: E9 \2 d' z9 s, p
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
/ `, |# k5 @5 }' b- w                capvalue = ECAPResult.cap1;
. X' m4 ~) s( h0 [
1 P- v1 x# ]2 v                // CAPTRUE 模块 228M 时钟主频$ J  M( _* Z& y7 ~  O
                frequency  =  228000000/capvalue;8 f  R4 |* k* P  n, `3 k! T" n  h
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);, x, J* e$ w! `/ S  H

, I+ O7 J0 V- Q) [/ x                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% X6 ~* G0 A  t4 t" X) g5 F//                IntEventClear(SYS_INT_ECAP2);9 X  P6 Z* L; F1 p% F* Z, x
        }
, V. r" k/ d1 s, x$ A" y4 w        return frequency;, w- \4 z0 d- v) V. G: w9 F, _2 M
}
" k; O7 g4 M" ]; F! j% D# I8 P
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。& V$ @  V# g0 M/ {( D
[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