嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家, i6 F* I7 d% V' |/ [( }9 `' i

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  V; K4 R7 ]3 J, t
/*                                                                          */. h9 M, i* k* T6 D) S* J0 e
/*              宏定义                                                      */
  h. z- b1 s: P. }& ^0 E/*                                                                          */
  b# B  G* B* ^/****************************************************************************/
: S# V6 a  ]. g. ?7 b" s9 ^// 软件断点
2 g3 ^5 W% H" [: p#define SW_BREAKPOINT     asm(" SWBP 0 ");
' K! Y* |/ m$ {# ]  {" ^  n0 D2 M1 a, S" q( M2 H2 h( F) Q
// 时钟分频' J$ Y: b. K2 \2 x% g7 E
#define CLOCK_DIV_VAL     2285 f8 S$ V  w  e8 p7 J* r1 y

8 ?3 a  @( q3 a+ f9 i" c' }* N/****************************************************************************/3 D0 Y4 g2 D' P  e  t" W* n; E
/*                                                                          */; N4 l9 }: s' l& R: n
/*              全局变量                                                    */2 i3 @; D" k( L( A- g- X8 f- ]
/*                                                                          */; X# T9 Q1 {" j/ Z
/****************************************************************************/
  Q2 _2 o1 ~" o8 L# iECAPCONTEXT ECAPResult;
( G- v, t/ ?) o7 ?$ q# }) Y: ^& A( U$ G" c
/****************************************************************************/
, {  {- W+ Y' g; P- r/*                                                                          */
$ {7 }, ?3 q  P/ ?/*              函数声明                                                    */
3 b  `, N( o) S* _/*                                                                          */
; i6 D1 c4 X, t& u/****************************************************************************/2 ?: j$ t0 T9 A) G
// 外设使能配置
7 N; |; O9 @* \# E8 e  ~# kvoid PSCInit(void);) o. F7 I/ y; z# }

" K3 |9 i; Y3 z0 C. ^- ]5 |" u// GPIO 管脚复用配置
2 @; Z' A6 u2 ovoid GPIOBankPinMuxSet();9 H8 F, v( v& k7 [
; r8 k* J; G: k2 T; s; B
// 产生波形3 V7 s7 S( z) }% W6 n4 r( k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);1 S# W+ W" x* r3 m" O5 E% ^
void ChopperWaveform(void);, @8 ?4 M) @: b4 t1 g6 w  T9 U
7 G2 z! |$ Q5 g' Q
// ECAP初始化和读函数4 j$ j0 v5 X! ?" I7 x; Y3 d
void ECAPInit(void);
2 U# R9 B& v- w& \6 ?unsigned int ECAPRead(void);  D6 P; R4 v( W/ L6 ]  I

/ H- x$ G5 B% x, I# X//ARM 中断初始化3 o# o+ t* m) W& H5 ^2 k
void InterruptInit(void);
% K/ S5 b( Y* `% K6 J) V1 k- o2 T+ `/ v- w* R8 T9 j/ o' q7 S2 \
// PWM 中断初始化
# v4 F1 {& b4 ~) G& R+ kvoid PWMInterruptInit(void);
2 l5 {3 l$ e$ U  b8 D7 `, l9 J0 X// 中断服务函数% S5 v9 k0 o! I5 w+ U5 f
// PWM 事件
5 f/ ]8 b' A5 V# x5 D  Hvoid PWMEventIsr(void);$ B. }1 ]; H' A  |2 K
// PWM 错误控制事件
" g/ c* q9 g2 L6 r6 T& N7 ^5 mvoid PWMTZIsr(void);5 j2 o/ B: i  b; o: }1 v& A
) i* o: ~4 T5 J& {) Q& t5 X+ ^6 i$ `' a
/****************************************************************************/" ~6 c, C" ?: Y
/*                                                                          */: `+ F& z0 D- F  q7 x
/*              主函数                                                      */
  l& s/ W  s. D, F7 p$ b/*                                                                          */" C& \( J0 |# ?. B* ~5 A5 U9 }
/****************************************************************************/# `$ m2 S$ U: }: ^3 J
int main(void)# a3 `: I' i- _4 w- b
{
6 J, x7 O  @4 n        // 外设使能配置
1 B: V# y% w& y% B' s        PSCInit();
9 Q7 F  Q* V* ]; U7 W5 T; G9 z, Y) ]5 p; n0 X. p
        // 初始化串口终端 使用串口2
4 p* r' [3 r; k        UARTStdioInit();( J  S# k( k0 {1 g$ h% {( k+ `
        9 `  y4 Q8 |3 J* M
        // GPIO 管脚复用配置
) {  \8 e3 |& c& G* e" y3 t7 z# t        GPIOBankPinMuxSet();1 f+ V8 {. H# C/ V$ x' @" b

& i7 A& A3 x6 p" O' ^4 z6 G        // ARM 中断初始化# l; j" ?7 _2 L: ?$ H
        InterruptInit();9 L8 E6 Q7 p0 `9 q- K3 |8 x& j5 t. p

; L. G2 n; |4 G; W9 a2 Q        // PWM 中断初始化8 ^+ ^  V2 X; V4 _1 b8 w- I
        PWMInterruptInit();
; o- }! N! K8 i8 Q( D( a4 }. g( L
        unsigned char i;
# q: _% V  K5 R7 J7 k% a        unsigned int j;
7 x5 O* M& S& R0 H2 d
+ P/ a/ Z8 j! [1 O3 x1 f. z        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ d3 l9 F8 o) s$ |        UARTPuts("------------------------------------------------------------\r\n", -1);! k2 D& H0 K" _8 ^; J
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);. l$ N8 Q4 l- D4 b/ R
        // 产生波形! S/ E- ^: m- }8 V9 d
        PWM1ABasic(25000,50);
" U( p' |- i! K% v' R
, y2 h8 U! I% q& c& `( p        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);) H4 R* p) {3 ~1 g# {6 g( j
        UARTPuts("------------------------------------------------------------\r\n", -1);0 x3 B! {8 o6 u, z5 {7 h& B! i
$ X4 v7 z3 I& i- c4 c2 ~6 ~" K& d

+ u& ]( \. [( N4 X: Y' f
- e* ~; G  |$ c+ c# F  i5 Y. e        UARTPuts("------------------------------------------------------------\r\n", -1);8 F( U8 o/ d" r( @6 f
        UARTPuts("                    C6748 ECAP Test\r\n", -1);+ {. M8 S; U  U7 J! u- a
        // ECAP 捕获初始化
$ n8 T& J. U9 k# O' w! v/ X7 e. \        ECAPInit();
$ [6 n- O6 S: ^) s1 W' q! h# ?9 Q3 g        UARTPuts("Initialize ECAP.......\r\n",-1);/ _: |) H0 K% a& Q& F
        for(i=0;i<5;i++)
2 O) }1 u& D$ @- A# y. ^        {6 a9 H- x1 h* {/ @
                    for(j=0x00FFFFFF;j>0;j--);            // 延时9 Z  j: v2 }, j. y& Q5 Y- _
                    ECAPRead();
8 \; f8 \/ h1 I$ h        }# |( W: ?# o$ J: q
        UARTPuts("\r\n",-1);
: p( S( P5 N) ?1 v* r1 g        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
" r% L& r$ i5 |5 ?1 d/ j        UARTPuts("------------------------------------------------------------\r\n", -1);
& k: C( D+ o/ j# j: M+ G$ d  s4 [$ X4 U* s, h) y
        // 主循环. V* l" l  A1 I
        for(;;)2 h. z/ r! Z3 z9 ]. E
        {
0 L( c  s& N1 e. C  \" m
/ |1 t3 @* k0 b& `$ O& V5 Q! F        }( \# [+ i+ N# e
}
- ]. l: b* s! H' B4 K3 i1 b: G) S
7 H, o& j5 ]' e4 `/****************************************************************************/
' o) V( e/ ^& f( X. x/*                                                                          */7 W' I' P6 b( T
/*              PSC 初始化                                                  */, m6 U( B6 }1 r$ c
/*                                                                          */( ?& z. p6 B" Z7 b1 [! g" D
/****************************************************************************/
+ y* `2 ?- q! G0 Cvoid PSCInit(void)& B# a& V6 n% I: q/ y9 i: H7 w
{$ a6 ?8 B# P# D0 n& b
        // 使能  EHRPWM 和 ECAP 模块# z/ X- d5 r& B8 e$ x( m" G
        // 对相应外设模块的使能也可以在 BootLoader 中完成2 P1 \% q( N% q: z2 F" T/ {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; q8 ?; v% {9 J1 n
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);  R; M# K. o/ J
}
5 `4 J/ I4 k. Y/ O+ O
2 m2 x0 c8 R% p  ^+ ^/****************************************************************************/
9 Q5 r2 _# c8 C* O( ]/*                                                                          */
1 a5 c! ^' k# f/ n  h) C0 w* e' |/*              GPIO 管脚复用配置                                           */" u% p6 r  G" T& }# @9 g) J
/*                                                                          */0 C, t* G# l7 \. Q! k% `
/****************************************************************************/
9 Y  C7 \6 G+ Z7 Zvoid GPIOBankPinMuxSet(void)
4 b4 }* J6 m6 g3 V5 U+ X5 k2 O{( F7 S9 f) S# v: `, E0 _
        EHRPWM1PinMuxSetup();8 L# W3 m0 ]# \; y! w) S8 j
* v; l2 R1 w( `! o; A+ a
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
7 @  s8 W0 g" p8 @. \- f1 |% M        // 作为捕获功能时管脚方向为输入
4 v5 @. k7 x( @5 ^# ?- j9 b* B        // 作为辅助脉宽调制时管脚方向为输出$ c% A# D$ p' N% c) E" E1 k
    // ECAP2 / APWM2
! _2 E4 f9 F& O        ECAPPinMuxSetup(2);
. o' c5 `$ \9 x, e9 u% L6 A3 p2 {$ j3 \0 {$ U
        // ECAP2 / APWM2方向设置为输入& u8 t# |, j- d* J& v* `" O
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]6 x- D1 }. D/ w1 S
}# R! C, C  T# G: G) T
% E5 {" V/ `( B- Q4 N
/****************************************************************************/( U& [& h$ L& l( t. a) W/ c
/*                                                                          */# w, O; T; c7 p! s
/*              PWM 输出波形                                                *// T6 g% w" \' X8 q7 w8 x/ ~
/*                                                                          */
/ D1 k9 s0 n5 g- s/****************************************************************************/
' a& X4 ]! L$ D1 |) A0 e. Jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( E+ E* o- k8 j' k
{: a, b6 y9 B* @9 j
    // 时间基准配置& y6 X% J3 L, K6 b9 @; v
    // 时钟配置! J# W2 i0 ^7 h7 D; g
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);; R3 ]. _5 ]' [* u) i

6 R! Z- Q" t1 R+ t) I9 Z    // 配置周期' x& [/ i- k2 J2 ?% ?0 k9 u5 i6 G
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 J, a1 S& T" ~4 R                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);( x: C- R. B) x) J% }$ b# o7 N/ _

9 F3 N! `9 ~6 m/ Y  @; g    // 禁用输入同步信号7 W: V6 k' I' ^! Y0 i+ k
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);1 C, |$ N6 C+ C5 |5 W7 J0 n
% Z- s$ h, V" y* s1 l
    // 禁用输出同步信号
/ p; f7 o( L: ^0 c* [    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. S2 ]+ p# e2 ?8 ~  y7 G
0 X) ]) m. s9 K( s8 A
    // 仿真(DEBUG)模式行为配置0 \6 E6 w7 S$ l& L7 c' E+ v7 B
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" _9 j7 y* ?3 a* Y
! y  D! `- @0 v1 |    // 配置计数比较器子模块
: S, J, f6 `6 J8 ?    // 加载比较器 A 值
% f* z  h3 Q* m, Z( o, V    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 p2 r6 Y) z  ]( N
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- {" ?  L! s$ F) }7 T; @3 f- X4 y) n4 k
    // 加载比较器 B 值
4 a, q' b, L: T/ N1 v8 I    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: T0 \1 }# O9 R, Z. b
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ `$ q. ?8 A; ?$ L6 t
7 E1 t7 k/ ?( K8 n7 K8 x
    // 功能限定配置(输出引脚触发方式设定)
9 N, I+ e. |: E( d/ U" u9 i    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 u+ w- S3 r2 q2 v. T1 y6 P$ M    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 Q  Q0 \+ @, p( M                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! i, z7 j6 |! z9 i9 v                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);+ O/ n8 \, ^5 k8 @' c% s* P

, a) a4 c2 f$ d+ F- k7 l( p) f    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 K  S6 x2 Z! R8 j1 `    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" U+ w2 h- |* E
% r1 d% ]  l  V* m    // 禁用斩波子模块
5 C7 E, k0 U, D6 i    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 |& A2 H: ~# M9 U( t1 k+ F7 I( M8 j2 l8 T4 C
    // 禁用错误控制事件1 f6 A8 l' p2 P
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 v) b% @# Q! o# |1 I    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);6 Z1 h6 F- C* t: ?! E

# G# m8 ^2 W0 v9 J7 u    // 事件触发配置
4 e" @  Z9 U  L$ O( ^( E$ @8 F2 I) M    // 每三次事件发生产生中断! L* q0 O" r. y( j4 `2 `9 {/ ^
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 T$ n# S) f$ u5 d6 n, U) N    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 m8 P7 g6 D; Q$ s
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 C7 |8 Z. Y- r' V- M    // 使能中断% p. ^! E0 S9 u* O/ V4 e2 q! ?% I
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);. q2 {. o0 ~- I4 t( L; `1 q
6 [: k" `# S% t& K7 P0 h& i
    // 禁用高精度子模块5 O1 m7 o  U0 @+ X  Y1 Z4 l
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);. p! b6 H1 F) Z8 P. O# U
0 P: i) v+ Y7 ]4 j
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ @. g) r. \( o. p/ t}
5 `0 U3 Z& [* V- n
/ }/ g4 B% _) |void ChopperWaveform(void)+ k+ u- P  H; ~4 q
{
- t) p" r& V+ `) E- p4 f5 G; V# z    // 50% 占空比7 \9 L0 D6 J5 a/ N
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ P  z# h- s! w2 Z" p    // 4 分频
5 s+ c5 p( D* ~2 y8 {+ H+ J9 W    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);, H7 U! `- a: U) f/ n2 [$ i* D# F7 R: _
    // 单个脉冲宽度! S, z6 h; p* g6 [  _
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);0 Z, }, E7 A, }6 A" D" p5 U
    // 使能斩波子模块; n2 o6 N& J# a7 {/ s2 b
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);+ [% L) J) l% w+ z* E" t" R2 C
}- o  H- C" ^! y' Z+ T. U7 ^3 @
# d3 X; L% N; J) ?9 m
/****************************************************************************/2 f% E- _5 x9 d+ [& H$ e
/*                                                                          */# G  c+ I6 p- s
/*              PWM 中断初始化                                              */1 I0 `$ }9 Z: ~. x
/*                                                                          */# h6 B; ]0 [, _0 B  |; }: T& m
/****************************************************************************/: ]1 u' r, ]/ S" d" ?
void PWMInterruptInit(void)9 _! a7 f8 ?4 C7 R- z/ X
{
8 S3 u+ d% \1 I, R# u' ]" b% B* D( u        // 注册中断服务函数
# T3 k/ r' D$ U- k+ A. D2 Q+ c0 @        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 w& R' |0 l8 m8 P* ^9 L$ V        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);+ U+ L& O6 G/ W. C; J3 |9 h; N

' X& `* W" U% L$ M) z: P9 n: ]        // 映射中断
" i8 |: K1 U. h! K  M& n: p        IntChannelSet(SYS_INT_EHRPWM1, 2);6 s" w, Q! l7 K  x7 a' z& Z
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);" V* W! F4 {  Z, Z/ l

1 o3 W2 u) U- R5 H0 R3 L$ p        // 使能中断
( \; h8 y  G& E1 U5 W+ k5 r" O        IntSystemEnable(SYS_INT_EHRPWM1);
# A) i2 b- g$ M4 ]6 G7 H        IntSystemEnable(SYS_INT_EHRPWM1TZ);, U0 @# }/ M7 p7 Y! S# \8 x! O; c" ^* u
}
# G, W: c) Y3 C2 w# l
# {: M  W6 x3 }/****************************************************************************/
+ O3 X& J8 w6 Q- S3 Q/*                                                                          */
0 m1 K# ]5 S1 X3 H( G/*              ARM 中断初始化                                              */
1 q: e: J+ y+ o) ?0 p/*                                                                          */3 l; W: ]$ Q" e
/****************************************************************************/  @# b& V7 I1 d3 T" w" E! O/ _9 I9 N
void InterruptInit(void)
* o. }* y+ r1 W8 C& a8 o0 W" X: g; e{3 Q0 }- p4 L/ Z' p6 r8 K
        // 初始化 ARM 中断控制器
6 a# M7 c" m0 o5 ~- h) r        IntAINTCInit();# I# _- f- u- z! F; _$ ?1 P. ?

) {+ u& j2 t' U9 ?, D: \" o- _$ X2 ?        // 使能 IRQ(CPSR)
' K# U" P1 w7 D: [. [        IntMasterIRQEnable();$ U3 a  W. Y; @1 I- b9 {) Z1 z

. V+ i* s+ E4 W# T! p7 U$ o9 W        // 使能中断(AINTC GER)6 i3 A) }0 P* S0 a6 c' M
        IntGlobalEnable();8 R0 }7 `. N5 L% P$ E

% a" W9 @; y7 _5 T5 w: x        // 使能中断(AINTC HIER)8 ?# I; X& z+ ?  h9 \2 q6 x3 d
        IntIRQEnable();
6 U" }: o3 k2 k" m) ~+ k* z}
) j$ [; `9 W. i( H/ W- D% B, b) M; n8 l8 Z% k- O

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" M1 @/ T! S0 P' |. H: q7 a
/*                                                                          */
/ K' n" L* y3 B0 L$ e  o0 x/*              中断服务函数                                                */
6 e" `) C; V- f2 O1 f  x: {7 {/*                                                                          */# H, l/ h4 R; d6 E( S  M+ k4 F3 Z" J
/****************************************************************************/
) h6 a" _2 z8 T5 K, C) L: evoid PWMEventIsr(void)  h* o/ h' |* \- X2 k0 v0 V
{' p$ ]- s/ P' [8 O1 z) R6 C7 Y
        IntSystemStatusClear(SYS_INT_EHRPWM1);2 W$ b" u3 c2 [& F
' _& S2 H& _3 v* Y4 U
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);( ?% j& Q0 c2 f/ G" }1 P  S: j3 ^
}
. u- E( F3 U6 A" A4 |/ z4 _! ]: n, T2 Z( K
void PWMTZIsr(void), v3 i5 y, J5 y
{0 }# \& D3 f; |. _# M4 m+ `
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);6 q0 W. T0 V! C- Z5 a0 N+ r
' J9 o5 M3 G1 \8 I- L) E2 z
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);) Y; O; a8 d# T  g- w/ e. G  i
}" E$ \- V+ X8 W

2 R( L5 b7 g9 I3 U( j2 a4 g$ q/****************************************************************************/
, p+ w) o0 a  a+ u. L/*                                                                          */6 m8 v: S- j1 m. h6 [
/*              初始化捕获模块                                              */
. Z& Z6 F  D( ~- |6 I/*                                                                          */
- z" Z: k/ E- l, L/****************************************************************************/8 K1 c1 ]6 F( B5 _3 ^' `: q) h
void ECAPInit(void)
: X. x' Y8 ~- n3 d- i{6 L0 x; e7 g# e, \
        /*-----设置 ECCTL1-----*/
* |5 O' Q! n& G% I' ~        // 使能CAP寄存器装载
: m6 c- M" b+ ]3 ]; f/ }        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
5 @/ I6 m  u8 E. P. H, O. A        // 设置预分频值.  X+ n. m: z* o$ |" `$ Y6 A2 j
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);: ?. `2 i; P0 @
        // 上升沿触发捕获事件: Z$ W6 O, ^$ f
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" r, H2 U* t% B& M: ?        // 输入捕获后重新装载计数器值., Q% R' h$ S4 y7 K- ]/ c9 ?6 T
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
  [9 F) J7 {8 D+ U1 k) J) e) B9 s( h6 ?
        /*-----设置 ECCTL2-----*/
& P0 V! ], V$ k4 V' H8 G2 s        // 连续模式
' U' U7 S0 Q! `, P3 W6 e        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, _! o5 N1 }5 b2 |' f        // ECAP计数器TSCTR持续计数
& Y4 g' n* K- x7 H5 r( \- ~& k        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 z. ^4 B, x3 u" j8 O        // 禁用同步输出和同步输入% S( [$ y6 G1 B  D* B; m$ g, z
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);! X: D4 C0 h7 k: r) m8 L
        // 配置 ECAP 2 为 CAPTURE 模式
+ ^0 d3 \- s$ N* }+ L3 h, p        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 ~1 w' r! ~4 A7 @( y
1 n9 B. O" m# R" x        // 使能中断
- w0 f. K1 W/ Q* y7 D/ f, S7 _; j//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);1 Y' k+ c5 q: a. f) {! }
}
& C* N, D7 ^3 a( H% C! \' `$ R
1 ]. g! f2 q$ [0 C2 q( ?/****************************************************************************/0 C# r9 T' y# w6 k: ?
/*                                                                          */! G9 q8 i: \" {! O
/*              取得捕获结果                                                */* y; c3 F" `) a& w
/*                                                                          */+ w  V( j7 \' J* f& _5 e
/****************************************************************************/
& V( D% ^7 z# b) l& Cunsigned int ECAPRead(void)
- I' E+ O% q$ n. r3 w5 F{
& r( Y, \! |5 Z        unsigned int capvalue;
; Q( {+ q2 m& @9 D. }. J; S. [! t        unsigned long frequency;' U) J# {" {0 F' K) q
. Q, N/ |8 ]+ j- K
        // Event1 中断标志
- ^, p' q( @" Y: T  G        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
) ]" j1 b5 ]3 \6 _4 c% \) S        {
+ [  [3 j" A& A' N+ R                // 取得捕获计数, g1 M1 h& }! N1 E* B1 M
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 E6 R% y5 G5 M2 h; j1 c                capvalue = ECAPResult.cap1;( [+ Z  \$ ~, K: f
5 d$ d. F( a; |0 b+ \9 a6 I, L
                // CAPTRUE 模块 228M 时钟主频8 \& k2 x2 w0 b
                frequency  =  228000000/capvalue;" Q1 r, \0 u( h1 u3 f
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
- O7 S4 ~, r2 h9 u' y2 S+ O; k" I3 m. w& |; ?5 Q
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: z/ ?7 V$ f, H  j//                IntEventClear(SYS_INT_ECAP2);
( [) L# j/ [% M# c! O  Z& G        }
) M: l1 u, t$ y& q* y; J        return frequency;
% u# [- Z, E1 _7 Q8 ]; N; V}
; k) C9 ]0 a& N- w4 R
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。( |& S7 e- i0 ?% N1 {
[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