嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家- s5 k  T0 e! I

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/% V+ i" y. i" l
/*                                                                          */7 G6 a% Q% n) E) J& ^
/*              宏定义                                                      */' ~' R6 V5 f- A( ]
/*                                                                          */- \7 T# h6 Q& F# m7 O
/****************************************************************************/
; _7 n; G- P5 E  c8 c// 软件断点* n; F# l; o  L1 E: E! n. W
#define SW_BREAKPOINT     asm(" SWBP 0 ");) _7 o' [( |/ Y$ F

$ G" W4 p& D) v! s// 时钟分频
6 [/ `0 ~  e! h; A" r0 ?+ {; q7 l) N( b+ t#define CLOCK_DIV_VAL     228$ ?4 p: H6 G# c$ K0 }+ w  [% k4 J. R3 g
) ^: y1 c  e  z% c+ V
/****************************************************************************/( W1 ^3 q1 c% v; ~" R+ \
/*                                                                          */4 X! P: E7 c6 u9 n% g. G' x
/*              全局变量                                                    */2 W5 Y9 ~. T5 i1 ~% n7 s  v6 h9 F+ B
/*                                                                          */
; h/ A' Q3 D0 p: ~2 S! S# Y# u2 n/****************************************************************************/) P9 U! }# t' [! @- N, Q8 R5 }" i
ECAPCONTEXT ECAPResult;
* W! {* s) J" d5 o3 Z& J* s& X1 a/ z: v. O/ |
/****************************************************************************/' i: o' d4 J6 f4 v% M  s
/*                                                                          */" L6 h" J/ {8 P; I) k9 u% v9 G
/*              函数声明                                                    */7 o1 i. q" E9 i0 u5 r
/*                                                                          */+ M$ K7 A, d5 Y$ z6 q" a8 E  R
/****************************************************************************/2 r. r: G$ ~" ~! G5 R7 M
// 外设使能配置
6 i* z% Y, A, _  X! R" Tvoid PSCInit(void);9 o* i% g* a+ w) I/ E
. a9 A6 [6 h3 e4 k' m1 r
// GPIO 管脚复用配置
4 H( N( `7 @. jvoid GPIOBankPinMuxSet();3 U3 D. }( L; R( n8 h# ?# ^
3 h9 _1 `/ o  @8 L7 x
// 产生波形
* y* z7 U4 X$ p5 b1 W1 Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);4 }9 t' G( d& h2 ~/ E
void ChopperWaveform(void);7 K; q. @+ ]) W& i% F+ f7 R8 R
; S9 C. Z1 j! h
// ECAP初始化和读函数6 m6 M% r+ m0 a% ]
void ECAPInit(void);
4 H! t3 q3 c9 l/ B: \4 Funsigned int ECAPRead(void);' `+ w( D2 d7 s. M( v1 H% r% O

* e1 _9 Q  d3 Z4 F) R, L//ARM 中断初始化
% ~* P4 F. _, x# Z1 ^( B: Zvoid InterruptInit(void);, S; s& ~, {0 @

, @2 f0 i9 h7 T3 i. Y/ j; W// PWM 中断初始化4 a. s4 H- H* \5 A' K
void PWMInterruptInit(void);
, M/ T1 Z  y8 P4 l// 中断服务函数
" W* x4 x7 J( P" ~// PWM 事件
1 l* Z% K* w2 b/ Y: t5 \, y/ cvoid PWMEventIsr(void);
: V* g+ c3 {5 a: E  F( q- F  q3 u// PWM 错误控制事件% m1 i  V6 x. ?
void PWMTZIsr(void);
& O4 T. E( \- G) v# ^
, Y  Q2 }/ a% O/****************************************************************************/
; y+ `4 T! z$ j; {, f/*                                                                          */3 y0 ^  m: w9 W& P2 ?1 d, m
/*              主函数                                                      */
/ m$ ]/ a; s* z6 x3 \: d4 D7 u2 {3 H/*                                                                          */
  j5 r$ `, W! F4 o5 N/****************************************************************************/" n& @6 L4 S% h" H+ j: S
int main(void). S( i- Z/ y" p! n" d3 J
{
$ h: S( Q( Q3 d( |2 B+ j2 q) E        // 外设使能配置
: l! e( |9 \" {- s        PSCInit();. I5 Z! C, ]- w3 t

- h) D& Y2 @8 ?3 J* p( y5 H        // 初始化串口终端 使用串口22 w- E9 v3 J, q3 [; o
        UARTStdioInit();# F# h4 {! R& H  D) N% B* d* u
       
3 ^: L; K0 I. ~3 X" J. A/ k; t        // GPIO 管脚复用配置
4 ]8 t6 c1 m- s- K$ |, t! F        GPIOBankPinMuxSet();: i5 N1 K5 i3 u& e% `' c

6 d: B, c5 R$ ?6 H8 q/ L0 E        // ARM 中断初始化7 f6 k- [5 R5 ^, r
        InterruptInit();
! K! n# m# n/ T$ Z
/ L* F$ b9 ^! _2 t! J- G( W  b        // PWM 中断初始化* ?% g  Q3 m6 O( g( D4 i8 u
        PWMInterruptInit();
( t# l$ H5 @. g* d" X5 X3 d% F# P- U) q
        unsigned char i;
, g7 w0 X3 A' b4 j: F2 C- G        unsigned int j;1 z1 N; X. v5 F) M3 F6 F

( I3 b4 P/ o$ w        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ }0 Y7 k% l" X& @" @        UARTPuts("------------------------------------------------------------\r\n", -1);
& x7 \8 ^; a1 q- m9 c        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);; {( A3 i) I( n6 D+ [6 w4 T+ q
        // 产生波形8 I+ D6 w8 K& W/ W9 l
        PWM1ABasic(25000,50);, N) t& S; s+ A& [: i
4 w8 r/ v  |# ^
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);! T" O- I7 V( o. G/ R
        UARTPuts("------------------------------------------------------------\r\n", -1);
" ~8 I" \" H6 V) T* ~2 p
; R0 ~- ]( `' W/ b6 x
8 A3 Y# h% n" _* |
9 M1 }0 q* ~3 F        UARTPuts("------------------------------------------------------------\r\n", -1);, a0 g5 c# D$ ~
        UARTPuts("                    C6748 ECAP Test\r\n", -1);; Z3 u* E( S: z$ @7 O" k- H
        // ECAP 捕获初始化5 R7 n) W* K- H% E
        ECAPInit();) C' O( f0 X; |2 @/ T
        UARTPuts("Initialize ECAP.......\r\n",-1);& C$ j) _, E! B8 s
        for(i=0;i<5;i++)8 q1 ]% Y! o, I! R: \! x
        {
/ v" S9 Q, k8 R( X, ]2 t4 H# W; {                    for(j=0x00FFFFFF;j>0;j--);            // 延时
5 n" t4 ]7 h- e' [                    ECAPRead();
; L1 e3 U9 o0 d& v' a! P        }
+ M# u' O7 [  E4 O        UARTPuts("\r\n",-1);! U2 Y* \9 S0 _$ `; S
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);- V$ V* u, W7 a* i$ w
        UARTPuts("------------------------------------------------------------\r\n", -1);& E. H2 |( s) U$ Y6 E& C, R
: ?6 {+ l& h$ r9 E/ N8 h
        // 主循环
- j6 ^! x1 v! A, }        for(;;)
% u3 k# C5 |7 J        {  F% K! @+ n' k/ |$ U5 h

2 U. ~7 d  P" i% \' e+ M: h( p8 W        }
: t8 R5 o/ I; m' k  Y& N! _% ~& X}
' j# Q  V2 J6 |4 s7 F% M' {3 I% f- Z- \. u- I; e/ c4 x# \% g$ m; l5 b0 i' \
/****************************************************************************/1 V8 `. v/ ~6 X1 P# j0 _! E0 Q
/*                                                                          */
4 [6 ?% O" L# x# i5 a; C  z/*              PSC 初始化                                                  */
1 o% Q2 x8 T2 R& u  ?& \/*                                                                          */
3 z. O0 Q0 Z- m1 b  C) R/****************************************************************************/# g4 L6 G5 I# k) T5 D  I4 [1 f
void PSCInit(void). Z2 b3 K! V, l) }! I
{+ d$ G! X/ H. R3 F- C
        // 使能  EHRPWM 和 ECAP 模块' M; Q# J9 u5 J6 f
        // 对相应外设模块的使能也可以在 BootLoader 中完成$ [% T" `/ ^4 w% b5 N
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 C  d8 y" r7 r7 `
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 I* h5 m. f& `& u5 W# }  J+ K}
# g! V/ w: i( I% g1 M8 A3 N7 S4 W! k  w# \  l" I6 ^7 X; q
/****************************************************************************/
8 W! ^( p1 M8 A5 l0 m/ b7 d/*                                                                          */
, \3 s2 |( o' ]0 i* q$ C$ v/*              GPIO 管脚复用配置                                           */2 d) D# k5 a: s! t
/*                                                                          */4 N' a# A4 n% k
/****************************************************************************/
0 ^2 q4 p2 I9 T8 ~. Svoid GPIOBankPinMuxSet(void)
% C* ?! v7 h, q/ s{
* T3 @3 o& ]' m+ r% M+ m        EHRPWM1PinMuxSetup();. o. g0 i: Q$ t8 k: l" `. @

! J/ b: C0 q' N; z0 x- ]5 k. v        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ P& \% ^& R7 j$ g        // 作为捕获功能时管脚方向为输入
) Q7 a3 x) Q9 I        // 作为辅助脉宽调制时管脚方向为输出: T4 Y. E- K$ k% x* p* P7 i
    // ECAP2 / APWM2- `$ S! l% Q) @! I1 o
        ECAPPinMuxSetup(2);* T8 {+ l, e6 q2 v' R( a9 S

; w+ U" e2 n- ]- l) M        // ECAP2 / APWM2方向设置为输入2 J6 k" j  M3 ?& B& G4 \" R
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]5 o+ \" Y; J  a, d' S4 n& s1 z
}6 [" F, J2 k8 ~- Y$ N3 \) @
; W+ ?' o/ p: S$ R! X( C' I
/****************************************************************************// U5 U! R5 \& K# x- M
/*                                                                          */
: O2 j" a7 S& x2 w  _4 e& D/*              PWM 输出波形                                                */
$ ~! n0 p7 y/ ?/*                                                                          */  x, H/ e; h5 b  L$ C( }
/****************************************************************************/
4 v4 F  k% ~2 c/ @/ c/ u- w& zvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- l$ ?) h6 L/ F# ^% @
{$ \  }# F3 Q: \5 q
    // 时间基准配置
/ K+ x; T0 E* o6 R    // 时钟配置! p, _  N7 z. c
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);+ Y+ l0 K0 p# t$ n5 X/ t

2 U( @6 E0 I, d4 g    // 配置周期
' g; [) R- @8 J, t( M+ A    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& g5 z+ F& n4 W6 C" A- q% X                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' ?+ w* N7 s3 h, K, T& f, G. d; I& I6 |  R# R3 \$ D3 z+ K$ a, b! Z
    // 禁用输入同步信号# E0 e5 p* f" y1 i& a. V- I9 q
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
4 @( x; o. ?1 h+ a& T* J5 B1 z0 Q0 _8 {6 z1 @( q
    // 禁用输出同步信号; w$ C- l3 e4 }  y3 D  B
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ ]2 f6 E5 L7 B/ M. }5 G
# x) d( N5 ~2 O
    // 仿真(DEBUG)模式行为配置' G& ]; ^% {2 f% I' V
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- n5 ?) o1 `( n; L6 I+ [6 D* W: A
4 r- w; C; w5 z9 Q3 A
    // 配置计数比较器子模块
, P7 o4 Q# O) u6 r3 E4 d+ m$ |    // 加载比较器 A 值, q4 }  g* l- V! V
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,( M. w2 m$ g( {$ U4 H8 B
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);6 u: Y& k. y. k" V& p4 m/ z; Q

. m: G3 r( _# ]' k9 Y( F    // 加载比较器 B 值
! `$ q& Q* M+ {6 o4 B, I    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,- A; [: n8 k8 t6 a! l  _6 N) r1 r
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 i/ h6 Q  R: [. z' C
* w9 l9 q8 t* d1 K( Y6 j    // 功能限定配置(输出引脚触发方式设定); o3 p  u- t. t
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出/ X, O. c- t+ @. ^( p" @: L) b
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,) T* @6 @1 A8 o6 D, B) g
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," `" }  ?# T: R" a7 O& b
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& b" T* F$ x$ q& y# c; G1 z6 ]# `
8 n5 D) C& b; h    // 禁用(旁路,信号直接输出到斩波子模块)死区模块9 Y' Q/ x& Z; M
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);8 \' y' O( k1 X$ a1 E

- E' O0 z1 }# q    // 禁用斩波子模块7 U' K; L7 o3 v- h1 \$ M, H5 E
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);/ z, i1 J; l. Z* q
% W! y4 p7 c! r" v" j
    // 禁用错误控制事件
/ V5 s, Z1 `% o/ {4 W! F, S    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 \/ ?4 R  G  w0 B% a
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);) ?% T5 Z7 @  h# f) U

5 [1 u: v8 f; ?$ {0 X# T% F    // 事件触发配置3 t. S+ `9 B, O4 R  c' K+ u% q
    // 每三次事件发生产生中断
8 c; Z, c* o, T8 ?+ w- a    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( \2 ]' v2 k  |* B. n0 m    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 _' P0 H  i! V8 e! z    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);( J3 L0 Q) r! g- @
    // 使能中断8 e6 g9 s/ B& b% s( D
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) W: M4 c$ P( \( w: i2 \

( B) d5 {  C2 k  Y" [( f    // 禁用高精度子模块2 }* \! f2 z! Y6 u- P" C2 Z
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 ]9 z" I6 ^& ]# N4 k  V

6 k7 c3 k8 M; v0 L: n" U    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# k  {( O( b- A2 ]: F: j5 v}
1 |6 I+ R! N) ~2 K
+ K& F0 ?& k5 k! m/ V; Wvoid ChopperWaveform(void)7 s* _$ z  Z* h
{
' m& z8 W* s& F7 X1 f" K& i    // 50% 占空比
: R  w" @  r) U! v/ _# D    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);3 |2 ]" V; S% V1 J
    // 4 分频
  r0 l- L, e6 [+ ^1 c    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( ]% D7 g% N  @    // 单个脉冲宽度) f0 g9 z9 d/ u: O: b7 u# \' {
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);4 X( Z# t0 S5 S1 b/ P; `, Z) W  \
    // 使能斩波子模块
1 j+ ~  B/ L0 {, a, E( _4 F6 ~, R6 {    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 E8 P+ m5 @) u6 r4 Q}
7 h7 w, M0 C1 i& V; `3 e# o: E9 ~  {3 L" i0 L! I  e5 s
/****************************************************************************/( }. i1 v8 j0 `4 l
/*                                                                          */4 g. L/ X! k2 O% T
/*              PWM 中断初始化                                              */
- R8 V) i; E7 g6 i( F/*                                                                          */) t6 Q+ |, ]/ s; i0 }. i
/****************************************************************************/7 _& L( X) V* W" I+ k4 D( @9 f
void PWMInterruptInit(void)
, }% z% H; f! @" k" t! s{, ~; k; r$ q5 ^0 t6 \
        // 注册中断服务函数
  {* o. ], T& A  |/ q( d        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' A$ I( y1 D: i5 W8 k5 i( r        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);1 b3 R1 D$ Z/ m8 p0 s5 q- A4 B

7 b8 V* f9 x: S/ D: L        // 映射中断9 M$ m5 w1 z4 e, u8 }# Q9 X# x
        IntChannelSet(SYS_INT_EHRPWM1, 2);" O- i3 y# ?5 R0 |% r6 v
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);. k4 O: Y/ L* {" G" D$ k  h( N
  z( t" c0 K) ?
        // 使能中断8 x! Y9 a& g% s" A5 ]+ s6 B3 r
        IntSystemEnable(SYS_INT_EHRPWM1);
$ |5 X1 H% m9 r/ E. f' r8 {' t        IntSystemEnable(SYS_INT_EHRPWM1TZ);5 q' l# x1 r8 s. P& U
}( d9 p7 O, Y7 H+ z  ~4 U7 n5 b
3 D! {6 v2 K7 d8 {% p$ I! `
/****************************************************************************/. R1 ~3 b& S- C* e& K# u: ~
/*                                                                          */
5 G: X3 w+ p& D6 k/*              ARM 中断初始化                                              */
# G& J4 A! j' \- v9 P- L/*                                                                          */- _/ Q% R3 l3 c1 N$ k7 d, r! g
/****************************************************************************/
5 W/ g! Z, m; C- Lvoid InterruptInit(void)
9 f. J! `% @* [{2 C1 y* \! L- o2 o
        // 初始化 ARM 中断控制器
# J; Y6 D% `% Z  F8 d        IntAINTCInit();
7 l  _. z; C! J5 Z) P. e2 F0 U9 D( S
+ z$ n3 b3 w8 r) }- {; U2 Z6 r        // 使能 IRQ(CPSR)
# d& S1 R; `+ y        IntMasterIRQEnable();
# }4 @; R1 n/ o6 F/ D9 i9 M' ]0 K1 I; l/ P
        // 使能中断(AINTC GER)' l' c% H7 p; r6 L* F: |
        IntGlobalEnable();& g2 p& u6 k3 Z4 j. a

0 G, P6 D5 q7 q% S5 }- N3 w        // 使能中断(AINTC HIER)
( E0 i% w2 V" ]3 \0 ^( `        IntIRQEnable();
, w3 [+ x( p6 w}/ a+ ?7 A; i% ^  W; [& w7 L

0 M) o1 l& Z7 |8 J
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/5 s# [5 m  l0 R  G
/*                                                                          */5 A* Z; ?* z1 U  V
/*              中断服务函数                                                */
" o9 I' N- j! S3 b% ~6 h1 c4 |2 J/ j" e/*                                                                          */
9 Y1 z1 g& z& w/****************************************************************************/% |5 h* j& @+ y; ^4 L/ v2 {
void PWMEventIsr(void)6 X. R4 A1 K: d9 }# `' ^: U0 ^: {5 j
{
" m6 F7 Q/ J% g: u8 L        IntSystemStatusClear(SYS_INT_EHRPWM1);5 a3 {  h! F! O3 B, [, {" {: v
6 w9 [3 S/ d: r
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);; E; w5 |( d# Z
}. ]9 r5 B3 b6 f
1 O# R+ F& M) R' s- m  C
void PWMTZIsr(void)+ [1 e: W& ~* V7 ~
{* A! _& S! z4 v) o7 P+ e
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);0 Y7 y; b3 E6 v% {
& ~. O3 N) {- l2 l3 S. c" H
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
  J7 b0 O# |9 w/ [& R- i}4 @8 p* q( U* Q

" i7 N9 g: V' t) [/ g6 d/****************************************************************************// j8 a" W$ e( H0 y  b: z' b" d6 ~' S
/*                                                                          *// O; j. \# N+ |2 h& R  R- M! j  O! V5 ]- [
/*              初始化捕获模块                                              */
1 B1 F% `5 p5 b& o7 \3 f$ e% S& |0 O/*                                                                          */
) v5 l% c) `3 y4 ]; N9 M; G$ }/****************************************************************************/, @+ [& K3 y! h! h$ |
void ECAPInit(void)9 G: N$ C7 y  d0 ^
{' U! ~4 `! ?$ B1 e9 c
        /*-----设置 ECCTL1-----*/
. q6 ~$ ~% H0 N2 t# o        // 使能CAP寄存器装载
9 p' ~. s  z$ y6 R) d' n2 f        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);: `; ^9 f3 n' G1 P* x" i& W
        // 设置预分频值.
! i9 o" O, p- s; V* \- p1 ~        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 O: V# ^2 O# b6 s# F6 N+ U% E        // 上升沿触发捕获事件' f" a, O' ^6 I- v$ ^! |1 ?& O$ a
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
6 Q  J/ k" K) F+ z. ~        // 输入捕获后重新装载计数器值.
3 l0 E! F  F% H        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ X1 K, O- N$ ]* H0 h6 r
# h% s( X. I0 f& z        /*-----设置 ECCTL2-----*/
' k6 h8 `" e; U. H) k& V        // 连续模式% M9 @. I* T' C
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" A% h% a; w' C" H, Y9 f        // ECAP计数器TSCTR持续计数
. F# h# h* D6 V/ u' a% f        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);. Q5 `9 v) _9 u: I$ v7 Z
        // 禁用同步输出和同步输入
. m1 z& d. r4 u5 j6 Z9 ~        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
/ Y. |* r2 }, v        // 配置 ECAP 2 为 CAPTURE 模式
; i. c4 Z. A6 c6 K1 x        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
$ \/ [; U6 _5 C) n  X9 s3 g
: X& {7 ]- ?" ^5 y: X& y5 }        // 使能中断) S" x, W( f+ O. L
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);6 Q0 @8 S# f) Q" I4 w, B
}, q/ ?( Y: }% k8 U2 X$ l

* w" ~! I0 z" C3 a9 X$ u1 j9 K/****************************************************************************/
9 `. \0 q; y5 H) x& i: x- S! v/*                                                                          */
: E$ Z3 Q, M* i1 r) w5 Z/*              取得捕获结果                                                */
; e& c1 x2 ^! f/ y8 `2 ^/*                                                                          */7 N9 Q6 E0 u: i7 S
/****************************************************************************/
* i6 D! g8 q! p" Z- f6 junsigned int ECAPRead(void)1 Y4 v% |$ M3 b* a3 Z/ V  i
{
; I/ N  s4 X0 N4 _& z) Y, H5 Y        unsigned int capvalue;
8 i) Z1 y. }( Y        unsigned long frequency;  ^. @6 ?4 @! m) M  I9 F

8 L3 G) i% n1 W* [( l% c        // Event1 中断标志( t" L* i+ @3 c8 p
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)); i- `  j0 G2 ]) _
        {
6 n( i" Q9 x! B4 a                // 取得捕获计数
5 ^* g7 }; R- w  e' J                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);6 `6 l7 J" p. K2 Y
                capvalue = ECAPResult.cap1;
6 ?6 f' b; M7 C* [0 ~( t
6 ~3 k2 P' q0 {# S+ r                // CAPTRUE 模块 228M 时钟主频
) `) @! J! f/ i: t; |                frequency  =  228000000/capvalue;" P1 [2 R/ y' h  K2 `6 e
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);5 u0 S6 J! i$ j. _

" O9 G% D8 E+ \- l0 L                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);, w3 J7 u' ~* T
//                IntEventClear(SYS_INT_ECAP2);8 {$ y  t; v6 O7 p( B& n8 n# M
        }  I% j6 H" q3 E, f9 S
        return frequency;
4 X9 d; |2 ]' P% l! }& s}& `; o/ H/ q- {. ?; D

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 K8 y( T7 I$ W[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