嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家8 Z% `) G" a9 B: n

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
. R2 [2 V9 r! v- O( }, T" W# x/*                                                                          */0 G" ?8 w+ }0 l9 k
/*              宏定义                                                      */
) ?3 c" H0 Z& B/ s' X/*                                                                          */5 Q+ D- A0 V" ]5 a% |) H$ l
/****************************************************************************/
' L: S6 `7 Y6 l1 `) E8 C& V// 软件断点/ Q5 j, H3 B+ l
#define SW_BREAKPOINT     asm(" SWBP 0 ");
3 H' @+ y8 k, P+ n9 s7 _/ ?+ n3 o1 Y) n# L7 @
// 时钟分频
$ l/ j) R: e& U) Q) D% z7 @#define CLOCK_DIV_VAL     228
. I! V+ j) Y4 i  |* d8 O! ]% J" y9 t% J4 E
/****************************************************************************/
) M4 o- N% E4 f* a! w/*                                                                          */
% `8 s( f5 }+ B1 i/*              全局变量                                                    */
: \3 P) E* n( i; O+ {- w/*                                                                          */
* X5 {% O& ~2 n1 R) g6 D  k/****************************************************************************/: j5 D7 u6 Y/ B' m6 }7 s3 \+ _; K
ECAPCONTEXT ECAPResult;
/ Z# N2 @- ]% q
6 t  Q2 f, |' A9 t# D) j. j4 ^/****************************************************************************/4 T* c! X. R0 `- U2 }- V, X( E' L
/*                                                                          */
& Z! G% L7 D# ?" ?, g$ u+ W5 C4 T8 P( o/*              函数声明                                                    */* {6 ^! L" l. W& l8 P7 K
/*                                                                          */0 V& s; J3 N5 J6 m! [
/****************************************************************************/3 v2 ~- p2 L; i6 Y
// 外设使能配置9 g/ A8 I0 V: Q+ d6 ?' Q% z
void PSCInit(void);
2 P# {3 z- H; t2 o$ _. n9 \; z. t" Y, `. ?2 D( @  Z
// GPIO 管脚复用配置
8 y! z( ~- Z. d4 K+ yvoid GPIOBankPinMuxSet();- Y5 L" K. X. B$ f; @2 y% i

2 e. m+ q) o$ R// 产生波形7 q+ V  }: t' I. P6 d- N5 R/ W4 ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);5 Y/ }) F9 {8 R# [7 Z, E. s  `
void ChopperWaveform(void);0 @& P! q' D3 M+ z

, Z) E" A/ m$ ]9 O* s// ECAP初始化和读函数
" D; ~7 q* N& T2 E5 Z# d6 |void ECAPInit(void);: _9 X7 E5 y( L5 z. U- q
unsigned int ECAPRead(void);
5 ~6 h  S8 Y$ h6 X* l
0 h0 J+ F, N) ?% x# l( [//ARM 中断初始化
, s& Z0 k% u4 v+ B$ vvoid InterruptInit(void);& P. s+ s5 \: Z0 o- U
3 ?3 w: t$ P3 W2 `$ b$ }
// PWM 中断初始化$ H- a* d6 x: ~( V! j- w# O$ Z
void PWMInterruptInit(void);) K# J* _2 v& W* ]
// 中断服务函数/ i/ x4 x; w* l% q1 K. I
// PWM 事件
& o& e9 U# Y4 G6 @3 P7 i5 \void PWMEventIsr(void);/ @. v- Z+ f& s) J& [7 g! I
// PWM 错误控制事件
% g- t. G; R( w! wvoid PWMTZIsr(void);. z2 \) H: f. C( |  |

% H- G) d$ c3 U) z1 c+ m/****************************************************************************/
$ Y9 M! e) g/ R% _* B/*                                                                          */* W# A* e1 v: x9 w0 |9 ]( W8 b
/*              主函数                                                      */7 R+ @2 E( P3 R2 d. E
/*                                                                          */. a4 R( y, a% @+ S, M) G
/****************************************************************************/
6 O# d- X# m" O8 j& Aint main(void)
2 P- T$ C' `0 P  @4 t) H' e) Z2 A{1 N1 C. d5 |$ ^! J  X) l
        // 外设使能配置
% A' {4 d7 M! d4 H7 @6 e, _- r        PSCInit();
" I0 j" E9 ]9 S: a0 ?* [- R& Z* E1 y! P4 G; ]
        // 初始化串口终端 使用串口2
- T. N) J: v& D+ ~        UARTStdioInit();3 u- ]* Q) }; k- L
        , r; F  ]7 ]/ I
        // GPIO 管脚复用配置
6 e1 h/ A3 ~& e5 _( z        GPIOBankPinMuxSet();
4 V& |. D  V! O+ o
9 s; k6 E6 N- b9 Z: Y0 I9 B        // ARM 中断初始化& ~, N: _! f  `& T
        InterruptInit();
3 s$ K% _, O7 o0 Y/ |
/ ^3 M9 P/ j2 l        // PWM 中断初始化3 ?3 S0 J8 M- @6 g  F! Y! I
        PWMInterruptInit();
0 I* P" M0 S& u* [, h4 [) r* `3 U2 a
        unsigned char i;
9 `! O; Y: D: c7 T( I" A# q) K8 n        unsigned int j;) |1 @1 n9 K. e4 \" s
8 |' T) v5 e1 m1 i7 v, n0 g  }
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" `* P. D. W( A- q* q) Q9 k        UARTPuts("------------------------------------------------------------\r\n", -1);
2 _' A9 Y* b4 L. u        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! s* o2 n; S7 w. F, r1 B- v
        // 产生波形$ d' c4 {& x5 A; H
        PWM1ABasic(25000,50);6 Q. g0 y- [7 b6 O- |9 \) E
* U" b: B5 }# w+ V& f# B; [6 g
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
8 Z4 }" ], G! c( t# p        UARTPuts("------------------------------------------------------------\r\n", -1);+ N0 e1 Q2 M6 o9 x7 w6 Y

2 q- k+ E1 P: F8 i" ?- I$ T6 t' P! w: o5 Q3 }8 W3 [2 X  c0 r; q
, M) N& |/ ?6 `) F  ~2 S
        UARTPuts("------------------------------------------------------------\r\n", -1);
# `: b3 g; d$ t1 Z% e# [9 |9 L6 L        UARTPuts("                    C6748 ECAP Test\r\n", -1);
( b! e* D* K, q  Y4 B8 X* \        // ECAP 捕获初始化5 A9 e( L: f. U) j/ I9 i
        ECAPInit();
/ t9 e( z# m. T# v. p+ G# p( B        UARTPuts("Initialize ECAP.......\r\n",-1);# o1 o* q9 L; M1 ?2 _
        for(i=0;i<5;i++)! E/ v/ I; l' i
        {
  A7 ~+ h2 `* T7 m( }                    for(j=0x00FFFFFF;j>0;j--);            // 延时/ @: O" j1 L/ ^. B1 E& U
                    ECAPRead();2 S# n0 S3 u' G4 P
        }. p( i: `, m) [, y3 C; M* ^, c) j& Y
        UARTPuts("\r\n",-1);
! z8 x3 o* K( L        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);( v& U/ d2 J) f5 f( q/ Y
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ r5 f+ ]/ ?& F. h& b/ b" w9 Z+ z) m2 X) h- w; |8 \6 X
        // 主循环
3 h% N  D9 h9 [' `, T" Q$ e1 |! c+ m        for(;;)4 A( p) e6 O2 g: I- r: b  u/ m
        {/ S6 r1 n* n- A, j* w

9 q, }* W. a' n( O( o4 M$ F  Y        }
0 a0 S% \! q7 K+ ?; Z, s}: M8 R" P& Q4 Y; r$ r3 h% _
+ K6 b3 Z. n7 _1 b. C7 I5 ^
/****************************************************************************/
7 j0 d% B( Z' p/*                                                                          */3 {( W  l0 W- s0 v4 V% _% v% J7 U
/*              PSC 初始化                                                  */
; Q, ~/ Y  w  o+ U. V" o* H/*                                                                          */, ?; i1 ^- z4 @3 M9 d+ b
/****************************************************************************/
: ?* r3 N) K# d& xvoid PSCInit(void)) f9 w4 z& C$ U0 k
{1 w% k. o" A! i. g0 G. i
        // 使能  EHRPWM 和 ECAP 模块" U& G% M0 q: X* l0 j
        // 对相应外设模块的使能也可以在 BootLoader 中完成, K3 X1 i' H0 H" _9 g8 e1 t1 F
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 N  e$ g' a, `! K    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- x0 f  o1 @& E& r* e3 |}  `3 D1 O+ i/ a# y% X* k$ e# Q1 k
4 ?7 H. G/ F7 f, F) K, y
/****************************************************************************/  C9 y' T9 Q# V0 e% A+ O; W' @% J# {
/*                                                                          */
; g( D) r$ u& N: B* k2 r/*              GPIO 管脚复用配置                                           */
( }/ F/ Z0 i, x0 x% G% `/*                                                                          */- ~0 e. J8 Z; X9 O
/****************************************************************************/
$ K6 g3 v" {, v2 @& X% b8 Dvoid GPIOBankPinMuxSet(void)
# h+ N9 {' g' _' R{
" j( _1 L  d) U        EHRPWM1PinMuxSetup();
' Z; Y! Q! c8 Z  P: {1 d
1 x; O) D6 {) S0 a. L7 ?        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)* E; \6 L# u! N8 n& E  x& F+ P
        // 作为捕获功能时管脚方向为输入% \! F4 G2 B6 C
        // 作为辅助脉宽调制时管脚方向为输出
; k; B' m. `$ O3 E6 b, R    // ECAP2 / APWM2' M/ O+ a) t  O
        ECAPPinMuxSetup(2);. v! C' o9 B5 O) l, G
) P9 r4 e3 o. H" c3 _" ^& p& V
        // ECAP2 / APWM2方向设置为输入
+ w+ }! J0 f. u3 w) @; d* c        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]2 X) U/ j& H6 u4 k/ [  I& z/ d! M8 G
}! y# x  \  [% E' |/ Y# l

/ U; z4 ~4 c3 N5 P# \/****************************************************************************/9 I' c' Z* w3 k# B5 K8 ^" R7 `+ @% u
/*                                                                          */8 u+ {, W7 N: ^/ z) ?6 C
/*              PWM 输出波形                                                *// d( t6 {, W  a
/*                                                                          */6 ?0 w; S0 O: G) K
/****************************************************************************/
4 }, e! U: w5 X$ B: q' Qvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 W5 @9 n. A0 T{' c6 x, q, N. b: C7 ^3 `! d+ U9 I
    // 时间基准配置
1 X' H0 k) _* i- b: `6 l. e    // 时钟配置& @+ u" X+ [/ P& w  B
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 n5 [" n9 Y+ |* B
9 B3 }% ~% _, D: Q1 M# q    // 配置周期
8 H- t" V. G+ b" Q    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
# P5 ]3 O- |  p; g7 {                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);. @5 D$ j6 y1 _9 O" y
+ b) T* E2 d* N8 z  H+ `8 Y
    // 禁用输入同步信号( P/ z" d' h- y# N5 h- h
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 ~" q% Q, l9 n
1 N8 J' O) M- Y$ b4 V    // 禁用输出同步信号: P0 I1 r# d7 S" j  f4 ^
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);4 P9 c% J" ?* `) F* v- T
) ~+ A) V5 v/ D3 T$ M! q; p
    // 仿真(DEBUG)模式行为配置* K9 B- |+ O4 X. X
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! J/ s/ X: x* P/ B4 A- I! t, ]& f* i2 e# C
    // 配置计数比较器子模块9 e2 S$ G7 S. C3 v
    // 加载比较器 A 值/ x( C, W2 P4 N8 q
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- @6 Z- D. j% d                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* s$ \3 `' X7 P$ z5 E  f; J; L
$ u: h3 s. \% Z' u; E9 T' _    // 加载比较器 B 值+ e9 A3 O. g2 O, Q
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,; @6 N" C, k2 T5 U- Y
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 o4 W# h$ P3 b$ `
) z9 K. g4 k/ }& B    // 功能限定配置(输出引脚触发方式设定)
; a5 x4 Q6 B' h4 n- D& }    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出7 g  T/ e( {0 X, {" V" U
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,/ V; _5 \& |9 {, e' {
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,3 f1 A/ J. b8 Y- k8 D3 E* U
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& S; _5 s" ?6 N) J, ~% s1 q5 K. |: d) ^: ~! q
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 i3 B+ e! y, I7 `9 d8 Z$ z" r) R    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);# j1 @  _3 g! S) g# |1 v
+ Q5 I$ _: d5 b
    // 禁用斩波子模块
# t: ~6 z4 A6 L' _- H1 c0 |    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: U% X- Y4 T3 |# l; _( R
4 n2 k% Y! I! n- e& e, J. a
    // 禁用错误控制事件
0 e/ H. e' _6 Q6 }    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
+ _  k- [$ x' {4 z    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ o+ T& h2 d+ j9 E& K6 x
8 L+ N2 U6 i: y4 v, M
    // 事件触发配置7 I( U" u$ n/ C% A* \7 ?
    // 每三次事件发生产生中断
+ b7 Y8 ]9 ?' G    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
  S% A1 P8 H3 [8 z8 Z    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ z1 d; y) A& E8 q& i
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- ?2 c" R2 }7 n) t5 b3 d3 |: o0 b    // 使能中断1 a2 j6 O, `/ P6 S: k. u6 ^
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, b: S7 h: }  p8 Q: j( ^) j
' W: s, C5 t$ W2 K0 ?  n    // 禁用高精度子模块
: T2 C4 Z% u! V    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);; w4 r8 j" F) O1 e6 c) x

7 X1 x% ?3 s3 i. g9 b) G) j    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);8 A) M& F5 m: f8 |7 t, T4 Q6 m4 L
}2 }5 C) P: {3 R- J

8 C* b' F/ p7 i- Kvoid ChopperWaveform(void)$ t; V4 x; q1 W" W
{5 L: |+ a% r1 z5 c( D. n: r
    // 50% 占空比
7 O2 j! x0 y( o5 T8 N8 [! t    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ z3 r- B3 H! h# [$ |& o- R  R+ `# I    // 4 分频3 X+ @2 h, V* i8 F, B) `
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);" @4 c( U1 P8 ~8 C5 }, r6 |: M9 J
    // 单个脉冲宽度, J: k: ?* j  K
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);1 I  e  v* ^8 q
    // 使能斩波子模块8 Z; x' H, r4 _9 b- h3 e- q5 _
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 t9 E, R5 v- A5 {( [& o  |" u0 k/ H" h}
2 ^' _4 t9 n, D) B2 o1 _0 b+ x2 b
/****************************************************************************/9 t3 T# {9 B% w& ]) g% g# l9 f
/*                                                                          */3 U) u! P& f( v' f+ i8 E3 J
/*              PWM 中断初始化                                              */+ t' y( ~! G& Y7 v
/*                                                                          */3 i4 D  {6 H4 G- [: C, B
/****************************************************************************/; M+ {& J! c) s3 P" m
void PWMInterruptInit(void)
9 C8 |' H% U! A* y{) |; U' }7 Z4 L6 V* ]
        // 注册中断服务函数0 d3 s5 a- C+ w  P
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);: b4 W& G4 h; J) B
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);$ E/ `/ m$ `, ]* F6 W5 c
2 b: V: b  q2 e3 E( O1 T$ c) v' l! K5 }
        // 映射中断
: V! `2 c3 P% t5 t4 f; ?7 R9 A1 [6 H        IntChannelSet(SYS_INT_EHRPWM1, 2);# t; ~% Y( u/ c: O
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);8 \! o5 X: D- F- q5 v' U9 ]$ C
, z% A/ W5 t% `& _5 ?
        // 使能中断
! I1 X0 C. h- ?  F/ \  |( c4 B        IntSystemEnable(SYS_INT_EHRPWM1);3 e9 A; [% t0 ~3 G3 _
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 v3 d; x7 s" q) W}
7 u1 k1 O& U# B3 M9 s- l; c
7 y2 x# Z7 X* z/ ?( _: a/****************************************************************************/4 H4 R' Z+ q  u6 d, A. O
/*                                                                          */. G) D: \! ^8 i# q
/*              ARM 中断初始化                                              */
; G! g6 o5 R$ ]/*                                                                          */
3 o' m1 h* G" y" x: c/****************************************************************************/
  {$ O3 T! E( @; Rvoid InterruptInit(void)
1 h( M; Q+ a: w5 O2 N{) `9 s. ]2 D  Q2 p: {! \
        // 初始化 ARM 中断控制器1 l. p, ~5 d$ t, E0 q
        IntAINTCInit();
+ T9 F7 e5 e$ E4 }9 L: }3 v6 A* Y5 A1 J5 e
        // 使能 IRQ(CPSR)
; _/ V. y- f$ n3 }        IntMasterIRQEnable();: C( I7 [+ y1 T# _# x

8 C' [+ b# R- s+ O1 I        // 使能中断(AINTC GER)! G8 N$ o# m8 m: u8 N% |
        IntGlobalEnable();
6 D5 J* _- ]' B: s! _& S# g8 Z. @1 ]! Q, c
        // 使能中断(AINTC HIER)1 T: i+ y0 U' F2 s6 a
        IntIRQEnable();
9 u7 H9 q2 H3 b! W5 d}+ j3 u1 z; T1 J/ P7 O; L  d& M1 ^- f

/ _$ K) ^- L2 p8 n" U( a0 X
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/+ u! M, |8 M# P1 U) M
/*                                                                          */
' S  Q- |9 m; L8 O' V# ^/*              中断服务函数                                                */
3 \2 t" L' M/ z5 F( {% i: {  ~/*                                                                          */$ r, m: a/ B" N3 o2 X+ y
/****************************************************************************/* _# d0 o) d1 T* F
void PWMEventIsr(void)
. ?7 F" n5 Y# S& y* n{
" t+ z/ m5 w# ~% d9 b+ k8 ~        IntSystemStatusClear(SYS_INT_EHRPWM1);
  @5 j+ \" p4 G: d' F$ V' d
/ c9 U6 m/ G# y& s3 J    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- i1 P+ O9 O5 b% j+ v: j}, f* {8 e8 G; y9 v3 \3 w1 t
- A$ f1 x2 z$ m8 r6 g' m
void PWMTZIsr(void)
3 a1 g0 F( P0 W* t2 D8 B3 Z, L{
# X2 a( [+ z8 L        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" F5 d9 m: k; \- r+ E4 G" T& N: \' E
) h. Z' p+ B* Q* m  G) m7 v    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);# Z8 C1 z; Y1 ^, n; H; ~# y. X) h
}
" ~' e- K# ^7 k- f3 U2 i7 {+ @4 v) y: u
/****************************************************************************/7 Q: Y+ w+ W& \0 j
/*                                                                          */
2 J3 v! _* L+ T% [  e/*              初始化捕获模块                                              */
+ V/ O0 v5 q- D! ?. h0 c/*                                                                          */7 k0 [/ t9 R9 q, R) z
/****************************************************************************/0 X# t4 u" Q, J3 \; A& r
void ECAPInit(void)+ s# X* [% ^) J
{
6 [; U$ f6 v6 w9 H+ i8 ?( G        /*-----设置 ECCTL1-----*/6 q4 {. }/ k2 O/ M+ \
        // 使能CAP寄存器装载
# @3 W" e' n* O( {9 n, q5 g$ g        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 {0 h: [8 X7 z" ]" v4 l" o4 S        // 设置预分频值.
& x% b9 H! V) M& C/ C        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
  W  q- @+ j  m; S4 Q        // 上升沿触发捕获事件3 ~. P( ]" v8 J) N
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);% U2 S2 ?3 h' M9 o
        // 输入捕获后重新装载计数器值.
3 F8 R5 f5 _* l        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
# y2 f9 t6 Z6 {5 z4 E$ S. q3 |, u2 A$ Z' f* i' b: S$ N7 F
        /*-----设置 ECCTL2-----*/
$ A7 Y: P3 V/ A* q% s) f! g        // 连续模式8 \; b& V  t$ \$ n
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 w" s# q0 ?7 k" G: U        // ECAP计数器TSCTR持续计数
4 G) F8 i0 e  W        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);( q+ @# T2 s/ [* u) u# f
        // 禁用同步输出和同步输入
: O5 }" k8 H& J: }% f        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, o* F' h. }5 p8 s( U  O        // 配置 ECAP 2 为 CAPTURE 模式9 V: N4 y' }- F* G4 U
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);) f2 c; d! G6 E. z. K

, x3 Q+ v3 H+ S! Q! w        // 使能中断) t6 l9 }0 P. o8 K( s) ]! o; Z
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 [9 e. d6 O: ~. Q( P}3 {0 }, w3 [  r# l8 H) }

2 ], @5 `! r( {8 e: y, C. U/****************************************************************************/) U3 k8 {- o9 Z  B& C1 z
/*                                                                          */) d) ?' q& D7 I! |
/*              取得捕获结果                                                */
: @0 y  o8 D1 D& ~/ j7 g( B9 ?/*                                                                          */" ^( H# S5 b8 h% U) l% I1 f' _
/****************************************************************************/
8 q8 I8 |7 l& Zunsigned int ECAPRead(void)
3 `% a9 x, w8 Y/ Y% d{' S" g3 \- t  o% o! U3 D5 r3 y
        unsigned int capvalue;+ L! U0 n/ b9 w0 e4 \4 k+ t6 G
        unsigned long frequency;
& |" Y0 L" ^$ _! p  i, {$ C/ o4 [1 ^) J0 l" |7 }0 k
        // Event1 中断标志
/ t3 G8 p$ \$ _( O        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
+ @: F" L! S- b, k3 u0 H) A4 M        {& S$ N+ F, J' E
                // 取得捕获计数: ~$ b3 u% U  J
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
/ x( c- i0 R7 k' |, \7 y! I- Q6 m                capvalue = ECAPResult.cap1;
* A5 ]* [# m* y) x9 L, S2 T; z& Z  Q  R: d9 v1 [+ Y
                // CAPTRUE 模块 228M 时钟主频# i- b1 u2 @+ F
                frequency  =  228000000/capvalue;" u7 R, {1 K, S/ s) M* D
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);9 V; m6 h) C6 Q$ Z* v$ P. A3 H
' U( k2 o' z9 x9 V
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
2 d( ^! Y: I$ U# E//                IntEventClear(SYS_INT_ECAP2);9 X+ z, m8 I) v3 i) P! x: `
        }
* l; `9 _- Q. O3 A& J# C1 [: e        return frequency;
9 ?# P9 y0 B# Z! u' u' l- @1 j}/ D# o0 k7 j) c0 n* L1 {# W/ Y. ~

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 N) Y, h4 a9 k" i- _2 ^[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