嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% [3 r: \3 U* Y% U" n7 I4 L  v
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/- F/ W( O0 m& {* l$ n
/*                                                                          *// p' t. o* M+ G: k" ^! }$ b) l
/*              宏定义                                                      */
8 K- ~! O- U) l3 V' o/*                                                                          */
' b: o2 _" N9 q7 b* V0 R/****************************************************************************/4 d! D2 d  N9 i
// 软件断点
* C1 m9 |/ I( i6 V. ?# ?1 F#define SW_BREAKPOINT     asm(" SWBP 0 ");% F' I/ K5 @. W5 D& J
5 j+ A& C1 d0 e/ \$ w, z
// 时钟分频
' s. N! E* G; v3 O  L#define CLOCK_DIV_VAL     228/ F( \) a0 Q3 j# T
+ Y0 w' }* v* S: ^- |
/****************************************************************************/  |3 K1 {5 Z& R
/*                                                                          */
5 f9 Z# B; u# t7 X/*              全局变量                                                    */( M! v3 G' J0 o  O& N3 r2 v
/*                                                                          */) ^2 }. I3 ]1 E1 F
/****************************************************************************/
5 t- O6 z% v8 D9 XECAPCONTEXT ECAPResult;4 o* W, Z2 b. s  T- k0 h
3 P- ]& C( H, ^& p% U' I- g
/****************************************************************************/9 {' U/ V! U% L4 T9 e
/*                                                                          */
7 G( h* U( U3 X3 n4 U8 f$ Q/*              函数声明                                                    */
( ~2 T& R+ d9 N/*                                                                          */
2 E2 r, P3 I8 V+ c! v" c: y/****************************************************************************/
' v) k3 C1 E0 ]. L0 ?// 外设使能配置
5 _- U- x( S, W+ C. T( _1 s) tvoid PSCInit(void);* P0 D- k, F/ R$ i# ~5 o1 q
+ R& g% G# f  U& h6 i6 C& K
// GPIO 管脚复用配置; `! b- `* j: q# `) w8 m& J
void GPIOBankPinMuxSet();
( G8 ?/ d. P# ~$ V( i2 l3 J* I' Y: O' r$ v5 Y2 h
// 产生波形
& {; y. ~" @5 `* l; v/ ~4 bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);$ S! ~4 T0 G( R( D. \% X
void ChopperWaveform(void);; e5 b# n. I- @" U  r" K

: ]9 O2 B$ z. n# D- T+ f+ O// ECAP初始化和读函数1 f% q* {. P" ~4 N* U! L" Q
void ECAPInit(void);" \) x% E4 m1 s* ]$ g4 @; V; X7 B. `$ ^
unsigned int ECAPRead(void);
1 S4 f% K0 S& e6 R7 e* B: z
+ Y8 J0 S) a8 U, h; s- l//ARM 中断初始化
3 r$ c- n7 j! q; S" m/ vvoid InterruptInit(void);6 W) V7 _" E/ e' a4 i) a. {
. c/ b- j8 U+ ^- n1 h
// PWM 中断初始化; D$ X. V6 M5 U" P7 k) g- k  I
void PWMInterruptInit(void);8 O* A" T8 ]# _, q, G6 w4 P
// 中断服务函数
# F+ d/ N  g9 t+ c# f- J4 Q  r// PWM 事件. z6 R" u$ a% H; Y. j
void PWMEventIsr(void);
' v' t/ d/ T6 R/ R2 c. J; L// PWM 错误控制事件5 _! K' U2 _+ [# a2 d) F, ^  q4 d: Z
void PWMTZIsr(void);6 |1 ?7 D* {# F* {7 f

6 w. E/ w7 f+ x$ ~' _$ t, U5 y/****************************************************************************/
# L* l5 K  a' X1 k/*                                                                          */+ d+ J) S. [( V
/*              主函数                                                      */
  i: S. W1 j7 h6 a) y2 n/ ?/*                                                                          */+ [2 x. s# J4 A2 `/ C0 X0 m
/****************************************************************************/3 j( J$ e& k: U" A. J
int main(void)
: j- i- B/ p  `+ ~/ d{3 G) K9 B+ C8 M' h6 G6 V4 E( ]! G8 r( M
        // 外设使能配置
  b) z' c5 K- ^! c        PSCInit();
" \$ h: ?* y* h+ N9 s
2 b5 N% V! [% |. E) F        // 初始化串口终端 使用串口2; w4 \9 h9 X/ B3 k+ \9 p" `
        UARTStdioInit();% G+ U( J. G5 e/ ]
        * `' B, `% E0 N; D
        // GPIO 管脚复用配置! j/ j) R' @7 K0 T
        GPIOBankPinMuxSet();- G& Y8 T# e$ W3 j5 E% J* ]

; s1 ~9 Z, y5 W4 K( K6 T, Y+ K        // ARM 中断初始化; s8 C3 }; B& I8 i: u* e7 G
        InterruptInit();
  s0 X7 @; R# k7 d5 `( C4 F2 E9 Z( y! P+ t  \' I$ E+ T" h+ P
        // PWM 中断初始化
; f7 I3 \& h* M  b        PWMInterruptInit();$ U. ?( a: {( P" {/ k- g9 y/ x

1 k8 Q' Z0 r: ?0 K0 I        unsigned char i;
6 u( D- v. t  P$ P        unsigned int j;
, m' t  j2 }+ X' C4 W/ X& I( u* |% n) C6 G3 C* L6 n1 L
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
! }+ X( h7 u9 K        UARTPuts("------------------------------------------------------------\r\n", -1);
2 Z7 [* [1 x  k" o        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);+ ?, c8 v0 T* ^/ |4 R( g
        // 产生波形
% p7 f4 B. V* |+ v0 W2 F        PWM1ABasic(25000,50);
& e# L4 ]% N! X3 B% J% l- s
3 J) g2 k) r( O9 d- T" E) ~  j( ~        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);& a) P$ T0 C# F& M/ v6 o& Q
        UARTPuts("------------------------------------------------------------\r\n", -1);
, ~. r; p( J* @7 s* a' @
6 Y/ r/ ~$ ^" t1 O
4 z6 g  J3 S2 B+ z" y- W8 Y2 n; c
$ b  Z4 r: s4 g        UARTPuts("------------------------------------------------------------\r\n", -1);' ~5 ^) i. T- i$ V2 g2 X
        UARTPuts("                    C6748 ECAP Test\r\n", -1);# L. d) D$ q2 g2 W% [7 ^
        // ECAP 捕获初始化0 B; E4 l' }9 e- E- P  A
        ECAPInit();9 |: b- ^2 m: E5 H* Q6 L& y" G4 R& V
        UARTPuts("Initialize ECAP.......\r\n",-1);
6 d5 a7 h8 \8 z, [        for(i=0;i<5;i++)3 @/ _9 W$ C7 A& r
        {7 r6 }  {/ f2 l- `% }" y! H% g& l
                    for(j=0x00FFFFFF;j>0;j--);            // 延时; K9 h4 K" A0 V2 ~, S# B' i3 I( A9 [
                    ECAPRead();2 r3 A: Y  @6 T$ P5 U
        }
* n4 S9 C2 l! i! N2 U5 Y" ?7 h        UARTPuts("\r\n",-1);7 r( \2 F# _$ k1 u6 F
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
+ R' W$ ^, U0 k) Z5 v6 P        UARTPuts("------------------------------------------------------------\r\n", -1);
) {, A; l' L3 t4 x1 t* d, i+ L. l3 V4 ?. N8 t
        // 主循环
& N8 N2 Q* Y& s6 \        for(;;)
9 U$ m! _# B( m" S        {
0 |7 {! t5 \: k9 J5 K' W! ?' Y, J
/ D1 R7 D  {9 l. N1 c        }2 B* j1 Q) G, H
}
  ~8 ?- |1 i1 s" O9 R! R" C$ V! @, x# y' r4 x1 K
/****************************************************************************/
5 z3 Z  y3 o! u1 }: y- d* G0 F6 w, @/*                                                                          */
  c/ u. O/ n+ x! Y! W. ]& N/*              PSC 初始化                                                  */
  \" b/ m3 r7 H1 d6 v6 ~* v/ {/*                                                                          */
5 i* ]7 ~. O3 z! U9 l6 K9 b. q/****************************************************************************/
2 ~, w5 |& _* w5 Wvoid PSCInit(void)
' @' y9 t9 M5 u' q4 X, ~{% J& P0 C* V/ N6 [
        // 使能  EHRPWM 和 ECAP 模块
# ]0 r- L8 {) ^5 Z5 B4 \        // 对相应外设模块的使能也可以在 BootLoader 中完成
6 p' {; M7 H3 ]5 c9 O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; Q. u& \+ E  w' z9 C
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( i; M- [! R& Z  |2 ]3 C3 j  C}
8 n9 _: `" c+ F& H) O  U  ~
3 p- K' J" Q; j' ^/****************************************************************************/
0 }( a  k5 A3 ~" E# B7 n- E' b7 F( l/*                                                                          */+ k0 I4 f) S8 b) p  V# T) O
/*              GPIO 管脚复用配置                                           */8 ^, o) l% M+ L# f
/*                                                                          */
- T6 S0 Y: F& v- H7 G- c2 f/****************************************************************************/
7 x. _$ e5 e2 W: ivoid GPIOBankPinMuxSet(void)
2 z: a, S) u1 I7 O; f  }  x{7 U" R0 ?1 L$ }& \2 m) w# y# u
        EHRPWM1PinMuxSetup();& p4 R; Q2 [  m7 ]6 D

0 B8 q$ T) |% G1 y        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 m3 C( c* v: t4 c1 b        // 作为捕获功能时管脚方向为输入2 d/ v/ a) v4 x
        // 作为辅助脉宽调制时管脚方向为输出
7 _: |& A4 v" `  B. b7 K6 `5 u' j    // ECAP2 / APWM28 s9 M! K6 x% {  M0 c8 \
        ECAPPinMuxSetup(2);$ L% n! q/ g0 z2 @, R4 B& C

% [2 a4 a( j) X1 U& i% P        // ECAP2 / APWM2方向设置为输入- Q7 X, L3 e- S& w$ g9 {+ b
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
8 B9 G. y3 t; L7 X% H. ~6 K}0 q8 {% r) Y/ d/ w; |

% t7 ?8 v6 ]7 g+ ?/****************************************************************************/6 d* K8 L9 S8 J3 Z
/*                                                                          */1 v! c  g2 X* m! u3 }9 r- t' m
/*              PWM 输出波形                                                */
7 Z( ]! Y- q4 ~/ j& n3 w/*                                                                          */
. S3 _3 O) o# q/****************************************************************************/
8 V# ^* u7 b9 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); x% p- s! |9 ^: j9 m
{
& q, A3 A/ O8 Z3 L    // 时间基准配置0 U# w2 z) v* J  m# H2 V
    // 时钟配置
+ {% M) Y% R. p+ t+ h    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);( k: z1 E' `+ T. S  B+ ]: G: |' G
0 c3 z6 j8 m1 N
    // 配置周期( n$ r' V$ F: \2 r4 s+ ^; y
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& Z$ i; m/ A2 k6 B! g9 v                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
8 b) d0 P9 ]5 g1 z" |1 b+ R5 f. ^# ?, ]
    // 禁用输入同步信号
6 L6 D! a7 ~1 s0 i; G( a    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& \& ?% k2 W/ ?) N2 I/ `

3 V# a) B. C6 s4 C) @# b6 c  p& A    // 禁用输出同步信号
- f$ H6 u( q. v/ v. T! j: t$ [    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% d2 o$ d" T8 i

/ f& X4 H; e! _6 H( X    // 仿真(DEBUG)模式行为配置
: Y* p; X6 B( I# l; n    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);5 G% ~$ k: v% m3 Z$ I! f% D
- b( J. u7 V/ Q
    // 配置计数比较器子模块
9 s# J9 ]: W% g5 o( b. \    // 加载比较器 A 值8 R* \' h: m9 I; x4 F. b, @3 W4 l
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
/ a! x4 M: s- ^                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% z: l  A. p1 d" N$ j, V- V1 w0 p/ [* p- c# u- `2 c7 ]% R9 g
    // 加载比较器 B 值+ `. s# d! Z2 V+ k: w$ C& b! ^: r
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. c& F8 ]" p- V/ [! A- l- T                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 E' @( e7 [- C2 U6 A8 ?# F5 s7 `) \. V4 F
    // 功能限定配置(输出引脚触发方式设定)! ^4 I3 b$ Q" ?- }" J
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: C0 w) u9 K5 ]$ |' b1 D" X7 B    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
" G- H3 [( P4 f5 s                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 A, d6 u2 q- R3 B. j; u% A
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);0 P( @$ R: ]5 b$ ~8 N8 P  |3 K

: U& Q/ m. `! B  V0 J4 h+ V( ~    // 禁用(旁路,信号直接输出到斩波子模块)死区模块1 [0 s3 f2 a# R: W; \' o
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ Z# I' x7 [4 t) i, n6 T

9 x8 S/ R$ L& ]- B6 x( i7 E- ]% x    // 禁用斩波子模块
# f7 J1 S1 y1 G% d! F) E6 Z    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);& `  `3 R* B0 ~  I
$ l& E; ~4 ?0 K+ S4 i  p0 X
    // 禁用错误控制事件# ^; a# W& ?) E" O2 K( B6 l  o9 Y# L
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! w( a0 j0 i, [, H) u2 X! O# T    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
  K' o/ D/ [' F, a) U0 P6 L
, ?" f) U/ O$ K5 a; c    // 事件触发配置3 J0 r4 C1 F6 A& }) p/ }- V
    // 每三次事件发生产生中断9 R7 K9 y$ m- n8 |: }3 H! a
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);  p4 l; b: Z& i& ~0 ^& `
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件7 O* ~) _, a/ q% D5 d
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! s3 [( J& F. S1 O- ]    // 使能中断
7 O; y) K' S2 U# t! G8 X6 w8 I+ a    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);6 {5 u1 _0 d" L# P1 ~4 [+ B% x
4 E1 S: m! G1 d7 ^& N9 F/ S
    // 禁用高精度子模块, B$ T' B% s$ j2 K
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
9 t  Z9 r4 ^4 w/ C9 n9 L% V: H# w: c6 s% D# ]
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# a( w3 j5 @/ V9 Z, A, `9 Q}
6 B5 ?( {/ R; Z0 \% h( h& j0 J7 @$ Y5 ]4 U1 B
void ChopperWaveform(void)
) |0 w% D6 h5 |+ |3 r9 ?$ f. w$ w{9 _! f% S: \3 B3 v' }
    // 50% 占空比
" d0 L+ h$ y# N) N2 r1 n1 v    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);/ [- J: H$ D. [, X/ }9 C7 N; W
    // 4 分频* J' ~; _; r1 X$ @* ^
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
  q9 X) H' d' b+ b    // 单个脉冲宽度+ @! M) B- ~4 A; J. g" M
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) _, k/ j8 I1 Q" A4 a1 P' ?
    // 使能斩波子模块
6 I" e# n+ A0 D7 E) l    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 Y( c( t4 [# X* v1 {}. i& ~0 p! B: w5 N# `. Y4 E5 j

2 _) o0 E0 K3 A5 N/****************************************************************************/
' ?7 S+ T) a! f' [/*                                                                          */
- |4 D2 w  V& t. _$ W' r* M/*              PWM 中断初始化                                              */9 {) }( n6 D) K% z0 d
/*                                                                          */5 l: g7 ]4 f: A3 P/ F
/****************************************************************************/" j  M$ m: M5 ~8 Z
void PWMInterruptInit(void)6 ?8 c! B) U: f+ x1 U" M( n
{
8 n) t& W, j# Q- c1 t. G        // 注册中断服务函数
3 I, A) R1 Z" z; _6 I. o        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 f7 K4 a. f: o0 j        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
+ R- P3 {# w( m  G2 |! w: J
" T+ K0 L! j- g; P8 d& q& j" @6 o        // 映射中断
2 N# P+ s, X. k        IntChannelSet(SYS_INT_EHRPWM1, 2);
- z; r, t7 k9 k; S/ s& y        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ Z- c. }9 V: w- C0 a3 p  y; R4 N" t) r% C: x3 u% p0 H
        // 使能中断) y: I& K% P& r5 }  b
        IntSystemEnable(SYS_INT_EHRPWM1);8 G  B8 R$ J/ [: \% a" k  [2 R
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 g! \* D9 O4 E$ G! R$ W1 U}
4 B" T# {9 M) k. A  j% i$ z
: [; P' X5 R# `  L/****************************************************************************/
; q; d0 d9 e% E/ J: I& a$ S/*                                                                          */
; o4 i* k! z+ _" K" z2 p8 N5 d. A/*              ARM 中断初始化                                              */
) s% }# C* v# V7 {6 \+ j/*                                                                          */
5 P7 j2 I' X  O4 q+ |) a! K/****************************************************************************/
1 u) u2 A* r9 a: \+ r4 `0 Y6 M/ Mvoid InterruptInit(void)/ v3 m5 V$ w3 F6 H' t5 T$ F+ ?
{) K$ Y5 @# c; W; ?  @1 L+ L
        // 初始化 ARM 中断控制器
! M% x! \" {0 z& l% |        IntAINTCInit();
2 x: {9 _6 p- U
2 Y/ ~: L% K' m! |        // 使能 IRQ(CPSR)
; o' `4 ]( h7 ^3 W& {7 ?+ |        IntMasterIRQEnable();
' W: X) y/ T2 e& L* n
; Q+ J) |6 o  C        // 使能中断(AINTC GER)
8 y) R8 f# q9 L/ y( x% Z0 C( v- k        IntGlobalEnable();
9 s6 L8 P) r0 ]. \7 S) t$ Z% D8 u* i1 g3 e
        // 使能中断(AINTC HIER)
, x' N  w$ M5 j8 z3 K- o) ~8 N        IntIRQEnable();
. d* j+ ^7 w4 @3 C}2 B5 D( X4 H% h! C; J

" l0 {+ T- v4 f) Y& M' z
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" T7 W7 ]* g3 R; @8 U9 C  H8 ~
/*                                                                          */  {/ r9 P! x5 V( c
/*              中断服务函数                                                */1 G1 j' [$ i) H0 D& p' ?4 l0 y
/*                                                                          */
& @  x, {8 G1 e. Q% P8 x9 B/****************************************************************************/
3 @+ \- i1 A8 c: `* m% v7 gvoid PWMEventIsr(void)
$ a0 l+ b' j' G$ q{- K3 N! ?, v+ u4 n& X4 m, B
        IntSystemStatusClear(SYS_INT_EHRPWM1);. [7 _1 U! z5 Y0 G5 A
* k! J6 F  O) F8 O; F% D% i
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);, \  r' e4 I) r" Z0 P
}
: _% k; F0 H3 ?* W: r5 L$ [% ?( m: t5 E* z0 N3 w! X
void PWMTZIsr(void)2 A; n/ j0 c, p) |: c
{8 Z3 s1 C* P) X6 V& O
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
4 ^' M  D6 e" C! `- H& s8 L5 l, Z0 K& {; u+ w
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 |  F6 U$ d+ _
}
# y3 e5 B# F. R# h/ d$ ^9 K8 \
7 u& O$ T) K2 l( W/****************************************************************************/- N) \% H' n4 q3 Y
/*                                                                          */$ K& M. g1 ]# J1 ]
/*              初始化捕获模块                                              */
& K. e8 K  k- _* X& B/*                                                                          */4 M* Q2 J1 }+ B4 m( Z4 r3 P8 r+ p. q
/****************************************************************************/4 z1 }5 |2 e. M3 `1 d3 X4 `
void ECAPInit(void)- l* f1 q+ T' V, s- z$ ~2 m
{  j/ i3 |8 m: \0 v$ e& F4 `9 r
        /*-----设置 ECCTL1-----*/
8 p, J3 d7 E7 {" w- C# h5 Y        // 使能CAP寄存器装载( B" \* Q' o! e/ r
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 X. D) ?2 N# S3 h        // 设置预分频值.6 w" v' P9 w" c9 @
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);+ M$ ^1 `4 C6 |$ Z
        // 上升沿触发捕获事件4 f9 H# ?; x, l$ s% v
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 M  y8 a+ G5 Z6 b& h+ i- W        // 输入捕获后重新装载计数器值.) t; W, Q, n3 b7 a3 O
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ ^. d( d; X7 f

3 y/ q: f2 f/ U& e9 w& n$ w1 K        /*-----设置 ECCTL2-----*/% v2 [% |2 U$ d& I9 m( U8 ?2 m. Q
        // 连续模式
/ F  S5 \/ v5 H) v% [; {. J1 i' m2 ~        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 e4 `- q2 W' X9 c1 [        // ECAP计数器TSCTR持续计数( `# m% |! y8 Q% l6 \9 ?+ y
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ I. {( [* H9 r; }! {( M+ G* n        // 禁用同步输出和同步输入
' |8 p* D! a8 e4 ?8 `        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
+ v* C  Y0 \5 R4 w; x' g6 q        // 配置 ECAP 2 为 CAPTURE 模式
$ v$ y8 I3 x9 P; \2 H. {) e* Y: I5 m        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);1 J2 B- }, g& u! `  d

' s3 [  T: J3 c. z3 T        // 使能中断; o" V; o! ^) k- y% y% j+ v6 U0 K
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- l# }* f& G1 q/ D2 S}
8 u1 ^/ i1 x! I( H! A3 i: Q
. h2 k9 h: ]& S: B1 Q, }/****************************************************************************/3 h, s# M# c2 r% W
/*                                                                          */
6 F9 S& z% G  ?4 b/*              取得捕获结果                                                */0 g9 z& v. E& \3 j  N
/*                                                                          */
& R) ~0 _7 ]4 e- M5 S+ Q/****************************************************************************/
% N, M2 F- r  q; _" K% _6 Vunsigned int ECAPRead(void)
. X$ q" Y9 c& `! [$ ~{3 g2 T! k/ T8 i7 h1 y+ X
        unsigned int capvalue;+ t% v6 K0 J9 m6 ~
        unsigned long frequency;
% W1 W$ q" ?" G3 ^( \) x; d" I6 G# g& w& t- X6 l6 L
        // Event1 中断标志5 j7 {* p/ }8 r/ {, m8 q4 P% g: P& M
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))& d+ p/ N9 f* Q
        {
0 H' F9 f" {; z                // 取得捕获计数
6 I! \4 F! p" W' o                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ U. h: y5 B6 G# \* U# w8 J8 J7 @1 p                capvalue = ECAPResult.cap1;# }+ o; Z9 W3 x$ q$ B6 |
1 T2 t" P, Z9 F5 C& {( \3 L1 d
                // CAPTRUE 模块 228M 时钟主频
3 l- F8 p+ Y& @. Z( \: e" e% ?0 A6 F' ?                frequency  =  228000000/capvalue;
( D; f0 _0 C/ \                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ N# B; z8 k* V7 a$ i& Q% T6 [: d8 R' o' x1 A, {
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
& c! n8 A4 u$ s3 K, T$ s* B//                IntEventClear(SYS_INT_ECAP2);
4 c* M. n& S% B        }
: ?5 s0 U" z% t# y        return frequency;% M) b& G  m& C8 ?3 a5 F* ~$ h! f# m
}2 ?2 u! [  t+ J- ^! D' f

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