嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" r( I2 B  r3 ~$ O- A
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
& ?0 S9 s) d, e  J* b% H/*                                                                          */2 `1 d1 M  @0 w* x; d+ f6 w
/*              宏定义                                                      */
& @- l2 ?: P( _4 \/*                                                                          */: ~1 _6 p3 A1 g$ E% O: f$ F
/****************************************************************************/# A4 k! k! O" y
// 软件断点+ c" U5 v. \  q- e3 V, |( h
#define SW_BREAKPOINT     asm(" SWBP 0 ");
+ u  W' R: |+ z6 Q2 {: M  |  _1 Z6 e7 S$ e
// 时钟分频4 ^. ^4 P1 c* q1 l
#define CLOCK_DIV_VAL     2281 \' l1 Y# r9 @7 t! N7 |! b

) p  {! x2 y% v' [/****************************************************************************/* w0 c" ]4 e* J" Y  \
/*                                                                          */
$ d7 g9 n6 @9 r: B) p1 r2 m/*              全局变量                                                    */
, ~3 R8 d! R5 s- ?: R/*                                                                          */6 Z" p" }0 c% g$ g" f* m( I& c
/****************************************************************************/
8 Y* Q4 D- W3 w% t. W0 mECAPCONTEXT ECAPResult;: ~4 b3 Q. T5 _# p' @
9 b6 A/ k1 _5 H, B3 ^2 Q9 m5 \$ u
/****************************************************************************/
4 ?+ \, s& h1 ], }$ |9 q/*                                                                          */- m7 O0 t0 q6 d; X6 A' K& b/ P
/*              函数声明                                                    */; S( T/ X* D4 Z1 \0 P9 p% F' w
/*                                                                          */* n0 ]- X' ~) _: g8 w* ~, s* R- x! H/ [
/****************************************************************************/
  W( l4 a) V) K9 N  M& ^! ^* ^// 外设使能配置
  s2 d! V/ R. ]# Gvoid PSCInit(void);1 d- R+ `/ S9 b; B9 g6 k

' h2 d. |! B( b: l' ^) Q// GPIO 管脚复用配置
8 i% `+ E9 b1 [. Jvoid GPIOBankPinMuxSet();* Q; R8 U! y2 C0 \* P

/ y5 B4 g! _( ]' K// 产生波形1 a* \9 v; l. B1 l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);6 n. K4 E. _7 G) v+ Q
void ChopperWaveform(void);
; G+ v( S) @# o. E9 Y  P4 {- ?: s0 W. J' z4 v6 C, z0 E( f
// ECAP初始化和读函数" j3 i4 D1 [3 l1 N- @
void ECAPInit(void);/ I8 j8 m* o- P1 C8 ~
unsigned int ECAPRead(void);
. U# X3 L% r* F3 u8 x, I6 ^* @0 r5 L4 |! U
//ARM 中断初始化6 R$ v' H7 u( O& i
void InterruptInit(void);
& h) n2 H7 l4 P. C2 b2 F; v+ D3 S
& w* B. `, u6 I. B$ _+ J// PWM 中断初始化# d/ }& t5 o& X/ `% e, ~2 Y
void PWMInterruptInit(void);
1 H% A; g9 J. Z' m9 U, `) w& s// 中断服务函数
- W: ^4 x# f: F% N$ g// PWM 事件
$ o2 ~& a5 o$ W' Lvoid PWMEventIsr(void);
% d2 d  w+ a. G& I% }// PWM 错误控制事件" Z4 }8 Z( z$ D2 |( h+ a( |: g: a! B
void PWMTZIsr(void);" L, q1 c" U, P# w) ^7 z4 t

: M. s2 t( U, L' p8 U/****************************************************************************/
9 _1 {: ?1 F/ ~" a- o2 u/*                                                                          */7 v  b8 t( I3 v! T% \
/*              主函数                                                      */! |) K* v' H, Q6 V' i3 f
/*                                                                          */9 P: P4 V9 }! B% a7 k7 N
/****************************************************************************/4 ^& p$ _" ]$ l( b
int main(void)% }% Z4 {4 x2 i, r) m6 n
{
. d3 Z; L3 x) }5 t  h% f$ A- ^        // 外设使能配置
% ~- _. d, x& r: q7 Y        PSCInit();
5 i7 u6 c0 T% d! u: o4 s
6 r" i* G* W# o; z$ t$ t        // 初始化串口终端 使用串口2
+ P. p" N- u, Y" T4 ?8 v        UARTStdioInit();
. Z2 n; w& i, b       
& S9 F! O/ H3 s: D% l3 O        // GPIO 管脚复用配置
; T4 i) K1 A& @1 t& O3 ^        GPIOBankPinMuxSet();
; ]7 h  m9 x$ r! }- ]0 L' r% o
  V/ v& M* n  v) H, l& s8 s        // ARM 中断初始化
* }/ N, `' r' y2 J" a! {3 W$ k        InterruptInit();/ t6 e2 e  s* _! W0 I/ Q
+ D* x/ m! s3 Y  J6 ?( _1 S
        // PWM 中断初始化" t5 Y9 S. v; @
        PWMInterruptInit();
: M! ~  B- s$ X
2 ~1 o' N+ ]3 Q3 L7 R2 u* F6 r        unsigned char i;) T; x. E) a9 E0 {- `8 {% c
        unsigned int j;2 p; ~& w, H" u# x* y2 U# O2 w2 i2 F8 y! F
0 T1 }" r* x+ }3 X4 g9 i3 E
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; C' Y  `: v8 o1 j" x
        UARTPuts("------------------------------------------------------------\r\n", -1);1 ?$ M; `) N; s! q
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
  D: v8 F& I& M1 n5 D; t/ a        // 产生波形# h9 E5 h; V, L- @
        PWM1ABasic(25000,50);1 n/ c( m( y3 L* v2 Z7 F7 J

7 l9 X: g; c& S+ m' g        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
* @2 Y5 [2 x' i5 o9 s! R: p        UARTPuts("------------------------------------------------------------\r\n", -1);
7 h* v; ?+ E: x; d) r! p8 {6 R3 q
, j- P5 X! R5 U8 }( |! K
# U" C' E/ s2 Q6 M! l! G0 F; o9 ?
8 ]8 U- |3 P0 Z- R/ ~9 ~        UARTPuts("------------------------------------------------------------\r\n", -1);
7 ~- O5 M3 t! Z: O+ ^1 q' y; u        UARTPuts("                    C6748 ECAP Test\r\n", -1);
  n, N! T  G% C6 g- o& N$ t4 ?% v        // ECAP 捕获初始化  u7 m4 _- p9 s# S" |+ T/ H" t
        ECAPInit();
; G' r5 Z8 P  S1 C4 i1 U8 u        UARTPuts("Initialize ECAP.......\r\n",-1);
9 ?% }! m( O6 t: x) h  l6 Y        for(i=0;i<5;i++)
! k: V" r3 h. @% O& T        {
# o1 q. f$ I6 c+ k8 H2 D# w/ E                    for(j=0x00FFFFFF;j>0;j--);            // 延时
1 v3 v4 i  @4 G+ c" U, J                    ECAPRead();
% |3 K. ^7 y- i8 n# @        }8 `: G( o9 y8 z. U1 i( D
        UARTPuts("\r\n",-1);
. {' `3 J2 |& b. N8 O' i! h        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);. x5 L" P8 v' b+ i7 S* {
        UARTPuts("------------------------------------------------------------\r\n", -1);  J2 U, B, x$ C) q7 l; l8 r
, [: q% S+ y( ]3 ~  ^/ x
        // 主循环5 g" u. l2 Z3 Q# i) V
        for(;;)
8 _+ X6 Z1 R; Q6 \        {6 k  v+ b6 f4 j8 C- n5 p$ A0 d0 f

; c+ p7 \0 w+ v( C3 w# S        }
& T' K" _' R1 P9 ~* w2 R$ o}
8 j8 a  Q" X7 s1 R% B! [+ Y
& x2 O0 W9 V8 U& C2 P& E0 M! q/ }/****************************************************************************/
/ Q; E& w, ^2 l/*                                                                          */
2 p+ q, `) P: S( o/*              PSC 初始化                                                  */& A' g; o7 o6 Y8 o" j
/*                                                                          */
6 W1 Z$ F# E# `& x( x  ^. s/****************************************************************************/( F. H: V4 a+ R& w- p, p. F
void PSCInit(void)8 S+ F' i; x2 ^1 n$ H% I- p. d
{
/ d/ G% r  ~4 s7 y4 D        // 使能  EHRPWM 和 ECAP 模块7 f: G# \* i8 ^7 E& f
        // 对相应外设模块的使能也可以在 BootLoader 中完成
8 G5 K  F/ i6 C9 a: |4 p    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* }2 |1 ~( w; ~  T& t# A2 D    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, w, f  w+ |3 s6 @5 C
}
8 @. m9 i6 p3 P$ C) d
6 F* n9 {( }. D8 \' i3 E/****************************************************************************/! }" V, h0 Q! o" G
/*                                                                          */
. i; f0 g+ u, f/*              GPIO 管脚复用配置                                           */
9 V  R# h7 \3 ]/*                                                                          */
+ }9 ^2 \) ]* S1 k: Y/****************************************************************************/) ^4 @8 s% }6 Q7 ^0 T+ \4 E0 r% g
void GPIOBankPinMuxSet(void)
- x2 D  M: m! V$ ^+ h" N* K{0 u; @% m+ U* R9 i$ B8 S
        EHRPWM1PinMuxSetup();
' ~5 J. @6 h  _8 r9 \" l. g. w3 v# L2 w7 A; ~
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP). y1 k1 {: q$ e# j4 c/ I* Y: _
        // 作为捕获功能时管脚方向为输入2 f+ O. Y# a1 ^; T
        // 作为辅助脉宽调制时管脚方向为输出3 Q+ h! s5 }' P" A) y2 b" X
    // ECAP2 / APWM20 y$ \  A+ ^* p0 g: H
        ECAPPinMuxSetup(2);
# F3 e' X' [/ a, v$ F1 ~7 r4 G! Y7 q$ r
        // ECAP2 / APWM2方向设置为输入* L* j8 V+ l2 `  e+ }
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
$ d# @0 W* E% h" `9 v6 B}' A4 P5 [6 b# i& ~$ J

+ ~% e; ^# q% F9 z- R7 S/****************************************************************************/
( K* n2 k7 b1 ?' G0 T/ |- g  Q/*                                                                          */6 a& v6 t" l2 \1 _$ i3 u
/*              PWM 输出波形                                                */
- v# K5 y6 C7 o9 V/*                                                                          */( N  R' ~  C) P' C  q
/****************************************************************************/6 p/ c* x9 Z: y8 k/ T) l2 j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); \, u( E1 s& Z3 @( T$ D
{1 X. T8 _7 I) R& \; ?' e/ r! C9 C' T
    // 时间基准配置% u0 V) o6 F: `9 T% X6 U% t' ^! g
    // 时钟配置" |2 S: X+ C6 n) g# g
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);$ g: }# Y- H0 C6 V) \: P, @
9 K) U; z6 O& x) B' ^& q
    // 配置周期2 c! {. F8 v+ Q1 A
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,3 j; K& }' B5 w( b
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);/ J" X, Z' b0 B

. C2 U! \) H% F5 d' F    // 禁用输入同步信号9 r' v1 K4 i$ w$ }& g* v/ I
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: I6 E1 j: B1 |9 n6 l. h8 N* _' y% q* \2 E& w
    // 禁用输出同步信号
1 k0 Q9 l/ B, y    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- Q8 }% H) F( u  @3 P% g$ Y7 Q2 a( U& H% ]& Q6 E. z2 t3 Z
    // 仿真(DEBUG)模式行为配置4 _7 X# W. m' v2 Q9 \7 T9 ^
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 G" B8 }0 }; J; M* O+ a5 e: j3 p, {& _7 A  q
    // 配置计数比较器子模块. |* n( f2 t. c0 E
    // 加载比较器 A 值
' D/ A) W$ a$ K/ Z0 c$ ?    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' M1 ]4 }- c; }. V" y                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! l* y  l  ]2 V/ R# B

- v* k( @' D# g- z% t    // 加载比较器 B 值
# \! e! r7 Y! D' T# [/ ?# H7 D    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,8 Q( e& J* ]  c; w+ ~
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 L3 H! Q2 A; i9 {/ e) g
. e! E9 _1 T4 ?- e6 J5 N    // 功能限定配置(输出引脚触发方式设定)/ @* C1 [; N% E$ G# N1 q3 W. v6 @
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' j, o% n7 g7 k    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. g8 B4 a9 x! u0 Q+ w8 D/ r
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," K/ e1 P! }( B+ z2 b+ A2 q5 |
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 T6 X, a' A. f% T2 s$ w: ]" c8 l! r% ~' {
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
% P8 k- O/ i! k  B2 ~$ W    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& ~! T9 T. T6 K% j
/ z% ]5 a- G/ q5 u
    // 禁用斩波子模块2 b" C% v' I; u/ |
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, y' g% o3 P% _, g; n* Y* E/ k) l$ L3 }# r
    // 禁用错误控制事件- o$ ]2 u/ M$ j3 U* F, p
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 t; ~  {. }4 s: r1 ]
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
" _1 L- `/ X9 T2 Z
; W) Q- w' o8 k0 O* O    // 事件触发配置
! ~% [6 c) E$ k6 H1 ^9 E3 ]    // 每三次事件发生产生中断
+ i4 h- K6 n& ~2 E( b% o( o    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 X6 V3 w' X8 j. F    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) t1 Q2 r; y# X4 @; Q    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. }, @9 J4 C! X2 C    // 使能中断' a/ C( Y' u$ R8 i- p, R
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) h5 j2 m8 F3 a5 {/ C

- m$ z# K+ D) g3 Q! N6 a    // 禁用高精度子模块' y) Q7 L& n/ k9 i) U0 v9 W# ?
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);: _$ `# ~' w' g3 N) D

# t0 r5 f9 L  f6 I    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);" O; w6 h0 W+ t) G
}: M) j* C) f3 z+ T3 h3 l

  x6 f! o. J3 w% |! K" Svoid ChopperWaveform(void)
- D+ N% C) A3 g7 }+ F9 {{
) |8 `* E  R- D( a: C1 r# p* Q    // 50% 占空比
( K5 c* W! \3 }* N! j( M9 ?& i    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);* B2 ~: x0 H* l+ l) u
    // 4 分频
& m. f) x0 d2 _# h2 H    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 W$ H' Z  ~4 k- [1 e    // 单个脉冲宽度
  m( [5 c2 Z. N* l% c' a) t1 t    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);, O2 J! [- M/ ?4 Y7 j! T4 ?
    // 使能斩波子模块
8 A" s8 Z/ O+ R0 y3 Z    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 F: c  [! ~9 v1 F$ z# u0 V
}% y9 j( _% }$ D6 \8 A
" c$ N& }- d( X
/****************************************************************************/
8 t8 q6 b# y  i# p8 q/*                                                                          */
! K! y; {" z& w! U! x- Y7 _0 D/*              PWM 中断初始化                                              */  r$ u/ S! U3 v! f$ G; |
/*                                                                          */
- C& G& G6 m6 \$ \5 {7 W  [/****************************************************************************/# q- E! f0 O( _0 m2 k( [4 l5 t5 Q$ N
void PWMInterruptInit(void)* K3 R, I( U, C" h; ~) d! _5 d7 c/ [
{  `5 k5 b' i& }( s! N
        // 注册中断服务函数
' m, s2 r4 R, x5 Q        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
/ K6 R! D0 a. g& V% h        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. u/ V8 }/ Q' n3 D
/ D9 |( r" ~% T* `6 q        // 映射中断
! Z' |* f; L3 [        IntChannelSet(SYS_INT_EHRPWM1, 2);
$ h+ \- g) M7 o        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ F/ e" ^! g  r+ o1 U* Z* Z, t, ]. b" C, M
        // 使能中断1 ^+ H& v) I7 Q0 ?! d
        IntSystemEnable(SYS_INT_EHRPWM1);) M0 m3 e" R4 {7 m
        IntSystemEnable(SYS_INT_EHRPWM1TZ);% S4 ?1 S. t6 j3 D- R
}
9 d$ V6 Y$ D( J: I2 j2 R& e
1 }! O, y7 Q& ~' J/****************************************************************************/, {' p8 }- r" h! U  R
/*                                                                          */
) Q$ z! t9 p9 [6 L% l3 O/*              ARM 中断初始化                                              */2 P5 j7 y2 ~$ Z2 @; Z
/*                                                                          */8 F: k9 E! P3 d5 ]% `1 G" O2 ]
/****************************************************************************/7 E# Z: X# T1 V( r- |2 ]5 T. l
void InterruptInit(void)- F& V9 E8 b' c
{
' y  X: x5 F5 t. r6 Q, v        // 初始化 ARM 中断控制器
' a# w4 `/ \& X& D2 |        IntAINTCInit();
. S% r1 f  G7 D) t$ D% d9 c0 |9 g; N8 ?* u" K% c
        // 使能 IRQ(CPSR)" e) E# V% d4 h4 y7 h+ i
        IntMasterIRQEnable();
! Y# C7 \8 {+ C# a: V/ c. A$ G- f: b9 R  P3 _' E* l* X
        // 使能中断(AINTC GER)+ n6 r8 j9 N* R0 M4 q
        IntGlobalEnable();, k$ r' ^" N3 ?& K% `

* f2 `& T7 C6 J& x        // 使能中断(AINTC HIER)8 w6 v- h% ~( p& C2 p, W( V
        IntIRQEnable();/ p, G+ x& V8 ~9 r( |
}
: p- k5 z' Y) W- T6 Q# t- P  u
; q3 l! ~/ z8 x" J  e: x
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/; V: d3 K# |( h  I
/*                                                                          */
, Y* }* A/ q2 K( K7 y0 r6 J) N" V4 p/*              中断服务函数                                                */& Z0 Y9 d$ ]! d! [% |
/*                                                                          */& z5 }( S+ x9 f; D) U; I" q
/****************************************************************************// w9 _/ w1 ^! \, a
void PWMEventIsr(void)
% L$ r0 r* K' G$ d( U8 |2 i{* t/ }+ N% W, {% `$ A: \9 z
        IntSystemStatusClear(SYS_INT_EHRPWM1);
3 k' s- @; H3 g& `/ g" G) R8 X! s7 A) u- d) R, V" }: p1 e
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' P. Z! A2 K, s8 `6 T
}
& f8 u1 u. W0 O- s' p1 M$ t2 l
7 O; r- g" \: C' C4 Q& h, i) nvoid PWMTZIsr(void)
, j( p" G: N4 U% h* U. {* l{2 e1 L1 H- d& v; o8 N; j7 K+ J
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
8 o: v' {$ b! v; X0 E7 K0 G( W" z, x* }/ R
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- ]: ]0 Q6 b7 @7 ^" P5 P4 _& K1 ^}
( f7 S9 Z) c3 F
  z4 j3 k, Y* R/ R/****************************************************************************/
1 s* B' R' ^9 \9 t6 g9 N( l$ v/*                                                                          */
; }. h. Y" ]( z* [8 Q! A& H/*              初始化捕获模块                                              */1 S2 g8 r8 _& i( t+ Y- `2 O. X" w4 o
/*                                                                          */
; Z" d+ y; S1 M) `- k9 K/****************************************************************************/: l+ Q/ v7 F. y
void ECAPInit(void)
( u* I* [3 \* }# _{, |% k0 w6 `8 C
        /*-----设置 ECCTL1-----*/8 p, x, e  n4 W* |9 O+ f& m
        // 使能CAP寄存器装载
- A! \- n3 S- [7 J# M2 E        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);) R' A5 u; {/ J6 t5 @9 @% X! A7 p
        // 设置预分频值.1 K' u! K# l0 N
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);4 w! B) u$ ^  X/ V; S! V
        // 上升沿触发捕获事件* X/ R3 X4 z5 b1 T" a
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. K/ S, j: O$ B5 S5 x/ s( J; Q        // 输入捕获后重新装载计数器值.
3 c$ I! K: [0 ]/ x, j& k        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);/ t8 o& Q0 s1 t5 ~7 J0 ]) |
) w* s' v& u* q! R& }% S2 C
        /*-----设置 ECCTL2-----*/2 h  n& }; x% R( v
        // 连续模式; v& M! C8 ~2 ~, L
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ x- |+ p! _4 t# H        // ECAP计数器TSCTR持续计数' o7 q7 _. `$ M8 r! ]7 @: n9 b9 |
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);% c1 e. w1 \0 D3 ~. ^3 i
        // 禁用同步输出和同步输入; J' t: ~. M( x8 }. \5 |
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);- ^( ^4 `& r+ D  G
        // 配置 ECAP 2 为 CAPTURE 模式( W& m' F" ~7 q6 A+ [3 Z; D0 O; C- B
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 U) [' P  z& s5 A  x8 I0 l5 Z4 s2 X2 H, z; w; {. n9 U
        // 使能中断( M/ W  n) f. E0 K4 L
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);8 X) k4 ?6 u+ V
}2 q- O& G& I, o1 h, G% W
8 ?- u, p* X1 B
/****************************************************************************/
7 _4 n5 i2 C$ G% }/*                                                                          */$ g+ R, H3 q: |$ t3 z9 N
/*              取得捕获结果                                                */
# w4 Y8 K+ \$ F0 p) f) ~/*                                                                          */. v! J5 U- o7 n7 D: b0 W$ T- X
/****************************************************************************/
, ^) [1 O) t8 Qunsigned int ECAPRead(void)
5 X8 [- m2 |* X" E7 V{
5 y) ?. C+ D' V, X- @- r0 r        unsigned int capvalue;! o# T  _8 y4 O& Z
        unsigned long frequency;3 e+ g' e8 j5 X- Z6 O! P: E( T
" U. w) D5 l" E1 h! h. A
        // Event1 中断标志
, S; H& y1 W! `; ]8 v! B        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))# B  _9 }! Y; I, U7 R  Y
        {
' {2 g4 a0 n- o4 _& [                // 取得捕获计数2 _4 t+ B3 P! V' Y
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 V  U+ X& a) c8 y  a9 S2 v                capvalue = ECAPResult.cap1;
* B9 R6 e' O$ X/ R/ V, V8 J  j. A) C) N# P
                // CAPTRUE 模块 228M 时钟主频
3 D" I" X( x* w. ]0 u* m) n6 G                frequency  =  228000000/capvalue;
5 z$ l  g0 Y) I                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
9 x' }2 [4 q3 y5 o4 C- }: M
1 E" s% A" \9 H. p4 M! _                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% T5 Q. W2 e) F4 M8 L//                IntEventClear(SYS_INT_ECAP2);
+ t% \- _+ t* A" i: n' ]" ?9 b        }3 h6 U1 f: e5 S7 d* K
        return frequency;
% K7 r, \. U+ z}  I" o4 a! \( U* a

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