嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家2 S) b; j0 @6 z

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/% F$ H3 G9 d7 r! `" w$ U
/*                                                                          */
- K' K9 A6 A& w: a# W2 b6 w; y/*              宏定义                                                      */6 w( G2 [1 U+ ~$ h- [
/*                                                                          */
1 k4 {. |5 y% }/****************************************************************************/
6 E& }& U/ d. H2 G// 软件断点
! d, F. @* ^9 k# R5 p* J. h#define SW_BREAKPOINT     asm(" SWBP 0 ");* O% s# B) \9 N7 V5 Y3 S7 _
" g+ I+ R4 Q  u
// 时钟分频
: q' v0 a+ F' W, p% }8 R' F#define CLOCK_DIV_VAL     2282 w/ w0 [& G- L0 T
: A: W1 W3 ?1 I* a% G: \6 j
/****************************************************************************/
2 p! ]/ [$ L, O3 k+ v" f, k- m/*                                                                          */
9 r- o3 q1 p1 g+ r" g$ |2 h/*              全局变量                                                    *// }; t2 o1 l+ D% G5 w' ^
/*                                                                          */9 u) m5 Z% X) _# |) |' h# O
/****************************************************************************/
7 e( o" Y- O$ }  E: A$ rECAPCONTEXT ECAPResult;' b- t- X- M; E- j: b9 I

7 n! B! F9 B) o, e/****************************************************************************/9 n  B1 N+ I; m4 ]
/*                                                                          */
3 L# {. q* o# l, E$ \. y/*              函数声明                                                    */
/ n5 t; k' `/ `, Z5 X- I! ], q/*                                                                          */4 C$ c. h" H. a& d* W
/****************************************************************************/8 T" q2 n* p6 Q7 j! A, Q
// 外设使能配置
* p5 [2 ^2 m' H8 s. _void PSCInit(void);- a) W, n  j/ L( }
) ?/ U9 ^9 T5 n3 b4 P0 Y5 h
// GPIO 管脚复用配置3 }) E6 q( V: ], X
void GPIOBankPinMuxSet();" u) V% L4 D' S* t6 _+ S' \/ z

  O- |8 T3 M" u6 E, c- B// 产生波形
3 o* L; h+ N& Z3 uvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; m0 |4 x+ E. uvoid ChopperWaveform(void);& |" b/ |! {7 ?7 z+ _& A# Q

; |$ ~. Z/ P" _: @; Y7 }// ECAP初始化和读函数* a9 n1 w) T1 |4 K
void ECAPInit(void);+ p9 M1 M: e( ?4 p- _
unsigned int ECAPRead(void);
- b1 P" `) t. d+ R, b. j9 t( D# E: l( D/ x4 u
//ARM 中断初始化
& B  X! Q/ n" @. Z5 x9 ?void InterruptInit(void);
% q! y1 ]- C6 ~
9 x  m! G! ^% w0 a4 K8 H4 K// PWM 中断初始化
7 B' }3 R" {- m- {' \void PWMInterruptInit(void);
2 z# m6 x/ d# e$ t( r// 中断服务函数
! R, R/ A( [) G2 u: }( y6 l// PWM 事件8 G: ^: d' W" v) l  J
void PWMEventIsr(void);
8 j0 s; U+ J/ n- y" R2 a// PWM 错误控制事件2 L2 q+ a; Q" y; v( G% O
void PWMTZIsr(void);
& K- t' e  r% [4 A/ m' T: B! B4 t. _+ x( z( M, @
/****************************************************************************/
' @7 [5 L. B3 ~! _/*                                                                          */
: M2 ]. o! D8 n3 F, m/*              主函数                                                      */7 T( _1 j" `5 D
/*                                                                          */
& T! U. u! T7 T) P/****************************************************************************/! l1 ^4 n" N" z) D2 K* h
int main(void)
- |8 U1 ^$ y4 z9 n8 B0 l8 ?7 i{1 m# c6 D( W8 U( v$ ]4 @; j/ a
        // 外设使能配置
3 \9 |2 o$ [# Q) S9 S% Q        PSCInit();% C+ v3 K6 c8 a* y% M; ?. I5 x/ Q
# G8 l0 }2 T. B8 `
        // 初始化串口终端 使用串口2$ I+ G; s' z5 X5 H, M, g4 l& a+ v
        UARTStdioInit();* H  R7 ^- M. r
        1 `1 G# o6 X' X
        // GPIO 管脚复用配置! X" h7 U/ ~; {- H  M: _
        GPIOBankPinMuxSet();# N& E* }. A  ]/ `3 V

- J( R  O( R* d        // ARM 中断初始化
5 B7 v) m3 x8 j6 ?. }( {        InterruptInit();8 u+ H% Y, A2 q% e, }
4 c' v1 i5 R) ?: D
        // PWM 中断初始化9 [1 {/ Q, F( e3 e( L
        PWMInterruptInit();
7 B2 U- B8 O2 }1 \3 E* ?7 K5 H' @% u0 E" B# H& o, j
        unsigned char i;- a5 r" h6 P3 l) I
        unsigned int j;
. q6 B$ X: y# W6 w" e- G' [; G+ a5 z3 f0 A1 E
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);; W! ?! e3 t" x- z. e( C( I0 A
        UARTPuts("------------------------------------------------------------\r\n", -1);
: u6 I3 v$ b: [1 F8 w        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ B" q; P" J" {        // 产生波形
0 j9 S- b8 T4 X3 C4 y2 w        PWM1ABasic(25000,50);
4 N& \7 A8 B, m  J2 s% Z$ ?# _9 q. g) v4 \" H5 L# x4 n
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
3 Q7 j* `9 u- n9 [        UARTPuts("------------------------------------------------------------\r\n", -1);
4 S7 I4 z$ J; B/ f3 `
2 D4 c) q7 X9 a4 w; Z$ |% C9 k
7 j( f: R6 G: E; _
- X2 c* m( h8 b( P( i* q5 ^7 v: x        UARTPuts("------------------------------------------------------------\r\n", -1);, _/ b/ _' D# Q5 q
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
- o, t, w; U' z        // ECAP 捕获初始化. c2 \! \7 f& l6 E/ {  B: D
        ECAPInit();
6 }+ D- t8 b2 B6 F  Y        UARTPuts("Initialize ECAP.......\r\n",-1);
9 ~0 w9 P) r/ D: B! z        for(i=0;i<5;i++)# ^8 t. i' n0 ~0 a5 W7 V& m
        {% G0 Q! V4 U; t* d3 d
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
5 v( w+ p# H; }# f1 n# m9 H                    ECAPRead();! _; j2 R- U0 p/ M& q$ a
        }
! T* N# Y" j  H        UARTPuts("\r\n",-1);
0 A9 N# @4 o% L/ Z+ Y3 Z) ^        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
3 _6 J, \* R0 ^7 W5 |. b        UARTPuts("------------------------------------------------------------\r\n", -1);
- `5 x# [6 Z$ T: ^) F( H
6 k" F0 F) B$ r0 G* e! ^        // 主循环
" o/ F5 g& y0 J7 a; \1 y        for(;;)" v9 A+ K8 i9 {/ B9 Z% @$ U: X
        {% X# W$ b. P6 K" d- S

: H& @% W4 j. e4 t5 I0 {        }
2 L+ E' J4 j+ c8 m}
  k( _% [1 a) c9 R+ t* N8 p# Y& x2 Z  V3 v, D/ {* j7 U
/****************************************************************************/
& H5 }7 Z9 x& ]9 y' @) ^/*                                                                          */
5 R4 f4 P0 B9 B2 S( }9 W/*              PSC 初始化                                                  */
% |& ?; e- m- J2 V$ U& |( W$ H/ N7 H/*                                                                          *// F6 a" v: I( R. _* Q5 s
/****************************************************************************/
; Z' ?+ [# t8 x" Nvoid PSCInit(void)
5 V2 u+ i+ ~* e3 L$ ~9 ~{
& u2 T  J: `; C9 }' G        // 使能  EHRPWM 和 ECAP 模块
; M* a) ~$ E$ q        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 P. w& V# b0 N; U    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- _. J7 ?* B- k* r. v
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 R0 q& |4 I2 i  O2 O1 A
}
: z# T- K# j1 _, ^
6 h% o/ y7 r. A2 k3 j4 F5 e% c/****************************************************************************/
7 ?6 a. f! |: \  f0 a1 X/ l/*                                                                          */3 S% m. C1 @& F# A( u$ T
/*              GPIO 管脚复用配置                                           */# m* y+ J+ y) w- I1 @  U) P
/*                                                                          */% {+ K. \' ~' [9 ^# A: a7 z
/****************************************************************************/4 t: a$ w: H8 R$ Z# b
void GPIOBankPinMuxSet(void)3 S8 ^- M) [; Z* O" c. w6 L
{
; J# I: F9 \2 X. m* _# E5 P        EHRPWM1PinMuxSetup();: Z% ]$ I( Z2 i
  Y" f3 D  V& q  j: J. u9 H) p, v
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 D  X4 |  n- g/ u        // 作为捕获功能时管脚方向为输入
5 P+ B# {) e* y2 L% {        // 作为辅助脉宽调制时管脚方向为输出  M0 u, W% I0 H5 R
    // ECAP2 / APWM2+ l5 @0 c. n5 M' q: e
        ECAPPinMuxSetup(2);
; c0 n3 u& ]: A) e* c6 P7 f* b% e0 B2 x, d/ b6 Z/ G8 ^4 S0 q
        // ECAP2 / APWM2方向设置为输入% f! N2 S( m" z; t% {- C
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]7 a0 P# ]# }+ o6 x2 R+ m
}
6 I. l* H2 f1 N1 A. D
" y+ d( V& b; b2 Y( e/****************************************************************************/+ k" r; u( F+ R) f' e1 W
/*                                                                          *// \/ K% A2 C6 {/ `$ Q0 r2 A
/*              PWM 输出波形                                                */% `& t" K2 [4 L; v( d# Z. w
/*                                                                          */
  B. X# y! c9 g" l% }7 j4 l" {/****************************************************************************/4 A1 Q, i6 P/ b2 Y/ A* e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); t" v# W) B& w8 Y. S6 @
{
: [; m8 b! h; ~" j$ \& e9 M    // 时间基准配置
6 c5 \9 c% _! [$ ?: V    // 时钟配置
/ O& H& h6 ~9 m9 P% s. p    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% R) J, c4 L/ ~. r1 O3 T4 B9 h

! t8 @6 N' l" R" t6 _" u) m    // 配置周期
1 X9 u' ~& `7 t' j    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 n6 @( m& l: v& \, s                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# c% ^. m6 d# l" v3 r4 c2 B; Y9 u8 s% t3 w- o9 D3 v3 I
    // 禁用输入同步信号
' O3 ^' K! U& p3 a# h( N6 \0 ]) ]    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);# g9 e9 ~# X; N8 M
( I, n, N& R/ ~( X' u! F9 N
    // 禁用输出同步信号4 H1 N7 }2 O# _" Z
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, U2 j  ~2 d4 m( M( A% A8 c
! d/ j7 z+ }- r2 |5 F
    // 仿真(DEBUG)模式行为配置% z1 t9 k7 |9 D# o* A2 o
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);' F- x, t" j- H' Z5 M3 `
! m5 i% n1 F# \$ I0 Z
    // 配置计数比较器子模块
( I  o! W# W( y* V    // 加载比较器 A 值
* v: [, g) p( \/ U    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 Y1 ]$ c/ v" y                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 Y, b" {2 A: p5 r% p7 U7 R0 z

% f/ J' j  d' c7 f4 {. E    // 加载比较器 B 值6 x/ ~! L( m9 n
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& w% i5 Y% A0 b+ Z% ^                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ [  ]# n2 }2 W. M
' A9 ], S( u- h9 [* m
    // 功能限定配置(输出引脚触发方式设定)
% p: t/ D* q+ r4 c) X% ~3 J    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, t; y" ^3 |, I, |    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 f. ?# L% F, B# ^                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' _7 Y- F) h! c/ q) r+ Z; b; G                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);) L& H) l( C: n3 f0 j( r3 ]1 @

2 T; u8 B9 m6 ]$ B    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
, r0 z& @( l, d+ l5 M# K    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 h! d7 x8 Z5 @& q( R
& v. c, C# x& |# P" x9 ^6 R    // 禁用斩波子模块
5 m. [/ M! r5 R/ |+ }    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! C5 T  H2 r* L# _- [, Z5 a
; X/ B* e# x+ \- J" H9 u, Q    // 禁用错误控制事件  [- }3 I9 ]! @' Q
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
4 }0 Y0 S4 R8 F$ q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ `0 u' v# m8 A( b* w$ ^
) j7 a# z4 C2 a2 G8 [8 `9 n" ^3 G, L
    // 事件触发配置
7 E! e, D$ k( ~- H2 v" q    // 每三次事件发生产生中断
( y; q  j0 d) g6 }: z    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) a+ A! c  n; b8 o
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件- E! h3 e# K. h7 j+ S
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( c6 t! u6 k5 l! y' L    // 使能中断8 h& A, m( v0 ^5 K( J9 e
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 Y2 z$ l- y- a+ q( R1 g8 b0 Y8 K
+ }' ~) [1 }/ j' B3 F
    // 禁用高精度子模块, ]/ \: j1 I3 n2 v- z  g4 h3 M
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. Y$ q/ u: M; j
0 s* p  z5 x$ H7 E4 n& |/ l/ D' G8 |    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);* U' q: e. |3 }6 }% w- Z% o8 x
}! C8 U3 N3 a8 J& P1 X1 x3 K
3 C& z$ K. ?. }
void ChopperWaveform(void)
" O4 n4 g, v6 C" P/ r{
) H# u. X. S: c    // 50% 占空比
, u2 D7 p; J8 y( e# v  g) ?! K* `    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* }  M/ k2 B7 V. G  K. H    // 4 分频
0 ]4 m5 Z9 }9 Y+ G6 h$ l    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
  y/ f/ _+ s! h' H0 s" z# V) _6 F    // 单个脉冲宽度5 ]  ?. f1 _4 @+ W" ^
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
8 E" t! y& O+ V- D0 d$ a    // 使能斩波子模块; D0 L  Z, E+ T8 h+ I5 x
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);* v( j% v# N6 r! e7 y% g+ y
}; g2 x* _! J4 M+ e1 N$ D. Z

/ d8 t. p6 x8 V7 A. a; ?7 G) i! \/****************************************************************************/# h, Q1 o1 n/ U9 k5 K  N$ X& ]" H
/*                                                                          */
4 p) R, x# K4 ?! t) E/ c/*              PWM 中断初始化                                              */- X/ i( W5 d; O7 P0 z/ M
/*                                                                          */
7 P1 f* k* U% I/****************************************************************************/+ I1 F" {( {; M4 _
void PWMInterruptInit(void)
+ q- s: _& e$ W  V/ ^{
+ z6 W0 z& U# A; r, |  L( e* H7 ^4 C        // 注册中断服务函数6 N/ y: V2 Z7 P; S0 d
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);  t. A4 y# M& k
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 J# V8 N: ?7 b
" J6 \$ i% C- z( L. E* r6 d1 W) E        // 映射中断2 s8 j1 X8 G* ^4 w
        IntChannelSet(SYS_INT_EHRPWM1, 2);. o; I3 _# _7 E  ?1 J* v1 Z
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) Y, r% z9 C% J: i2 I! Q# a* w3 G
        // 使能中断
% _" f) W. f7 I; b* @0 a        IntSystemEnable(SYS_INT_EHRPWM1);
$ J& `" a. f4 L. A- i3 H+ [        IntSystemEnable(SYS_INT_EHRPWM1TZ);1 I. B  D1 b+ e, R/ E
}
+ V9 }6 w/ a5 C3 {! m! u
+ }+ {. T& s" c8 b/****************************************************************************/
. x3 q" k9 l7 K5 s8 d7 G/*                                                                          */
1 {: d: z7 C0 [- q, u/*              ARM 中断初始化                                              */- U! r' M+ g$ |
/*                                                                          */
+ [) x7 K. W: B1 f6 T; a/****************************************************************************/
9 Y# t7 j' e: n1 ?* N! [void InterruptInit(void)0 K# N& S7 `; O  r0 `2 U
{
3 C$ k* Q& P% p, ~4 B! L        // 初始化 ARM 中断控制器7 _# A0 B/ }& O! G5 H7 Z
        IntAINTCInit();
6 L4 Y, E! J2 l+ c- r% \. K2 L& F
        // 使能 IRQ(CPSR)2 Z- D% z! s- ~
        IntMasterIRQEnable();
0 @6 D% K3 ]3 R6 k* K& y
9 F- i! W# E2 t0 w6 d9 y        // 使能中断(AINTC GER)
$ |. K1 E2 P- l, l" C; N4 x        IntGlobalEnable();2 m% [$ ?5 u8 D: h

0 a3 c$ S& A9 S7 B        // 使能中断(AINTC HIER)) G% h& S- W1 m% f* N
        IntIRQEnable();
" m) L2 g8 f- b+ f+ e! P}
+ l+ h" C% y/ @- `, ^' h
) [. p2 S4 Q- j+ N
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
/ j# q9 v1 k4 @. |; b% x; D' A2 R/*                                                                          *// l: v# v; n% `  n7 _$ l
/*              中断服务函数                                                */
1 J! P% t- e2 }  H/*                                                                          */
" C7 U7 n  H9 K! r( J: x  g6 q/****************************************************************************/4 K) ]" G& V9 U' R+ V
void PWMEventIsr(void)
+ m/ O- q0 S9 S, H{3 O! K5 z0 ^- c' L8 o. }% K
        IntSystemStatusClear(SYS_INT_EHRPWM1);3 V# `- \1 Y- N- b9 W7 h& ?# }' ^
, d. m5 j; w3 g% n1 ]9 H2 o
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);7 q9 g( d$ A: W* _% L! L
}/ U6 ?# p* a6 ?6 u
4 e  z; |* R* J& x- ?& g: M+ }
void PWMTZIsr(void)- \7 I2 q7 M6 L: n6 E6 m5 g
{
% c8 j7 I) h( x7 a3 H8 H        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);  D  {  a6 o. R
, n* I2 T2 o8 `4 X8 i
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
5 o7 w. {! V/ P3 ?8 l}
! G% ^/ C: f+ v" F: {' z; F' Y$ k- C( ]) h1 F$ H
/****************************************************************************/
1 C  @- H* f) O9 `& q/*                                                                          */
$ x* i/ [6 ]9 J. U& ?/ O; \+ h/*              初始化捕获模块                                              */
( X4 Y- B8 n  |" Z) i* Y% ?( q/*                                                                          */
: w' B! P# i0 _( f/****************************************************************************/
( w/ Q6 g, j/ F. h1 C! V# B! nvoid ECAPInit(void)
# T  F# O0 _. O* g5 G{/ g9 U" q9 G2 \; `) W
        /*-----设置 ECCTL1-----*/
  w- J. H! Y" \" S: Z! S0 M! K        // 使能CAP寄存器装载
; O5 r' [- D$ v( ?  }        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);5 n4 m. S/ ], F! E
        // 设置预分频值.0 [+ ?& j) _; @+ |' E3 B
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. P! |# x7 x- f* {        // 上升沿触发捕获事件3 g! n7 ]" S! y  }" F6 d
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* n! X8 t# s+ X# \/ G# X% B        // 输入捕获后重新装载计数器值.5 u0 ~% e( H1 Q5 A: }  f6 w
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);' J% y% p0 m1 U+ q
5 s" ], U+ R+ X2 b
        /*-----设置 ECCTL2-----*/
) G" f8 H; Y+ @. n5 V0 t        // 连续模式
. p& m0 a) ]# ]5 j3 a7 ]2 i' g+ s7 n        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 b+ x* v! }3 t5 ]        // ECAP计数器TSCTR持续计数
1 k5 o$ d0 C$ E2 n, _# A- F        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 Q" ^5 R6 t! C0 D3 }        // 禁用同步输出和同步输入9 Q+ }* Q. c- h
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);% O4 F) X8 B3 W1 z. X/ j
        // 配置 ECAP 2 为 CAPTURE 模式( [( A* h, A. G5 r
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
. z& [: d* T) v2 O& O2 B* v* D) F0 `
        // 使能中断
7 M( T( g9 y% w8 N//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);0 J9 r% L) C! V* `3 e9 E" p! `4 y3 H
}
' ~; ~% P5 M0 y( V! C. W
- P& `% H- w9 F2 C( M" u: V/ u' _7 n/****************************************************************************/
4 r2 M  r% \; A( l1 t+ V% z, p- D5 c/*                                                                          */8 n) V& U0 N( K  p8 a& B! P
/*              取得捕获结果                                                */( f4 L! K$ B; g1 W+ N4 R
/*                                                                          */
. S9 s7 d9 w2 E* D/****************************************************************************/% z7 F" N% {0 P1 T0 z/ `+ J9 K7 m
unsigned int ECAPRead(void)) f7 Y# Q5 R# I, c
{5 K" T- }* S+ I0 `; K8 v1 s
        unsigned int capvalue;
- z) p/ Y# X$ @- x* \/ Z        unsigned long frequency;
9 X- ]5 G) V+ J' a. r1 y; M/ Z/ W# ^5 g! _  a; U7 K- s
        // Event1 中断标志3 y$ K/ `4 @5 Q: X1 _' ?- {0 D9 h
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 q# c2 I+ a$ w        {) x* R4 b5 _- O
                // 取得捕获计数% y4 X/ p) Z+ n: A
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% u6 n* y: u% Z$ Y                capvalue = ECAPResult.cap1;
% e5 E) [" L$ ]5 t" \
/ L, B* X3 x3 M2 R                // CAPTRUE 模块 228M 时钟主频
0 d3 `9 ^1 \# D  t                frequency  =  228000000/capvalue;0 J+ X0 p: e2 V# L, E
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; T- h) l) j: X% R3 \$ M5 l  z" f" W' o1 z( G- m1 C- }3 k0 }8 a
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
2 L. B  H9 r2 v+ i; Y//                IntEventClear(SYS_INT_ECAP2);( {* @" Q7 _3 M  l: u; d
        }! f4 G& ~$ Z' q8 y& K. L7 Y5 d
        return frequency;
! r; Z. L" q" j  M7 [: X0 V}
8 L+ @; l" M) N
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。/ [4 L) w% _# D( 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