嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家& c7 x+ |% w  H- z

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
6 i' e# V3 o8 T1 [2 T8 y+ y4 k# `. H/*                                                                          */
/ H- `* N# B" \/*              宏定义                                                      */* F8 d$ |+ @+ W# k# T' l
/*                                                                          */
; A/ y+ A: O3 \3 P/****************************************************************************/& x( T7 Z7 ~3 U. Z
// 软件断点; B& \: V- z2 y" g8 B: Y$ U9 r
#define SW_BREAKPOINT     asm(" SWBP 0 ");( m+ B) u7 A% q, U# {& i. {

8 B$ m" i( q) |' N+ d5 J! ^2 q0 h// 时钟分频+ D  E9 o& Y' D& u' y
#define CLOCK_DIV_VAL     228: [4 ?( t& T, q  x( c2 L& r

$ A$ ^0 a% y" Q( ?8 F! L. O/****************************************************************************/
, `! F0 T, E: M5 F/*                                                                          */. R5 R' |& F; H/ \- B; e
/*              全局变量                                                    */' t% Q+ v) m/ p; n. Z; @) F# f
/*                                                                          */1 z: u+ m" O5 A0 ]- R5 T/ i
/****************************************************************************/
5 C( j0 n, Z" z4 k& hECAPCONTEXT ECAPResult;
) M, C: r# T4 ~* v( w% y/ t1 q# k% V$ c( K
/****************************************************************************/
  v# d5 G  p- m$ {% w% J# e/*                                                                          */
' k! G$ f( F, X/*              函数声明                                                    */
; y( p5 r! F$ G8 _$ ~  X% p% y/*                                                                          */- y4 q3 C; I1 S
/****************************************************************************/# r1 {9 N" O' b# f& a* v
// 外设使能配置
- h  J* s8 |* i* m4 I1 Avoid PSCInit(void);+ T" ~5 x4 V7 d* Y) r! _# P- z
2 Z. R  `6 l. m% H. W
// GPIO 管脚复用配置
) w6 |  y( K" K7 k$ Tvoid GPIOBankPinMuxSet();
8 o$ j  t1 Z0 G3 q) S  {! R  E* \1 d9 \- O1 z! R; _( P; N; l3 [
// 产生波形
2 r# u3 a, |# U; D' R6 v1 t8 xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& m4 ]( ]$ X8 u- |void ChopperWaveform(void);
5 d* x$ l- ?3 @( ]! Z
) J$ S+ a& x) h4 E. H// ECAP初始化和读函数
, R. N( V9 b" ^% @6 Avoid ECAPInit(void);; }: L2 l! `# P* I' L, l, i* O
unsigned int ECAPRead(void);8 `6 F2 g; G( h  Z6 ^
0 ~2 X' `5 g# \- Z% j, h
//ARM 中断初始化3 M* C! j  F8 x8 M$ s% i
void InterruptInit(void);
- E' T/ k& h% B- V8 C$ |2 @& o- _& ~3 J- h/ R
// PWM 中断初始化& J' J. e& g6 m: ?1 f1 n
void PWMInterruptInit(void);
  v1 k5 p$ Z  ~( X, O+ }8 u// 中断服务函数
2 G6 s# b! c6 l# r! P// PWM 事件
$ Z8 F: T- @- bvoid PWMEventIsr(void);3 \) h& o4 ^3 w
// PWM 错误控制事件& W6 Z9 a1 g) N! X& t
void PWMTZIsr(void);
' i1 A) h( D* u
% ^: f5 m) C4 D/****************************************************************************/  |/ c! n/ R% e% v3 _
/*                                                                          */
/ k6 D; g* K% [& l& V/*              主函数                                                      */
$ {, q& L7 \5 u3 y0 a7 q/*                                                                          */
9 F# i% @, U. g" x, b" p/****************************************************************************/9 J( j) z( H' [+ Q) m& R* O4 Y8 K* @
int main(void)
( o- V' H2 C5 s' Y' L1 l{
4 m! a  |! ^/ p' t        // 外设使能配置
7 G$ l; h' n) Y0 x        PSCInit();
6 F4 s' u+ y, q- K2 u2 |5 i9 I
. a; S" B& O8 N7 }$ c* G        // 初始化串口终端 使用串口2
% a2 U0 m2 Z; @. S- V        UARTStdioInit();$ l) C$ a- b: B$ ]( p3 ?% r. ]) P6 L
        : X  ]+ M: H1 @" h, ~/ [! T. y
        // GPIO 管脚复用配置- r1 H& j" s( C) O3 b) |& E
        GPIOBankPinMuxSet();
) F# C) v$ O" J) l$ H
6 z+ t+ t$ x  R        // ARM 中断初始化8 K2 ^, X3 c! m, R% v% ~& P3 }' m# p
        InterruptInit();
6 c: F/ ~+ k. x& d
  E' n7 j  f: ?8 m$ \3 j" F        // PWM 中断初始化
. v0 h" {/ w% z7 v, f8 I& t& v        PWMInterruptInit();
: P2 C; f0 f; K  J5 P% c
* A3 [$ A7 n" a' m0 p  B, I: `        unsigned char i;( W8 g$ S. v8 v/ x
        unsigned int j;
$ C% m; a' f% I- B3 O; g0 ]. E: @
( _  i! j8 f) M5 a4 ]; b8 J: I: G        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);1 P7 T; d- y% ~" y5 w# Z
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 V+ _' H0 Y: a" A+ h- j7 y1 u        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
' W" C4 I  O1 c8 f% q; K        // 产生波形
6 r8 T! V: P* Y        PWM1ABasic(25000,50);8 {; H$ L# p( L. L- E& s
& S; B3 D$ ?8 C/ l/ Y; k; v
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);  y; Y, [2 t$ o5 V/ B( ^, H4 W
        UARTPuts("------------------------------------------------------------\r\n", -1);
. f/ s. m5 R( i6 c5 a( V# G; a% ]1 {; i' K" B* j
) p  P9 e7 i/ e# v4 p0 Y( t: ^
: s" X5 c6 _* J+ U* A
        UARTPuts("------------------------------------------------------------\r\n", -1);
- r+ {$ e7 H8 \& k, p        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- ?) M9 Q+ [. @- o; J        // ECAP 捕获初始化
! ]: a* ?" h: t        ECAPInit();
4 h* g) C- w! |6 X1 K        UARTPuts("Initialize ECAP.......\r\n",-1);2 [. K/ D( I! N" X9 o
        for(i=0;i<5;i++)" v( @  v$ k. T. L( O
        {% C! p5 [7 s3 n- Y9 A* [; p5 J" L3 y6 V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
$ U8 n) o- U$ w' p  d* ^                    ECAPRead();
) V+ P  W4 W; o3 z% Y# \$ G! y  c        }
3 F8 o% G7 z7 a  y. L        UARTPuts("\r\n",-1);& f+ O+ u& a3 p% g4 n9 N7 p
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);# p& ?' @8 x# V
        UARTPuts("------------------------------------------------------------\r\n", -1);
9 A1 A. n- `' i( L/ Z. B8 N. n% ^
3 e: Z+ ?9 r9 W        // 主循环* D$ @3 G, f" `; |3 G
        for(;;)( \4 H9 C/ w8 z" d, A2 m" R! k" R
        {5 g. b! w% q" o) @1 F
8 t/ k9 k  \! {1 p5 A
        }3 x7 @( L) X5 G2 f6 {1 p
}
! B4 Y2 P6 W, c+ k7 i7 J; `  ]3 p" u  ?; t
/****************************************************************************/. `# _( X% _$ b4 D
/*                                                                          */9 M- X' Q% C7 a6 s! N0 A9 m9 J
/*              PSC 初始化                                                  */
: Y4 z3 I! R' M# e. N/*                                                                          */
. {9 Q& f1 ]! D# q/****************************************************************************/
$ S8 t, j6 w( p: o* z- k7 Jvoid PSCInit(void)! u/ X1 X! h. s2 f: [
{: E8 J  C0 {' p- h0 W2 B9 `
        // 使能  EHRPWM 和 ECAP 模块
* p' _. y' e7 ]4 I$ M, Q$ A3 i        // 对相应外设模块的使能也可以在 BootLoader 中完成
# `1 w2 J4 `' V5 m! l0 d    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% r1 d! o' |( s, r3 t5 y    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; R3 q& r# H  B+ p* I}5 a6 D' p  j6 X6 |4 w7 C2 e% u

# f6 i1 C7 f8 h8 D, P% V9 G  G/****************************************************************************/
( m$ L5 n( U7 i- b. O/*                                                                          */
9 |* a. u0 m. s/*              GPIO 管脚复用配置                                           */
: n9 {* `5 X7 C' A/*                                                                          */2 L) W+ a; |6 [
/****************************************************************************/
4 L, w. D) Y' m* e4 Evoid GPIOBankPinMuxSet(void)
. H, v# A! T: k( W- S0 Y6 i" e{6 y" p: D5 V! x" h6 s
        EHRPWM1PinMuxSetup();+ i9 x( o" q% |- _3 q

" `6 _. a$ q4 S$ O! U( I        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 x9 U* Y8 d) p' a& E        // 作为捕获功能时管脚方向为输入
1 \% [  Z! c$ @6 {  i) F        // 作为辅助脉宽调制时管脚方向为输出  S) ]$ Q9 f1 H0 B# o
    // ECAP2 / APWM21 [" \$ z9 m  W# n. V& z2 ]. f
        ECAPPinMuxSetup(2);  @% D9 Q2 `* Q0 y

. ~5 M% ^9 x$ T1 R        // ECAP2 / APWM2方向设置为输入! F7 J) ?5 @- o. L) d. n
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]7 |7 w" u* u8 e, d1 c
}9 b9 \- l# X8 B( R2 c

/ m! x: n9 e5 A9 @) L% k/ p/****************************************************************************/+ i( u& w9 Z! N1 e( Z- p
/*                                                                          */5 b5 W" `4 j$ `4 o8 |& n, b1 q) K
/*              PWM 输出波形                                                */3 l6 a+ f& }# C4 }- A8 f
/*                                                                          */. n! ^9 I7 t) u* j& Y
/****************************************************************************/
2 A7 `7 W7 X6 T: c/ P$ Pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. p0 P4 C5 i0 @6 I5 j/ |1 b{
/ j6 g% `7 k& c$ h1 ?" v    // 时间基准配置
; k+ G. ^2 Z4 }7 J! k0 P# |8 J/ g    // 时钟配置$ T% E# ^1 e. o% o* U
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ]/ P; ]$ `7 w- L+ L2 I; k
" @8 S4 g  Y/ N7 P' t+ P    // 配置周期% G# f, }; @* ?; G$ E' r
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. }# D- k% }9 Q. ^- f                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);# t2 t4 N% o- J- l
5 h: P* Q; C9 H1 I. a+ Y4 E( z
    // 禁用输入同步信号% ?3 C1 W9 o3 U  }4 U
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! W8 [: j( j1 a- M1 Z. [$ }
) h* ]6 C- K: t' E5 x: Y    // 禁用输出同步信号6 S- q. H1 O$ U3 _4 d( f
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);" V& u2 R, U: z
3 i, b' `5 }( Q2 p4 A
    // 仿真(DEBUG)模式行为配置- F; l" U) @3 L" F4 h" Y3 K4 r" O
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' p9 w% D# ~# N8 F4 u# a- m  z' E7 Z3 V0 @/ b
    // 配置计数比较器子模块
& a5 D9 m# n7 i, v! C" ?# H) n* n5 U9 i    // 加载比较器 A 值( I/ t$ @# F& @  l; x4 Z7 R3 X
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! Z7 |$ H0 \# ~) R8 @' z9 _                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% Q6 p4 a% V+ W. g" J0 i3 [7 b! ]! o4 O0 j$ ]; H; ]' `
    // 加载比较器 B 值0 D8 d, r' O1 Y$ j( y' d. h' v
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,  E  V5 Q6 Z. Z! Q, U9 o
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' V/ e* `% {3 v: Q8 T3 f$ R
' [( o' s% W# F# c; Z
    // 功能限定配置(输出引脚触发方式设定)
5 }( J1 H; l% J( @1 m! j9 f( I    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& y5 v, V' z* J  s
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,+ g7 W2 `- x! W/ i7 k( t5 m. W+ u% S
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ o8 [. l& \; X8 t                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: D& C2 Q6 J& r- j: V3 e; j, |" u0 p
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 C( t! q( E% {- J5 u    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 c( k& m% b& X& k. C+ V! W2 o1 b1 }; q
    // 禁用斩波子模块
# g2 b# W4 N5 o# d2 O    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);6 f7 `7 u* e  G: T4 K  R

+ ?* g+ ]! d% x6 }0 [4 A( D: H    // 禁用错误控制事件
: ~, Z4 E& V' K4 Z    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);8 v, ^+ P1 L, y2 ^
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);1 ~# W! I( k3 t* r( l% f8 t
$ K: K& F. _9 l. D5 `4 z
    // 事件触发配置
! ]7 J  `; G) \# ~, [    // 每三次事件发生产生中断# l0 d2 _; ?. u0 J6 u# N1 O
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);4 W7 D( P$ }+ k: j0 Z9 l8 i
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' g* g4 ^5 s6 \& J7 o    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);, n' t. Z( [. p8 M( x! r' O
    // 使能中断
" ^& N2 `9 `; u5 ~. C# A" P    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);! x( f( n. W$ x5 g

" ~; e2 K3 I6 s8 L    // 禁用高精度子模块4 h7 Y. D3 J- z7 u( R
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ \* _9 x: q" x" O; a7 T4 Q6 Y9 c: B5 Q) g: U
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);4 t" _# W! F) g4 _
}2 Y3 ^7 |" j! ^( T; l8 e

& j  f+ Q: Z* q, A; pvoid ChopperWaveform(void)/ c2 a, O' N' B8 r3 B# P8 e" b
{
  Z1 B7 r1 [$ M0 o" c4 [1 Q. ?6 A3 j    // 50% 占空比
( |+ \6 _5 R7 I    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);/ z; m4 L: C' R& f
    // 4 分频' B# ?) H. m* C3 ~
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( Q- c9 |$ q: q. f9 P2 d% K: k    // 单个脉冲宽度
% o4 p$ w- J  x# Y8 p8 C    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. C3 C9 }! `/ d0 d# L5 K* D    // 使能斩波子模块
# x4 K! e8 R6 x3 w. b6 i4 ~) I2 W/ _    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);% ~" v. k/ x1 h* @
}$ j! P; ^9 l! ^* }' h/ l# l
" i, e& i5 L: d! P
/****************************************************************************/9 o' [$ P1 C* R% H' o4 e# h
/*                                                                          */
9 |+ W% x3 S6 N* I9 L' I/*              PWM 中断初始化                                              */- P+ u7 _: z: B! ^
/*                                                                          */
/ \% [& m9 P* u3 z/****************************************************************************/
, p: T6 j+ ?& W" z; y( yvoid PWMInterruptInit(void)! c2 {2 C' T, p5 W8 Z1 y/ w3 r
{7 x/ x7 w6 F2 s% k0 A/ b' U
        // 注册中断服务函数
: k  P6 H# E, \# ]  y( s* D# @! ^; G        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! W6 p! ?9 j0 Y3 r+ R        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ i! m; M4 M' n7 w* A0 s; H5 T- |1 Q7 G0 D: t* ^% `
        // 映射中断
, z: z0 }7 H/ m1 c& H        IntChannelSet(SYS_INT_EHRPWM1, 2);
* V* K7 K9 r8 H. f' \( u; e        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);* E4 r5 N" o* V
5 v" }9 s9 d4 v1 \: L. u7 s: B
        // 使能中断
" `1 S' b3 r- f5 z0 P  l  i8 ?: W( O& M        IntSystemEnable(SYS_INT_EHRPWM1);
1 X% K& |8 a4 ?6 j& d8 ^4 h9 O- [        IntSystemEnable(SYS_INT_EHRPWM1TZ);1 Y1 {) r1 N# [
}
, H/ ?0 M/ C$ W. _! m& h1 F( x3 E. Z% y
/****************************************************************************/! J2 r0 ]! y; z! R
/*                                                                          */
5 U) j1 l* O, }! Z/*              ARM 中断初始化                                              */
: n; d/ v' ]) q$ @- D- |! ?/*                                                                          */
3 \# C5 I6 |* i3 W" `2 I9 k- ~! u/****************************************************************************/( {; T- E) p5 Z7 o7 ]$ s$ V
void InterruptInit(void)
4 p' O) ?* L* m: Y, @1 C{& {/ w3 L$ ~- k' {
        // 初始化 ARM 中断控制器
* V! X) \' M3 t) t! ]3 O( _        IntAINTCInit();  s6 ~. Z  q2 R* ^2 {. A* a

9 a# x5 N& M& e6 \) `! ]( X        // 使能 IRQ(CPSR)
2 k4 L) @0 c. u' B+ P, L" ]        IntMasterIRQEnable();/ h2 j# \+ @. B0 E6 a4 v
. _! N7 `( G$ O* r8 E: \
        // 使能中断(AINTC GER)0 b( ]  X: e1 G! ?7 V" r/ w
        IntGlobalEnable();/ G+ G, Q) e1 m" c' l& j4 C! l, K, {7 W
& K$ f- x8 Z1 ~2 f0 r
        // 使能中断(AINTC HIER); S; W4 M, J" v( G$ ~3 _
        IntIRQEnable();$ n' A9 n) C7 v
}- \8 [) f9 ^2 V

  b1 U7 L" q- l+ U% W& h
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/+ _- ^1 ~4 c, j  E2 ?3 g
/*                                                                          */5 ]! Y0 \5 g8 \5 P6 s( [
/*              中断服务函数                                                */, B- ?/ f4 C/ H7 _, o
/*                                                                          */* }: f3 d/ E5 Q% b! p4 _8 B
/****************************************************************************/9 G4 g% [# R; L5 m8 \5 h. X
void PWMEventIsr(void)
, |9 g0 S# s! ~& k- x- m{/ T  ~# \/ T" j+ W6 Y% {
        IntSystemStatusClear(SYS_INT_EHRPWM1);: }' V- Y. ^9 }8 J, B: h3 U

: a" e0 e* {% l: O    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
: Z" b+ E. `3 V* G}2 N' `0 l) Y3 \6 g- O
0 _% D' w/ C9 s: T
void PWMTZIsr(void)* B- K6 Q  b% G: C
{
4 m1 a% O0 k7 I6 C! f2 R        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# N" i: [) h; Q2 e, G8 C
( s# p/ v, O8 z9 F7 i
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ M, ]0 R5 i3 _2 c. A8 e}
$ V% T/ }0 o& W
3 j% W! X+ D$ S2 M7 q/****************************************************************************/
2 }( W8 O5 l, V5 d" x- N: u/*                                                                          */- w# x# {4 z, `# @$ f4 g( D2 ]+ K
/*              初始化捕获模块                                              */
& y, p5 x2 n; X1 U0 D6 a. J1 w0 b/*                                                                          */
/ B3 h/ i4 z' C' ^( U& Y1 ]1 O1 F/****************************************************************************/
8 d; Q0 }4 N$ E' o6 Mvoid ECAPInit(void)
/ R  S2 p- I* v+ \+ V  u/ O{: p: Z9 r: ^" F) A. ?
        /*-----设置 ECCTL1-----*/
& }0 I7 @# @  d$ H: t        // 使能CAP寄存器装载
9 w7 G6 ^9 c3 U9 _& p; X        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);" n% g0 r% ~- p  [7 G5 k1 V! }) r9 H
        // 设置预分频值." S! [! _7 Z! ]2 w' W3 b4 Z
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 Y) ~$ H7 W9 `7 d- D/ ?& `' y        // 上升沿触发捕获事件. e5 K6 M+ C6 t6 s6 c' R# R
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);& W3 D. X( m! l; ~  `
        // 输入捕获后重新装载计数器值.* A9 ^+ g- S) C4 J( ~3 o
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
: ?+ Q4 e) A& ?# F7 Q& r' N8 ~, }4 E! e
        /*-----设置 ECCTL2-----*/. A" {, K, F, O' o2 r
        // 连续模式
" h" U$ ~; g2 p# W% M        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, ^; E: o$ A3 }" y4 N% g        // ECAP计数器TSCTR持续计数
$ d1 h6 h- q# @# c& L4 \        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);5 y3 }3 e" z* u4 Q/ G* @4 W
        // 禁用同步输出和同步输入' `+ S. w" B5 a
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- q2 ]$ g) a2 h) a, i        // 配置 ECAP 2 为 CAPTURE 模式: u/ R5 }5 J4 ~( w
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 `; w! N4 }6 i1 U7 r' F, x, M" d% S# P, k, t' M5 U- P
        // 使能中断( k* X, C5 q" G5 O+ Q7 ?  v; N
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);- y: X( B) T! t
}$ P# M3 T7 p' Q# F2 J* a

; Z$ U- k, y3 x( T/****************************************************************************/
% }6 u# T& p/ m1 E3 a/*                                                                          */. T) A# M* E2 W+ d( |( u" b
/*              取得捕获结果                                                */
; F, x: I) F( G4 W0 m" V/*                                                                          */
# m9 M1 w/ `; C1 t# p/****************************************************************************/
/ |* [4 z: _" l( H' nunsigned int ECAPRead(void)
' h: L' K* B6 U& z0 [# t" U8 ~{
' @  x) b7 p5 L7 k; |1 \        unsigned int capvalue;
/ _  N1 S, Q2 c- y& c6 o        unsigned long frequency;
1 ?, }8 C9 e9 z* Z8 R
% K" G, ^6 K" |+ a- H  m        // Event1 中断标志
. }7 `8 v( x$ q4 ~- }        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))2 ~/ |# i8 H5 H
        {
. G7 |' B5 m8 z- Y$ }                // 取得捕获计数+ z0 N$ H; P) l( C( m2 X4 L' }
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 b2 @5 {* ~% e1 P/ \                capvalue = ECAPResult.cap1;% M0 P$ X: |% v7 K/ N$ ~% i, w, d
/ |& U( e6 }4 X" B
                // CAPTRUE 模块 228M 时钟主频, r8 R' @; J3 l2 `+ [4 F1 l) r
                frequency  =  228000000/capvalue;
7 h3 P8 e: f% E# A) l' K0 ^                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);: D" F* Q+ _# l4 s- {

  S) M# M+ H( @- |, [' N" R                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);+ K3 W1 l' m# d  ]) b. _! J
//                IntEventClear(SYS_INT_ECAP2);2 B& @% l# I3 A, c& f& l" g
        }
) M1 V6 f8 P6 I8 M! B6 h1 ]" {4 t8 Y        return frequency;
+ D/ [: C% c, A% o# U}
; {4 V/ ~0 R( w) X3 k1 d
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。; p" R+ f/ V9 M) t( e0 ?; d9 W% `7 a- i
[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