嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
6 E2 b3 ~2 [2 g3 Q+ S, `
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/0 {8 a4 E( L! V* e9 u& B
/*                                                                          */
' k, B0 k) G0 L( O1 I# C/*              宏定义                                                      */
- K9 F; R  S0 D# z/*                                                                          */
9 d3 T5 g, v0 L+ D" e$ T: Q/****************************************************************************/
" ?( i" g. |* [7 E4 }) @// 软件断点
5 B$ z- A+ s) ?5 b#define SW_BREAKPOINT     asm(" SWBP 0 ");
6 Q$ X, R& X. H* P7 v' C: j
$ K. q  Q" o3 m( P// 时钟分频4 f* N' X. K  M5 b
#define CLOCK_DIV_VAL     228
7 [4 N/ E4 O( L7 R
  U3 @. D3 Z( l+ A( M% p/****************************************************************************/
1 [. T2 p/ f5 g" j/*                                                                          */) [9 ^! H  U1 A7 W
/*              全局变量                                                    */+ q# y- D# G0 G# l
/*                                                                          */
  I$ n- F# C' [; v& n$ `0 e" s/****************************************************************************/. r8 K  u( T# h' ]& x  ?( J
ECAPCONTEXT ECAPResult;
1 B; o8 v, C* n; B
0 l, H* D1 g, Y6 Y/****************************************************************************/
/ k7 u6 W0 F- y2 g/*                                                                          */; L) y" O5 ^( C: B1 P5 ~" n/ c7 `$ G
/*              函数声明                                                    */! ?# @% R4 Y1 U
/*                                                                          */2 n1 W' N$ X: w$ [. d
/****************************************************************************/
- M8 V5 O  s# c' [0 K9 i// 外设使能配置
( \- i8 {7 e6 V) v& G, ?5 evoid PSCInit(void);" B1 I1 N7 f& {: N! W$ |
, ~% {( ~# T$ o9 k7 i+ g
// GPIO 管脚复用配置1 N, x( r8 t8 y4 ]  H, a
void GPIOBankPinMuxSet();- F4 \/ c( ]/ G

- c' A/ f; o* v. Y& c  e// 产生波形6 G; E$ @; n' ]8 r6 W! p; Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);1 L# ]& p6 v" f/ x) o1 t# Y; x" x
void ChopperWaveform(void);: n1 a& a, ~2 t% D
: A6 y1 Q; f/ s' u" M8 Y( T
// ECAP初始化和读函数
5 w  S7 R8 ~( v, ?. vvoid ECAPInit(void);
4 U; f# W3 N; `. r4 ^! G% E8 ]unsigned int ECAPRead(void);( d$ W) u2 G  z

! j. M3 @3 J7 w6 q% f, S& x& N//ARM 中断初始化, U0 ]/ {) j4 w* U. r) T
void InterruptInit(void);9 r  l, ~+ q" n) [& G8 [

8 ?- a2 i6 C( X7 B( o, z// PWM 中断初始化9 Y/ y! ]/ Z7 i, \) j
void PWMInterruptInit(void);0 K8 v* w9 i/ q; O
// 中断服务函数
7 X, P- w7 {; Z- z  o' H// PWM 事件; V) Z' T% v7 t: |
void PWMEventIsr(void);% [( V" x: d& ]
// PWM 错误控制事件
$ j) {5 h" S" {; \' j& k% Gvoid PWMTZIsr(void);0 ]0 q# C0 H2 U

) ?; F9 \8 }' G* L. O) y/****************************************************************************/
1 y0 t  z" Y9 E1 Z, `/*                                                                          */
) N7 l6 B  o9 l" \; |: K8 I  r/*              主函数                                                      *// J7 Q: u+ u6 W. N0 ~3 J6 @
/*                                                                          *// K' ^- D3 A2 O4 g+ {6 B4 G$ |
/****************************************************************************/
2 ^4 K# D2 d% [& K0 bint main(void)
6 {+ A$ j/ ?9 D" E) \% K3 d/ _{
! v9 v8 T) ~  ^/ |. Y; F! O" b        // 外设使能配置
  L- A- y, e+ ]0 j8 A( r        PSCInit();
) h/ |# M& ^8 g8 x& b1 u5 U, {7 @! S. @+ W3 K2 b
        // 初始化串口终端 使用串口2
$ m! }9 E  C9 \# F: _        UARTStdioInit();# X5 h& ?- @1 ^5 X$ t( c  I" P
        ' J3 N/ r, Y3 o6 q$ O
        // GPIO 管脚复用配置' R5 s% _8 T+ g1 l3 R
        GPIOBankPinMuxSet();
2 O' D" ^4 C9 s# p1 c6 J' B$ t/ u4 T5 l+ W+ D
        // ARM 中断初始化
3 k# y  l+ b3 T5 e' @: u% `1 O4 D        InterruptInit();
3 g. V/ L* D9 e" C1 L$ G5 I
# \6 T. E3 f! L0 p3 K4 b+ J, d3 K        // PWM 中断初始化  m' |+ r) H( f
        PWMInterruptInit();
  ~$ C9 `5 V4 R8 l2 `; o$ R  M& Z5 y8 l0 [
        unsigned char i;
: v4 ]3 l0 e( W$ K$ @, \) y        unsigned int j;! n" y: J$ V0 D  O
' c0 [( T0 f4 ?: _
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' d4 ?( `5 P, n8 [2 h  @0 t; i* j        UARTPuts("------------------------------------------------------------\r\n", -1);
% D# P+ G* h/ R& Y4 y9 A* X: u        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
. J# d6 a/ B. S2 m  u        // 产生波形
! J# i( A3 s' J& [" Z        PWM1ABasic(25000,50);
6 I  L; x% Y, \) k, L8 ]& s% w$ q$ u( g
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
0 W" `1 d) i) N/ O0 V        UARTPuts("------------------------------------------------------------\r\n", -1);  Z; F3 G) ]: ~/ O

  Y9 l) b; i6 A' d# e& V/ R' t, ^8 L

8 ~& _/ E3 s' @0 [        UARTPuts("------------------------------------------------------------\r\n", -1);
8 b' S& ]% b  D5 M        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 j/ G1 ~$ }8 c: X8 i
        // ECAP 捕获初始化
1 i) f6 U; y" W: A        ECAPInit();  [2 A5 C( O, [- C# T+ s' ~
        UARTPuts("Initialize ECAP.......\r\n",-1);; j, |/ \9 J9 p: t! @( L8 ?1 [+ n
        for(i=0;i<5;i++). M' c  v% G2 ?9 Y7 D  s" _  G
        {. [6 z4 v* E- E$ i/ w$ Z
                    for(j=0x00FFFFFF;j>0;j--);            // 延时1 D( e. |4 i! N& s; L, s4 a6 ]
                    ECAPRead();
+ [3 ]& m) G4 {) N$ K, t7 V- S        }
4 Y* x* M! l, b        UARTPuts("\r\n",-1);
/ O+ [8 b0 m% v( A  T( `" `        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);; p% i9 E+ T3 t8 g/ a& S
        UARTPuts("------------------------------------------------------------\r\n", -1);4 N4 l9 n+ A9 L' Z4 d: s
3 F. U& _& Y6 A$ `
        // 主循环( r1 `" \4 \* \* z
        for(;;)/ X3 T, C5 o9 c5 b2 i; q7 K
        {5 X) a  {5 R, e
  t; D& i% {9 Q( p9 D' K
        }" g8 \; v* X$ H3 d$ V# L
}
  \4 V! n0 _: e# |4 R8 o
0 `) Z% |7 @6 m. Q- |9 |. z. x; v/****************************************************************************/
, _9 Y9 n! L! {4 J/ K/*                                                                          */7 A7 O2 z1 X. s
/*              PSC 初始化                                                  */
# a& T# ^+ F( Y* C% ~/*                                                                          */
5 ?5 W' N# ^9 S7 b" [/ ?. p% F/****************************************************************************/4 Q: G) U% b- G! }* j* X7 J8 O
void PSCInit(void)% _2 E9 h( P3 D5 {
{, M) q4 u+ a8 R6 ~* i
        // 使能  EHRPWM 和 ECAP 模块
( \; G; z/ K* M% S4 N# {- x5 _        // 对相应外设模块的使能也可以在 BootLoader 中完成; T4 P3 c& R( @& J, e
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ b0 e! f4 }7 |
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 S5 q, F' |  n+ d# X' \9 c# E6 Q
}) D: \+ _) S+ p2 b9 j) j
* f" k3 l" [  T; K* Y' p
/****************************************************************************/) d; V: t2 L3 k0 j+ }
/*                                                                          */
, u; H; S4 n, V3 J7 |, n$ E+ c- g/*              GPIO 管脚复用配置                                           */
4 ?2 {. u1 S1 a. b/*                                                                          */* U9 Y4 c2 S* K* h! P1 H
/****************************************************************************/
3 u, I7 v2 n  R$ z6 t8 Kvoid GPIOBankPinMuxSet(void)& W2 b! G' P7 ]9 x) o# I" o
{
0 I! ~  |+ O/ {& r! J        EHRPWM1PinMuxSetup();
. t- p" \4 W2 D; Y. s9 E  L/ |8 K: `6 J; x- D( c, i: E+ P# r8 Z% s
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, ~2 H9 k( u! p- F% b9 A* f/ g        // 作为捕获功能时管脚方向为输入& ]( Q0 Y2 e' \
        // 作为辅助脉宽调制时管脚方向为输出
: X7 [3 X4 u& |    // ECAP2 / APWM2
5 `; O+ C. y" U- A4 Q$ S) _        ECAPPinMuxSetup(2);
. @8 ~* V+ K$ _8 ^8 U4 D7 F
2 P7 s& H) [) p/ `( J        // ECAP2 / APWM2方向设置为输入
8 J7 |$ E4 o' ?/ A: ~5 h. J8 _( I% B7 ]        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
9 l7 \6 ]' c! n3 v* r/ t+ ~}
1 m# m- O8 }' Z0 i
4 F- q+ {; k2 ?7 S: Z; f0 o! a/****************************************************************************/
3 w! L2 H0 m; G5 p. t/*                                                                          */
: Y% p5 W) e# N% i* C% \% m/*              PWM 输出波形                                                */6 z; z* {# g* g% ~) s- @' ~; U* i$ q
/*                                                                          */0 M) D$ W+ \' [2 I* x4 t6 s
/****************************************************************************/( \1 A; r! R8 {7 o
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
, F2 }9 R$ I5 M: L+ r{0 ?! e+ p  J/ y) V7 b( J
    // 时间基准配置% T4 D; x3 v* T9 j, [
    // 时钟配置7 q' H3 N, `7 D0 \
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);: W! v. {+ {% R3 Q  e/ D
' [) N( ?; `3 k/ h1 O8 L  x7 k
    // 配置周期% O# Y* ]. v0 w$ P8 p1 y& `
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- M- d: s4 `! c3 [9 K, @0 |                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);2 B0 l1 P% @" p' V8 H  Z
% A1 _; Z- ]& I+ G* N. i
    // 禁用输入同步信号
+ j: E- G9 d8 ?3 o    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! O& O7 P) I7 P1 f- K
) D6 ^' @; F* s  d    // 禁用输出同步信号
7 i, ]& s0 Q# b% i9 F: I* y    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ j! }+ o1 W4 P/ ^' ]- G( q3 c
6 Q: Z$ |8 e( G' p& ?
    // 仿真(DEBUG)模式行为配置
3 k( Z& l5 }3 E3 F) [  J# D    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 z& [) _& v7 I& z% r! |3 g" D8 z  o) W8 i
    // 配置计数比较器子模块
: y) R& T4 b, q# b+ a) ~3 K% Y    // 加载比较器 A 值
- ~2 \9 Z0 O% W/ [9 R% T    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: H* _, |  g: ~- |' D5 h# q                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 n$ N* y6 V, |. w- Z0 s, v- B, b; o( u; K$ C
    // 加载比较器 B 值, e6 l4 W1 z, u
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, y4 a! M7 F* ^' e
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! c' c7 H+ {7 ]: E3 N1 Y  f+ C+ M0 s& A; i6 Z' X
    // 功能限定配置(输出引脚触发方式设定)
7 K5 a/ N% V/ S2 o    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 y' T; C% c5 ?3 r+ h$ B
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,3 F) @. x! H4 q0 ?6 ^
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,8 L" z" F( P& l# |6 e4 g2 p
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);" |# C4 l0 t3 n' ]" G( c

7 w# _" q+ |' X' |    // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 J2 A7 A' U0 g3 ?# J
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);: p3 ]' w/ d& l$ B

3 _& X4 y' }7 L/ v2 l& T6 h# ^    // 禁用斩波子模块; v% e( T/ E( t" [5 Z- L( g' @( S
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: a" K( a5 m1 P; _5 t, d1 T+ ^6 q( H' o* N
    // 禁用错误控制事件
. I9 _: ?6 k: k  L    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ ^# H# o$ N+ S  d3 H! E7 q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
5 G- S; r4 t" b* b& Q. s$ ^" u8 l1 S+ f2 y
    // 事件触发配置
1 x; ^: y, p: p3 K    // 每三次事件发生产生中断
* }" @; e. W- f    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);! A3 o$ S- e3 V
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. @* s* I  t2 h4 Z4 L4 f( ?6 U    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 g8 l. I' v  u, k, Q' v; B' l
    // 使能中断
# P) d) s2 ]) l  p) L) X    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 i; G: G2 i+ `1 T

  }: ~" v+ r! [/ y3 `4 _! U    // 禁用高精度子模块
* p& X2 b! P& i6 k' u* ?! Y    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 \: R" F; F* E8 m7 k( v( O( h! Q" P
) w& T2 \8 ^* H    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ B8 @1 ?) t* z}$ v6 m5 F& b/ ~- n' b
4 E9 W; m& A5 i* Y) k+ V, ^
void ChopperWaveform(void)
9 b6 ?' ~, t( }: o2 ^) n* @{6 V( _9 [) X0 _# Z& j! k
    // 50% 占空比" T& s; W0 ?% A. _; S
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);! L5 s, o# ~. ]$ K5 Z$ e
    // 4 分频
! {8 j, n4 Q1 B( `    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);. E0 U% w4 k; M' @; c
    // 单个脉冲宽度
: [( M2 X: d3 ~3 z! X8 Y* l8 [5 v3 X    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);5 p' R+ `- u) i% _2 }+ K6 @
    // 使能斩波子模块) j9 [2 M& n5 |* E
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 F9 l1 @# t( n: w, O+ \
}
7 O- d$ h/ ~. b4 L$ n! p5 `8 h
, V/ X5 r. [) {$ ]- ~/****************************************************************************// m  Q0 M+ M8 @1 C$ t' ^
/*                                                                          */
1 t! J' x6 ?2 l  N. N: W- |/*              PWM 中断初始化                                              */
+ p, _7 z' F- l, B/*                                                                          */* o  I7 t% J3 _+ [# G
/****************************************************************************/( h9 m0 z5 \- k: B' \$ u
void PWMInterruptInit(void)
, K1 c7 t( G  x+ U: G$ V{4 E, P2 u! G0 L& C
        // 注册中断服务函数
8 v" q( f0 V5 \6 E: X) {7 I' I        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);& X( ]7 S  X$ s$ a% J9 f  u3 u7 C# h3 ]) X
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);. t* A. K- X2 a% X# H
  ?3 P( ^: W3 _8 l8 F
        // 映射中断  `* V2 l: I% Y
        IntChannelSet(SYS_INT_EHRPWM1, 2);& A1 E' p8 F, H$ N  o0 z1 W
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 ^8 A9 K) h$ G

. X+ b" q! r) O0 j$ \        // 使能中断
4 C5 a+ M$ {0 E  _        IntSystemEnable(SYS_INT_EHRPWM1);
+ {! Q% H) m% e1 o9 L5 O        IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 n8 f- d. m! {}
- }: t6 Z" C' W: Y5 z& ^5 |' _" E
/****************************************************************************/; Q4 n2 Y* J2 N: o7 I% ]
/*                                                                          */
; q3 ~+ Z3 {" s: u9 t" L/*              ARM 中断初始化                                              */. U# p+ n9 m) w8 [2 x* m* x8 {/ T
/*                                                                          */3 f8 o# e+ a9 Y6 h. `
/****************************************************************************/( b5 f# q" s" N% w, x2 E+ m
void InterruptInit(void)' s) ^% f; H* k, l) n4 r
{
" B( R; r$ y" Z        // 初始化 ARM 中断控制器
) r& ?$ j( l- x( {# q4 j3 h        IntAINTCInit();1 ]3 V4 P! J: `! V7 b$ z* n2 L
$ V" o: N/ c; `1 I6 G# F7 ^
        // 使能 IRQ(CPSR)
+ p. q5 E% o2 \# l) E' k! I0 J        IntMasterIRQEnable();( v' V; [7 J: S7 ^+ `( Z6 g5 Q
! A9 A/ |0 p3 m) q1 y* B
        // 使能中断(AINTC GER)
- n$ g0 S8 C* q3 X        IntGlobalEnable();
2 ~! x/ e- ~0 ]4 c( c- [8 z$ t
6 k4 k# C& ]* U3 x( c! S  r        // 使能中断(AINTC HIER)
5 M: R5 h  E6 n( u. c' ~: e) I4 ~% ?' g        IntIRQEnable();2 D* p/ I$ B7 W* h, ^$ L$ \
}! r2 @' f# M$ W6 d
8 {" \8 p/ c7 q  T# P0 y. }' k8 t; M

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/% N& {" s9 M; N. w
/*                                                                          */
! j$ _  b5 i$ L; i8 H9 ^" z/*              中断服务函数                                                */. S9 V! m! M5 y) v# u1 q5 B
/*                                                                          */
6 t- X) @. K) J/****************************************************************************/
$ X7 t8 s& h0 S- r9 t" _void PWMEventIsr(void)! l1 `1 f8 K  S
{
5 I& X9 F1 b8 x6 W& c5 k        IntSystemStatusClear(SYS_INT_EHRPWM1);6 m: {, ~5 O/ M; G* {
9 K( ?" f" p3 X9 M, T* o  s& ^3 Q
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
1 B0 D$ q: q. x% o1 G! R' }}6 w1 j, T& x5 h: w$ N3 |6 p

2 z7 r, ~% X  O8 U- Yvoid PWMTZIsr(void)' P) n& i+ c/ v1 D
{# ~$ L$ K$ K) Z- w4 u6 h! a7 y! S% b
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% \2 B+ S- E; O; B$ B' @# S  d/ B0 E3 V) a- F5 x) t) U* |" A
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);- i5 N* p6 l0 U
}
% \2 m* T: J. ?& l7 D
$ A, e2 W& V/ I$ A' f2 P3 \/****************************************************************************/
# S+ L8 \( \: U/*                                                                          */% F7 n$ c- D2 v, W
/*              初始化捕获模块                                              */
: r! y' H  V- Q# z; M/*                                                                          */
+ E, x7 X7 x! D8 ^; L3 A/****************************************************************************/0 c5 W* r8 [- g% Y. M2 Y1 U
void ECAPInit(void)' d0 t- `7 b  `& V' K
{9 ^- W2 z9 A! S# _
        /*-----设置 ECCTL1-----*/# X* z/ C. t* d6 D2 }
        // 使能CAP寄存器装载
: }' A: W* S% U( j        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);# v. A  r  L6 {; J) b
        // 设置预分频值.
0 y/ ^& R/ i/ d  g" O6 d        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# V# h8 C: u( f        // 上升沿触发捕获事件7 c, {% F, w, x7 }: c; w
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);5 p) v, R/ F$ Y
        // 输入捕获后重新装载计数器值.
% x' X2 g: X4 M- P        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);8 Q) L* J* Z! g$ _8 E1 a
( }( e7 ~& s; r% @
        /*-----设置 ECCTL2-----*/: V  g; m3 T. ?, x
        // 连续模式- L+ o3 k! I) x3 W# K$ C
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);$ X. B" T# R& {, s( D& ]" U9 F
        // ECAP计数器TSCTR持续计数
( X; M, A% Q2 c$ |        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' m1 a  G5 n9 e( v7 |
        // 禁用同步输出和同步输入
! s+ F4 z8 L5 U% g) Y8 n        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);: c# c0 z! v) a
        // 配置 ECAP 2 为 CAPTURE 模式9 ?- o8 E7 t4 \
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
9 M7 C$ V) R% _; n# |4 _( _- B  m# K9 _, s: K% q
        // 使能中断
* J+ W* G4 q# b- t. S//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);9 z: Q0 L3 n1 w+ x* y: T/ H
}
: j7 j. w0 |7 r% z3 }2 P4 e& O" h
4 w7 u. U0 L( t9 h0 L/****************************************************************************/) X& Q5 k1 f* ?. J3 r% t9 Z
/*                                                                          */  s# G) {5 a% S
/*              取得捕获结果                                                *// Z9 [; \3 v- h, s7 {
/*                                                                          */
" ~; \0 Y* C+ c0 M# a/****************************************************************************/: Y' I. j" f2 d+ b. U
unsigned int ECAPRead(void)7 S4 g: ]  m2 B- D/ Z6 D1 ~1 p9 m
{
# ]. l2 \" @+ P        unsigned int capvalue;1 ~# X" z6 d- [1 ^. L6 g
        unsigned long frequency;7 t" f! N# h) g/ B& ]1 u; C

" s! K3 M3 ~5 E        // Event1 中断标志4 e- s4 F4 X' s  i
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))% O4 @# J& Q2 [" A
        {1 t/ z! @4 M6 U) g3 ]# y* r
                // 取得捕获计数( }: g- o- K# `" w
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);7 Y, ^( e+ W6 M( r* a
                capvalue = ECAPResult.cap1;
, S5 i) g9 n, o/ f8 Z) ^+ }6 U9 V  Q: a" e! S; F# I
                // CAPTRUE 模块 228M 时钟主频; C: c2 s8 Y) |* T3 X
                frequency  =  228000000/capvalue;3 U, x; S  j/ Y: t8 {
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);6 h' y3 S8 @4 d  q0 \( e" b
# S' ^! W! t, h% l  P5 m
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);( I' e' A! ~. b: p! f) i5 Y
//                IntEventClear(SYS_INT_ECAP2);  z( V: g5 G# W' \. i
        }
- o; P2 b( U. t2 V1 H( M  `        return frequency;3 N' j1 S9 H3 B
}
- O2 e2 B- o6 l4 h- C4 C4 y
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。9 x( Q3 h4 h' N0 q- r' Q
[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