嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家2 {1 f& Z! }3 B( g8 W2 @

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/$ W( P3 l9 o. |5 T
/*                                                                          */% v' I* C5 t( y" ]8 u; C- q5 l9 J
/*              宏定义                                                      */
* Z9 i% {6 b$ z8 k* c4 S/*                                                                          */
, M( I& B, _- ~- r/****************************************************************************/# ?+ @/ w+ `7 W' ~6 T
// 软件断点
$ ]: J# c+ z6 U0 B9 H/ |#define SW_BREAKPOINT     asm(" SWBP 0 ");3 |0 r3 u7 Y$ F! ?# ~) Y: D
) l& l/ j: c4 D! D3 C7 L+ z
// 时钟分频& q) G, ^7 B- [) L% g# P. [
#define CLOCK_DIV_VAL     228
8 `" e& M. i7 ^" s2 l% i1 W3 @5 k+ O: p, w6 Z5 a
/****************************************************************************/1 Y& o% s, I( V
/*                                                                          */. I! k$ D' T4 M) s4 m( }' C2 b4 P
/*              全局变量                                                    */
# ?, e7 P6 K7 Q6 g/*                                                                          */7 o8 I; T4 V! ?5 x1 @8 ~7 ?1 T
/****************************************************************************/
* M  s& S( Z7 c6 w" b' ^ECAPCONTEXT ECAPResult;
+ z9 I; j' [% O: l9 P0 L) r* _7 s1 {8 S# r& V) ?
/****************************************************************************/9 A5 W1 B! ?/ Y6 u
/*                                                                          */2 o# O, j' r$ h
/*              函数声明                                                    */
! }2 j% {- Z; N, P# u/ N/*                                                                          */
/ h. x% a+ }: u* K; ]1 }6 Q/****************************************************************************/9 K7 q- Q1 t% f3 c
// 外设使能配置2 ~, [% n) q$ x' |$ Q
void PSCInit(void);
) Z" Y, Q6 k0 C+ O0 K6 y5 x1 J& M( s9 c( e: L" o: g, e
// GPIO 管脚复用配置. r& B: H, @. q) |% D
void GPIOBankPinMuxSet();
9 x# `2 x- x7 i. i* V) p9 R+ U
, R0 s. x7 z+ L$ u& T// 产生波形2 O# X5 m, x1 T; _& r. A. B/ L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 R* I3 n: J  |void ChopperWaveform(void);
. D* s6 E! d) W7 c3 A  v! {9 w0 D. C6 a1 K/ v) F; t# p+ N  M
// ECAP初始化和读函数
. L1 w7 f5 D: }  z. ]) pvoid ECAPInit(void);! X8 r0 Y" w0 D) @  `2 d
unsigned int ECAPRead(void);8 K, r4 A9 Z9 g8 H! x1 Z8 p

! Z. S" B8 Y4 \  z' J4 t//ARM 中断初始化
3 S+ t% ^$ P+ F/ `# s5 _* W' I2 `void InterruptInit(void);
( f( U  g8 A; H8 j8 S
( X) e+ o+ O8 x7 Z. \// PWM 中断初始化& U4 ^2 _2 W$ R
void PWMInterruptInit(void);8 I- }6 g0 }; T: x- }* m
// 中断服务函数
6 c0 M# _: e/ v2 k9 T6 ~* M$ |// PWM 事件8 i  ?; Y2 h- V; F0 F4 j9 V9 @
void PWMEventIsr(void);
: V( ?) }) N5 \6 G& F8 D// PWM 错误控制事件4 P3 K1 t* K+ W3 D$ M. l4 }/ R
void PWMTZIsr(void);
% p( \+ \8 e0 L* `3 m0 k- p& K1 i: @' ]+ n4 Y
/****************************************************************************/' B5 K. w. `3 |% t
/*                                                                          */
, Y! _  }5 L  U2 f' Z# P3 |; }/*              主函数                                                      */" B2 s' ?0 K9 |' R$ V5 t3 l9 d
/*                                                                          */, z( a) Y5 Q) O6 v6 T( N& t
/****************************************************************************/7 Y1 B" q0 g/ M
int main(void)
: \. _* }) I( J$ m9 d{7 R% }$ n1 k: h
        // 外设使能配置) H% B8 t/ K* X: H8 y. R
        PSCInit();
7 C4 A: A3 X! A' F+ j! s) O& B; C
        // 初始化串口终端 使用串口2" n! w* ]4 P. c5 N
        UARTStdioInit();
) [8 y/ G/ Y, l' w2 m# J       
+ y6 r6 X  j7 C        // GPIO 管脚复用配置
4 D- V) ]% Z5 l, e, N        GPIOBankPinMuxSet();
. ]) I1 ]- F! i$ z6 y: M8 F# e* T- y* s+ C* |/ n
        // ARM 中断初始化
3 e$ _6 a) z9 e1 q  W$ s        InterruptInit();
% E2 \" X5 M  A" L
! l$ y* U$ Z3 {0 M: T: [/ A1 J* G        // PWM 中断初始化' C1 T) e* Z8 x
        PWMInterruptInit();
" C! O) b) p% p6 b6 h8 y: k$ Z
3 \" F3 b# c% H" g5 H6 h        unsigned char i;
: p1 ^0 d$ h, I6 |2 v        unsigned int j;
  j: e2 u& T7 [2 i& k. C6 K2 p+ f: S1 j! O( K' W' h
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ n* i1 U% n3 S0 ]        UARTPuts("------------------------------------------------------------\r\n", -1);
( M% O9 {  |1 k4 o" g0 H; a$ i+ i        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
3 g5 O: D3 e5 Y4 ^5 c        // 产生波形
- L6 M, }% l( ?' T5 {6 ^        PWM1ABasic(25000,50);
' w% X" D) d& |1 n7 Y; T5 A3 x+ [* Z- {: ]2 Z  u
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
) l/ [& |- n! ~$ m        UARTPuts("------------------------------------------------------------\r\n", -1);
6 ~) n0 F) z7 L. g* S% `# \: p; e) r5 M4 K. h& m1 `5 \

3 C9 J9 S5 b* Y8 b9 H# M- w- I" P4 s0 G, L9 y- a- ?
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 n# P+ n" }1 Q0 F! G0 U' p        UARTPuts("                    C6748 ECAP Test\r\n", -1);
: X3 j: S/ r, `3 z. p        // ECAP 捕获初始化. c5 `! Z4 N; N. N" u. p2 i  N
        ECAPInit();/ |" L' M& Y. a/ u" f9 f# q
        UARTPuts("Initialize ECAP.......\r\n",-1);- ?" J! p1 L$ S; |
        for(i=0;i<5;i++)" E4 U' l& ~3 h/ G% Q0 J
        {  {1 ^4 E" i: y$ A8 b! e
                    for(j=0x00FFFFFF;j>0;j--);            // 延时( a' P- ^+ T; d9 L- H) t) _- R
                    ECAPRead();4 E5 L/ Q. _% z$ V/ ^/ ?
        }0 V* C* L% b2 q7 A* n8 Z8 }
        UARTPuts("\r\n",-1);
& g. O% {5 i1 }( J9 {" N        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);! x5 |4 z0 z9 R, f7 ~2 p7 J( v) c! Z
        UARTPuts("------------------------------------------------------------\r\n", -1);4 d- l, H  ~& H
8 M5 j) Y* d$ k# o
        // 主循环
6 _1 z0 {; {, N' Y        for(;;)
: g. \& m) t2 s        {, N) ~  Y% t4 @

* g  z% u3 i# G. m0 N/ T, w        }
3 U3 s9 }& d* H}+ Z3 z; {& a0 E$ f+ s) U

0 h6 ]% w. @0 i6 W, `* q/****************************************************************************/
4 F  e) v% p( z! y  R8 R' j: i/*                                                                          */8 @) e: g' G2 N  w0 p8 y' `
/*              PSC 初始化                                                  */
" L2 X! I* L' S, S) J+ t/*                                                                          */# o+ c( b1 G. z9 N  S" _
/****************************************************************************/
3 r5 G6 b0 W* _' E# {- Uvoid PSCInit(void)
. B. D- b3 z( q( _{
' r3 W2 D9 t5 w, [6 h0 x9 `        // 使能  EHRPWM 和 ECAP 模块
( W+ I& e  u% c( S4 N        // 对相应外设模块的使能也可以在 BootLoader 中完成; C! }* Z) U6 }% }
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: o+ n$ f) p; z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% g/ j7 U7 q5 m! F}
# n- I4 o9 L: t* p' z/ O/ I; s( J( G- T' l$ j+ I7 y" ^
/****************************************************************************/% F- N& }( ~- O
/*                                                                          */- ?0 b! O6 @) j5 v* i
/*              GPIO 管脚复用配置                                           */
- L  u7 B$ f$ X5 t" e/*                                                                          */6 e& j  [! p% x& E( \& i# _
/****************************************************************************/
2 E% E9 d& ~( t/ o# O' [, Fvoid GPIOBankPinMuxSet(void)+ [' M, i7 _: P, K! c( c
{
" O& @7 M2 n8 o" t        EHRPWM1PinMuxSetup();
, `+ x$ p  J0 B7 z: q& R( z( m; O4 X
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP); X$ v$ `; }* ]! F* ^; S
        // 作为捕获功能时管脚方向为输入% J3 i2 g- S% _* N& `8 ^
        // 作为辅助脉宽调制时管脚方向为输出
( Y; L' n8 N' c+ K* f- o    // ECAP2 / APWM2
, R- _4 t" C/ v' h- C        ECAPPinMuxSetup(2);  b  k% v4 o" ~# v8 |/ w; M
/ U4 J2 y, ~) j1 L5 r, C1 h& O7 x
        // ECAP2 / APWM2方向设置为输入0 ^* ]2 S" l6 X# t. `3 B
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]2 s+ H' k9 H+ F/ b$ G- ~1 w
}: {) G1 F8 E4 y* i

$ ?8 B4 |! S1 J' i2 {7 @/****************************************************************************/6 C/ @. a0 A' ]. S
/*                                                                          */; N, r6 d; |8 D" |- k( E5 v
/*              PWM 输出波形                                                */
) c5 k/ t# Q8 a) @) w/*                                                                          */
( U! A1 i  h2 u1 J1 @3 w) m( R/****************************************************************************/
5 U) X1 }2 n' P" nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)  L. [3 d2 o1 V- w' v  R
{
% X9 U# e: g; U# G# o) P1 d8 e* D    // 时间基准配置2 B) L$ z5 L9 q1 m
    // 时钟配置
* S5 z! G  ~/ `8 w1 s1 B    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);: k* a- C, I( i) l1 u- g) z! ^/ z

- w0 r4 g$ B' Y& l. J! a2 r6 }    // 配置周期
: ^' f3 C  o$ w  K( Q, _, ~    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,: a, H3 o* Z' ]2 @
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
  x; m  p; u# h+ {/ f/ o* V
% X/ Z, _+ f: ^9 }0 T) s7 V    // 禁用输入同步信号3 k/ ?- }+ C) A7 I
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);) |, F$ Y) v# n+ ?
) G& f/ b% N! {; ]6 d) l
    // 禁用输出同步信号' _3 U% s0 C* s& L. e* F3 t
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 E) ?7 Q+ Z- t
0 E9 {  J' Z1 u  F: P$ m    // 仿真(DEBUG)模式行为配置
" g$ \# u# b2 _* p0 X    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 O, h9 j& `2 h$ N6 p' G  [

; F4 a5 d) z# X( h    // 配置计数比较器子模块
  x8 t3 \% K/ R5 I    // 加载比较器 A 值
" h5 @3 |0 u1 z, N5 y6 b; e    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! q6 ]; k9 S2 r6 P$ o5 W* ~                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ L  Z. k( d3 ]! e" V- j  s$ Y2 y$ u$ y$ c/ L- T0 u' m
    // 加载比较器 B 值
6 r7 a) w, s' k    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,* X6 f, O% f; q* q
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 p3 r& N$ `& G2 u3 e
4 w+ d$ r+ p  W5 W    // 功能限定配置(输出引脚触发方式设定)9 D$ ]" e3 v) g$ X
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 L9 S5 a. \2 q( Q/ M9 l    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,; h( r& m6 ^9 `
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,! j) E$ d4 ]3 c, c! z, J3 O' ]
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ F9 }1 L+ g3 f* w" R. e
: o# y. G  F0 O4 [4 T: i. Z    // 禁用(旁路,信号直接输出到斩波子模块)死区模块  Z. i) L' r( T. Q! d' w
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. g( L: O# @+ D1 A3 O
  i1 @3 M; D. ~2 c7 q' Y    // 禁用斩波子模块
' V2 A: u  F+ E7 U6 F7 N, ~    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);( d. S7 \, J# \' d# X
; R2 B* L. C' Y
    // 禁用错误控制事件$ k) M5 s  c7 ^, F  @
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
+ B" [7 `3 g/ n- f2 q8 l/ G    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);- |6 V9 r0 b& l% q; B
+ _+ T" A5 y- p+ B: ?1 g/ P
    // 事件触发配置
; Z9 @( y, f& G! e    // 每三次事件发生产生中断5 d# L+ e6 b% s( ?
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- W! o/ Q: j6 B# r% M) o* H    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
+ Z$ M7 L* t  @& ]3 r/ S$ x: e    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. C$ O+ _1 r% ?( ~  Q# h    // 使能中断
1 Y* l/ X& R' Z: M; N    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
: ?/ a- t; X9 A7 J6 J4 `0 ?6 c$ _6 O
    // 禁用高精度子模块
6 p$ `, |7 ^" V, B8 \; r! n    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* f# u  G: P% s9 Q0 ?' W$ i1 u+ _
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 i; _  x  u3 g1 _, l
}
6 z5 j4 h) K/ a1 D. o
/ ^  j8 s  @: S2 Hvoid ChopperWaveform(void)
% l; y9 S( p; Y- F9 D3 g{7 P5 w1 p# V7 L( u7 @% x
    // 50% 占空比
1 m! G& P; F$ e+ O6 `, Y) n6 ^    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ v$ g, `6 B& O, l4 W1 A0 k    // 4 分频
' T: Z: i0 C: |; D6 T0 p, X    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);; }5 r& g  a' o* I
    // 单个脉冲宽度
  T. |; E9 M# a5 q: ]    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);9 }9 F7 {3 A2 A% h# r) K, x
    // 使能斩波子模块: n2 ~, k7 L$ c3 x) r! h1 V8 P
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 R" s1 a) ]6 O9 [}
9 d! W/ L1 |( V" |$ `6 r( G  G& {
9 Z! r( C5 G* R) R# Q: e1 ]/****************************************************************************/
, w0 X; A9 B5 p9 @, O! L/*                                                                          */6 J  a6 k5 @1 N
/*              PWM 中断初始化                                              */) V( g: ]! v) L/ G4 U0 C
/*                                                                          */
) s; F' S& ?9 r7 P0 [/****************************************************************************/2 H6 R  H# n2 P
void PWMInterruptInit(void)
! o. F2 R4 K; n{
1 @' J7 E! i' t        // 注册中断服务函数
+ }  C% O) W% {) V        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( V6 p$ K4 y9 X  ]& [) |$ q        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);; d/ i! W9 U: h+ L% G1 c. D
# v1 u- b0 `/ H' A+ k+ I6 R' O# }
        // 映射中断7 F& B; T, f( c* D3 A
        IntChannelSet(SYS_INT_EHRPWM1, 2);" v3 _8 U, e0 @; d
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* [( T! J; a' Y* c! A6 x; z6 ~+ [) d7 \
        // 使能中断2 e  F, z2 b8 O/ U  D
        IntSystemEnable(SYS_INT_EHRPWM1);
( Y$ T6 ?/ O+ {; T2 ^7 S2 ]        IntSystemEnable(SYS_INT_EHRPWM1TZ);3 e. y$ W: h2 O5 Z; r& ]
}/ C8 p) Q8 U+ [
7 l  ^; a9 K# M; Z; w; b0 h9 @' [- M
/****************************************************************************/; H8 b) p1 [! k; Y
/*                                                                          */
3 O9 ~. v7 {9 \: B8 z& f/*              ARM 中断初始化                                              */
, y+ Q0 J8 p* J/*                                                                          */
& t  r* y/ x$ l2 M% r  J/****************************************************************************/$ o8 {1 q! f4 c8 z1 b% a
void InterruptInit(void)2 Q0 M& K8 d; c1 ?
{
  J  s4 V+ D: K. N7 U1 |" E        // 初始化 ARM 中断控制器
. W) F* |# \5 K: Q        IntAINTCInit();
! P* K  D8 c- @5 t9 ~) J; a
3 s% ]. o$ A8 [: ^6 k        // 使能 IRQ(CPSR); u; E# r! P! Q# Q" v0 A. U# u
        IntMasterIRQEnable();
+ n# [" A: Q1 S4 J0 W5 z- P$ [0 P6 d& H( A8 O. g# b
        // 使能中断(AINTC GER)
9 U' ]8 `. k# H# |3 y) N  |        IntGlobalEnable();
6 K3 z! i* l; o
" v% Z0 E) a; r7 b) |; n# b9 ?        // 使能中断(AINTC HIER)
8 n: W9 v; J1 P; s$ ^2 U        IntIRQEnable();# S6 ?1 }+ e* ]+ }. y7 H
}
) l2 I- o4 X7 i+ G* \. ]
9 \, {& |4 @- s& s* \" U
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" \$ I/ t1 _% I9 U
/*                                                                          */
% {# @3 g7 `+ J- W4 q/*              中断服务函数                                                */
( K5 Y0 m" l  J: t& |! z/*                                                                          */
1 O" R" ?/ ?5 C& r/ E! K4 f. C/****************************************************************************/1 T! l7 ^$ K4 y& Y+ Y* s+ b
void PWMEventIsr(void)9 g! b; {3 W/ a$ _( P, }. j
{' F0 B& L8 v9 u! I
        IntSystemStatusClear(SYS_INT_EHRPWM1);( z( a; y3 A9 c4 g' O! P
2 G) e  t( b* i: G  |! l" a- G8 g
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' }) E$ H" ~* Z9 `4 K
}
5 G9 F9 P$ f+ p& z4 t) f5 K4 D4 C- U+ x/ L/ ~/ B$ g
void PWMTZIsr(void)$ ?5 ]; T" E' F
{
; {# m- K6 s8 r) m        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 X# U' C; B$ w4 h& c; L
! B, ~: B4 \1 V5 T    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
( K6 B& ]5 z  n8 @# B}
9 a2 i# m* T4 F0 k% c3 C! r+ e7 n- J' M8 H; {
/****************************************************************************/
  t- a; _& F8 F0 c" X( s/*                                                                          */
1 U7 `5 Q4 W4 S  _6 u3 ?/*              初始化捕获模块                                              */* z8 l. ]: j! C
/*                                                                          */# A. R) d9 y0 E  _  r3 v
/****************************************************************************/
% ^* Q; }% O, g) l; m9 \void ECAPInit(void)
" u3 a3 a7 ?. O& z: M7 P+ L- |{
5 C% O) q! z, B9 I. k3 H2 [$ }0 Q        /*-----设置 ECCTL1-----*/
& e: p8 ]4 m, D9 Z        // 使能CAP寄存器装载
* S) m/ T8 O. r. P$ Q        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: J+ c* I! Z# b: h        // 设置预分频值.: F" E8 q. H6 J0 B% G5 E3 K
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);% p# _+ K; V7 Z; k& W: V
        // 上升沿触发捕获事件
% K* j( v& ?; C; v. z: n        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 `; c9 M' ]+ w        // 输入捕获后重新装载计数器值.
" q' L2 \# k( c( ^  K2 p        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
' P' d2 j3 e8 H  M" O
9 o) D1 n2 L/ |/ U' ]        /*-----设置 ECCTL2-----*/
9 G7 r/ }, f. \& C  S        // 连续模式
/ i5 t* f! C0 B" O" U& o        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* o4 x1 U( T- K" n        // ECAP计数器TSCTR持续计数
4 B; |1 A, o) T9 ]$ l        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);1 v8 w3 B! O& D
        // 禁用同步输出和同步输入4 \! ?0 ?/ n2 w0 ~
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; U: Z# f8 n9 O3 D
        // 配置 ECAP 2 为 CAPTURE 模式2 S+ J9 e' P( e( B
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);5 T. v9 d4 O0 g9 X# z& _
6 T5 O8 F$ `5 W  H* |+ {1 R0 F
        // 使能中断
  W2 {2 v) f/ h4 I2 w4 `//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);& g  A8 o$ D5 c& P5 Q) |8 X' ?" S
}4 e" Q% S" ^! M1 m( y
3 g1 h9 [: |# I2 R  L& ], I5 J5 f& m5 p
/****************************************************************************/* L6 j4 _% C) p! O
/*                                                                          */
' X; p( L8 Q# M5 N. {6 b/*              取得捕获结果                                                */
6 d. u! ]- x, ^/*                                                                          */2 I5 a) ~/ t- o3 z" u' j3 m: Z" a) N
/****************************************************************************/& A  _5 k$ e4 _5 e
unsigned int ECAPRead(void)
) N9 y" z0 \: q* Q{
3 E4 X! q; N; `7 w+ T' _, E        unsigned int capvalue;
: ?, D# q. p* Y% O5 B  H+ n+ t0 t        unsigned long frequency;
" V' z4 v6 O2 \1 M$ I  L; e
  k. N* V8 G4 r1 L9 }2 }        // Event1 中断标志% P3 ^9 E* s1 k8 R" m
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. z0 a% K# w' ^9 V, b: ?        {2 U! x% \! ~% r, A
                // 取得捕获计数$ _0 N4 ?1 I, c* Z; C& w
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 w. P$ y7 o' g3 i/ v6 ]' S8 H: p                capvalue = ECAPResult.cap1;
3 h& Z6 r, P6 r6 j
! O1 X+ v* _' w  N& W* x. }                // CAPTRUE 模块 228M 时钟主频" ~& g! _# N' `& t' f- H+ D7 X
                frequency  =  228000000/capvalue;
7 l. f0 O6 {5 s* V) M) O                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);4 S& ]. _2 [- A3 @' n
; b: E& \8 T4 \. e% p" u
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) A% g" K( Z& j. T# E//                IntEventClear(SYS_INT_ECAP2);
2 w1 {  h3 Y/ f2 X5 z  N4 r6 I* \        }3 \& @0 H! F! J7 L& _( z
        return frequency;6 Q# k. Y# h7 M
}
, _  W  d, p: b: A1 ]
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( ~2 y  e+ m; c+ I- k4 q1 [9 S[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