嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ K! x# R* t2 V" p, N2 {
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/; y6 o/ @; V  b( I- C
/*                                                                          */
9 ~) i5 t' L) ?+ Q; Z+ p/*              宏定义                                                      */  {3 k" C0 M4 G; B* |
/*                                                                          */
7 P) l2 `" R" ]/****************************************************************************/6 d" K8 I$ ~! A" m) |7 k' ]
// 软件断点
( p! ^1 C% j" F4 u" a1 x2 ]. b, d( T#define SW_BREAKPOINT     asm(" SWBP 0 ");0 J" E5 ^% `, l, T: |9 i
3 v# ^0 o* d9 D
// 时钟分频
  C! \7 B) i  ?2 J#define CLOCK_DIV_VAL     228$ _2 T5 `  d+ G8 D6 }$ s8 `0 T
$ ]3 a* o7 G! O0 b" M
/****************************************************************************/- w  S( D% n8 ?7 k5 F
/*                                                                          */" H! Q& d, h. }/ [/ X" o
/*              全局变量                                                    */+ o0 w/ O/ W8 @4 D
/*                                                                          */# c" Z4 |5 W$ l; c7 {
/****************************************************************************/  y( t- c- h! W6 n/ t0 i
ECAPCONTEXT ECAPResult;4 h, Z4 S6 F% q+ ?0 ^" D

8 s! h, N- F0 L( G6 W* Q/****************************************************************************/" t6 s+ i; w9 g: I8 D! j: G
/*                                                                          */* {8 S# ]! N' }  e6 X! g+ y
/*              函数声明                                                    */
3 R( F* ]# l3 s' i/*                                                                          */
3 g6 W/ l: E. e' o/****************************************************************************/. `$ @1 E- v9 [  ^8 A. [
// 外设使能配置+ g0 F' l* D7 v2 [' ]3 w0 h, \
void PSCInit(void);. d3 y% u2 k0 k- T( @. q9 M# a" h

. k) S: X2 G0 ?' E- u8 f% O4 }// GPIO 管脚复用配置9 T6 s" n; t; W' w# |4 s1 @% E( V% L6 n
void GPIOBankPinMuxSet();2 \8 u) |8 n& L5 c

5 E0 i2 W: l1 m* u5 y9 K// 产生波形$ o, X) T& A8 O8 B6 d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 ~' l: P( d7 w7 y4 A& Ovoid ChopperWaveform(void);3 r+ m; O9 s1 t$ C# y

. `2 F5 |( V& R3 S( v6 m! D4 E! w% N// ECAP初始化和读函数2 V) B( g/ t; G9 o: ~
void ECAPInit(void);( l8 W. F9 }$ N7 U6 s8 g
unsigned int ECAPRead(void);
% p5 {3 E& {% e# o0 B
' ^0 V+ [+ c9 O! `# }//ARM 中断初始化0 H/ q. H! E$ ^4 {2 m
void InterruptInit(void);$ j" t* e3 t& N/ N+ E" Q
* |3 r8 D9 I6 u( [. R2 l' L( n, e
// PWM 中断初始化- X2 Y/ ?/ k' x0 |8 N
void PWMInterruptInit(void);
# S# \) v6 r: c: M$ s// 中断服务函数
2 a! M) I+ P$ S/ c5 E4 a// PWM 事件
  ?+ t8 l: V" ^4 H; Svoid PWMEventIsr(void);
' ~- o% l1 M6 A( W// PWM 错误控制事件) d- D) I9 [, L+ Q; G7 g
void PWMTZIsr(void);
# P4 _1 l. x8 E  i: `& T  r8 j+ o% ^/ l! ]8 `) F* y, G* [0 T
/****************************************************************************// O) W8 i. z% X' ~( T2 a$ l% w
/*                                                                          */8 N5 p  O, D  O8 O0 ^& {- L) F
/*              主函数                                                      */  f4 T. s; c' \/ C
/*                                                                          */* V& {0 {3 O/ n) D
/****************************************************************************/2 {. m" V$ D: v" N  H6 A4 i( m
int main(void)2 P* J& Q( P% h; B
{
) d' F& y2 ?! |( R4 W( p        // 外设使能配置/ n4 O  A( h" q1 J
        PSCInit();% p! J) V% l7 ?

# q* L- F( o# `        // 初始化串口终端 使用串口2. l& x( b# T5 L3 A/ ]/ W2 m% [
        UARTStdioInit();, Y* t, Q- U7 o- G* [, X8 |5 A( h
        / d% f& M: Z% C( z& W+ ?$ Y
        // GPIO 管脚复用配置4 w/ o- c8 V  P' ?% w9 p
        GPIOBankPinMuxSet();
6 O& s8 m8 j2 d* J; H& t
' \% M$ M" V6 p! j1 T$ ?" J        // ARM 中断初始化
7 t. @* ^0 m+ D9 g* r8 \1 o        InterruptInit();
$ R6 C9 w9 ~$ m  u
8 Q/ u4 o: A  ]: C        // PWM 中断初始化
! e- n; u* r- d0 a5 @/ j        PWMInterruptInit();/ g' c( h+ C# X0 B/ {. \: g
) i1 l6 _  X# k: l8 \
        unsigned char i;
" Y( |& e1 U7 _, z        unsigned int j;
3 [, t7 n, ?1 A2 M; i# Y6 z) v* p- V9 a4 A# _8 s0 ]
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' |6 i- g/ g  I1 O' R        UARTPuts("------------------------------------------------------------\r\n", -1);) B. H6 l$ S0 F4 s" ?* f
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);7 h  Y, n8 o' M/ Z4 |
        // 产生波形
" S7 p& v+ ^1 t0 H& \        PWM1ABasic(25000,50);
9 F+ c, }+ d8 v
( E* d! u7 C- s( E% I& G$ _        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);4 x4 g" [' l1 K) |8 M! i( n
        UARTPuts("------------------------------------------------------------\r\n", -1);
2 F' y/ ^  l0 d# Y
3 F- P. n% P8 d' S4 h0 z( }. }- t7 a) C3 ]/ V

+ n; I+ _: w+ }8 L& v0 L& e        UARTPuts("------------------------------------------------------------\r\n", -1);
- ]/ N1 L* d: H& H7 j6 D( k2 k2 k        UARTPuts("                    C6748 ECAP Test\r\n", -1);
  G: J& Z( Z$ p. o, _$ h" R        // ECAP 捕获初始化
7 B' m. S2 _3 w        ECAPInit();
. M4 k! A4 C. D        UARTPuts("Initialize ECAP.......\r\n",-1);( r- Z5 F- j/ B1 n2 T% q
        for(i=0;i<5;i++)" t1 O2 T7 u6 @. S1 \- Q
        {) T2 O' e" f# K9 Y  P% K5 x2 e  {
                    for(j=0x00FFFFFF;j>0;j--);            // 延时& J3 |- Y2 B: d2 q# h% N2 s4 ?
                    ECAPRead();
. E" x4 M/ E1 w        }) G4 {2 b$ G5 z4 S+ [0 R
        UARTPuts("\r\n",-1);; b0 M; D) `0 k" Y4 e4 z
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
1 [" _# ~: Y/ K9 H        UARTPuts("------------------------------------------------------------\r\n", -1);
0 t3 b0 r! c/ H- F; ]' [
7 ?* K* _8 Z$ f        // 主循环6 F+ a1 {0 `" o$ x& t$ a
        for(;;), m4 l# v0 u, D6 i
        {
% d6 q  ^+ i. V4 _" k8 B
( r9 ^% d' p8 f) }: J        }
9 g8 l  L5 B& F! v% F9 L}* n. y9 h9 d6 E7 t/ O
6 N5 K, b6 _8 o8 _, G
/****************************************************************************/9 \1 o$ R# W: c4 w: M
/*                                                                          */( k9 H/ A  q9 f  H
/*              PSC 初始化                                                  */
/ N1 T: l8 r+ d5 f$ @/*                                                                          */
+ i  Q% v* l# c( U9 x5 N" V/****************************************************************************/
& D! q# _9 N# m# A- dvoid PSCInit(void)" r. q, Q, w8 Q) x% T8 b: N' m
{- J9 D4 N- ~/ H- g
        // 使能  EHRPWM 和 ECAP 模块1 P5 d7 E" ?: j( P) J
        // 对相应外设模块的使能也可以在 BootLoader 中完成
' ^+ j( d, S1 H) C) _% F    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( A; U  ^. \: ]2 m    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 G) j4 ?6 {( d. z- V- r
}9 p/ G2 M+ I3 m
1 Q2 r$ j; x; s' R+ @
/****************************************************************************/
0 u- H" _5 o1 b0 m9 }1 ]  a/*                                                                          */
- t4 p9 f8 q4 h' z& d' L/*              GPIO 管脚复用配置                                           */( w% S  g( b; P" w; r. [
/*                                                                          */
. T% ]5 @1 R) t/****************************************************************************/0 R# C, `/ N5 f: H0 ~- j- [
void GPIOBankPinMuxSet(void)
* o& X& F" h# l+ Y7 q# L: ?( n{. j$ V$ O' R  `5 H7 g# h
        EHRPWM1PinMuxSetup();* M4 e) m. e9 R& h
! Y8 N3 o. v* M. X' A  O
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- o9 P$ k$ c: p& W/ L0 D1 g        // 作为捕获功能时管脚方向为输入. n, K1 C; u& W- i7 O+ O
        // 作为辅助脉宽调制时管脚方向为输出
! \  _, t8 A: _0 m0 e    // ECAP2 / APWM2# Z2 z7 h- A- u5 f
        ECAPPinMuxSetup(2);
- U0 T$ m1 a/ o: O7 M; e6 W, @
/ [6 N/ A7 ]( n        // ECAP2 / APWM2方向设置为输入% S, W  Z: r  `" Q
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
/ P3 U4 ]) i  }- [( S8 @/ u}* {3 n0 V# G# q7 M4 Q

; Y& P0 r% U( i3 M% [; q/****************************************************************************/
8 K4 q9 R& Z/ D" O9 p/*                                                                          */! x) }: I, a0 u, o! N* }
/*              PWM 输出波形                                                */
- k6 [/ N2 X  W, [: M7 r+ S( D9 n: m/*                                                                          */+ h; ?2 d( v& e$ r3 ?3 e- E
/****************************************************************************/: c; R" d( c2 W7 l  _6 ^
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)  ~" R. `9 A* T) ], e6 r
{' U$ V8 e' L& n. K
    // 时间基准配置
6 n* N# d1 R9 W4 Q: E$ q    // 时钟配置
0 @5 ^- B( Q9 N# }% [) }    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 {+ Y- s4 _% G+ ?$ `* O( r0 `" n9 p
- d' C* t4 s! M. X4 U: A' P1 v    // 配置周期/ _  H$ G# p% W& t3 q
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
" \- [, h' X  b2 d! n& G0 A                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 z/ J+ [3 o$ y, f1 ^0 R
7 a" o! F- z2 b/ b. B  q$ l3 O    // 禁用输入同步信号; y* C) N# {' r% L0 E
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);- j7 f% f, ^- c" R7 r' [

( ~& y  y% C* ?    // 禁用输出同步信号
+ K! [' a1 Q: G    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" \$ g' d+ {; Y% ?; v9 L3 u) b+ V4 Z- J( V6 e
    // 仿真(DEBUG)模式行为配置8 L* W' B2 n8 m. A$ b
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 S; @  u9 l+ H  Y( T3 \- ~0 m9 B( y0 @& ]
    // 配置计数比较器子模块
* ~  u- O' K. v( W. x- W    // 加载比较器 A 值3 D: N* v) R' S3 ^. q( f- X/ x9 S
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,5 P4 c% N0 `& F' O
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);& R! a" s# C0 k/ X  ~& r" |
& O# @& a) x+ w% L0 b- q0 K
    // 加载比较器 B 值  y7 u6 U9 T0 g$ F+ u# R$ p
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) g7 j$ b# u" t9 s
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);7 g( G/ t8 a2 Q/ F6 F& P
& X( ~0 ?! M5 }/ M. _+ u
    // 功能限定配置(输出引脚触发方式设定)* F3 l4 |+ H6 x4 f1 `6 `4 k: C- G! Q
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* ]4 g$ @, `1 N# r1 d0 Q    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 P- b/ x; M0 Z5 Q/ k& v9 A. ^                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 P2 X( x5 U/ A) M  W& O
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: M: P% D, q5 M; |3 U, S- `: s
( @  I* N; M2 {  f4 e
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块% _! r9 o2 _  z* F; z0 g0 N
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);- R+ d3 [3 ?- U* R/ c( W

# z$ n, I0 y7 }# q, D    // 禁用斩波子模块* O. {6 z$ M$ B& w1 D. E
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
* K' `) I( e# }7 L% J5 d$ ?; y7 ?8 h8 @) s
    // 禁用错误控制事件
" k4 q. H9 z0 ~) k  U/ e! J8 p    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);! E% C5 ^1 C. |( ^) `
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
( P8 |4 `  Y( k5 s5 s
; v$ T2 K8 e# L3 T9 B( b    // 事件触发配置" Z1 Y7 G2 q6 S- K+ c* v- t3 X
    // 每三次事件发生产生中断
2 B2 }1 t* U" n- q; ]    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ t( S6 @8 e+ S4 G    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件9 R: B. |2 r  a  [, t/ d! F
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);5 k9 B/ h+ D- [% z
    // 使能中断
* e. M+ Q) r  k% a5 e. ~; i    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 n  |; q$ \6 x, T% v6 B8 h  E" f9 p7 s: L
    // 禁用高精度子模块
2 O) y( d$ k3 p5 ~+ Q    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);: G, ^4 t/ n8 l3 C% v3 i
- W4 h/ X" l- H% S
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 C$ F% r& |* X3 \: j: T4 E}
. ?8 L1 S% Q+ |
- O. z+ E$ r7 _# C% ovoid ChopperWaveform(void)0 k- Z' r7 O8 b5 o
{
& j8 {; }! u  f; l/ c8 |" @    // 50% 占空比
& e3 R" [  X  U    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);+ J6 T! {8 W$ E9 b
    // 4 分频! Z* w* W! [) X; g# i/ k2 k
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 D! z! g: p9 d& J
    // 单个脉冲宽度
5 y" V' j- G8 P: p: W  a    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);/ t5 ?: j$ ]3 v$ }+ m+ M
    // 使能斩波子模块
* N. J0 }9 v9 N' {    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 v# x) W5 l! J' m- j}6 k2 z5 M6 I. e) _

) h; c2 P! X8 }2 e/****************************************************************************/' ?  X8 l7 I' f* K& y
/*                                                                          */
- M) n5 b# @8 }' U. Q/*              PWM 中断初始化                                              */
& S# t9 {4 o' l# O  L) G1 Y0 ]8 Z/*                                                                          */
5 W) y$ X6 w. J5 H/****************************************************************************/7 t' y. z& r7 I" N. e
void PWMInterruptInit(void)0 L: w. f" y& N3 _
{
% Q* ~1 g9 [9 Q4 V  P! e3 }  l        // 注册中断服务函数
' _, x- v, z& I$ W, B( g2 y        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);( s+ f! |6 G$ M2 F
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* R$ F: e& k: W* h" a! @( ]& k5 q' \* V0 O
        // 映射中断
' Z  x; ]9 @- y/ b' C5 r        IntChannelSet(SYS_INT_EHRPWM1, 2);( i& r1 ~, F% L' j9 ?  p5 @4 q
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);. a' L+ Q) t9 v8 _. [0 Y- f
- r" g' s- _5 I3 _, T; ~- o1 Y
        // 使能中断* U! p/ }: X5 s2 t! I1 [
        IntSystemEnable(SYS_INT_EHRPWM1);+ u4 t; ~6 S; e1 y% c( b+ `$ ?3 R
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ z& x( G  ]9 l2 t% x' [% ~0 `5 A* E}+ L# i+ s. G" R8 ^1 m
2 w3 n0 b- w& E
/****************************************************************************/
2 G6 I7 m- w' o" }) l  s/*                                                                          */
& e$ |! W- ^+ |; r/*              ARM 中断初始化                                              */# ~* S5 a" H- X2 M, w. U3 `
/*                                                                          */
8 }8 k. O* w  v3 d6 N! |/****************************************************************************/, s# T# Q  }: J# ?/ s4 Z( g
void InterruptInit(void)7 ]) Q7 R# r3 S( L
{: y* Y1 C! `2 x3 ]9 i3 w! G7 i
        // 初始化 ARM 中断控制器5 p! e, g0 w. P3 b2 g
        IntAINTCInit();
4 X* y- l9 }$ E2 I" Q" d! i
$ ~7 W% a/ |( ?+ e7 T+ O! X* U        // 使能 IRQ(CPSR)
- j8 f+ l% \* B4 `$ I        IntMasterIRQEnable();
2 R" y) R. Y3 E3 \3 O+ G( u0 V5 m, Q
        // 使能中断(AINTC GER)* C4 ^1 {) Q5 ]
        IntGlobalEnable();: r* ~2 L4 |- @2 k- N6 j9 D, F9 r
% [. v( t/ o3 N! J. h. l) u" Y1 p
        // 使能中断(AINTC HIER)" Y5 S6 E/ o! C2 Z
        IntIRQEnable();% L7 o) w( U. }! H6 Z6 ^
}. o7 I6 o, D2 ~# _/ S& i
" F2 [% d" h6 J3 V3 P; d

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/& a4 I8 `8 `" u2 I) e; h$ N$ r
/*                                                                          */0 p+ W  V/ U* S" }5 E3 ^
/*              中断服务函数                                                */
0 m* Q1 l* |# \: J- o. s/*                                                                          */
6 M' ~# I) C  L8 h8 R/****************************************************************************/
, \; H+ o5 m, c6 V& t3 Avoid PWMEventIsr(void)+ i; c2 p2 z0 |2 e
{$ e- |% A, H1 |/ b
        IntSystemStatusClear(SYS_INT_EHRPWM1);
4 V% a) b7 j# F3 D
4 Z3 K/ d- }0 I  D: j  T: {: d  v    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" Z9 }9 f8 o* C) M% f* j( D4 X' |
}
% C5 N0 d9 u9 _8 A3 s4 z! b: P2 G1 T- V
void PWMTZIsr(void)
- E3 n  p  q! a{
+ V; i" Q+ B: y: D        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);& L- @' z, c  f% E* V
* T0 ~) ~' S+ o8 f: p) \
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);6 x0 `0 C. e6 \. l9 b
}
, z5 U7 W; S! ]
6 z# X1 z4 L0 U: O3 J/****************************************************************************/; a& Q- u  i0 G" [6 p% S0 H6 Y
/*                                                                          */  \/ Z. n6 g3 }/ ~+ g
/*              初始化捕获模块                                              */
$ I# x( O5 H  f; s& e/*                                                                          */
, L6 ~) q* y' P' f0 s% \/****************************************************************************/, k' j9 s0 U, R. ^! E
void ECAPInit(void)1 R) L5 \: Z' o' S6 _. a. d; I
{
; U' c- N3 M9 b- i/ y0 a: j* i+ R( F        /*-----设置 ECCTL1-----*/: X2 i% j/ g1 y- \$ _
        // 使能CAP寄存器装载7 c5 ~+ y1 C4 S2 D1 M9 N( j
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; p% z9 N3 B* @. J, P+ M% n        // 设置预分频值.
5 G0 E* B4 `1 z        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
8 U/ _9 I3 F: F5 n' n* ^        // 上升沿触发捕获事件
8 v! z- O3 L; D8 L, x2 Y        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
7 C* }' ~' O& F9 n        // 输入捕获后重新装载计数器值.
+ S, }& d. ?+ n        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
) M+ p# N7 d  |
0 e; N( S% x  h0 r& J9 z7 e        /*-----设置 ECCTL2-----*/$ N( _- E( T3 v9 z; o; @9 {7 |
        // 连续模式7 f6 Q, a. Q  n! `7 u9 K  H% w
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);4 @- u; B. F9 G; F+ R2 M1 P2 c! Z
        // ECAP计数器TSCTR持续计数
* l- ]6 \( a; V2 n8 E, Q& W( h        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 C, \/ C9 N# H5 B8 H. N        // 禁用同步输出和同步输入) ~2 h8 f+ X( o& J$ l- j  [
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);6 \4 C5 m8 ]( d
        // 配置 ECAP 2 为 CAPTURE 模式
4 n3 Q6 _* r1 h6 d! L        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' e+ Q3 b5 ?  {0 ?
* N; y6 e# b' d; m; K* k+ I        // 使能中断4 Y2 @3 b5 a/ n. K
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);6 r9 S2 _5 Z" e
}
1 i' N# t( T0 }9 q3 q
+ r! v$ i! F# q& p/****************************************************************************/
$ t% ]% y; \8 T9 e* i% ]' Q1 j/*                                                                          */
# F. @5 f3 g) `5 E/*              取得捕获结果                                                */5 F' z2 B5 c+ O* K/ T' q% ]
/*                                                                          */$ ~# j$ }8 j/ s$ U
/****************************************************************************/3 q! S/ D% F  o3 |6 c" B  `
unsigned int ECAPRead(void)
1 _  h( P+ @( x: e: L1 @5 `{
4 z; }7 d' U. [) K' h8 w8 ^, X3 g        unsigned int capvalue;% Q) n/ S3 u: y/ g6 g
        unsigned long frequency;
4 }, }0 X- i5 Z/ m2 k# e8 _& u$ b0 `% V$ d+ h! ~
        // Event1 中断标志) Q- V2 @7 }3 G# x0 V
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 ]) C, p/ k# ]. j' J6 @        {; O3 g: C0 \" D* Z, d
                // 取得捕获计数
' j1 E: Z; I0 R* {: @                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
: U" s2 A0 |) ]7 d8 u" `                capvalue = ECAPResult.cap1;1 b. B2 D8 t$ y, `& h3 L+ w

* o( w, b5 ]' _4 S( m                // CAPTRUE 模块 228M 时钟主频
% c+ b7 X' r5 v! S4 {; I                frequency  =  228000000/capvalue;
% C5 z; C* s! ]/ A0 V                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
' v/ m4 H/ D* D
. G! ]9 q* `' I                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: }; k$ G+ k+ x/ L  e3 l//                IntEventClear(SYS_INT_ECAP2);+ D9 p2 T: b# M6 d* e. N
        }
; \  u/ Z' d9 t, V/ d5 @        return frequency;
1 O( S! q; O% J% I( h( ?}) S- P+ \$ f3 z

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。1 Z: s3 U8 x" F( u: k5 q
[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