嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家1 W, d# z0 h1 i  E0 N% A. H2 V2 K6 q

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
4 V- s2 g- a; Z3 v5 C/*                                                                          */& v7 b  `( i/ d7 S
/*              宏定义                                                      */
) K0 \5 L1 d1 d. B6 W/ `2 A/*                                                                          */
5 |- k3 @% F5 |$ \6 U# M5 Z& V/****************************************************************************/9 y2 g  {4 A: @1 g
// 软件断点) J  }  v1 }9 @" K
#define SW_BREAKPOINT     asm(" SWBP 0 ");# b& r- j# c- P

6 ~* q" g- w0 c// 时钟分频
' L5 \0 r6 m8 q& G) [2 T#define CLOCK_DIV_VAL     228' p6 Q6 a) L5 C/ S8 ~; G9 Z
( P: D% O5 Z0 ^: Y) D6 e/ ]
/****************************************************************************/
4 f% V+ m  y( x. ^1 p! J/*                                                                          */
, U! l( o6 U/ g; V/*              全局变量                                                    */% Y& P* w: J: ]6 F) y
/*                                                                          */
0 T6 J, x) v6 [) G5 t+ D/****************************************************************************/
# E9 K/ k; s, r) i% JECAPCONTEXT ECAPResult;$ F/ P+ s; F' J1 K% Y! C# b

+ ?0 G3 i: X, q. c7 A' k6 F/****************************************************************************/
# Q& `6 F& x3 `* W/ G/*                                                                          */* O8 d: f1 \- n
/*              函数声明                                                    */
* y3 d% O) U4 G4 X2 }/*                                                                          */9 R1 r. D1 Y3 v1 G: W5 d" e% \
/****************************************************************************/8 T# U/ Z5 {6 U5 g+ n
// 外设使能配置
( M' T( J+ h0 j  r* O1 Nvoid PSCInit(void);6 P% {. u: q3 m4 t7 M
" ?  `# K( u, c  R& e9 _% v8 b. s
// GPIO 管脚复用配置; t/ Y+ h9 f: C
void GPIOBankPinMuxSet();
+ ~# m- M8 U( a  x4 ^5 a& r# [$ [* m# I2 Q2 ~
// 产生波形6 v7 [' j8 q7 j7 L. s( v6 d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);0 l7 {& i3 D- d3 w( ], ?7 ]
void ChopperWaveform(void);
+ s, Y9 D& }- X0 w2 S
. s5 Z* z# I/ v( `& _! X* A( k// ECAP初始化和读函数
3 B* V& \* }: T- H) Cvoid ECAPInit(void);( K8 j! r% x* R3 U5 A" I* V. @
unsigned int ECAPRead(void);$ s7 L4 f9 T. Y+ J% j

; M8 g1 z+ f- B% B* M1 z& K% H0 V8 `  }//ARM 中断初始化
6 w% G) ^" o8 f& Q" Bvoid InterruptInit(void);
* g9 e2 S) Q5 J# y/ d& [( C+ b4 E6 b- {0 U6 V5 [' e
// PWM 中断初始化2 o' c! b/ S" q3 b- j( x
void PWMInterruptInit(void);# I3 |0 y& T- I, W6 O% |( p, C
// 中断服务函数0 R, K$ z9 ^; y' Y% s# ^! C
// PWM 事件
5 i' B* r, e4 kvoid PWMEventIsr(void);# R+ _0 H6 ]  ?% e
// PWM 错误控制事件  M6 y9 U3 @  M3 t
void PWMTZIsr(void);
* `' r3 e2 e5 |$ {( C: B, `7 r
1 {. B& b! i; g$ D: k/****************************************************************************/
' r5 q) G; f2 X/*                                                                          */
/ w% K" N9 b) V. W5 I! T; \; E$ v/*              主函数                                                      */" h6 k$ x" V# d0 Y
/*                                                                          */
( Z" c( N0 N5 o. H0 g& U( g/****************************************************************************/
. n6 p8 F& d# {% D1 fint main(void)
0 v% [1 T+ R- |% P* V4 S{  t2 [& K- D1 k, X
        // 外设使能配置
# k! u( E2 _* q) l6 L! {8 R        PSCInit();- }5 w; |7 Q: _& L% A& H8 R6 w
* A0 o9 O; @. m: C
        // 初始化串口终端 使用串口2
+ X- G, q0 r, O/ U6 p0 ^        UARTStdioInit();
$ t+ P# E9 |2 Y5 C% X5 w       
# L' x: r% t/ e# Q        // GPIO 管脚复用配置
3 y9 A, e' E4 E3 x+ O: G        GPIOBankPinMuxSet();8 Q* K* p7 a, u, E7 `

8 {  Q! u, j. c        // ARM 中断初始化7 z- `& _0 Y( I2 g( P
        InterruptInit();( h& ?, X) i# ?4 k! v" Z; z& f
# P& y% k! J! U  k: i- e
        // PWM 中断初始化
( y$ h: [6 w6 C. D# R# w$ j& P        PWMInterruptInit();
9 q3 u3 [& q3 k$ }/ e" ]* x5 B" r2 ]1 o- \
        unsigned char i;% S& F" @' j; T, B- x# l
        unsigned int j;
% |5 O9 v7 a$ [3 ~2 u  }8 V
  A$ X9 {8 F% g7 [+ W" ^2 V        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);2 L* R# [- Z& n- R( ]9 _4 N0 }
        UARTPuts("------------------------------------------------------------\r\n", -1);: d# t- v, t: h+ ]! q1 x# Z
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ {+ h( S% v( |) y0 L4 i' W        // 产生波形
3 w: J# l1 f$ |- ^. }        PWM1ABasic(25000,50);8 ?( j8 q$ Q4 f% T) P& H$ e

( Z- M; m2 I: U$ q: k4 m/ o# I! W        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
0 m3 g  A* y* J' L        UARTPuts("------------------------------------------------------------\r\n", -1);8 u( I2 D! u- u- {

4 V" F6 ]. \% p4 v# u$ c% H! }
) f0 ~+ q% Y2 |  }# P# B4 h6 A
        UARTPuts("------------------------------------------------------------\r\n", -1);' W! [1 }- ?, A( X. ^5 a  `
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
  J4 @6 k& ]! S$ b        // ECAP 捕获初始化( |  e3 m  y% D: N; d
        ECAPInit();( s# j+ ^2 T2 c8 h2 ]  j
        UARTPuts("Initialize ECAP.......\r\n",-1);
" F! h6 p) H; q2 l4 z( r3 I2 y        for(i=0;i<5;i++)3 c8 V! V5 x5 t- S
        {
/ u3 W2 e4 i4 J6 x" r                    for(j=0x00FFFFFF;j>0;j--);            // 延时
- r3 g' j. ^" B; Z& }. u" \: c4 e  h                    ECAPRead();! [. }5 v+ r6 G4 P
        }; N6 F' d' c8 P! s) @
        UARTPuts("\r\n",-1);% B' r$ g- F% t
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
3 Y0 {7 w0 K9 M2 Y- f) F        UARTPuts("------------------------------------------------------------\r\n", -1);
) I4 A; E5 J& ~% U9 {2 N2 [8 h
! ~0 o/ L1 K9 U3 k7 v. W$ M        // 主循环3 v: H& O  V! m: g
        for(;;)  y. f- p9 l, Y8 H4 {0 U
        {
. G! L; L' t2 L" C9 b- l* K, ?
: y& e5 }' c7 e0 H        }
/ d" U- E' x  y6 b' ?}2 s* \8 f9 ?1 y. e# Z
0 c5 E% i5 [) |8 B- e* D
/****************************************************************************/! u) h) g, Q. K7 I4 k
/*                                                                          */
( X0 _# t/ [" d4 M, i/*              PSC 初始化                                                  */" [& g, x7 A. J3 Q! J1 f( F
/*                                                                          */4 P5 f( [! A. N2 I* E, ~
/****************************************************************************/8 c! w" h; Z, D0 f6 K
void PSCInit(void)
% ~2 v' s- {4 f  e. l, \. ]8 N{% C1 ^3 |7 O' T/ h# K% t' p2 ?
        // 使能  EHRPWM 和 ECAP 模块/ b/ K& E7 J2 J3 t( V, v
        // 对相应外设模块的使能也可以在 BootLoader 中完成
  x8 q1 I( A3 H    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' S6 U, E8 i( |; I% G& }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 U+ b$ n1 B3 M}
9 L# _: a: y2 z1 B: W& x0 B# V6 k  h7 Q
/****************************************************************************/
, F5 }( x0 Q% O# f1 ^1 B/*                                                                          */
# L- g9 S7 c( O& I% n2 e/*              GPIO 管脚复用配置                                           */8 {/ y) {9 X- m' Q3 X; P/ F
/*                                                                          */) ^! X0 T! F$ {2 H( p: k
/****************************************************************************/1 R+ b- x$ a# q9 v; f9 D" \4 A0 o9 D
void GPIOBankPinMuxSet(void)
! D+ I  W/ P+ S) d+ y# s, G, W# [{
) o0 B% X4 l' p' N        EHRPWM1PinMuxSetup();2 G7 u: A1 Q0 U. L

2 I+ w2 V) Y9 Z) E! C' R        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 ?$ n% u' y) U- C+ \; [  f
        // 作为捕获功能时管脚方向为输入" U% n8 r1 B, Q1 ~! @8 }
        // 作为辅助脉宽调制时管脚方向为输出0 T6 m" h" S  a# T  ?& e
    // ECAP2 / APWM2
5 d7 E3 Z' a. d5 ~        ECAPPinMuxSetup(2);
! W8 i; y$ Z0 u# |3 @  Q2 h9 V+ h( C4 X2 h7 C9 Q8 ?3 c2 s% x* D
        // ECAP2 / APWM2方向设置为输入/ R0 W; a& W0 b+ D: {2 K- O
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
  q6 p2 M& B( @! D, |1 T7 O! O6 P}- j- ]# J) D$ \5 g: |* K& Y8 F

  P6 D6 U8 o5 [! l" k" }/****************************************************************************/
9 n. o" ]8 J7 v7 ?" n8 b+ v/*                                                                          */0 ^0 {& r+ D6 _0 a5 B
/*              PWM 输出波形                                                */: h7 D' v: [' Q: N& Z: ~/ {1 G
/*                                                                          */
4 |8 Q  ^) c5 p( n+ x3 i/****************************************************************************/
. q2 l9 Y9 L# `  _: H, jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 u  B' f" H8 a
{
( h/ C! F/ z3 ~/ ~. r    // 时间基准配置) b4 x: S* K7 l7 S1 _! E
    // 时钟配置/ M6 g+ O+ h" }/ e8 s4 a, k7 U
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);7 |& H* k% a0 R5 N" p3 }7 J- d4 {* ^6 n1 G

# Z1 s. D. A6 ]! y' l7 i    // 配置周期
& D7 h# \6 o! P. K' N    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& L2 B# F2 [+ L9 V                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);& B- s3 J% x2 l/ R3 `

! B2 b8 m; m, m    // 禁用输入同步信号
% t: n2 s$ g7 u+ G* Q" `: M    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 U2 ^0 J2 g  z/ d1 s- t2 L, J

& S3 O- t. O$ w  y8 G0 X. \( P; L    // 禁用输出同步信号& w  |2 S! o% U, I& t& L2 a' c
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" N3 U, I6 c' v" Z, W' Y* I5 z0 R/ @
/ I/ @# O0 s4 s8 @: k) R# W    // 仿真(DEBUG)模式行为配置
# H2 [- v+ W( r; z: R1 z    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 R  Y! ?; A- _, }
+ x/ ~* L2 j+ z9 @. w
    // 配置计数比较器子模块
; m% p7 n' D3 O+ f+ W& N0 c    // 加载比较器 A 值, q5 E- f* r9 {$ f& X
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ q/ e' T8 I5 [, _8 e) G& n/ j                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. w2 e% h: ~+ C1 Q: H; ?

$ o; c  y9 h% Q' _    // 加载比较器 B 值
9 h; n/ A9 r! z& z5 o( z3 F, P    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; z/ j" g. k. K# _/ L7 Z                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);  j4 b& ~5 |( X

  ]9 z: o2 p& \& Q. t) `) d    // 功能限定配置(输出引脚触发方式设定)( b' X; Y$ {8 Y2 W6 a, l! T
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 d! @# \& V: @* f( C    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 f0 Y: |" N4 t* c0 L                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
  C( T' F! v0 W                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
% P- B4 W; q$ _& S9 w# T
" g# P  Y: A6 `8 {6 C% H+ ^    // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ a; w( J$ w7 r: A. ]
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);5 M; }- i! O# ]; l4 i0 {2 {" |

+ S5 V" W$ h8 f$ n# N8 R4 W  d    // 禁用斩波子模块
* t5 s# l; ~4 s4 [7 Z2 x0 |% y/ Q2 u' |    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: E  U! ~' c" ~5 L; p
# N, Q( k. V( Q7 \* {/ I8 ^- t
    // 禁用错误控制事件' m3 m7 Y: J) J0 U% b
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ c  R: K6 L" b. v$ Q- T" e    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% |1 y8 Z5 ^2 b0 H4 d

) e7 s1 \5 q9 V4 D+ k4 Z) H    // 事件触发配置- b1 A( F5 F( }6 f! U
    // 每三次事件发生产生中断
+ k* r+ X& j  |$ O$ V    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);7 ~8 ?4 Q; e+ ~
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件. Y, @7 G% H! {6 E& d
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 O/ o( O, V, K! w+ _( K; u
    // 使能中断5 N- X  U' T# v% C$ @" H. `# e& w
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);1 Z, U7 S/ P! B8 `* |3 q
9 \0 L$ _" d7 a
    // 禁用高精度子模块5 W  E3 U2 {# U  c( k1 @* P
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);5 x( ?* s( v- C( T
* k" ]" B% H  Q6 ^) \% L* E
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! K8 ?& U4 Q) y1 z1 b}; |! m4 `3 q1 ~5 [/ M" P
9 Z( O, V9 k- w- U& p
void ChopperWaveform(void)2 V1 ?) }( O; ^- p* g" \7 t1 W
{* t! V8 H9 d; I+ ^) w( |9 x$ J2 E
    // 50% 占空比
0 t6 J- O* y8 B% V  m    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);" `# q9 B8 _' ~1 f  p
    // 4 分频
" \% c+ \' q+ `$ G% a+ I8 F6 E    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, x9 P6 ^. p/ i. F  @1 C! e    // 单个脉冲宽度9 ?7 H6 ]1 D! C& a; {
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
) _4 i4 C/ S5 A( m7 U# l$ `* J. l    // 使能斩波子模块
* U/ d' u; y/ f    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 \. y7 Q. g& h, e1 ^}! P5 z) H$ [( g6 N

4 q8 [/ A9 k, e: P/ n/****************************************************************************/3 i; I/ C# d+ Y$ y& n
/*                                                                          */
; [# x- P) {1 B7 Z% y# \/*              PWM 中断初始化                                              */
3 b: {' P# H$ p6 T" C6 D0 ?/*                                                                          */0 V, e4 `1 E5 B- ]0 I! v
/****************************************************************************/1 i* @, C- q+ [3 `& E" n
void PWMInterruptInit(void)
' A% ~+ [, z+ F0 P, F- c! f( \{
- w$ j, d1 q7 F: S  f9 j        // 注册中断服务函数" a/ S& y; y( x' y
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 }6 P! W: C2 ?  I. r7 X# k        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);4 z5 D3 H  {& h, ?
1 X$ ]) \+ g# a2 L* a3 q4 Z
        // 映射中断  v# R! {$ Y# q% ]
        IntChannelSet(SYS_INT_EHRPWM1, 2);
- R7 o) K, D( L- ?4 f3 p, W) }        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- d1 t9 c) E7 [  `' m' ?; f8 [4 P9 l% i
        // 使能中断
- T% m. }3 \3 W; |* z$ P. V        IntSystemEnable(SYS_INT_EHRPWM1);9 |$ a0 T1 n$ f; v2 R  `2 K
        IntSystemEnable(SYS_INT_EHRPWM1TZ);; \4 `. \; J2 [& _
}5 N$ A' z/ s0 @* Y% ~' |0 j+ V* N
' o) z: d0 p  g" w2 [( t' X! X
/****************************************************************************/9 w' s" }  i0 y& k" l- L2 a
/*                                                                          */
/ C4 t2 k# P, b/*              ARM 中断初始化                                              */
7 I( v, i* S2 W" m* P6 k/*                                                                          */
  F- F, V, o! M8 \/****************************************************************************/3 |% L6 g; v: @
void InterruptInit(void)" v5 Z5 ?. }: R5 ]
{* n) I9 O6 n% l: X" n
        // 初始化 ARM 中断控制器
: A- _/ G# Q% t+ H        IntAINTCInit();, J9 T9 r7 t) \' k

" [" c! f- P- F- j1 {! `7 O        // 使能 IRQ(CPSR)5 |" H7 A( |3 R% C0 ?0 d
        IntMasterIRQEnable();% z7 _7 o; ?( V7 i0 Y# W3 n+ i. |# c

! X/ ?& |/ ], m. q        // 使能中断(AINTC GER)
# }" \- W: y5 g        IntGlobalEnable();* h8 V  w* _1 Q* t  A

- X3 ]! f! e: i! f        // 使能中断(AINTC HIER)  g  O" x+ {/ l) A
        IntIRQEnable();$ w" U  M; q/ o3 O) j. V% g( ^
}
$ d: c- h+ |; B3 \
) l; \# h8 ^( y4 V6 R! q) P
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/- ^& p7 Q8 D. k
/*                                                                          */' S* ]- Q3 J+ E( z) I
/*              中断服务函数                                                */( m- R/ A% b0 k3 m
/*                                                                          */
& v. J8 C  U$ I7 J6 W+ [/****************************************************************************/
6 W1 g) E4 T# w4 D2 }void PWMEventIsr(void)# ]) ~: t3 |2 h- D. t
{
/ k3 z" m/ P- L/ w6 u        IntSystemStatusClear(SYS_INT_EHRPWM1);
. V( e5 `2 W6 h
; ^9 F8 u. |, q" p- Y$ r, d    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);) e, `- O& ?1 \3 Z
}5 U" y0 `" x2 {3 `$ k' a

+ @) r1 ^# h5 O/ A+ Gvoid PWMTZIsr(void), q# x1 F/ Y, j- X  O- o1 [( c
{5 O* B; v0 ~' q2 F
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);( U4 @* x) e5 M. ~% r  N
4 L& X1 l) L+ d
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);' |( \4 }$ Q( a
}4 h8 g& Q: z( \4 `

3 y& D; v% L5 M! I  f: v% ~' s/****************************************************************************/* y9 Q2 q, x) z+ b* s: k
/*                                                                          */' T2 u, P' |, m$ b9 T8 Q! x6 l
/*              初始化捕获模块                                              */) k3 K4 Z' a2 l, e# T  W" j
/*                                                                          */
1 c5 ~8 e7 V9 G/****************************************************************************/4 `  {" ?) r; ^4 b
void ECAPInit(void)- i+ B3 x" Z, O; w2 N2 b& J$ I
{
" Y2 i7 Z3 |( e        /*-----设置 ECCTL1-----*/1 [7 U/ a7 J/ o, J
        // 使能CAP寄存器装载1 m5 m. P+ S; I1 m( ], h! d  N6 l
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
, I; }" {2 |! z2 _: \1 ?8 b        // 设置预分频值.+ L  Y) K5 }, B. _. J7 U
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);! w" v+ a0 Z# w; q; d6 M$ T
        // 上升沿触发捕获事件
5 i* K; y8 \/ ?5 m+ t  E& Q6 Y        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);# b; c# {$ ~4 M$ k9 ~" K
        // 输入捕获后重新装载计数器值.
3 C; j' ~2 F& E" s, f4 E        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);  P5 a& ?0 |) n$ @, S: v

' g7 e& v8 j. X  q        /*-----设置 ECCTL2-----*/) [7 s9 b) d5 S; d" V5 P( O1 L
        // 连续模式  v8 q. s0 ]2 A' \! b( Z
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
6 P0 M/ j/ s1 \6 O; ~9 [! C0 \        // ECAP计数器TSCTR持续计数
% Z! y9 x! O6 Q+ d        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);: g# ?  D/ K0 X, J4 u
        // 禁用同步输出和同步输入4 h9 H' @& [; G2 t
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, o2 ~/ l" U& \: ?        // 配置 ECAP 2 为 CAPTURE 模式
. [4 T8 Z* T: g- y        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
: C7 S6 v3 f. p1 x
% [+ ]7 Q2 s4 [" R) T        // 使能中断( b7 I) n- V8 j$ g. Z+ h
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);  a" z" L% J% F; o3 f* ^3 D5 V
}7 S8 n! ]8 H6 t- c. t' S7 e+ C
8 \$ n" G/ V. Y0 _% J" G$ C: s7 L
/****************************************************************************/
) ]2 e1 F3 }2 K1 f/ t, @# n- B/*                                                                          */$ O1 n7 ]% y6 T/ n) h
/*              取得捕获结果                                                */
+ Z+ L& N; Y0 G! G$ z, [3 M" G/*                                                                          */
1 M. r, J2 b6 G: i% O- n/****************************************************************************/
& g+ u) ^2 W, r+ q6 runsigned int ECAPRead(void): D' k' X3 |( G( Q
{
) D. @- }: Z. L. i0 c9 s, e        unsigned int capvalue;# q) [: S4 P' v; p2 @/ J
        unsigned long frequency;+ @2 b% f& G2 j$ ?0 Y$ |( M

, c$ c& i' N4 W& P) R9 R) l        // Event1 中断标志7 s3 m0 r' q. z
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
' n2 G, j8 v) t: F  j9 C        {
. n4 Q1 l' H/ N1 v: K$ O                // 取得捕获计数" z) }/ m2 a  T1 @
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);8 W3 a+ c7 q* B+ x
                capvalue = ECAPResult.cap1;
7 B6 H+ r& q' c  J0 V% `5 q& v, c% Q3 l! k$ \& D, }
                // CAPTRUE 模块 228M 时钟主频
% s2 r2 f4 }- x1 q9 o* g                frequency  =  228000000/capvalue;1 y- v7 h. K5 b6 D9 Y
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: O1 i( r) z* q+ h  A0 e7 Z  a7 F3 E, a8 |) {) E6 j; x$ k5 }9 _
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 b+ Q2 `( V1 `# l) a9 s//                IntEventClear(SYS_INT_ECAP2);! v$ L/ i- S: C
        }% h/ c3 e) l  a7 f# b. L
        return frequency;- P: D8 @$ q* t' e/ @
}
# ~. u! A2 u- p6 i2 D# ?1 p
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
2 j0 ]  @; S( f' v- `" J# B+ ~[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