嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ U2 m2 _. c. M( |  {9 y
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
( H# }) ?; `0 }  I- E0 e; m- t& N: |: c  T/*                                                                          */% y$ S; t) ~6 z' `! q
/*              宏定义                                                      */: M& [9 B0 g, N. Y; z* w. j+ N7 D
/*                                                                          */
1 ~  j1 w% j# G0 N5 l/****************************************************************************/
  J! r6 m4 I- I, E" E0 l// 软件断点
9 r9 W3 U& d1 E( L1 b% v" F% E#define SW_BREAKPOINT     asm(" SWBP 0 ");
# x0 Q  r' z- f) p" S6 {2 t: _( Y6 L/ f+ E' t5 c+ X! A
// 时钟分频
$ }* n* n3 A6 `/ [" r+ ]4 G9 |4 k#define CLOCK_DIV_VAL     228* O+ y( F1 Z! N2 n5 q1 N" h

& A  [1 ]- ~" L/****************************************************************************/
. \- N0 e1 M- d/ l" n- L/*                                                                          */
$ F8 j9 A# M9 S- b/*              全局变量                                                    */6 [0 A3 i9 Z) [
/*                                                                          */
' f. W# g$ X7 H7 ]! m! I/****************************************************************************/: {7 r3 J" R; Z
ECAPCONTEXT ECAPResult;
8 {) [" m, D+ y2 ?9 E6 y
. v4 U1 c2 \  ?/ }/****************************************************************************/( y! @8 i1 {7 I  r
/*                                                                          */
/ ^, R$ y& p0 I; }* Z7 q/*              函数声明                                                    *// V: J! S; o9 K) O, t: p+ p
/*                                                                          */
! q2 ?! X; p# o# }9 L9 H% [/****************************************************************************/
2 _, p, w: W. W- x! r( s// 外设使能配置
: f4 _& I9 V, j) D) _( gvoid PSCInit(void);- A0 q) j( L6 f" R9 X
4 a2 ^/ y' v- c9 M
// GPIO 管脚复用配置
+ p# W9 l  S7 v  R2 e) k5 g3 Tvoid GPIOBankPinMuxSet();
; l% K' ?5 A* ~
- D& W) [( w# ~8 ^6 I# n& p// 产生波形
: u8 n5 [6 s/ R5 M1 b' H! s0 Mvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);" [0 q8 }5 _- v$ U
void ChopperWaveform(void);
# Z: ^2 \( {. Z8 {
; M- ~' ~8 f7 }, W// ECAP初始化和读函数
9 l$ D* o0 H% ^- _0 ]5 b# s, Pvoid ECAPInit(void);
' _% Z$ l( P/ sunsigned int ECAPRead(void);6 M" C4 g% k- @' `" ]: Z% a2 {) P& A

) r4 a% @/ M4 |# B# _1 {) j//ARM 中断初始化
# ]% ^: W7 T7 n  C# N! Yvoid InterruptInit(void);9 |/ B3 g! T* A7 U

4 K6 E' n  D8 D" k0 S* c// PWM 中断初始化4 n8 P7 d  D6 B. Z, h4 G
void PWMInterruptInit(void);) e/ I, h( g0 ~/ e( T. F" g
// 中断服务函数; f+ g, F9 V. W3 \
// PWM 事件  K/ L9 ]' W/ m3 L% e4 m0 V
void PWMEventIsr(void);
5 [4 h3 z, o$ C; K4 f8 O// PWM 错误控制事件9 P" e3 M" l# U; e3 Q. |
void PWMTZIsr(void);
* X$ I/ n# P" v; V0 D
( p, w9 ^" b. x$ t# v, R/****************************************************************************/
$ [! Z: j% A6 o9 K9 x/*                                                                          */
- u+ V1 h/ W4 S4 O' \/*              主函数                                                      */
# T$ ^4 u9 E, i+ X3 W6 T5 A1 S- s/*                                                                          */5 c4 C) t3 M/ ^; v# t9 u8 F# R/ l2 N
/****************************************************************************/
2 b) a7 n4 `5 I7 L: m# zint main(void)
2 I8 o0 ?* X* e4 |: b{
4 d. a% a# Y* d/ D. r1 f        // 外设使能配置
3 t0 Z( Y, w. @* B        PSCInit();2 ~) ?: t8 A! Y

1 ]6 W# ]: t$ C% J+ m        // 初始化串口终端 使用串口2) t, l4 [4 ?" S% l% ]
        UARTStdioInit();
) r* P2 \) @2 w        & ^6 z1 y& E$ x5 `3 \
        // GPIO 管脚复用配置
& o- w! `8 I' V$ u- n1 Z        GPIOBankPinMuxSet();
) Y5 A5 o- w4 \$ A' c
2 H& M2 H3 v; z1 d, B        // ARM 中断初始化; A2 q5 y5 B; G- `, W
        InterruptInit();
( s, J* |$ E2 c% C8 k3 s9 e, d4 |2 V: z2 R1 y' A+ V1 J
        // PWM 中断初始化/ q! d7 t" }8 t
        PWMInterruptInit();
& O8 B7 K* O( }
' K; f1 j( b4 X        unsigned char i;6 e9 |! c$ a: {5 ?1 `, d
        unsigned int j;
9 o4 J- U* J8 |
+ Z, M* t" v. {5 `4 a7 {. V4 ]  m  A        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);7 P8 I, M' p/ i) U1 c
        UARTPuts("------------------------------------------------------------\r\n", -1);
" ?) v5 Q8 n- w% D+ B0 N        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
' O# @$ ?' }( j! ]. S        // 产生波形: E0 _: y! C; E5 n
        PWM1ABasic(25000,50);6 S3 A0 G. O7 _! @  a3 b2 |

+ ?2 x1 [3 Q  U+ D" {9 g- c        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);7 r8 T, Q$ \4 g6 F# B( r
        UARTPuts("------------------------------------------------------------\r\n", -1);
" H8 @8 K6 b; S3 D  J- ]. O, t  D& M
+ x3 k/ q# h  P9 Y7 x- J1 @; J# L: ^: e% f* \- H7 n8 T) i: N

$ `- y. P/ k8 N( K9 y" ?        UARTPuts("------------------------------------------------------------\r\n", -1);% E( l3 i; a; i* O; _" [  Q
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
. r9 b( Q; G7 k/ z( }        // ECAP 捕获初始化
& D* d& u* s1 D- e# z        ECAPInit();% i, U6 D& z7 |: h
        UARTPuts("Initialize ECAP.......\r\n",-1);0 ?9 }! W  t8 S' L: q' b3 M4 y4 d& S3 N5 I
        for(i=0;i<5;i++)- A" X; V& a+ C8 A7 z
        {
1 A, [! I6 K" f                    for(j=0x00FFFFFF;j>0;j--);            // 延时
: v! j6 b3 z) M7 }' D. ]: I, h                    ECAPRead();& k3 u2 F6 u8 g* m
        }
% |( F# _! y1 E6 `2 t        UARTPuts("\r\n",-1);
9 I5 G9 a, Z& z5 {7 o        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);* _) c  ^; w1 N8 n
        UARTPuts("------------------------------------------------------------\r\n", -1);* E5 ^: L1 e; p8 s2 R. i

- N2 B; _8 M8 e8 R        // 主循环
1 h4 J; K  H3 O/ a7 m$ G6 Z        for(;;)
: ]/ K' M% T/ X0 ]; [        {9 ?$ f: P: |+ }9 I: Y- U2 ]$ Z" \- q

8 N5 o; @/ ]; z! I1 }  P5 d  F/ Q        }
- f  M" T: t$ a) `+ V8 Y7 y}+ d; T/ K; q; c/ q
6 m. M& |2 f( C0 {2 [! ^+ n
/****************************************************************************/
/ Y) P4 E  X& J/*                                                                          */
" I6 G8 b) V+ N, k# l/*              PSC 初始化                                                  */
5 h! z8 s% k) T( F0 Q/*                                                                          */: R0 ?7 y% ?$ l3 i- u3 A2 |8 z! Q
/****************************************************************************/! M1 y1 W5 N9 Y: X3 G
void PSCInit(void)+ d" f$ b2 P9 N- U7 |
{% Y2 j- H% [' z2 r
        // 使能  EHRPWM 和 ECAP 模块
' a4 i5 I, P! p        // 对相应外设模块的使能也可以在 BootLoader 中完成
! V/ V1 e9 K7 y* q+ R2 G+ z    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 A% n2 F& _3 D7 x    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( m$ Y7 d: e; Y4 `4 s
}
9 p% F) D, o. o! U9 o: `% _5 J6 B. Q2 F" s7 g
/****************************************************************************/
/ F* C' v- L' R) p6 v4 y5 M/*                                                                          */& q2 c+ C& m, s3 g9 v4 N
/*              GPIO 管脚复用配置                                           */: b0 d8 ?$ ]/ Y; y0 N9 q% ?/ R- P
/*                                                                          */' S2 A. i9 p" T
/****************************************************************************/
/ x* T/ A" ?+ a* x1 s! ~void GPIOBankPinMuxSet(void)
3 d7 a/ a0 H3 a0 F! e{2 I% o. C+ o3 B0 L1 j$ i
        EHRPWM1PinMuxSetup();  S+ `! W2 U. S3 i

: u  x/ L2 T6 T# l, l- g. M5 y        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# u$ a4 |  P9 ?. i. }
        // 作为捕获功能时管脚方向为输入7 }( X3 j5 k7 ]
        // 作为辅助脉宽调制时管脚方向为输出
3 e! R2 I7 h0 x8 h' f    // ECAP2 / APWM2
: K% a4 P4 W3 n! M. G2 e) b  e( O0 V4 Y        ECAPPinMuxSetup(2);
7 h. Y5 j: I! s' @! W/ V0 _
- O0 @) Y2 _0 f8 _( ?) C8 I+ Y        // ECAP2 / APWM2方向设置为输入
5 }4 H0 \) f$ S. z        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]2 D% u: @, F6 R4 f0 s/ L
}/ ~+ ~; _( Y, ^1 I" b( s+ o* X
5 I9 H* r0 m8 P- A  x1 c
/****************************************************************************/
9 r, D' |0 h5 A# t/*                                                                          *// {& s) z3 C2 Z/ s" ]6 d, s1 R
/*              PWM 输出波形                                                */
' v% F3 u; `4 [) j, f! l/*                                                                          */
: q" R& r2 @* y( s# }- V/****************************************************************************/
4 L7 ?! Q/ H+ a& s0 G$ Z! Gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)2 o) \# C9 Z1 C9 b7 }) B9 [  y" B
{: A( V! [3 l5 v" Y3 L( r
    // 时间基准配置
3 w7 y% q! N3 j$ x5 l+ w% @    // 时钟配置
+ h6 X0 \: ^  b    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& D: B8 t9 A* N9 a4 I6 J; w6 a; F% g* P
    // 配置周期
/ L7 N- s7 |# a# d" T6 ?, z- C! X    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,* s5 H9 l9 s6 a6 Z0 [
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);0 W0 }* Y8 o5 R  ^

& \! D, m" @. d% A4 f  T4 G( M    // 禁用输入同步信号
# v9 }! J. [7 r    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
- \2 ?& f$ R/ b( B4 ]: q7 T; L
) I2 c$ ^2 l4 T7 g7 X/ f    // 禁用输出同步信号
8 t6 }& Y5 C" F0 j; c, h, g. ^+ m( X    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% n* y( _1 @* Q& L$ G" o! T0 }! o" m+ O6 {& g+ q  H; ]0 b# {
    // 仿真(DEBUG)模式行为配置# G! L6 K/ F; q
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 x% h% w4 m( O/ Q" T0 q
& S. O  N! z$ o8 O4 `1 y    // 配置计数比较器子模块1 {) y  X, i/ l" O; v1 I
    // 加载比较器 A 值9 h7 b0 o8 }* {- B
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
  v" w* F( ]2 _" }6 t- \                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 n+ e6 B  C+ g4 j5 B
; E5 h0 m& e( Z+ l
    // 加载比较器 B 值: `) o3 ]2 u. J# K; i+ P6 T# E
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,& f" Q+ b! f2 c$ ]+ P( F9 {
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% P" a# l5 w4 m6 Y4 Y4 J: M( Z. D; a2 X
    // 功能限定配置(输出引脚触发方式设定)
0 ]5 I$ e7 w1 t) N. U    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& o7 t5 i+ x$ Q3 d1 z6 o
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 g: e- m. q2 j. o( H# q' _1 J- ?& g                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 s5 M! Z1 x' V9 p( V                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 s, a( N% b  g5 L* U; H7 c7 Q

( T; Z9 @# X0 k% ~9 Q  q2 ]    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 r- Q7 g1 b: A2 `. n& {% j4 i, t: F' j2 W    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) u; o$ |, V- g
. [- `5 R, k* j# r5 \- S    // 禁用斩波子模块. u1 \$ y1 j' d7 ]4 {  X# S% O* c
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- V0 x4 J. x# N  M' c8 E' p6 ^
5 V% H" h& ]# P
    // 禁用错误控制事件
0 E0 R7 R  F* w7 }    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 ]$ t7 E0 d" s  j( b( w  E    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 T/ e8 h) y* L7 w* w
+ c4 a9 U/ v) O; X) J! }3 X    // 事件触发配置
+ d) j% k1 b: U/ ?    // 每三次事件发生产生中断
3 m& C" @9 J1 R    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);" T! q+ |& C- U* B
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件9 g( o/ H% z9 W8 d
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) F& P- I! F: x
    // 使能中断! o* n4 A5 }: @. v& Y' g
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
* K" }+ }3 b1 E2 x# V2 \5 Z
2 `- i+ n. V  a- I" O* }1 x    // 禁用高精度子模块# |! ?) _" i. ~$ n/ }
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' x: u/ _. t+ S* Q2 O8 e

& o: l: A2 L/ e: s2 ]    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. e# N# _" O+ a- b% G7 g* W}
0 C4 [( [$ l) S6 ?8 s& T, z. ~7 s0 F0 ]. ]. y
void ChopperWaveform(void)
, x  x; n" H- F: [0 J* K{/ ^$ u% A2 e8 _7 k
    // 50% 占空比
6 F1 N0 G8 w; M7 J5 ^2 R    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);' S& ]3 B* {% f5 M2 S, D  ~
    // 4 分频
: l1 y4 K( C0 _8 R9 f( T- h    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 u/ ~/ b# M4 n& L) `    // 单个脉冲宽度
. t0 V! K) `  F& O: A    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);  j" i( Y* t3 s* J- t6 Q1 X- A
    // 使能斩波子模块6 c! ~- G, p4 ^* m/ i3 S
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 b! n0 Z9 J* P" C4 l' y' J}
! O8 i. S/ \8 J! t) S
" S2 W3 d/ O* N( A- ]/****************************************************************************/
& J- ^0 u" w2 Z9 r. ]1 C$ E/*                                                                          *// D8 A/ O) L* g9 Q# n0 l
/*              PWM 中断初始化                                              */' V3 `* z: N% W% N
/*                                                                          */
6 v7 Z; A2 L8 ~# _/ ]- q. d7 W7 F5 j/****************************************************************************/
/ N: D) {7 W. c( }) Ovoid PWMInterruptInit(void)
5 \( ?1 W! u# B1 A{
/ u+ s2 s/ g' [9 o" e9 [        // 注册中断服务函数$ D$ z1 P3 W4 F9 F
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);: U  T' h, f* R! E7 t
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
( k( c6 V  k1 D9 q$ J: j# E0 u# Y* ~, ^" A. ?! ?  J
        // 映射中断
# C# |# a0 \+ n9 S6 l) ~- u        IntChannelSet(SYS_INT_EHRPWM1, 2);2 p% e/ V: Y3 s0 h( S
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);& |8 j- {8 m7 i! k3 S

5 q5 E! }* W- M2 Y( i        // 使能中断$ H: ^2 @8 w& E! D: X% z
        IntSystemEnable(SYS_INT_EHRPWM1);
5 ^8 w) s+ t1 V$ x8 j        IntSystemEnable(SYS_INT_EHRPWM1TZ);4 U9 [8 t& ~9 B4 E* z7 @# ^7 @% M
}" Y/ q% w* u4 Q, F. U
8 q5 ?6 ~6 L# n0 U" m, T  v2 N
/****************************************************************************/
4 Y( Q. Q0 N% H8 q" G5 H# M/*                                                                          */% i+ i. ]' J' {3 W$ R
/*              ARM 中断初始化                                              */: z7 H4 L, n& \. \( ?! y3 t
/*                                                                          */
. w4 Y9 F8 _. j* @- A' f- g/****************************************************************************/3 M1 Y1 Z& y. G( Y! k2 Y
void InterruptInit(void)% q" l+ X8 Q5 Z
{
4 d2 L6 w1 f( O/ y$ v0 _; u        // 初始化 ARM 中断控制器
0 N# i; C9 l! u% e/ J! \  k        IntAINTCInit();
! \. f) h4 b) a6 v" I  b
8 q2 e5 \' b5 V5 o+ x        // 使能 IRQ(CPSR)
# R8 p% @" m. y$ J- J6 y6 M        IntMasterIRQEnable();+ I) H1 K$ _! L- C* w7 ~

, ^" p* U1 q$ A3 A0 L! {        // 使能中断(AINTC GER)9 ^) N4 Y" v  Z, K# }" @
        IntGlobalEnable();1 q1 ]+ o4 J/ |5 t5 Z" e2 }' s
0 A- @% M2 j9 h: e
        // 使能中断(AINTC HIER)3 s, @3 s3 J! `1 C
        IntIRQEnable();
  i+ u) p. @# g, A+ L}
; O8 g5 p7 C- g+ w. c7 Q: Z% E( H7 x1 d( s

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/) |! v0 k. ~4 U: d
/*                                                                          */9 v3 f6 R7 G- S# e% _
/*              中断服务函数                                                */# V5 d! z) H9 e# {
/*                                                                          */
- m* R3 d% r! Q6 {/****************************************************************************/- J4 u0 a' i$ ]2 y& ]" ^' t
void PWMEventIsr(void)
! H0 C. f# j9 |2 S- l{5 G- g# g3 w2 a
        IntSystemStatusClear(SYS_INT_EHRPWM1);3 U/ ~! L* n$ \' t0 u) m' p
6 h' f7 t0 O, i8 z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);- m. ~1 I3 ~" T! T% }9 ]. `  N) \
}
( r& |6 B8 c+ s' `9 i0 m( Z8 \+ k8 k9 i6 U& d. |
void PWMTZIsr(void)8 `# M% m7 Y- Y0 u# d9 u
{3 n+ f. J" N7 K; ~- Y3 M  ~
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);  j6 ?; k# H/ J/ U) p6 l
: O1 n- v' c3 j- y
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 [5 j: m( D4 G6 I0 O- I
}
9 u2 s0 I* [" a' J$ U  U4 L2 x
( {  ?2 x+ f* _& i7 |/****************************************************************************/
4 A( K' E1 `% h/*                                                                          */- J! X7 o% T0 d* l  ^
/*              初始化捕获模块                                              */
" z; `9 x8 M* W0 V) I4 K/*                                                                          */- y0 ~( ]. i5 Z" t# q
/****************************************************************************/
+ _9 j: t/ C5 _4 s4 @) H! p" |void ECAPInit(void)
/ p/ s# d1 s" e{
2 f( O6 c; T+ y  M! l: G- V* ~        /*-----设置 ECCTL1-----*/
" v* u# {" K. m3 V" V: S7 s% A        // 使能CAP寄存器装载6 ]4 A$ e2 q' z- C
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);" q$ q/ W' d: x+ v
        // 设置预分频值.  u* A2 Y1 @) C; p' d# x$ z. m
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);1 ]+ H5 o$ l8 t5 Q- }
        // 上升沿触发捕获事件
" d# \9 V' {  K4 f        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);% W. A* t2 a, q6 G( ?* Q
        // 输入捕获后重新装载计数器值.' Y$ j  I. ~* E3 e$ m: _  s% f
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);9 [$ R$ Q1 V+ s5 f' Y4 N; u

/ D. ]" u) \5 D7 e        /*-----设置 ECCTL2-----*/
3 n6 w' i: k& W        // 连续模式- \6 ~& Q$ w1 d
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);+ r* G+ j2 `$ r& I" L' @
        // ECAP计数器TSCTR持续计数
% J7 r: }  L5 h4 d6 f        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);9 r. r0 y/ s1 }4 \: ~- J, ^4 v: o
        // 禁用同步输出和同步输入# d' p2 p, l6 Z8 g" [
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 q  J$ B; z$ b! L4 b/ L. h$ _        // 配置 ECAP 2 为 CAPTURE 模式
: l- h* e: B9 n" l; s/ I5 \+ e, V8 i        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);5 t1 H: x+ B' R$ _. [' |7 S

9 e& C0 f" ^% F5 S: r* P        // 使能中断
. N( p2 T7 v7 F5 F  o6 A4 U" H//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ z# [8 v$ U( U( q}! C2 t: L& f8 R4 u2 }6 m
, Z& N# A2 X7 w  y8 V
/****************************************************************************/( u& ~, ^( ~' q% `& y3 i
/*                                                                          */
5 X2 U$ @) E3 f: D/*              取得捕获结果                                                */
5 H; y% r1 m" ?9 p/*                                                                          */
7 b' U: O: E  N5 n) q% B" `0 J: Y/****************************************************************************/
; B) X! C5 E+ ~7 F4 T/ G% yunsigned int ECAPRead(void)
4 }& g- N" C" V3 b7 H& I1 z  E0 Q{
" g" L# O, a& [+ L# k7 E        unsigned int capvalue;
6 f9 G% U! o7 X        unsigned long frequency;4 J7 N: P3 V0 y+ f4 b
+ q5 [) P* l- Z: g! Y
        // Event1 中断标志3 }3 i) V9 h* G  W
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 n% w3 H6 r* ?; V" T        {
: ]' ]  D( [, K+ Y5 U8 s' T                // 取得捕获计数
! ]- r' g- c+ ?& `                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
; \  p+ {1 P3 G; N5 m                capvalue = ECAPResult.cap1;1 Z* h/ J9 Y  j

0 B) b; W% z. v                // CAPTRUE 模块 228M 时钟主频
) b$ R4 D- I3 v. r$ V2 A" {' x                frequency  =  228000000/capvalue;' \; ]$ @9 E/ J9 ~
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; t2 e2 E1 U. _3 u$ X7 Y! x. Y5 M* @6 J2 l; m
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);4 x9 m( D0 j& q
//                IntEventClear(SYS_INT_ECAP2);: j$ ?8 L3 d. G( E
        }7 x0 l. c1 q" n
        return frequency;
1 {4 \" M! m5 l8 e2 w}3 d( U! P4 u2 s) M2 `" g" ?

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- n" p3 y8 ^0 U/ 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