嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 V" K+ p. A) K! [
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/+ \" K1 e3 g' I3 ~$ _7 u5 H
/*                                                                          */
: a1 ?$ Y( @( p; h  f/*              宏定义                                                      */3 a$ R* w0 q* Q: u
/*                                                                          */
5 d' p2 ^2 M  J3 A9 u/****************************************************************************/
. \: r5 k# k$ B6 T! G/ T// 软件断点
# g! C9 O3 I' D5 a' Y7 s#define SW_BREAKPOINT     asm(" SWBP 0 ");
1 d8 S* c# y4 X5 s4 Q# h* }! ^, v7 N  B7 w9 i
// 时钟分频# H* {7 T* ~4 \$ G
#define CLOCK_DIV_VAL     228; \- {5 c- C$ }+ i5 N2 t$ \/ V' X

' t4 e) \6 _* ]: C/ e/****************************************************************************/
& H5 O# j. x, R3 x/*                                                                          */% Z' {3 q+ Z- {/ x- t- L
/*              全局变量                                                    */5 d& {6 P& s) _
/*                                                                          */
0 S' }- i2 _, G) p/****************************************************************************/" A" P( `% k- n2 S
ECAPCONTEXT ECAPResult;9 W& ]; w1 i, ^
# N  m, z3 @" t$ q6 C
/****************************************************************************/. j' A, T* |& ]: C
/*                                                                          */
, D: D5 o, v9 B9 P3 a7 N: D/*              函数声明                                                    */
' G- S7 |$ m0 A2 I) L, Y' G5 `/*                                                                          */
: T( i' o; Z) Q0 F3 [6 x, m2 J% ]/****************************************************************************/1 D; k% @$ l* M" J
// 外设使能配置; a! ~8 k. {5 \, P3 V7 ^9 _
void PSCInit(void);
7 f; @$ ~& [- x9 f
* d& g7 Z& K; z( j1 @+ o3 B$ b: Y// GPIO 管脚复用配置0 ~) T5 p6 ~& `9 S0 Q2 {- o* ]. {
void GPIOBankPinMuxSet();
3 E6 ^" L# l. K6 p$ ]" G) q' v; I: ~% H- i, ?" y
// 产生波形
3 B. H" H% L. I8 b) i! N/ \void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);. `) s' o2 T) s- Y% S! X
void ChopperWaveform(void);# B, o+ T( Y% G1 M

; E2 n# q5 ]" k" a# `// ECAP初始化和读函数& y" U0 |, }9 W/ R. A2 A# @& k
void ECAPInit(void);8 q; v& O4 J4 H/ F' i& f
unsigned int ECAPRead(void);7 X! [  n8 H& H" S" F) s
+ W; h) x+ y* j* w
//ARM 中断初始化( _9 @* K' P2 f; w5 p: s; l" P3 D* e
void InterruptInit(void);0 }7 g7 [5 B" u8 x

& S/ U1 o$ B( J5 |// PWM 中断初始化9 t4 w9 E7 S3 Y  `5 A7 c
void PWMInterruptInit(void);4 a" J( f' \# m  S9 a4 o
// 中断服务函数' R( G# j3 v9 x1 {0 ~
// PWM 事件
2 l% z4 y9 F  l. C5 Mvoid PWMEventIsr(void);, \9 v5 e* D% R" N8 _. L2 a9 e
// PWM 错误控制事件% U! z+ f1 v0 x0 }) E
void PWMTZIsr(void);  p8 H, I" e! f( `
) p9 p: I& F0 z: P1 Z9 h4 e
/****************************************************************************/& l. E+ [% f* {
/*                                                                          *// Z0 p. |2 a2 K+ `
/*              主函数                                                      */
" u% i' c. Y: m! N1 s/*                                                                          */
/ n5 s/ m8 O; b" t4 c6 j$ S/****************************************************************************/, j) j# _+ b$ i, h" c
int main(void)
: O- F) |' P5 d% d2 A( ~, S: h{
. `! |' w' ?0 F( z- @' X% N        // 外设使能配置. r& T: O+ [# z
        PSCInit();) f% X( K" f3 Y& V# e$ G; w) z1 o

- J9 G& B9 q1 z        // 初始化串口终端 使用串口2, r/ k9 H2 G- ^8 a4 Z3 f
        UARTStdioInit();7 g" V4 d( h4 a! P
        9 k; V! D' w, J1 a8 t8 L
        // GPIO 管脚复用配置
$ L6 A, x( m, E: i( M3 a/ C        GPIOBankPinMuxSet();
# l/ c( R6 A5 ~1 ^9 J4 c- b3 K( ~6 ^8 v1 @$ c
        // ARM 中断初始化
4 g2 E" }7 W- S8 H# |4 i        InterruptInit();8 ]% a' N' o8 O; |( \# k+ }

0 {7 ]8 C- |& b- ]; s0 h) O* R        // PWM 中断初始化/ Y3 \7 F- u9 ]: r
        PWMInterruptInit();
3 X, G$ u$ b8 S$ a+ t( P/ V  D# u6 s1 a% {& p
        unsigned char i;
# ?. u, Q; k! q/ a        unsigned int j;
7 j; O0 I3 J1 |. X" n
  W" z. B0 Y- }        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);$ ~1 [6 T& O: E
        UARTPuts("------------------------------------------------------------\r\n", -1);
) W6 m7 m1 N  B! D: @        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
) k6 K- I* [# {        // 产生波形
! z$ S# r4 n( K1 n' A        PWM1ABasic(25000,50);0 R3 J" Z% l. g4 c

+ x" O( `1 U7 R: W        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);" ^) H6 q1 y# `( x# a2 o# v1 T- o
        UARTPuts("------------------------------------------------------------\r\n", -1);! \% W! W% `0 E9 D/ y9 W! b; R$ }

8 r  u8 v4 I! n# \8 p
- x$ h7 }5 m. M/ b7 T- R  u0 |; c- S9 Z2 R0 U
        UARTPuts("------------------------------------------------------------\r\n", -1);' w& D/ `% W' X7 R+ N3 _( Q7 x
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
/ Y  L: ]5 R9 t* Y2 f& X, ~; b! g        // ECAP 捕获初始化
9 E( A  ^* d) K( T1 Z: l1 E        ECAPInit();& \$ f( K' G9 C6 J) F7 v4 V( v# |
        UARTPuts("Initialize ECAP.......\r\n",-1);& {9 g% h" G$ K
        for(i=0;i<5;i++)
% b9 e5 A0 \9 z% E$ |8 i- ?        {
2 }4 Y3 p+ R: i+ }5 M                    for(j=0x00FFFFFF;j>0;j--);            // 延时& t, O3 b2 e% Q. H& H5 I, ?6 v1 Q2 F3 g
                    ECAPRead();5 Q. O/ x! B: a. a
        }
* q9 q- k! x9 z        UARTPuts("\r\n",-1);
& J! f4 z0 A7 b: G$ }' G+ R5 Q7 x( D        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);2 G) g6 {; y/ P6 V' Z9 M7 T
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 T" E5 n9 b8 |3 F! R6 o9 g
0 h& P  n: `1 O, o        // 主循环3 f1 D9 {; f. P, U
        for(;;)! F  L* g% o0 s+ o7 h+ y
        {6 t, A7 m- g9 S* }
; `. A7 R6 z& \5 E8 ?2 ?( Y5 c
        }# T7 Y3 Q" J# s& d  ~. k
}1 C2 k9 z0 {6 m) y% y& r
* \- S( M* f5 y6 |7 F
/****************************************************************************/8 Y6 b5 o% \3 x$ B4 j9 s
/*                                                                          */
, e. [* h8 J  W; Z/*              PSC 初始化                                                  */2 \, N- G8 j3 _7 S: _: ]) x
/*                                                                          */% Q. n4 ?* t* `& c2 a
/****************************************************************************/
2 U9 V: o6 e1 F) R& F3 _6 `void PSCInit(void)
7 h4 {( k% Y& W) I{
2 z! Y& K7 F3 Y" i        // 使能  EHRPWM 和 ECAP 模块+ v5 l/ F( a. H3 n* R
        // 对相应外设模块的使能也可以在 BootLoader 中完成
% D4 \) b4 |9 t0 U* ~0 d. X7 M8 O    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 x; d. }, l, ?3 {3 k; s* ?    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. z% w: u8 Y$ W}% `; O4 A8 `" e& ^1 V6 g! y9 m
$ v# C6 |2 p" ]3 [& m) g4 A
/****************************************************************************/+ y+ ~0 z2 Z6 K& T6 M
/*                                                                          */5 q! `! T3 v7 X" W% P/ O
/*              GPIO 管脚复用配置                                           */9 V- y& w: k- ~' Z0 p
/*                                                                          */3 e) k/ z8 x# j- y
/****************************************************************************/
3 x# k: C3 |9 n; _, Jvoid GPIOBankPinMuxSet(void)6 |; o+ a3 _3 G) k
{
$ H0 M6 v+ C' ~2 F% U2 m1 M5 K        EHRPWM1PinMuxSetup();
( |) [( [; @: i: {9 ?2 i
2 w, B1 Y$ e$ Y        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 x6 F; P! H5 Z" I$ ~        // 作为捕获功能时管脚方向为输入5 {- E, q) {+ i2 B* Z
        // 作为辅助脉宽调制时管脚方向为输出! \% I8 {2 p$ v
    // ECAP2 / APWM2& d, V+ ]* f) p, c, M0 q  S# K) L
        ECAPPinMuxSetup(2);
' X0 u4 U. `9 K9 E+ V# S* t; N( l( D' O# t+ C7 @9 g
        // ECAP2 / APWM2方向设置为输入' y# C/ y6 A. v  w+ ^
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
! G7 L' ?2 V/ P0 F}
/ O# r. @9 @* l: U+ B- u- b: d' o2 V5 n; P, ?, \, ~" s
/****************************************************************************/9 D$ H' P1 P0 C  a
/*                                                                          */# M1 w: W" d6 b% N/ F8 s
/*              PWM 输出波形                                                */8 b- U' S; ?; c% N9 O7 S+ n; z
/*                                                                          */
' n, U6 m3 ?0 Q* \! m! u/****************************************************************************/
: r' i- ~3 u$ M5 Avoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 C2 ^8 Y! S/ q; `2 h' l{1 z. s$ ^0 |4 Z0 f' q3 ?' M4 u! c
    // 时间基准配置
+ g' b- f8 T- m    // 时钟配置" \1 d: E3 _6 c1 T& M1 p; G
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. u3 t& K/ k- A# S9 K2 }
7 ~- R6 R4 r. f9 X, E' R
    // 配置周期9 t2 w: j* q7 Z4 V0 \1 k! ~
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,: l  S6 s7 N- I0 t3 t. u# v% B; \
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);3 M4 f( ~" ^, j! N$ Y
. j* j$ X3 X) ^4 N0 f0 u, W
    // 禁用输入同步信号
6 d7 \/ N5 L. V    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);2 \# Z! x/ W- n4 ]7 x

! Y+ m( l' t% o, m3 l+ k    // 禁用输出同步信号/ S1 x$ K3 ]6 C2 G
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
9 a- j' E' Q  F! L* t5 m1 ^
, n7 F+ B. Q  k! S" v+ W4 ~    // 仿真(DEBUG)模式行为配置
7 T/ U9 c; p5 X2 R& |( V" W    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);2 m9 I5 }+ n8 f$ W+ t& y
( M' ?5 l/ q1 G/ E" W$ V( j
    // 配置计数比较器子模块
' v2 z# B+ |4 {* k    // 加载比较器 A 值. x0 s2 `  g, H! H9 M
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' o" L3 N" c) y9 x$ |
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- D; U) n# J9 d* B* s2 T- ?( J+ {; g0 Z5 P& `4 ^7 l& n% \) O# \# S
    // 加载比较器 B 值
6 x0 ^, g4 X/ ^* x, J. ]    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,, x# b4 T' t; i" D5 }
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 \) j4 c+ Q5 d7 ~* N( A& N8 D7 s! u! W$ q
    // 功能限定配置(输出引脚触发方式设定)
- a# c8 F4 j/ O1 t3 y    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
) P0 [' g( \1 i( G% _- _0 y    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,( ]2 ?* C' S4 [# J% H
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,: w3 }2 A8 K) l5 h8 Y
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
* u+ Z8 C9 [0 c# l" X1 G
) C' u5 C- g* I) H    // 禁用(旁路,信号直接输出到斩波子模块)死区模块7 W3 `0 y1 e2 ^, c) ?% S
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 u! i" j1 m: @6 }* G( O$ O& R( W$ g( ?" K# D
    // 禁用斩波子模块) Z; e$ X/ p# x3 N) {
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- I, z& a7 B" X3 p6 L3 Q  h7 e
) z: K  F, t# I  ~8 Q
    // 禁用错误控制事件
) U. Z( h; a/ u/ ]. D3 M% e! h    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ R% P8 L. W0 V/ [% b  F    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);2 a& A4 k% f! g' _9 }7 L/ t
: K. h( Z; ?: j7 M" {0 o7 k$ Z  Q7 u
    // 事件触发配置
- I8 f+ Z# z0 \+ w7 B    // 每三次事件发生产生中断
$ \$ [( e/ n4 p2 C    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 _& N- i- g+ E2 ?* A! f    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ `- ^# D7 \8 a. e2 x, Q
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
, U  q# ?# i7 n0 t& Z! n( X! z. e    // 使能中断
! T( M1 l: h1 j& t    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);/ ?+ D, c/ L3 G4 i4 Z1 b5 m* E
8 c' {1 R; ?" `8 S: \( s
    // 禁用高精度子模块
4 n5 y) Q; T: V5 m' I8 f/ n    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ y: ?/ l6 O# q+ r* ~/ k
( u& D# v) A3 t# ^+ p7 _    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);6 l9 {: l, R% j
}( x+ `4 Z& i# b" _5 p
1 e2 \, C6 ?/ P4 O& @
void ChopperWaveform(void)
5 {7 n$ I) N8 A1 A2 o5 T{& A4 \. F' h5 B7 c( n/ ^
    // 50% 占空比' s  n$ m# K, F8 ]
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
% z3 A2 F, U  B/ Y/ O+ e    // 4 分频2 i+ s% @" v; p) `# D* @+ j! J
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);4 x% @6 I0 n, p* n0 f/ r+ s$ o
    // 单个脉冲宽度; C8 b1 d! b" e& ~6 n8 C
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. U7 I; @( m$ N# h! K4 Z& L    // 使能斩波子模块
! ]- `( x7 v3 L    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);* f4 o- h5 T( ~1 G. C+ W+ V
}
2 j$ d5 F6 h% Z' I$ U
" J( _: T5 u7 O% w& q3 {" W/****************************************************************************/* D5 h8 ^, `6 C, m% K% g
/*                                                                          */% v+ w3 g0 k  R7 Q* |
/*              PWM 中断初始化                                              */8 u: A1 i4 J- a+ I4 m1 t
/*                                                                          */
# l( Q" \, Y. T- B/ m5 O' v, \/****************************************************************************/9 a/ }" G8 }9 r) e0 H3 `8 v
void PWMInterruptInit(void)5 |) c9 y* P0 U+ C; n2 |, ?, K$ h
{
9 N$ y5 w. |; z* B        // 注册中断服务函数
! c& c0 Z, Z, n' N& T) L        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 a1 V# [, r+ {- `* r3 E) h4 ]$ _
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% i! r0 H  j9 \, H+ u7 X$ A. e. x0 |) ~# a* {
        // 映射中断
# @7 M+ A$ o$ K" H0 S* h. h% ~        IntChannelSet(SYS_INT_EHRPWM1, 2);
4 ]6 G6 ~# l0 A& L5 \. E0 s        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: @( v5 C2 s; s  v- y6 ~  r# T2 \; ^' k
        // 使能中断* M# I% g  h  m% z" z" w7 H
        IntSystemEnable(SYS_INT_EHRPWM1);7 @8 Z( e( _! [+ `; o
        IntSystemEnable(SYS_INT_EHRPWM1TZ);6 a& ?) c) Q, e6 D$ N8 X
}
$ V& S- }; |. y: `3 S  p) n. P5 N2 \0 e" r
/****************************************************************************/) R9 b( i- g( k$ a" S, B
/*                                                                          */' C" y) o5 x( O" [- o$ m
/*              ARM 中断初始化                                              */
# i# Y! t$ }0 d8 l5 u/*                                                                          */& i% y' M* X8 q2 e# S, k
/****************************************************************************/+ `8 B  }# i! b: _
void InterruptInit(void)
" i4 b* r% [4 m/ _$ N; W{( J2 m. N9 ^) U3 N) |
        // 初始化 ARM 中断控制器7 G7 h0 q. j( s% d2 F% @
        IntAINTCInit();
* e( o& `% B+ ~5 H2 M
# o; P2 I4 r- d9 v        // 使能 IRQ(CPSR)' M5 V- a6 c' O& u
        IntMasterIRQEnable();
5 Y& z  K8 O0 A8 e: N" X! ?; Y: d% Z. g3 i6 S" a( }* N
        // 使能中断(AINTC GER)3 a2 l7 ^- U! w. L0 J
        IntGlobalEnable();
$ K7 s& W& f4 {. \: P% J" N4 p4 _% \. K- _) e6 F
        // 使能中断(AINTC HIER). N7 I( K+ F9 g' \3 @
        IntIRQEnable();
0 j% I, s  Q' Z* I}
, p/ w9 e/ m+ F$ j; q  B3 k. Z1 b$ T5 x- |+ D+ y- h7 q# [

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
2 ~# _+ h7 E  T& y& Q9 U9 G/*                                                                          */0 h1 `% ?, U" H, r0 {, q; T
/*              中断服务函数                                                */
4 Q; S/ R$ H$ B3 w+ |5 q; u/*                                                                          */# U8 L) L( G# @+ B" I( x
/****************************************************************************/! O3 ?6 J5 v4 c, |- [5 o) Z( F
void PWMEventIsr(void)8 m5 h  R  }& Y) ^
{
( Y/ W- ^8 [* X        IntSystemStatusClear(SYS_INT_EHRPWM1);
# k( c$ r+ j7 m5 O# I0 x1 G" S2 \! h& K$ s3 F
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
$ j, O+ q9 Q. n$ C: g}) w4 R. O% r1 t; h4 m. R7 Z. R

  F7 N* s& _5 L# X, evoid PWMTZIsr(void)
6 b6 n& Y' C' y/ o2 Z9 i( C3 g{
. [: E- ~& X& \9 a        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);- i# Q, F6 B$ P8 Y$ Z# Y

% _( i/ w$ w" V' ]: m    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
$ F( @6 d5 P9 V}9 N8 H/ R7 q5 Y- c( d6 Y% y

: J& w% H2 c) @7 V/****************************************************************************/+ Q& g) d) @8 Q! D* w  \4 K+ z, q
/*                                                                          */
9 z7 v+ y  f% \" a6 D/*              初始化捕获模块                                              */  u( y6 m6 |6 ]6 N- B
/*                                                                          */
6 k2 o2 _. L0 G' A- H  `, I/****************************************************************************/
2 h, a( ?5 V% k: k& p$ F" l4 `- dvoid ECAPInit(void): W$ z# D2 T3 _" G8 i: y# P5 h
{
+ j( }# K3 O0 d6 R; T        /*-----设置 ECCTL1-----*/
4 p% M; e9 s4 t# _0 m        // 使能CAP寄存器装载. |4 V  Z5 {! ^: `
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);8 s  T9 ?5 z  r; k9 r0 @; ^
        // 设置预分频值.
0 K$ N, u4 p: ~% D0 J3 G$ T        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);4 ?7 R" h1 K8 D5 k6 c, @  h
        // 上升沿触发捕获事件2 r0 A- C% C* j1 Z
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" ?7 E  j* ^( y, y+ w0 H) x, H        // 输入捕获后重新装载计数器值.2 c& D/ S0 y0 j/ ~) J; V
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);6 I- T3 a9 j8 j8 x4 z! o5 F& j" p- Q
: P: I4 n! o& Z+ Z3 {/ }
        /*-----设置 ECCTL2-----*/* X" n# w  }9 k+ U/ v  Q1 q+ w
        // 连续模式
* I- ]: W6 w1 A1 j6 |8 }        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# }) b) S0 Y( a        // ECAP计数器TSCTR持续计数
4 T- G$ O% Y+ [! }% J        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: R+ J/ F  z+ ?- j+ i0 e        // 禁用同步输出和同步输入
4 ?2 z9 B; t7 l0 F' O        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, |- c' D0 z' q7 s        // 配置 ECAP 2 为 CAPTURE 模式
4 c8 y: F& E# n        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 y, ]( L7 ~& k2 b) t' |1 Q
5 a# t. _, k' s        // 使能中断
: l9 {3 w" w3 x//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);1 \0 H% O2 F1 q3 m9 f: h
}' d$ K0 `" E0 n
/ d2 g$ [  q3 t8 ?: u/ b) T
/****************************************************************************/: z/ i3 L+ f) {: f2 n9 k3 ^
/*                                                                          */1 G) t, G. S; ]; h9 }& w
/*              取得捕获结果                                                */' b+ ^. H& l2 Q7 x  T
/*                                                                          */2 @. X3 f; P- T1 I3 z  Z2 D: d
/****************************************************************************/1 T- G' p! p3 u: z, _$ z6 h4 A8 @7 {
unsigned int ECAPRead(void)
) Y& ~3 R# n1 a  V# Y! ?{* Z. g- H* J' F7 I5 u$ Y
        unsigned int capvalue;
! o  V5 J- t- _8 ?. R) m7 h) U        unsigned long frequency;
6 B) l0 W, G; F! W( n
; J/ v, q/ T+ t9 ~: N3 g        // Event1 中断标志( J: j* O& O( y- i9 c
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))* i: ^+ {9 {' ?4 z7 D
        {
5 q4 g$ P$ J9 d5 N! P) c; `. h; j                // 取得捕获计数! Z* O( }% ?5 C" `7 [4 G" Z
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);8 j/ Z' w! X( f- ?, g* W) w5 Q
                capvalue = ECAPResult.cap1;( E) G/ a2 {. G1 m! X! I) K& y7 d

1 x! M5 Q; Y$ I1 g, }- Q4 }                // CAPTRUE 模块 228M 时钟主频
# `' O4 o3 z& x( d4 E4 o$ V                frequency  =  228000000/capvalue;5 I* Q: \( @; v- N$ q: l. H  A
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);2 ~! |) M! S+ Y7 q: E
; d( X7 D( |; T9 D
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
7 Q" \0 x0 U8 V5 f6 G" m6 G+ |//                IntEventClear(SYS_INT_ECAP2);
" p) I) f/ v9 J: V# Y3 @9 F        }
5 P! I# F' O7 j. n3 O        return frequency;1 N% M; L! ]2 ?
}
) {, U$ O" }& N5 S9 _
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; R7 M" p  ^9 A[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