嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家, G. Y5 a& I8 d8 \8 q$ ^

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
2 h7 P( f4 Y4 U1 Y  \+ b: y/*                                                                          */
- e3 O5 j) j) Z6 F" K/*              宏定义                                                      */5 A1 C) G4 Z% F3 ~
/*                                                                          */
7 g& V) L# o; q/ ], _8 t2 _/****************************************************************************// J0 T. W% u6 C7 M5 s& F; V% ]/ W
// 软件断点& b- I7 f& j  B2 Y) V, M) y
#define SW_BREAKPOINT     asm(" SWBP 0 ");; c# Q( X9 S& x2 o. g8 L

+ F7 r: D/ }+ h3 f9 J, ?, [// 时钟分频
4 E7 K  r+ f+ @, C9 o#define CLOCK_DIV_VAL     228
* [5 X7 U2 l8 ^
# i5 G5 D! ~  s/****************************************************************************/8 H+ V7 Z$ Q  e$ N6 B
/*                                                                          */( V% S9 @& y3 r0 y
/*              全局变量                                                    */( H# G: o( w( R( w5 \& I
/*                                                                          */
0 `! C4 S$ a; M/****************************************************************************/# B/ z! O, w( D: z# z5 V: I7 ~" G
ECAPCONTEXT ECAPResult;- V, U: U! X+ U, w, G0 u

0 G. B8 a6 ?- {2 E' m/****************************************************************************/2 m+ D& x- a5 A( f% m  s5 I6 n
/*                                                                          */. V9 ?/ w. v, i
/*              函数声明                                                    */
0 o3 j9 K$ S' I3 z/*                                                                          */# Y- ?' E2 n: T$ S
/****************************************************************************/: c( y" C# I/ M2 B
// 外设使能配置7 c  v9 E. v8 h2 Z/ ]& ~
void PSCInit(void);
4 h7 B7 J" u* H+ ~7 Y- Q: E" F" q( B+ q
// GPIO 管脚复用配置
( _7 R7 d8 R" J% p- E9 svoid GPIOBankPinMuxSet();2 `* t4 c" o  r6 T0 M( Q9 q
2 y& g9 Y3 T- W( o% S5 y. O
// 产生波形( F' ~/ G5 q& N& g: x# x  {9 H1 [
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);! m$ j/ A1 k" ?: M- M2 K" ~, L
void ChopperWaveform(void);4 B4 ?0 l, `3 E; A
3 D- }/ y2 f% `
// ECAP初始化和读函数" P! ~: s2 \, _& a$ S
void ECAPInit(void);0 g: h& l, j" N- M/ k% p
unsigned int ECAPRead(void);
9 i. Z- v% t4 E' T) Z
. a6 o/ \- R. n& r7 b//ARM 中断初始化: `; A% J: l  L* k+ {) J
void InterruptInit(void);  X. A  m5 T, ~" Z, o
6 h0 k  [3 Q! N
// PWM 中断初始化5 S$ H5 Y4 y5 O$ j: C4 ]
void PWMInterruptInit(void);
: l& T6 i9 |/ Y; c9 g// 中断服务函数
3 `+ l8 x4 ^& A3 [// PWM 事件
) L, D7 c& c, H: |void PWMEventIsr(void);
# U% e8 [, O# [  ~) |+ P// PWM 错误控制事件
8 `4 ]% k$ a# _) @4 j; ^% Fvoid PWMTZIsr(void);4 P6 O6 L# N+ F( o; Z
) s/ u( h5 w# @* d0 `& I( q
/****************************************************************************/
5 H' _$ c9 i, z& W% I/*                                                                          */
- r  D. K8 t* n3 }6 V/ F4 z/*              主函数                                                      */$ m# ~7 _! `9 |1 x; [$ S
/*                                                                          */
5 K5 c8 h" v& j/****************************************************************************/5 e. n! }( h) f3 U
int main(void)
5 E. f% ]4 p) V7 e% E. }{
' A$ `  ^/ e7 ?2 W" C# k! {* x: {        // 外设使能配置
, ~7 n/ Y/ A4 _  T8 E: N* t7 Z. [        PSCInit();
( M/ z  h, I; u8 r  x  W
2 I, E9 m0 X1 i8 [2 V" j        // 初始化串口终端 使用串口2
! a+ Y' ^! J. A* k        UARTStdioInit();6 I% Y2 Q' [+ Q: X5 q) O
       
+ I0 d+ _( s" D        // GPIO 管脚复用配置- i" n2 v. ^( j+ d0 `, c
        GPIOBankPinMuxSet();
" Z9 g- ?3 s  g1 A* m# e- Z( r9 w& b9 R- S0 U5 E7 m# `
        // ARM 中断初始化% I6 Q% |! F  U
        InterruptInit();
9 \  }% Y' o! V$ U- T0 ?+ Y  |9 C7 K. _
        // PWM 中断初始化2 T; L/ d3 B; R  ]: j- Y
        PWMInterruptInit();/ z2 e9 z# Z0 b) k
0 l, ?* k% Q9 Z  C) E+ w: x
        unsigned char i;
+ M5 S2 D. ^0 U+ Y        unsigned int j;4 K( g% _5 f' g6 P

2 W% T2 k8 P" y0 M' l% x        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ [( T: u0 S9 l/ R1 c. r1 U: l        UARTPuts("------------------------------------------------------------\r\n", -1);
: ?$ a, }" I" D' p+ ^        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
$ X7 P/ v4 W! s1 b9 P        // 产生波形
7 Y! R: O3 K& y4 B        PWM1ABasic(25000,50);
9 |4 [+ N/ d6 b0 g2 K' Z* f
& l! l5 v. }* @0 Z- F+ J% h, [        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 ]6 T" x, M$ O3 ~  v
        UARTPuts("------------------------------------------------------------\r\n", -1);
4 r# A/ X  |: m! ?/ _% v5 L, [  W
: {5 L4 K/ A: a. g8 y1 ]1 X
( s+ R& r% @1 A( E# I: _7 M% x  i0 |6 M
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 L6 y4 d/ K3 g1 l; m( l3 S( x        UARTPuts("                    C6748 ECAP Test\r\n", -1);1 j4 @- G* i& O( W& j% J' S
        // ECAP 捕获初始化7 V, B3 |/ B' T: F! f. A' o2 I
        ECAPInit();; v+ ^: m7 W9 C
        UARTPuts("Initialize ECAP.......\r\n",-1);
3 @5 J8 G: Z  H, U- p' s4 d        for(i=0;i<5;i++)8 Z" f$ n6 J, a$ X) F( n
        {
* d! c6 @& q2 F& `                    for(j=0x00FFFFFF;j>0;j--);            // 延时4 l" L# X% ^  i  J% \. L
                    ECAPRead();. }, Z( t& l, h* `+ U
        }
) H. \$ i- R( W9 y        UARTPuts("\r\n",-1);
" V, m. p  ~0 S* P* R( Z0 c        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);" E4 F* s/ X$ W6 T
        UARTPuts("------------------------------------------------------------\r\n", -1);
9 E3 {9 o0 E& g. B- n( r, N" O6 T2 k5 [
        // 主循环
4 J5 f9 S% C2 ?4 y        for(;;)
* I- M- }4 ~5 K1 i/ R- T. P  W        {. j5 n+ u1 ?  D( ^, P

/ E( |1 a8 u& A        }( q; b" H/ t# s! ~
}' j- V7 w( z: S+ b& m& m
+ W9 a& l6 E. a0 J6 C( J. [
/****************************************************************************/
5 _: y; z: q' q" a: N/*                                                                          */
1 _- S+ {) j' N' m" T: ?5 H( U/*              PSC 初始化                                                  */, k1 w  r& j0 M. K
/*                                                                          */1 x# S- U1 _+ l3 z& d' a0 f1 ]
/****************************************************************************/
+ _$ Q1 c; \; _& I! M& nvoid PSCInit(void)
; U7 b3 F/ [! l0 I, n* Y/ j{+ E; N( N: L4 o. V+ @
        // 使能  EHRPWM 和 ECAP 模块' p/ C! M4 Y5 T% Z$ g2 O* `% A, p
        // 对相应外设模块的使能也可以在 BootLoader 中完成5 H4 Y4 Y  ^  k& ?" L" I1 L
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, [- C4 O$ D# a
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& R' j& D/ U7 }* d; `}
  r  d8 S+ S* e/ k, G
# X! F  a$ K2 p' p; U/****************************************************************************/4 I# I2 G) }2 f0 F
/*                                                                          *// O1 i6 `2 H" O* G+ h# x3 z2 A
/*              GPIO 管脚复用配置                                           */. C* V( |* V0 m& H) M! F- ?
/*                                                                          */6 `) s* y! F# T4 D: Q
/****************************************************************************/% s7 i7 E9 E, m7 A4 W3 {, I
void GPIOBankPinMuxSet(void)
% Q0 t; h: V' Q: }4 M{9 [2 c6 e- W9 k# n- P4 `
        EHRPWM1PinMuxSetup();
. h8 r. {$ J  \# Z  D' D9 A& e3 A9 x# y" A6 B7 L/ B' P! s* s$ q
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)( @- M, o' z- I& d6 D) S8 h0 g7 p
        // 作为捕获功能时管脚方向为输入- @1 \5 B" V( t2 B0 J; I' B
        // 作为辅助脉宽调制时管脚方向为输出% I( G) {/ w6 Y4 ]; ?4 `/ ]
    // ECAP2 / APWM2
  ^4 A! K+ Z5 t, b* T9 P& A- E        ECAPPinMuxSetup(2);
3 X0 i" |8 }4 |% S6 G: X* Q
3 ~. D$ o/ z! t' E8 `- P        // ECAP2 / APWM2方向设置为输入
& W2 `3 V! y4 k8 j( y( j! }3 s( F$ s! A        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
+ f$ w, F; S) `9 U- A}3 ^/ p0 d( o& ]8 B

% D' N' I0 q( }9 j6 P& b% r/****************************************************************************/
( |% q5 O* T' G4 T, R) e8 X" a3 B/*                                                                          */
3 c% \, l. ^- }. @" {- U; i5 o/*              PWM 输出波形                                                */0 S& \* ?* E7 z7 u) e
/*                                                                          */& P1 D% L9 b( i. `
/****************************************************************************/8 h9 p% I$ U! A" B+ ^+ ]5 ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" o6 `2 y8 Z0 ^) K8 p' E+ v
{5 j5 L2 D3 ?* C7 q, q2 f9 Y7 W9 E
    // 时间基准配置, {5 _, K9 w$ I5 ]" K
    // 时钟配置* n% q4 U, k0 X: z* f! b* J
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 n. w7 j/ L& M. I3 ^" a/ ?$ X9 s, Y6 z
    // 配置周期
& ]/ p, ?8 |$ h, D. e. B8 E; X    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 p1 Q9 [5 y$ r# U4 ?+ C* u& m
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- T7 j9 ?8 j9 C
  ^$ K! h3 Q# u/ s2 j# z2 p( n, c
    // 禁用输入同步信号
4 V3 d# P& J% X  U7 |$ Q# u) W; t# f    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 P& @& C* C9 I! s5 S9 ?4 I8 i- v" T% u' i6 L
    // 禁用输出同步信号& d/ f% M! A$ ]: v3 e! y
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);# C( e4 `& w0 J! P! Y, Z& u

' j4 n# X" L9 H# n2 n3 t    // 仿真(DEBUG)模式行为配置7 d! d: W. t2 P; _: T
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, L7 |1 b/ n! Q5 _2 _% ?; z. f$ v& M$ b9 e) I
    // 配置计数比较器子模块
" l* T  ?, @9 E    // 加载比较器 A 值
* b2 C+ j# m& Y+ l1 P' L/ q, L    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" o0 B5 l/ j' B+ J                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  E+ H6 d* R! d5 P  Y. D  K  c4 V0 z  ?
    // 加载比较器 B 值) T" J$ l" k3 l4 I3 @, W3 y: L! c
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) H/ I0 ~. r2 [2 Q: T! |  F2 S
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( V, \. I' V! {" i# q- h; o
9 ?, \/ ~. \3 Z  m+ D
    // 功能限定配置(输出引脚触发方式设定)% k4 g% b7 P% a0 r9 H  ~, m* M/ ^0 b; n
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出' ?  v' {$ E9 _) B* s+ K; W
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ x) t4 L% b4 x/ K6 U6 b6 O
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 y( A1 _; n3 {- m/ U9 F  ~
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; C4 Q0 P( \/ L  N- A! A$ H8 V* `+ E2 {0 K4 X
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
- }$ p% H0 e0 Y1 Q8 b. h    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);5 @+ Y  i! H( |% z( ~

4 o- a9 r* N/ a% E( K    // 禁用斩波子模块! ?2 T, e, b; o8 v4 C: D* u1 f4 J
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 J: K5 A  o- n9 `7 y2 n* Z; ?0 ]( j, ~6 S
    // 禁用错误控制事件9 x8 G* R# a7 z! H8 K6 X, }
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);9 v0 t2 d' x1 u. f4 J$ f
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 A2 J( Q) N+ u! ^: q
' u" Y4 E1 |6 g) L/ k    // 事件触发配置
. q' s/ |; ]2 C, j; p& _* [5 U    // 每三次事件发生产生中断
5 d' {% e2 R  W7 y2 s    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# Q% s" u2 H2 j3 l* f% _1 k6 Y    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 [- j9 y4 V. J3 n/ X  v    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; \! m! t3 J  ^, i1 E* p0 c    // 使能中断. y3 I: h# o& F. y  c% q, l3 `6 E$ @
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  n3 c) H: f; v) R* i2 r& |" _- H: Y% K' }% A# @! U+ r
    // 禁用高精度子模块  q: B; ]' i" L
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% o0 O$ @/ I' X% p5 _( }8 x. |( ^
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& I% k( b% a" `* _  B}
) f  O0 Y0 \) }4 q' V
/ X' I3 x4 [7 _- j" G& vvoid ChopperWaveform(void). _, S3 e% Z' S$ _' k2 m
{4 D* b9 u, E( G8 F9 n* x: h
    // 50% 占空比
2 C$ Q5 G. y& B% U    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
: c" G. r2 |% j    // 4 分频3 n. Y# D: C3 Z0 y; Q7 a% `' i! z
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ O: g- b" i. t" B( H: t3 [    // 单个脉冲宽度& K1 H& E& L% A. F8 i& B1 l5 [% ?; L
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. i, a( L, M% W  G/ i6 O( j7 I3 k    // 使能斩波子模块
* K& O( }3 B. J- O: C    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. B  U. z8 @5 R1 C  V0 S}
0 B9 B! e( o5 @  U/ z
. D0 t1 ^( `; N# e  G6 t/****************************************************************************/
  e% r1 B3 R' ^  t7 o/*                                                                          */; h. T9 z1 I) k
/*              PWM 中断初始化                                              */1 p, Q4 K  i" v% P% E6 P
/*                                                                          */- v: s1 t: b. q$ y( t% Q  C; K
/****************************************************************************/! V% x- W5 e; P" D3 {
void PWMInterruptInit(void)5 V7 v6 G, ]$ _; \9 X- }
{
  L7 F! g: z$ j/ q! W2 f/ Z5 L$ F5 ]        // 注册中断服务函数
6 x7 E' @$ I" I7 Z# q$ ~8 k        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: f' E% R8 U  x9 N# \        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 S; ]; U% b* ^6 W) }
+ E$ Y% i0 l3 F4 p1 L8 x* t
        // 映射中断
( y" {3 R( ~2 t8 |6 E        IntChannelSet(SYS_INT_EHRPWM1, 2);/ J. Q1 |" t: D* Y/ E& t9 Z! G
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);; W- \! U4 _* O( f5 w- }
! x: k: ?( B' W7 F* t
        // 使能中断
# f" Z& v. M  E+ R, p        IntSystemEnable(SYS_INT_EHRPWM1);& G" c( Q( D: @# }, B, B
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
. w# A2 O: V3 V. E2 t}
, N. x5 S9 U6 o% k) d
) n6 ~4 r* F# V3 B6 p/****************************************************************************/
) W! p5 e* b+ a. U3 a3 s' w* t( K3 \/*                                                                          */
3 X* M- G5 Z2 n9 |/*              ARM 中断初始化                                              */
# q6 t- t. p- l: e% h/*                                                                          *// ~$ [4 z0 S$ }- q. Z
/****************************************************************************/
9 o3 ~' \8 Q" d1 {void InterruptInit(void)
, s( P3 O% j6 M) A! M( q( c{
! F- H4 @& g6 W5 K        // 初始化 ARM 中断控制器
5 ^8 m5 ~* l6 i9 C) j" a5 C        IntAINTCInit();8 L- ?" Q% a$ r: h! ^! f$ D
3 f3 T3 w, x0 O1 s2 _& t" i3 |
        // 使能 IRQ(CPSR)* I  \1 d; w- l9 F# j& V3 G( q
        IntMasterIRQEnable();
7 c6 X* _" t' }4 p5 `4 N
) J- |4 v! Y) L! W$ M        // 使能中断(AINTC GER)- [# k1 {$ v, u9 w; }7 s1 T: X
        IntGlobalEnable();- c2 k" q+ x' Y0 Y3 w/ Q2 J

, `& u% X7 V1 o- s3 c8 J        // 使能中断(AINTC HIER)
: ^- i/ F# c" E) b! D) |2 }& i5 A        IntIRQEnable();% W6 _% c& v, \
}
% m( g* T9 ^' ^$ ]8 {. a
' q. B; \6 P9 M3 T
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/: }2 x' \8 I/ A5 u2 R; C+ l
/*                                                                          */
% {8 \* I$ }# O5 ^5 v/*              中断服务函数                                                */! Y0 O2 p$ M7 L8 d3 d0 n
/*                                                                          */
' d) M6 Y' Q4 J* Z# X/****************************************************************************/5 p$ A/ M: Z8 ~( V, z6 w% I- L  S
void PWMEventIsr(void)1 {7 {2 N0 n4 a6 d
{
8 t! u% ^7 Q: b! f7 A" [8 c        IntSystemStatusClear(SYS_INT_EHRPWM1);
  s4 G8 p0 f$ c6 e" ?
' B# L0 r, v4 u) Q$ O    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
; v2 ~1 e. @5 C5 V6 U7 L8 v}
# p& l$ k, K  z6 X! Z7 m& X* _; c+ t: C8 w$ v
void PWMTZIsr(void)
# Y! i) {$ |' P* ?{
9 j7 J; e+ R7 c; M        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);5 F. u. r" [# @4 q6 v3 E" k
! v* V) a2 F8 z9 F
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);& o5 x0 S8 c2 Y
}$ o  M' R4 b$ P( _* Q5 f

1 s7 _- q1 m! y/ j9 O7 {+ J* E/****************************************************************************/; Z6 ?0 Q" f6 {) l! L- `
/*                                                                          */
* d% f& x1 G" Z1 a9 \2 F4 U/*              初始化捕获模块                                              */
3 d. z! J% ]3 [; y4 d/*                                                                          */' H/ J6 T2 }! T- Y# f2 r2 E  T
/****************************************************************************/
9 N! p- E  W$ W5 {! |void ECAPInit(void)6 n3 O, E# d$ M& M
{" b1 o9 ?  t2 \5 \" K$ L
        /*-----设置 ECCTL1-----*/
( L8 x0 a) B& \  a        // 使能CAP寄存器装载
$ s( ?; R* o$ d# l% o        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ n0 T; f1 ?4 I; w1 q/ D& h        // 设置预分频值.1 b. A7 l/ w; i% Q
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);. f# j8 v- _; F
        // 上升沿触发捕获事件
$ z+ h8 y- Q( F: k1 X6 Y: w        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
- E: b; ^3 A, b- f7 K        // 输入捕获后重新装载计数器值.
- \' Z, p# a% Z: @4 p( y/ }        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);2 h+ I* I$ L3 ]$ V- t+ ^
- q5 Y7 {' F8 N& N% ~3 v
        /*-----设置 ECCTL2-----*/
: \$ j9 K. ]2 q$ k) x" A        // 连续模式
3 k8 I+ E3 a* g1 ]; ~* S$ f        ECAPContinousModeConfig(SOC_ECAP_2_REGS);5 }# H" ~& B0 T0 s
        // ECAP计数器TSCTR持续计数
2 _) z; z9 E( J8 I        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);& o3 v4 P1 N3 L! T# T5 K+ S& _' n
        // 禁用同步输出和同步输入
7 Z+ J' }  k- i, R8 V) D        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);0 e7 R. v8 K' j( W- B, }
        // 配置 ECAP 2 为 CAPTURE 模式
5 O* G7 K9 h2 T        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);+ h0 L1 ]( R" Q+ ]  D# T) M. l# W
, l, H% C: F( @' U
        // 使能中断
7 q. m' f! R. V9 X" X//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);: |8 `4 C" ^& X+ {- l
}
( h+ y; q2 x( e( z1 ?3 Y8 u9 p: G% F! Z8 k
/****************************************************************************/
4 `7 j5 e$ w. N5 X/*                                                                          */+ H7 B( n3 ]- s/ S, g9 i" [
/*              取得捕获结果                                                */: K. ~& ]) L* s3 X7 v/ v6 M( ~' S/ X/ ]
/*                                                                          */
) u+ j# T9 T; f9 S( G4 R! s/****************************************************************************/6 T" }$ i3 C: ?( E+ k$ C% p
unsigned int ECAPRead(void)
8 ]' x9 J3 P/ O7 u6 n7 I. L{8 b( Q) h9 |1 M# p
        unsigned int capvalue;
' e& c4 k" e( h# r        unsigned long frequency;/ i' |7 O: K3 o/ L& Y( r
2 Q: g( E9 N4 v& ?1 p' L9 J* P
        // Event1 中断标志
' L" U- o2 |8 M& N$ \0 R9 s; J! a! {( x; l        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))1 Q  `" N  W( i2 j" G3 R
        {
. s! A4 V+ R+ l, p3 }                // 取得捕获计数
! e: z5 i  m+ u6 l                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 A* C, N# _, P: ?/ o                capvalue = ECAPResult.cap1;/ a1 E" V1 R% @7 p( p
* n, H. Q9 a# V3 v
                // CAPTRUE 模块 228M 时钟主频
, \+ C- V7 D" ^                frequency  =  228000000/capvalue;
% c* t- p: a' T- k& b                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);; r6 v% L2 b* u( c
; r! V; _& u' N
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);: Q/ D! @  f$ j' k! d
//                IntEventClear(SYS_INT_ECAP2);! G, i1 G) C7 S: |/ D( l
        }& t0 Z" w- k& k$ T. L/ ~. i9 ~
        return frequency;
9 D# `( y! S8 {# b; S9 O: P}& W/ R8 K2 [: V9 ?' A/ C

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。9 ]$ ?" C* F1 Z5 T& A- D/ ~( `
[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