嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
3 K* f# m; Y2 r: }& D) [# B
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
" ^. ?# k9 W) Q/*                                                                          */
3 t$ c9 c- P% Z. Z" `/*              宏定义                                                      */8 u( Z  k% @" |8 s! O& W' |
/*                                                                          */* h3 K8 R( \4 Z4 f+ Z1 j
/****************************************************************************/
- r2 u1 V; f4 }' ?// 软件断点
4 Q2 D: F! o( u#define SW_BREAKPOINT     asm(" SWBP 0 ");) l7 g+ ?" K) s' j8 W; {! ]$ l0 L
: w' q$ Q5 w( u, _
// 时钟分频
5 S  O( r. X9 ]; n#define CLOCK_DIV_VAL     228, A- @; k5 s% _  X5 A- Z. @5 a

5 }! L# m' }+ s/****************************************************************************/4 A5 F' x; P5 \9 b
/*                                                                          */7 A& ]" K& l' o& N# O# u/ V7 S
/*              全局变量                                                    */
1 }/ ]/ i6 w; c7 Q/ h/*                                                                          */3 G, X% q0 D' c4 v
/****************************************************************************/
3 c4 ?7 P( F3 a3 T7 eECAPCONTEXT ECAPResult;; M! x# X6 @) t
0 X& J) ^1 i% P$ u4 ]5 `9 u
/****************************************************************************/
9 P% U! D# }) c, P/*                                                                          */
8 H! X& Y& O  v  R/*              函数声明                                                    */
# e: L7 d! s  q1 `8 u/*                                                                          */& }, x5 P) Z" {$ p
/****************************************************************************/
$ o$ g6 w6 ~! n// 外设使能配置% `6 d. ~5 z" M$ o5 c% Q0 ?/ @
void PSCInit(void);# W, D" Y" V2 B

" o- U, ]4 O& ~3 |. J// GPIO 管脚复用配置
  G6 \0 B2 [0 z" c. `* Q8 e1 tvoid GPIOBankPinMuxSet();
6 u6 U% e5 ]3 G! T0 L( \, D% v
# q  j! x8 R( |3 K2 X8 M- h// 产生波形- P; U5 c9 ~9 m  ^) Y' Y- j5 T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 |$ @: q/ w, `- t
void ChopperWaveform(void);, e/ x$ _8 v" J2 G4 c4 i8 j% g
6 \, P1 \* C- |9 e, H, C
// ECAP初始化和读函数
( H) k# ^" U: L9 @% E( Dvoid ECAPInit(void);
. \2 K$ q9 y$ M$ Y0 Y3 S$ Junsigned int ECAPRead(void);
& |; U. U9 U2 H+ ]/ W
" G- B" Y; p3 i6 s# U3 r- T- p% E//ARM 中断初始化
% ~/ R* R3 t- v- |; J- Rvoid InterruptInit(void);7 r) ?0 _& ?9 s8 `
6 \+ p6 ?  b+ M  p, \* ^9 d; A
// PWM 中断初始化( J) M& V5 {0 f% a3 u- R7 e+ s: Y
void PWMInterruptInit(void);
7 j% V/ H/ t# V. d// 中断服务函数: j1 `" R! M% C2 p7 \: n9 Z; D* y. W3 ~# H
// PWM 事件9 _6 \- v4 b6 ^! c/ a3 B
void PWMEventIsr(void);
8 l' ]# Y4 [+ c7 n// PWM 错误控制事件4 M* r# i6 y5 H
void PWMTZIsr(void);
1 l0 T* \: U+ F: O; a: N/ X4 }5 n
- [8 k" |$ Z. W; j/ ?/****************************************************************************/
: I' C+ D* O4 M& M( `" s/*                                                                          */
: @8 ^9 x5 O3 J2 T9 J& ?$ x/*              主函数                                                      */
) j! e# @  M! c& y  ]/*                                                                          */
+ p/ @+ Q  V1 m* u/****************************************************************************/
; Q* d' ~0 ?" Y8 v$ G# Nint main(void)
( z* a* E3 y. z5 @! f{# a6 h6 w' u8 X+ b
        // 外设使能配置1 {) Y% _; B# }" J# Q( |4 Z/ Z
        PSCInit();% u6 U, h# o2 m! ]

) c7 J1 c3 R1 q        // 初始化串口终端 使用串口2
; c% U: W- |" H# Y6 ^        UARTStdioInit();4 g5 I8 t/ c& c- g$ k, e8 M" ^
        2 a) O+ p# j2 O% V: p6 q
        // GPIO 管脚复用配置
7 M1 {/ N( ~2 V: u, F, e9 Z2 b        GPIOBankPinMuxSet();& c$ O3 n( B  B) z' X

% b3 a$ d; a* Y# v' v        // ARM 中断初始化4 m& l$ b5 N# i4 w: H
        InterruptInit();6 W) s) T$ v+ ?* R$ N
: f6 ~" |+ _& V' U
        // PWM 中断初始化' U) E3 l& C/ Y! A
        PWMInterruptInit();
3 i, P) r- ~* D7 d0 _1 Z9 {. Y2 ?  E6 p/ |; M  K; X
        unsigned char i;' L# s. k4 ]% o/ r6 F
        unsigned int j;6 C: Z! c( j$ \6 U# t

! {& `& ]4 [7 z# e        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);) A! B- E: q8 \! v/ I! S
        UARTPuts("------------------------------------------------------------\r\n", -1);4 P6 ?8 p3 U, r) Z7 P! o- j/ a
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);& ?* y% @2 I; x5 D
        // 产生波形0 i* `. H7 I2 v; o; q& e
        PWM1ABasic(25000,50);
, V) H( |% B2 l
6 |3 {+ L- Q( O        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);* U; a# k: T* w9 p# E5 d& X8 P
        UARTPuts("------------------------------------------------------------\r\n", -1);2 ]3 n- ~6 B2 q+ t
. L6 d2 W7 a) A, _

9 s+ X1 d% e5 k8 R2 R5 s
  }) V: o$ n6 p/ f        UARTPuts("------------------------------------------------------------\r\n", -1);
  S$ x& R+ H0 J$ T        UARTPuts("                    C6748 ECAP Test\r\n", -1);. L! Y* n# e* c
        // ECAP 捕获初始化% a* }! J  r  _% }* v
        ECAPInit();
" a6 e- E4 ]1 m5 b# S        UARTPuts("Initialize ECAP.......\r\n",-1);
/ y2 ?3 H" y5 T, u/ P        for(i=0;i<5;i++); m- j# F. S+ f/ S) b
        {
- [3 y) ^3 q! z% ^7 Z                    for(j=0x00FFFFFF;j>0;j--);            // 延时, ]6 O4 z0 \: l7 W% M8 q' o* K
                    ECAPRead();
6 U4 I$ a2 f  ^* U        }
; x5 k2 J/ ~1 L6 I        UARTPuts("\r\n",-1);2 s3 M5 O4 g# d; h0 z* _4 m3 ?+ i
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
, z2 w1 c3 [2 M4 g! V" b& X        UARTPuts("------------------------------------------------------------\r\n", -1);7 P# H. D+ l6 L" M( T$ U
( [( U& f! k. `! L- }; |) d
        // 主循环7 e. R: {( g' Z1 j- w- g: q
        for(;;)9 D8 |; p/ e8 Z; ]. Q; h* N
        {
- i+ D1 y& a" P; d7 V: s0 ^+ u* \" D& m$ _  P  a
        }) N0 a7 J3 H, \
}! X5 x! D9 [9 U- m" f) Y, N
' g& G: w/ `0 ]4 Q  P$ i4 m
/****************************************************************************/5 a# H1 ~5 `$ q- n6 K. W
/*                                                                          */
. N$ p* s! _- g9 ~2 V- g3 I/*              PSC 初始化                                                  */
  }8 v. f, S9 u2 o& I9 B, D4 C# A0 {/*                                                                          */4 X& p/ u, O  h4 w0 b* L
/****************************************************************************/, |; _* f- ~1 x2 ^$ S0 V% K7 M1 \
void PSCInit(void)1 ^) z$ V: ~4 N% g5 D5 P+ A) z% ~
{; O- H7 z  e9 y' z
        // 使能  EHRPWM 和 ECAP 模块' S5 S" Z7 o: I8 j, Y0 |
        // 对相应外设模块的使能也可以在 BootLoader 中完成
: Y$ ]# f& H' @* O3 D9 B    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* v, D7 ~: V" U4 q1 c8 g" s
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 I  ?3 U& ]8 h  z, |}1 |9 |3 g6 E0 }  W: q/ F
0 @6 q$ `) H' T
/****************************************************************************/8 t; F7 B! J* |$ T6 S  f
/*                                                                          */3 m3 S3 V1 E3 X6 w, Q, |
/*              GPIO 管脚复用配置                                           */
) b# q. @1 Y/ F6 j/*                                                                          */
' Z, v6 P1 M% \1 ?) Y/****************************************************************************/
! U2 a' R5 S7 a# B- \# K& [6 kvoid GPIOBankPinMuxSet(void)# m: k! v" @  p9 I& T+ r, j
{
5 t+ U2 h" J4 a7 C        EHRPWM1PinMuxSetup();
8 |- q& f! N0 {# \. v- y: \9 f
. }" h! ]8 A% n  K7 B" U2 ?        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* a  e7 q7 Z6 o0 U        // 作为捕获功能时管脚方向为输入
0 |, X& K0 q/ b* ?/ X4 v5 R        // 作为辅助脉宽调制时管脚方向为输出
( }* V7 Y; A( w) a5 O: L    // ECAP2 / APWM2
& K2 V- R; W1 F$ Q1 o) Z( Z        ECAPPinMuxSetup(2);3 {1 w0 H3 U/ n2 v
& Z8 _# W( _4 ]0 w: M$ O1 w- M% V
        // ECAP2 / APWM2方向设置为输入
6 h2 u: M6 `: w        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]* h# Y' F8 e: F2 f% G( U
}" {+ D0 R- V9 }8 F  M( i0 {( G
1 w4 z0 Q6 x. j5 {- k( r
/****************************************************************************/
* Q. \5 ~: V  P& a' i5 l# a, Z; ^. u9 Z/*                                                                          */7 F5 L1 m& A2 S) x3 {) x
/*              PWM 输出波形                                                */6 \; E  r9 {; _, O9 h: Q
/*                                                                          */
, a3 |( `% J0 [2 C/ r) u/****************************************************************************/1 y" Y5 [# |$ Y7 I- p- i9 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- C+ F' e8 I4 [8 }
{; m. R, Z; h/ D7 u
    // 时间基准配置' r1 Z" p7 Y$ O8 R1 Y
    // 时钟配置
& t! [9 ~, I- _' A, t5 i    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);; t# y. l' e+ p1 f
" g; ]- U# Q  ?
    // 配置周期
2 H3 C8 R6 m9 P5 x' `5 y) ]    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- @5 v( r3 m- X+ u; K
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
* Y4 `0 Z. {8 X& X  L2 R
$ Z/ _  I9 t; f& X5 {/ X    // 禁用输入同步信号
. G, A7 k4 }' H9 T& k  X8 y+ D- P    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
  U: S3 Z8 Y5 u6 u! v! _
: v- _9 U2 w& o$ E% ]5 Q    // 禁用输出同步信号2 r8 N1 Q4 _3 w0 i. T& o, Y
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);3 |7 T6 Z6 e' w
9 i5 A6 w) p+ r& f' {
    // 仿真(DEBUG)模式行为配置) @, c  b. r" i' o2 N7 h. |$ Y
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 w7 n- u3 A: N1 [/ u+ G' w% |4 i& T
    // 配置计数比较器子模块
! D( i, i2 `+ f( p- ^6 j    // 加载比较器 A 值5 I5 U. i2 M. c: C. ]
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,2 U8 w# A' q& D8 o0 V. R+ C
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. e/ G+ a' X7 K8 B: @7 Z; e; E
3 ]1 N  O  i+ u/ d( Z% ]    // 加载比较器 B 值3 f7 m. u; `5 V/ U# F' X: Y' @0 J
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 u8 g$ T4 [0 x" ^% v' z; k! l                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 U7 ?5 T5 W+ q0 T
' f* W" Q% T9 h
    // 功能限定配置(输出引脚触发方式设定)
* }; V  y: P: e% a% h; A    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: o. ^8 ]5 q) m    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 V) A$ Q0 s) }0 U& J                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,: L& g4 H& V* l
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 I+ C1 Q5 u$ g  V# s$ S, N$ v
, m% h6 W% z& C) Q6 I    // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 V0 h7 G. m% T7 z
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);4 l5 F  {1 j( _( b! k0 O  K

* j6 p+ E. N! ~( t% S8 {    // 禁用斩波子模块/ P$ e; l, h; r5 `& `6 E1 [
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);" ^, t& Q/ t& H+ `* F7 q
1 U" J9 x5 H, ^; B* u: W2 w+ x$ {
    // 禁用错误控制事件
9 [; `/ `& J( \/ i+ a( }    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- W8 b' y) j1 _% j    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
3 a9 f$ Y! Y0 |! n+ K( Z" D8 h- }8 L/ f% K+ _. _
    // 事件触发配置
. b* {5 q/ [% C! D    // 每三次事件发生产生中断, x& X, I0 p4 T, C" h1 e' n; c
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ @' e6 ~0 c& \0 F7 H
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 `$ @1 l% [+ \+ o8 @1 F! g    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 ^+ V( y4 [( B+ J, N' g
    // 使能中断+ Q9 G; @5 j2 j- p
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);7 T& |0 W: Q$ J- z) l
: ~4 s/ r; a1 |. e' }$ Y% z: \
    // 禁用高精度子模块
1 c$ N9 w! E  P: |, F. q2 Y    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 _9 B6 S$ }1 [9 |+ t. U
6 D7 V- u# @" t$ P/ _! g    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);0 E2 n/ @5 u6 w% P0 B; o
}, J( J( f; u6 B& U. x8 I

4 W4 Y8 _( {5 C; E- hvoid ChopperWaveform(void)/ i, R  Y9 ?0 v7 g% Y0 ^) F4 b! V
{
2 }5 B& y7 \. ?& [5 o2 C    // 50% 占空比
8 n9 @' M4 |" r! M+ @    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);; o- W0 x' J5 m# v* @& b7 r/ v; V
    // 4 分频
2 C4 P2 k, n( `: ?    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 U: q/ S8 C; @2 |* c/ E
    // 单个脉冲宽度
& E; ^0 r" x% v& ~0 P8 @% T& m    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, x6 C) G. s* t7 f, f    // 使能斩波子模块
! M1 Y' V0 F6 d) @2 x2 B6 A    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);- S# P# K2 {: \! i6 S
}
: i6 @% {  E8 u, k
9 T/ I3 r2 @0 c" r! b/****************************************************************************/! O' t% _: F: h( o
/*                                                                          */  `# I0 Z9 S! ]: S2 B& i% `( g
/*              PWM 中断初始化                                              */
. \. ^) F$ K9 C  |$ x, L/*                                                                          *// O, K8 o6 p+ `1 Y4 _, p
/****************************************************************************/
, H- [5 l* D6 b; i. dvoid PWMInterruptInit(void)
) R0 A3 T- r) |4 u( {6 L) |; V  A{9 f7 i4 Q3 R) z
        // 注册中断服务函数
, s+ d0 L- K  U' f* d6 ^9 ^        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' }& C4 H0 m4 d% P% b, ?        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);3 P) z5 w5 x8 x6 ]% p

* o) u; v) K0 L& R        // 映射中断
/ c( Z( O5 v. R, a( e  `        IntChannelSet(SYS_INT_EHRPWM1, 2);* [# Z/ @0 x1 B' ^3 j, i: k
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 b! k: Z! f. Q$ G) A* s
  A: l" h* U' e( @4 N3 c: \' _        // 使能中断* Q6 v0 g2 \$ r; e: o. r0 P- U7 |- X
        IntSystemEnable(SYS_INT_EHRPWM1);
$ T/ x4 @1 U& }( a2 Z5 I7 I) D        IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ o9 W/ \* f+ f, Z& v* y! t. K0 j; Q) f$ p}4 t  c. U, f- B0 B! p" a" m3 M

! p: s  z0 |  N* G; s/****************************************************************************/3 A6 V" N  O) H) K
/*                                                                          */
9 x/ \3 K+ U, k/*              ARM 中断初始化                                              */( U! W. r- [2 z/ Z
/*                                                                          */
5 N% {/ N; f) }+ U7 T/****************************************************************************// ]8 V6 v4 q3 z0 P: G
void InterruptInit(void)- B6 p5 ?/ a$ @. I2 {* Y6 O7 h
{
5 I* u  O" |, V; ]! F        // 初始化 ARM 中断控制器" v0 }" }% }' W
        IntAINTCInit();. f7 U* Q4 A) \8 f0 K! P

! q* u! q9 w6 K6 e; h- Q        // 使能 IRQ(CPSR)
, ?* x9 U6 p1 G        IntMasterIRQEnable();0 O/ n/ i2 p: [: w

! [8 ]2 ]2 m* i/ h' \6 w& s/ N        // 使能中断(AINTC GER)0 [3 M0 w% k# G2 d& g
        IntGlobalEnable();/ g1 J" t* ]* A2 ]+ u) ~3 Y9 W* }& L( o
- ?+ H& b- I* K8 D2 ~" c. Y
        // 使能中断(AINTC HIER)  h/ T" {% O8 n) m' U6 k, Q7 T
        IntIRQEnable();9 |. w2 g" h; ~# B8 h
}" E& f: t7 X  a+ G! b+ S
6 Y1 I8 Z" Y" W

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" |. ?+ ?4 }% t- U4 Q
/*                                                                          */
& _9 X2 S9 z) @/*              中断服务函数                                                */
& F% J- |. L, E+ B1 Y/*                                                                          */
: ?& K6 }7 G0 V8 Y4 \/****************************************************************************/
0 l- Z  K7 ~9 K6 ]0 V8 D2 b- evoid PWMEventIsr(void)
6 s3 w% e, ]0 F/ D1 s8 i{5 _6 j( u, z+ O4 X  W  d
        IntSystemStatusClear(SYS_INT_EHRPWM1);# G5 N3 B  c/ O! Q2 C$ i

! c0 C# Z3 p' ]! `% U    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" E2 L( j; I' t  ^7 A! T6 V
}) F0 Z; R. b5 n: m% w
& i# x9 `) o2 v! }
void PWMTZIsr(void)
1 _' Y' N& R# B. w- U* R{- i& X: c& }  a; _3 D# S
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# ]  r# h9 n- Q1 q/ F5 p
' k$ }: [: ?. W" M
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 l( J$ i# P! O( q% E}
$ Z7 u( Q1 k  I' j+ I1 ^& v' ~' [. z  e
  L8 u( ^. _: v/****************************************************************************/% [2 P, |5 ]9 k
/*                                                                          */- \4 ]; Z' g5 C, }& v1 N
/*              初始化捕获模块                                              */
4 ~6 W8 i5 T/ ]+ N( T$ ?& N/*                                                                          */
- A, N2 p% j5 }0 A: f/****************************************************************************/
; w4 }! R% M7 @! [& {5 cvoid ECAPInit(void)
- l( P9 Z8 H+ I! ~+ S, o2 j{
, g+ _: b6 v: ^! s5 f3 ~) q        /*-----设置 ECCTL1-----*/. Q) _$ n/ Q% k1 f* l
        // 使能CAP寄存器装载
; \/ s1 W) u) v( i0 F: K- G% [        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);4 K) A4 ?& ~8 v9 z3 r
        // 设置预分频值., l9 u5 {. D) r7 a; T. o
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);) K8 l3 S: r3 L1 U6 [& I9 m
        // 上升沿触发捕获事件
7 g/ F" K  J7 k6 @; \7 n( J% k, v        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);, s4 q% B. T8 N# E
        // 输入捕获后重新装载计数器值.
( [% E% o/ y" i        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);  l* O2 a) `' G3 t6 \, h, P

# S: ?; ^, G  N  h        /*-----设置 ECCTL2-----*/7 U' F, H# C1 G' f$ }
        // 连续模式
- Y5 y+ z/ h' j' I+ T- R" _        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, w/ F. K  {, q% Y* H( R
        // ECAP计数器TSCTR持续计数
" P  e# U! J0 I7 b        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);/ R" G* v% b4 V
        // 禁用同步输出和同步输入7 d' Y' N1 C) J( c+ w
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);" ]- P$ X$ V0 b( w  ]* P
        // 配置 ECAP 2 为 CAPTURE 模式  Q8 J( }# \5 A4 q, }+ p2 |0 M
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
) o) O- ^9 u9 `7 W6 T5 J3 O! s! s9 `. s6 e: T$ q2 A- p
        // 使能中断# V, ~& O: k& B( b: e! r
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 _- P! g1 a1 V8 r1 n! r}
7 o: R. w5 w; u8 ^/ A6 a1 Q1 t* \  Z) N; t9 E
/****************************************************************************/" }- R, S1 y/ C' y& J
/*                                                                          */
3 h  H5 W: c, t8 b% q2 _/*              取得捕获结果                                                */
) t7 L) s1 X( `4 K1 g/*                                                                          */' B0 e* f9 D  w
/****************************************************************************/
) H& w9 O6 q9 C0 X7 hunsigned int ECAPRead(void)8 p1 \' p  B/ G  I8 Z0 S
{4 h: y, e0 \( O
        unsigned int capvalue;
4 P6 s' V" F1 o  G- e' p        unsigned long frequency;
0 H! W& _0 t) B% Y4 \
+ G, V. w$ ?5 M) F. z7 H* z5 h& c        // Event1 中断标志+ F) t7 s8 G. H& c' C5 J
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))4 b1 q9 L8 k. {1 j& N/ r" r+ T
        {8 P! z, A; K: M/ n
                // 取得捕获计数3 P0 }: N+ |$ Y3 ]: a  w* E
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);2 q5 ?8 |9 a7 |
                capvalue = ECAPResult.cap1;
. {$ c" [' a4 S) e% s! X3 Z; {7 E6 S) h2 H5 \
                // CAPTRUE 模块 228M 时钟主频
, `0 J; [5 t6 O# s$ f! h# Z0 @6 \                frequency  =  228000000/capvalue;0 [% v5 B. l, B/ ]
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);. B* L% w. V" Z+ x) I: `& |
1 _$ p1 }4 u$ V: Z+ _, ]/ |) h1 R3 c
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
- {. {9 I) ]4 f/ Z! B- u! ]//                IntEventClear(SYS_INT_ECAP2);
5 }& g& V- `& e) g+ ^: X        }; u9 F- t) f7 v" J0 O
        return frequency;: M9 K/ E' W$ u4 K
}0 J# S1 U: `$ @

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