嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家: m7 K7 i6 f9 u5 U. ]. |" r

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/- u: I& }- r$ n
/*                                                                          */3 W/ U' o( M- s6 s  p! @+ ^7 v7 d
/*              宏定义                                                      */
; f7 i6 P, ?& m/ T" X$ N) g! V/*                                                                          */
& b' t( |$ F: g: g/****************************************************************************/
. N8 \0 b- C2 p' ~* q$ S7 R// 软件断点; M" X+ ?: B/ s! U
#define SW_BREAKPOINT     asm(" SWBP 0 ");; V" B# G$ C$ t4 Z
. R/ L- Y  ]5 O- |9 u) T& Q
// 时钟分频
5 h7 @" X$ P. _$ G% y  N6 j: `' h#define CLOCK_DIV_VAL     2283 P( C- `' ^) q8 C5 w- X. h

, }2 g% q; M: U; |& T/****************************************************************************/
4 K2 J' q$ t6 q# N! T; |/*                                                                          */
0 r2 r* J, v% Z8 n  V( Q/*              全局变量                                                    */
; e5 E+ P1 E! M- p, D/*                                                                          */0 D# l9 M& M7 C7 `1 R- t' b
/****************************************************************************/( o6 W0 a6 R5 g
ECAPCONTEXT ECAPResult;
  K7 B& |5 h( \! {' |# E( ]+ ?5 `) V' K9 V
/****************************************************************************/
/ E+ X$ I" h7 D/*                                                                          */
( d) d1 f# G7 U- |0 h/*              函数声明                                                    */
7 x5 _& y4 P9 G/*                                                                          */; {& B6 Y  i) _" e  A
/****************************************************************************/
( Z( M+ b8 L, b// 外设使能配置
8 G  S  p% O$ z1 f% o: M$ Ivoid PSCInit(void);
) w. x, @$ N6 D" f& N8 l# k# m2 C" X" R  G9 u" z9 j2 B% v+ |  {) l7 ^% ^
// GPIO 管脚复用配置3 K* u& u+ z% h# E0 g" y2 k  c4 [
void GPIOBankPinMuxSet();
3 S- y9 q/ }/ P5 F# \  l$ h* J+ d% |3 G* f( h+ n6 z$ U8 k, G* ~
// 产生波形# s, r8 f0 g6 S# @( d3 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; s0 R" I$ |+ yvoid ChopperWaveform(void);# F+ Q- s3 g3 K
) G; v( M+ P' v6 a
// ECAP初始化和读函数) T4 P  ^( `3 C& g& E2 Z& X4 }
void ECAPInit(void);
2 M5 c# G: @. ]/ {3 Cunsigned int ECAPRead(void);' u3 i8 B, P6 }) i  ~3 g" p
3 ~% A9 ]+ L' s; j& t
//ARM 中断初始化% e' B5 P+ g# u0 y
void InterruptInit(void);! e/ h. q- J4 ^! U

( H( f* i, {, j9 Y// PWM 中断初始化% ]8 q6 @1 Z* }$ E
void PWMInterruptInit(void);7 W) {4 V6 f7 R/ P+ g4 V
// 中断服务函数7 O1 a5 a; w$ D. H' T! Y1 B
// PWM 事件7 w1 u( x% q: Z# B; Y3 d% E) O
void PWMEventIsr(void);5 N( t' k0 P. v
// PWM 错误控制事件
9 O3 K+ @4 @, e3 Y/ f: T, {& rvoid PWMTZIsr(void);
- E6 i) ~7 ~- y( C* A- l: h1 Q7 n1 \8 L
/****************************************************************************/
+ ^8 A6 d8 n2 N; f# x+ |$ d: n# ^% y/*                                                                          */1 v4 c. y8 ^2 K! v4 U' N, |
/*              主函数                                                      */( y, R3 B; ]% }
/*                                                                          */
* o: w+ P, G% l8 b5 T( V+ I0 s( B/****************************************************************************/1 s. i" A" g: ^, ?8 i; V0 @& v
int main(void)
9 f" Q$ _' U  u2 v/ N{
! A  I+ P* H8 x) S# z3 e2 Q        // 外设使能配置; p" k/ e7 J) r1 @8 X
        PSCInit();
6 E1 J; p9 }1 p9 o+ P9 ]* F/ A1 x7 X- F1 f' ^# @+ O
        // 初始化串口终端 使用串口2
$ Z' k2 P4 B0 g$ E, t% j  q, y        UARTStdioInit();
0 g+ b& s2 e" ~- N       
  `: x& t2 Y5 O9 M6 j( C6 \" w        // GPIO 管脚复用配置4 x1 m9 `9 n, Y$ `4 m5 b% w* e% A; E
        GPIOBankPinMuxSet();
( F/ z5 Y. b; c6 r. H: O5 L! N  G+ O7 o) @9 h$ T0 z. [) O9 x: K
        // ARM 中断初始化
# C2 Z. ]3 [+ j        InterruptInit();5 x( [' a9 r; ~9 r  Y

3 v( b$ B" j0 W: M7 J7 Q% q2 Y        // PWM 中断初始化5 H% i7 X% |8 w0 o8 j$ {0 z
        PWMInterruptInit();$ e& l' t1 I: u" o# v  d, v

* D5 T8 d6 @4 S+ A- C        unsigned char i;
* u. p0 S' U( S/ k2 |' W7 A        unsigned int j;
8 x$ c5 g* V& s" [! y. T# N- }$ P! ]
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& |4 X' P6 V1 S5 {' S4 }! _        UARTPuts("------------------------------------------------------------\r\n", -1);
$ W+ x3 ^0 d  G' }( ^( m        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);" T6 P+ ]9 m5 j+ I
        // 产生波形
/ T2 ~! [  _3 [  X  h# L, ]) o        PWM1ABasic(25000,50);" V3 Q: w0 |* k9 m
4 m6 i% V+ I/ w8 U' c+ }, G
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
. s$ r0 u! L* u5 l! b        UARTPuts("------------------------------------------------------------\r\n", -1);
" M, @" e# w* ?* v/ j6 h  R: L  q# [& F8 B) D9 K- l% `

1 n6 ^; v# q  l& a' T  W  }) {' n' [
" @1 R( k, s5 }1 M; {+ w. B* u- A        UARTPuts("------------------------------------------------------------\r\n", -1);+ Q$ Y* [  L; e
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- \# i+ {3 o9 G6 k, q$ Y        // ECAP 捕获初始化/ B3 F  E4 U& x
        ECAPInit();: C6 x3 ~- b: B+ N! O* l7 ~
        UARTPuts("Initialize ECAP.......\r\n",-1);) a, y' b8 j" t1 \/ P& }( I
        for(i=0;i<5;i++)
9 I  U' X" a9 l- h, O- D. I4 U3 N        {. ^6 H3 ?3 t2 `' k& [3 ]  o# E
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
2 Q* B% _, a+ ]2 {6 F                    ECAPRead();2 j; [+ g) v: N) [' t0 H- ^
        }+ L; n8 _0 D3 [
        UARTPuts("\r\n",-1);
' c; u: @0 i' r8 [! F        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);  a2 }7 e6 X* X
        UARTPuts("------------------------------------------------------------\r\n", -1);
# u# ~6 t/ I  t9 k- F8 ~: |, m$ Z- M% F, k  C
        // 主循环% O# X5 r" d! Q8 C
        for(;;)- t% ]% F6 c- C
        {. s% A7 G, A" x! w3 {

  D  r5 C. ]1 y" |" `4 k. L        }
7 D1 d. u* }% _}3 h0 }; G+ H5 |+ G' f2 z+ O

; H( X5 x* z: _/****************************************************************************/
, e5 L5 a6 x  r" I/*                                                                          */1 N0 I0 k1 I5 v2 B& w6 v- z/ ]
/*              PSC 初始化                                                  */. I8 l5 Z6 z* _5 ]( P
/*                                                                          */) k* U* s5 b6 P) H0 O/ h7 `( ?, Y
/****************************************************************************/
9 q4 u- V5 `# kvoid PSCInit(void)
2 D3 X; w( M/ ~" W1 p; Y{
5 Q; h8 U, Q4 z7 g8 I        // 使能  EHRPWM 和 ECAP 模块( g7 v. c( k- T* L% D
        // 对相应外设模块的使能也可以在 BootLoader 中完成: K  J" B4 g4 f- W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' d7 L/ D2 k% x3 t- N, d1 |/ P; r) K    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; f8 S0 {& R7 t6 [" _}
. M$ A6 l' ]. |! q6 n7 u
& M1 T. E4 K% n) y) X0 u/****************************************************************************/2 M8 k' e0 b+ A5 k; G) @
/*                                                                          */
( P8 _& S% K* ]- c9 d/*              GPIO 管脚复用配置                                           *// ~% b& q* @7 b8 O, J- R
/*                                                                          */
7 w* d7 g1 j' |, K4 B$ W: c  X+ n/****************************************************************************/3 a( X+ B9 J2 |) Q9 ~' i
void GPIOBankPinMuxSet(void)6 f- i4 l3 U! N
{
9 E) Q5 D2 J/ E0 M; k! v! L+ c        EHRPWM1PinMuxSetup();2 s6 G3 h  U) q' y3 a
4 j, M4 O  j. Q# K/ H
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% r& g2 r7 R( [- I
        // 作为捕获功能时管脚方向为输入
9 h0 U6 E" @& @% }        // 作为辅助脉宽调制时管脚方向为输出4 w) o  ?% x& Q2 U2 n. H
    // ECAP2 / APWM24 c! {4 V5 w) c& |- U% s# M
        ECAPPinMuxSetup(2);
: l" J; Q% f% n& E. K/ [" q
% D3 [2 W# u5 E        // ECAP2 / APWM2方向设置为输入
3 V& N& o5 b2 {* M. }8 s$ S        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]$ u2 _% k' ]2 j6 M' e
}- B$ V7 K8 o! w7 F
  M9 _8 F& i1 ]0 d: U
/****************************************************************************/
! S$ V. y9 l% b" u3 _/*                                                                          */
1 N' A! q1 u5 O3 q5 W" F6 ^/ a0 V  l/*              PWM 输出波形                                                */$ H. U! ]6 k# P' K
/*                                                                          */8 G8 B8 O% _7 n% ]+ S
/****************************************************************************/8 I+ j6 D3 r% M4 O, N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)% d0 y8 C2 f# t2 L2 U
{- H- N6 p* M( y* k! }+ m
    // 时间基准配置
! j- j2 Z( _" @% h7 O3 O3 l, |0 x    // 时钟配置
, w3 w4 u3 T6 _    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 o; p' A5 c' v; R6 V
. V* ]- w* ?9 h    // 配置周期
. V- z' a8 [0 D. [7 H9 ?  a2 {2 b    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ R  G; B9 B( N6 |" t& K( \' z0 i# Y+ F                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);: N- L1 q7 U. R7 }4 a

1 E) [5 }  ]: p3 ]    // 禁用输入同步信号
, w9 o  V# b' y    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ _0 n* H7 P% E
! Q! @( W  g, g% U& R( L' _; l! E    // 禁用输出同步信号
  |2 q8 F8 s  b- @    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; @* ]# S2 o0 w: K" j

, q; {0 L, t8 @    // 仿真(DEBUG)模式行为配置
$ H8 [* c6 ]2 B* P$ i    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);8 y# e3 T; x$ G0 ?6 p3 W4 E

7 p/ s8 P0 J+ F- i+ X5 ]7 T& }    // 配置计数比较器子模块2 c, U& d4 J( X
    // 加载比较器 A 值) Y6 f  ?1 B7 y" O+ e
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ Q5 l. s3 p. ]/ \6 O                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- r0 |/ e$ K  d3 s
) G5 [! Q# I4 N2 C  x5 B2 a    // 加载比较器 B 值, K% f7 G" }9 b# ]8 y3 y8 ~
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,6 n/ Y3 k; b- e4 [9 S
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: M  f: i( B: c4 z
. ^  h# [8 ?) w+ p) K: u
    // 功能限定配置(输出引脚触发方式设定)8 y0 t6 d# V8 M  k  l0 J
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
  w% a' g& R/ j/ ]* o: J    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,7 i7 [. H- f" j' l$ T
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 k: A3 N4 u) n4 p/ G+ X1 s
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 ]" o' Y# I/ A, U+ V
9 R' O/ N5 m) i    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 ]+ ]# X/ w7 m# e    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
3 U+ v" Z; |( f7 b- p: D) c5 c* ?
* m" g0 X9 G7 ]: `# J7 w3 y    // 禁用斩波子模块
- ^. X9 h  ^% b( n, K, x    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 M/ T+ D1 {0 l- \8 n- w1 y  F3 r% H: X2 {/ d, C( Q2 [  a7 B5 c8 H
    // 禁用错误控制事件
2 L2 K( r. ^/ ?1 p7 Y    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);2 A& H3 X2 v" ?/ K8 `  f, I# Z
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ z8 a6 o6 b; X' I! V# \: F& I3 H+ b- p1 m
    // 事件触发配置
0 b6 l# G$ f0 w1 r9 L    // 每三次事件发生产生中断
4 p" b  p8 q& S; o' J    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
5 z$ J, T$ X$ L# h( M    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# g0 K: K" G$ U/ ^    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);+ \. Z* y' v" `6 \
    // 使能中断
$ T2 I* D  W+ L( q    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) `. T2 F, {( V

1 W. G8 }$ ^, X! `% K; e: {    // 禁用高精度子模块
4 g- Z, Y' [/ W8 D% Y    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! a/ k0 N+ T! V( r: p0 ?8 |) V) S1 A5 u6 p! o
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 J5 b1 C1 n6 R. V0 N; ]7 n. U
}
( ^& \5 t& q9 q% x& \, n" q( |" N. D0 k& M- ^3 [  o
void ChopperWaveform(void)
/ K( D# z7 N, e% y% q{( v4 t( G- B% W5 B2 U( s5 A8 @
    // 50% 占空比
" U. r, i: q- @, u    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* I9 r8 c3 |, s  |% l1 H4 ?" y    // 4 分频
! x4 P& ^# V6 j& I: }9 k    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);  f3 t$ y9 J' N. w
    // 单个脉冲宽度
" o0 h6 W! N  p4 i& L    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! v; Q+ W9 L; [/ b: A" G    // 使能斩波子模块
. Z- i  ]" m; B4 X! J' m! j    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);7 F( Z- Y: z: {4 r  H. E2 v
}
: ~" Z' i7 f1 F( `9 {5 l" j* b+ ?' r8 }" H- x% U5 Y; ~. j
/****************************************************************************/
7 L8 c$ D4 ~  B/*                                                                          */
- Q0 @2 [; [5 |& ?  x/ O/*              PWM 中断初始化                                              */
" ^! v  I8 `( M* L! K& q0 Y* w/*                                                                          */
7 _% n1 V9 G  v/****************************************************************************/: m. w3 s6 z% ~. r3 s! m  F2 h
void PWMInterruptInit(void)7 E) m. n- M- H1 A1 n4 ?& E. v* l
{
" _% x2 A9 e/ x* Y        // 注册中断服务函数
2 w; s( H9 [& p# J        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 Y0 r0 d, g  |4 r6 c. c        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);" u. F: ]0 {5 s9 w5 B% N
- K- u% s- e& [. M+ L
        // 映射中断! S' X' m# p4 p- N% p
        IntChannelSet(SYS_INT_EHRPWM1, 2);6 K7 w/ Q% m8 _% m3 A7 ~( `
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 ^$ X" l1 [0 R  y5 V' d' U
; u1 R8 n+ ]0 _0 X4 |/ S
        // 使能中断" V( I2 p. s2 T) _- s' ?5 @. \
        IntSystemEnable(SYS_INT_EHRPWM1);% \- K. y8 v5 L/ v
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
; l6 s# y+ E& N( v2 F( S8 M( |}
8 @; x* z3 D5 h+ F" j  e& w- l9 f- Z0 K2 ~' T% M) S0 M
/****************************************************************************/
" k% D; t- R: `" S$ S% H( V/*                                                                          */
4 \) ]  X% v0 o- p3 {/*              ARM 中断初始化                                              */
( K7 V& B5 Y, R, U3 Q8 V4 o" ^  ^/*                                                                          */
7 K- i% C, F  u# p5 a8 A/****************************************************************************/
, R* U7 l7 @7 Y5 mvoid InterruptInit(void)7 O. x: z6 \/ X
{$ `9 @$ \" Z1 L
        // 初始化 ARM 中断控制器) R, [) t& ]3 r3 w. K6 `
        IntAINTCInit();
9 l8 ^( S6 s+ K. T0 F1 n' N; v
" J8 B  S4 m& B5 G0 P2 x        // 使能 IRQ(CPSR)  y0 c% B8 @$ x; S! u1 h/ F
        IntMasterIRQEnable();
/ n. c) J: o. G% R
' c- s* u4 X2 M/ y8 R        // 使能中断(AINTC GER)
9 `( G7 ?; @% K8 _% r( \        IntGlobalEnable();" Y+ q( j2 {  ]  L. h

3 u0 W4 B. B0 Y4 E) K3 q        // 使能中断(AINTC HIER)
7 Z0 E% s3 j1 ?; Z        IntIRQEnable();
; t. C9 ?# V7 _, m' y6 r}
7 j0 E$ D7 i% D9 V. ^  U% B( H7 N) O' _1 A- Y

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/* M& L! o: g8 r: B
/*                                                                          */
- K( m3 J3 o7 D% }: X  r: Q/*              中断服务函数                                                */; V# @9 A% _( @7 @: ?
/*                                                                          */
9 T+ |, P- F% t. a0 p: b/****************************************************************************/- M/ {7 F% x1 N% ]5 t; Z) Y+ `
void PWMEventIsr(void)9 M% Z# g; a! x+ ]0 d
{
- A8 A' \' ~, |8 N/ u        IntSystemStatusClear(SYS_INT_EHRPWM1);$ l% i* W" w+ m& s

3 [2 V! L0 W$ [    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ G4 V) N! W4 _3 m, Q8 l1 G}
8 Y* |4 X* C! Z& T  g6 C5 Q0 x0 N, S% b# n4 s
void PWMTZIsr(void)
3 J- k7 z2 J( j3 @6 |, k: E{8 h: Z3 x' E4 n$ ?
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ v) _* h/ E4 I9 R; \% P
5 v4 S) C) j! |( m+ k0 }. Q    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 g4 h+ [; [" m9 {# L+ t}
, l& N" q$ N4 b5 l0 u) y) l8 V8 b( v+ p$ h1 `
/****************************************************************************/5 B: c9 T: {7 T( [9 p
/*                                                                          */$ ]& G0 U8 A- m) z( b0 b* Z
/*              初始化捕获模块                                              */. T6 `6 K3 X5 U5 n9 \- U
/*                                                                          */
- p0 F) ]2 ?' S; y/ b/****************************************************************************/
. F- y% e$ p! X. L+ R2 Nvoid ECAPInit(void): D0 ], Z+ a( n+ L2 V: G
{1 P, X8 l! ]+ I) B- Y/ K9 K
        /*-----设置 ECCTL1-----*/
" K$ C$ F  N- I9 @        // 使能CAP寄存器装载
! T" e0 I0 J6 [. J3 u        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( L4 D" w: g: f( @, f        // 设置预分频值.
3 ^8 B: \( f+ q3 o        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
7 {  l6 F0 l5 V% L, y        // 上升沿触发捕获事件
, v% H  m. y, F5 N1 P        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);7 H& g, q. Z0 o9 E: k1 e3 }
        // 输入捕获后重新装载计数器值.
" j% ^6 A" e" U0 K  S1 G9 {        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 m- h; l: f: q
- q: [4 p2 F0 w1 M9 |
        /*-----设置 ECCTL2-----*/
8 O, T  A) y# S% Z; p        // 连续模式" K. |3 S/ J5 p/ k3 O1 b. K
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);2 F0 s4 G' |# n# y
        // ECAP计数器TSCTR持续计数
% _  z9 {( z+ B) d        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);3 ~$ P. V6 V+ ~, ]3 }0 ^7 D
        // 禁用同步输出和同步输入
, W" J, Z3 G- t; W$ a        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 b$ I8 d# [4 G* _' I        // 配置 ECAP 2 为 CAPTURE 模式; Z1 w( S0 I. K1 F* ^
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);4 W+ Y4 m- n+ Z2 p* i- s8 d
. q" E# M$ U" j* m4 T/ b
        // 使能中断
6 \4 i1 q5 R" @6 Z; h//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);) v* q- O8 z+ u
}
4 l3 o& d; b$ Y) y1 F4 x0 u+ g' {) r( e3 p1 `5 [4 F$ g, o. t
/****************************************************************************/
$ U2 [$ T) Q% |( G/*                                                                          */0 {3 T: e. E# C7 c& C
/*              取得捕获结果                                                */
6 }! A, B* [. ~. K3 g0 d3 y3 }/*                                                                          */
, ~% u) q" c/ {9 Q2 \- x/****************************************************************************/! ^) d( Z' j; K1 e
unsigned int ECAPRead(void)
$ ^; s- n6 g. R; t, f; \{8 s$ Z1 q+ A! q5 w' F/ B# p. o" D2 Q
        unsigned int capvalue;
( a( A' @. K# ?" s        unsigned long frequency;# ~) k5 Q, n# f+ Q$ E3 z( P9 Y! t0 A
& X% n9 n2 H2 v) B, ]* f( ~
        // Event1 中断标志3 A4 X% k& N. W8 ?3 U/ {6 n. D8 F
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. A$ Z' Q( b0 T7 h  u8 s' `* O! a        {
  P  |# |& _0 ]! c/ E/ l% j3 W                // 取得捕获计数1 q  a4 F. t/ `8 T0 ^
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- K- C- Z) z" U& G, m6 ]                capvalue = ECAPResult.cap1;' D" w0 n& V9 n# K2 @7 W( `- T# T0 N

( {. |9 T' J( ~+ r; M                // CAPTRUE 模块 228M 时钟主频4 T/ K) L/ Z/ k8 N' L8 W' w4 k
                frequency  =  228000000/capvalue;
) Z4 i- W/ v! I$ R( s                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
) M5 f8 H, s4 y. R6 ]1 N! ?7 q' p2 I* T# |: P5 g
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);# m$ S4 s+ C3 d- f; o5 }( H
//                IntEventClear(SYS_INT_ECAP2);6 m- {$ a0 W7 Y& K3 W$ i
        }
9 H% E' V3 j# d$ E        return frequency;
1 z- n* ^1 G6 U' A1 P}
; [- r1 r3 N5 T- Y: V7 T
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ J$ @  ^: P0 ]5 C0 c; C[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