嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家' R1 [& x3 A$ }( }* ~

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/5 R4 ~" @( s8 g) `( |
/*                                                                          */
' A) j- v% X8 N  ^! {  u. X/*              宏定义                                                      */) E* ?6 u* c8 S3 r/ l
/*                                                                          */$ p6 l9 G% j; H% |- B/ l
/****************************************************************************/
" v. [, l5 `1 J7 X// 软件断点* V) _7 ]; u; J, I
#define SW_BREAKPOINT     asm(" SWBP 0 ");* u$ f5 o+ _) f0 Y2 h

# I5 d) [, K: _2 w& K// 时钟分频
) J+ Y; g; w* z, U6 ~#define CLOCK_DIV_VAL     228- E; G  m0 ~  p5 V0 K/ ?% `

- _6 Q* A- {" d2 l6 S' R' c/****************************************************************************/
" y, G3 S) N7 A. ]7 }, }/*                                                                          */
/ P$ e: N$ X& K& F/*              全局变量                                                    */4 t* L" `2 q1 Y; _
/*                                                                          */
" V% Z" p  i& a, \3 f/****************************************************************************/! I  X2 W$ X/ H2 t" q
ECAPCONTEXT ECAPResult;7 n# Z+ k. U4 c6 Q& |
2 j) J3 T0 U& J7 \$ j
/****************************************************************************/
! H0 d( x2 _9 M/*                                                                          */1 l8 v6 s- Z# n+ P
/*              函数声明                                                    */
* A  F! R" k0 r. k+ c6 d/*                                                                          */9 K2 T" `2 Q9 e* B: |9 Q+ Z3 V% r' t
/****************************************************************************/
/ w. U. w4 Y1 R( u9 ]  [. X; i// 外设使能配置, |) d& M3 {4 c9 c
void PSCInit(void);
& i: ?) X( Y. n( K
" Z/ b3 H3 s" t8 R& Q// GPIO 管脚复用配置  G6 R6 @; _( h5 ?5 ]& }
void GPIOBankPinMuxSet();; R  W; @8 K- L) G% E
: |# J  w+ z! o, P- ], p" d
// 产生波形! X0 |' \; X- I- p4 s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);- \* Z9 Q7 ~$ d9 f
void ChopperWaveform(void);
" x8 r$ I. y% @/ T. e
* ]! O% U/ K$ m) O6 m  i# ~, _" a// ECAP初始化和读函数9 G4 x% {$ x. f- Y* I, B% ]5 J
void ECAPInit(void);
0 z+ I$ W, c2 f* t  Dunsigned int ECAPRead(void);
5 J- S5 a1 S$ \( L+ q. j
4 b0 f8 c$ \" I, H/ s//ARM 中断初始化
3 N; r6 `5 P; d# dvoid InterruptInit(void);+ P2 h1 T0 `: `! C  j- H
' e8 _; q# n; X. Z# @7 r
// PWM 中断初始化
8 A  `1 k2 I: S7 I* U+ z1 ?void PWMInterruptInit(void);/ B+ I+ a8 i5 l' q6 ~8 P, g7 r
// 中断服务函数
* J9 `/ R! ^! x  F- R. F! O// PWM 事件7 {3 [1 I1 ?9 T: e
void PWMEventIsr(void);4 }! d' {% J; D* h4 |
// PWM 错误控制事件! V8 P1 r5 `& B( P
void PWMTZIsr(void);
* b; v& L" d0 d1 n& V5 L* w' \/ {) W3 r( S& u1 Q1 u7 T3 p
/****************************************************************************/
" Q; v8 f" q: p7 f5 G/*                                                                          */
: u7 U6 x* n  }& w# p; R# I/*              主函数                                                      */
( W9 _0 h8 [0 P  {' @/*                                                                          */
) ]* e7 P  ?+ L" M4 {. b4 a/****************************************************************************/
- X5 p% {( s& ^, qint main(void)
3 V( Q+ X4 t0 w) R5 e; V! o{
" f& t4 N+ L0 {4 t6 v        // 外设使能配置) j2 U  ~9 u$ Z3 ]7 n( d
        PSCInit();/ H: T! D, I7 Q2 a9 U1 ^% H' e

" b, R9 u# u, K        // 初始化串口终端 使用串口2
; ~+ I1 u; W- k$ g0 [% a  @1 j        UARTStdioInit();$ t: d! {) B, ]1 F0 f/ u
       
9 h5 x/ O$ N2 o: \2 e        // GPIO 管脚复用配置$ N- ?2 R' d9 H9 |8 x
        GPIOBankPinMuxSet();
$ C/ d# V, x$ x& E5 Q. ^4 w% l7 y2 b& R; y* E% T5 k
        // ARM 中断初始化
' s: [- m* Z  ^4 c        InterruptInit();
! C5 l. j! H# f8 B0 N$ H7 U
1 d8 Z7 V+ d0 g4 n" \        // PWM 中断初始化
! Y+ s( l, L; W6 I5 u' I        PWMInterruptInit();* Y- q" i' O: T' v/ [9 {5 g* m

" v1 o- T9 ]# h' x  {, C        unsigned char i;
1 L6 F0 S3 @! ], ]4 S4 ~        unsigned int j;
" @% S) u0 L( `* j1 K) E. [1 \* }: x" ~7 T8 n1 x# L
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);& j7 p8 s6 x) t5 ~& P1 J1 C
        UARTPuts("------------------------------------------------------------\r\n", -1);
# K, R! Y* {  ~. p+ {) E$ X4 Q1 ]        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
4 ]" d$ w) N4 u8 Y: |& [5 _* z        // 产生波形& R, }  ?5 ~2 b* S
        PWM1ABasic(25000,50);0 a9 F, v' e- v9 D$ `4 {% ]. o

( x: y" ^/ I- ]" _        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);( F2 Q8 O8 z4 S  Q/ z0 l0 a- Q
        UARTPuts("------------------------------------------------------------\r\n", -1);
& h3 H$ u  {6 ?1 |: P. }- z9 B$ V4 v' ]9 k! R6 N; C9 r% F
6 r$ l6 r4 I  T7 C$ H

! b; G/ {& l1 ?4 I0 j& u0 Y- P3 h# |        UARTPuts("------------------------------------------------------------\r\n", -1);* }: n. O3 N$ r8 B7 R9 e+ V
        UARTPuts("                    C6748 ECAP Test\r\n", -1);) P! D' k# [0 o2 d; G# _
        // ECAP 捕获初始化- r+ x$ C' s1 O2 n) Q1 V( o
        ECAPInit();6 H: ~+ o. u% r- a
        UARTPuts("Initialize ECAP.......\r\n",-1);  G4 O8 z- L% z* m
        for(i=0;i<5;i++)/ \! o" C* O5 V
        {
; p* ^* V% T2 n& X/ P                    for(j=0x00FFFFFF;j>0;j--);            // 延时
1 T' z  m& Y, X& n5 V6 U, i                    ECAPRead();5 Z! D+ q& |% a
        }: y6 B7 P4 T! G
        UARTPuts("\r\n",-1);( I8 z" h+ @( m! \- p
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);6 V/ _4 |, m* s* l3 t  D: M4 t
        UARTPuts("------------------------------------------------------------\r\n", -1);
/ Y7 `% ]3 [2 U0 ]% \) d& j6 d* s# |, l) l6 {  c7 M9 o
        // 主循环
1 x" ?* U9 w# S3 q  g        for(;;)
8 \- p5 n; j( J8 y% e# t5 E        {
3 L) j* }7 e+ k/ _3 A2 {
- @+ A5 `- ^' B, ~7 D& W: l        }5 J% i' }% W7 ]% z2 X$ Z1 O7 A3 G+ o
}
6 L: U6 t- B1 R- s, Y: n6 R7 I! Z6 e5 F8 Z7 X- _5 G4 ?
/****************************************************************************/- Z! }2 K, u# v* V9 @- L
/*                                                                          */
& c9 Q; h  K  E/*              PSC 初始化                                                  */0 ~% R) z* p9 x" z9 `& G& n
/*                                                                          */4 i- p# f2 P0 J6 i9 U; S0 u7 o
/****************************************************************************/
0 l# C2 p% P* f# d9 m  m; }5 G' i( Kvoid PSCInit(void)
) U8 f  ^1 X( n" P9 B0 B{
' }0 F1 y. X8 p) z- z        // 使能  EHRPWM 和 ECAP 模块4 J: M: H! B7 J6 C( \+ _9 C& H9 b7 u# m
        // 对相应外设模块的使能也可以在 BootLoader 中完成
! D. J. y- v5 D6 y7 m; j/ v- G$ W% J1 i    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" J9 L7 c/ H; @2 \0 i0 \' {
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* S! }1 s2 A1 L1 H6 `" Y+ J; T: H}) j. |/ V5 `* |
9 |& }% K9 h/ x: {" k" t  a- R' Z1 L: ~/ K( \
/****************************************************************************/1 T2 f/ u) s# R# h! A
/*                                                                          */
. j) r& [% E* S$ u  j/*              GPIO 管脚复用配置                                           */; o0 H6 K8 C' u% A$ W
/*                                                                          */
. Y, N# N  [% P5 I/****************************************************************************/
/ U5 o/ U, f. \( b3 f- ^+ Hvoid GPIOBankPinMuxSet(void)
8 A+ X, M1 d' Q+ u$ r; m  M  @3 p5 |{& w9 x, t+ G1 [; |( I
        EHRPWM1PinMuxSetup();
8 C" [% T2 k; T. `9 R- N6 h" W( @- F5 J  A
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( Y/ X: w/ d3 J% |% ?& s& [        // 作为捕获功能时管脚方向为输入
- n! Q  K7 q& s1 l% z: A7 a        // 作为辅助脉宽调制时管脚方向为输出" ~  H# y& T* G! G8 `
    // ECAP2 / APWM2
2 Q/ F: m  y: w+ o0 q1 T2 h* P$ F' Y9 ^        ECAPPinMuxSetup(2);
5 v) t# A, b2 G9 G) c; v
/ p( ?8 D3 o/ J- o* M5 g        // ECAP2 / APWM2方向设置为输入
' q/ X4 d; x' k. q; z        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]+ A- v3 i. U1 |# Q2 x
}& X, e- V6 M, R" y; X
+ D! n) N. \, G' B# |
/****************************************************************************/
. {1 [1 B6 t1 w2 e( T/*                                                                          */$ v* C  J: y) |3 j' y# I
/*              PWM 输出波形                                                */& O6 g9 J) P9 |0 \
/*                                                                          */
, L$ e! h& b3 Z/****************************************************************************/
" F2 h. h. e) F$ ]void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 N2 n" q& [" u
{" R' A- t& M. M, z) g3 x
    // 时间基准配置
. s; @% ]& ?0 d$ ?3 v$ q    // 时钟配置
; F, w) j7 m. [6 q+ p# G    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- d1 ~6 K/ r# v7 f0 c+ ]+ P' n* B/ y1 I
    // 配置周期+ L* N6 P/ }" t8 z6 B
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( J/ g3 y! d% V8 n                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);. q' q% V9 ^' j* a
$ U& r+ ]+ d" |$ e! X+ \0 g2 L$ C4 D
    // 禁用输入同步信号9 B( m7 s3 L! j& _( V0 k, J
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; o& I3 D9 v; K' `
: y% f, [* A. s( d9 v6 }    // 禁用输出同步信号
  a9 R6 h4 y0 w+ Z$ ^    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 R6 l1 Z3 ]; D% K! R- ^6 d2 G$ }  \1 x4 F
    // 仿真(DEBUG)模式行为配置
3 {  g# J4 e/ e6 I5 F1 N    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- L; _$ K7 |2 Y( h* `
; x# Q* Z* L4 O, w9 d, M. J    // 配置计数比较器子模块
3 B/ e& T! _0 e, M3 m    // 加载比较器 A 值, O# K- w, d( O  A4 Z( S
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
  p' d6 k' g  G9 ?8 [                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. Q  P) E- Q' b; L4 g, `* [5 I& _
5 m/ p" r& G( x$ _
    // 加载比较器 B 值
& V& t( ^. d4 R+ v" [; Z$ q  V5 d    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ c8 O  q7 B% M5 j                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: k% Z, Q% d) s0 f0 R- M. m: [6 T
, v0 c+ G* j1 Q4 S6 u+ l. h& d6 p7 b    // 功能限定配置(输出引脚触发方式设定)
- L* n% P" L2 o% s6 k# ^0 ~% B    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出  ?* l$ t& B! q. W5 \
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 ~2 v/ H- N2 t5 O/ O8 {4 U1 i: k) P# d                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,1 {# [/ e$ Z+ J% ^0 E/ L
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);5 V6 }, h  n3 S6 g( H

- k# ~. v# M: c* N& ]; t1 e    // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 v; T6 L4 O+ K/ c" ?. O  I8 a4 J/ M
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);9 J% s3 p8 b& F$ H- e
+ r0 n% z& ^$ c) v! F/ K
    // 禁用斩波子模块; A9 ?  L& S$ P0 i, U( }
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 W! L; `" d. d: a  u8 W: C% @, _7 R: P& R  N
    // 禁用错误控制事件
! N3 o1 \" t9 {4 t' W- o; U    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" Z/ m/ T, p6 ?/ z    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 x) ?( }: n* ~. @1 j/ @

) V) b) g5 p' M" h3 Y" t1 x8 O    // 事件触发配置
, x2 Z+ ^5 m4 ]6 i% d+ G; H    // 每三次事件发生产生中断
% e9 z) e/ Y& j; l- L2 u! ^: n! a, e    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ G0 N4 k8 V8 y' y6 D; `8 Z    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 E, I. B5 Y- M4 K+ K  T1 F' f    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- ~2 N% R/ N, L. w8 g
    // 使能中断. z+ R" M% ?7 p
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! Y9 f' W$ w$ O# Z2 _5 ^+ h$ E
0 {8 D4 q3 }% s9 L4 U    // 禁用高精度子模块
* a$ s, A# _" q& O" X9 O" v    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);& m3 `' }) P# i0 m3 @

& a& W/ V- g! H7 l/ H% n    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
9 {% r# c0 c/ M/ i; s: ~}4 V8 J4 {# H" I

7 @3 F7 H0 W8 }) T* L4 @- v9 ?void ChopperWaveform(void)4 o6 N$ ]8 ~1 G4 q- A
{
+ u( P& R: Z; B! J4 }! e    // 50% 占空比
$ S6 ?" Y: Z/ l( G    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);/ {9 s4 K7 p) K6 `$ V0 g' e
    // 4 分频; b7 A6 m+ R7 Z( C
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);3 }, }2 p  L& u# b/ N8 @+ I! v
    // 单个脉冲宽度4 D: \/ v" s; G( e
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);+ ?) G. g/ a; n: r1 ~/ _
    // 使能斩波子模块# I0 r% F. m2 ?  _! x4 _
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ I5 ?' h; C, q! f) c) V& b}4 B. p3 P/ T. O9 ~* m1 s, W

: k0 D" P+ j, c+ |/****************************************************************************/
# f! x6 F# K/ d+ I1 X$ E/*                                                                          */
4 h' u8 |9 N* v3 t, x3 z8 o/*              PWM 中断初始化                                              */$ M9 Q$ u1 y, h4 \
/*                                                                          */3 E# R; f3 X% ~- }
/****************************************************************************/$ T% H4 w( J7 `; S1 j& f, m( V9 F
void PWMInterruptInit(void)
; P) j1 v- b( |2 N$ [9 D. A{1 o- t$ ~# F* D! \; @7 B
        // 注册中断服务函数3 B7 ~: I! H( L" O. Z
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);% [: Y/ [( a- Z. {& z) E- }
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 B+ U$ C" ~+ \/ ]5 y5 C
! F4 G" Z0 t# W8 _9 a        // 映射中断
$ Z( k) e1 t1 k( S! M3 W        IntChannelSet(SYS_INT_EHRPWM1, 2);& g' Q& F1 X1 i# I( V2 \; A: x( r
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
' W5 l: b4 K2 Q) \
$ e$ A/ i% B* j        // 使能中断
2 C; a  m( D5 |+ s+ s5 v* t7 {        IntSystemEnable(SYS_INT_EHRPWM1);
2 ?. Z$ N3 w9 M, i, M        IntSystemEnable(SYS_INT_EHRPWM1TZ);- B7 W9 b! Y4 O9 W( M4 M5 v4 z; F
}( c% \) E9 v5 h+ U; n
4 H9 w. ^$ ]! \+ i! U+ E8 Y
/****************************************************************************/4 B% Q6 o' @# c/ d: t( i+ m
/*                                                                          */
: |$ \5 @7 V* [/*              ARM 中断初始化                                              */7 W' p- z; p- }1 j7 F0 l4 ?5 I
/*                                                                          */% T* Q( M' g% g# M+ F: {0 H* p
/****************************************************************************/
9 f1 ^$ M1 r2 b% Xvoid InterruptInit(void)* h) W: R* q( Y  a. F0 P. v& F
{
; |2 s0 g. G& ~0 L* N9 v        // 初始化 ARM 中断控制器& `; ^- Y. Y+ H) H
        IntAINTCInit();' a2 l, v9 \, n+ \4 m

) y, h; W" g+ e" w# O# w        // 使能 IRQ(CPSR)4 N, I- ?- X" Q0 h. c
        IntMasterIRQEnable();4 W* Z- F: Q) x% y, I2 H7 F1 U
2 C1 b2 R0 l, A" g( y* j& o; y) D- H
        // 使能中断(AINTC GER)
: u& V2 y2 `' u        IntGlobalEnable();
0 B1 Q  u% }% J8 P" S; I
5 l' S; S; w) L# {8 S        // 使能中断(AINTC HIER)
0 e7 ^, Z; O* O' y) ?: p' H$ O+ @        IntIRQEnable();4 f! {8 x' v% e7 X( b: |
}' S$ S% q2 M" [7 u6 _
, ~$ c7 [. q$ L( |% f

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
! [$ C' Q: S$ z* j: K& N/*                                                                          */
  V/ k! O! d2 ?% r9 V3 M/*              中断服务函数                                                */
$ W: `+ p" _" L! D& B- }; ]+ a/*                                                                          */. B; C' Z6 I3 _) o% ]( r0 d8 G! J) R7 w
/****************************************************************************/1 ~+ G6 f4 x( C! \8 d* H* l% e
void PWMEventIsr(void); E& k5 f) c( q, f$ p
{
' ~: v, p6 m( m% V' X2 c        IntSystemStatusClear(SYS_INT_EHRPWM1);
1 z3 \- a. t: o2 l) w/ u6 b4 {
) O1 l: \: w/ w+ d& W+ M! ^4 P    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);$ h2 Z5 [1 f  _) \4 ~2 g0 V9 o$ E
}
% L9 i) r, a. K! n4 q0 ^6 X) U4 a/ M. a& Y1 X! G# |1 R" C
void PWMTZIsr(void)
% k. J4 c8 ]. l6 H5 G{
+ n; r$ X. Z, {4 v! W2 ]        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ z% {+ i7 c* ]" ]% h1 w+ l8 j. n( O5 M% }
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
, O2 r- B1 B: X/ C9 G}
% ?/ P4 r, ^& r. Y. h& E) [% ?4 {6 {3 h# Q7 u
/****************************************************************************/% ~* g- e  H; f9 P9 a. e) |  q0 T" j
/*                                                                          */3 v$ S  D2 p& T) L2 b
/*              初始化捕获模块                                              */6 M6 q2 t- d$ T
/*                                                                          */  }! D5 U: u5 b! A5 _+ ^" u
/****************************************************************************/6 u- _* C9 m% _
void ECAPInit(void)
: Z, N% m; c# k; E{
* g( c$ B$ m9 ~" n, I/ [% H        /*-----设置 ECCTL1-----*/4 L$ f: T1 H( w+ A0 `% O9 J
        // 使能CAP寄存器装载
# R7 H5 B$ P0 U! _& i1 \7 x        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ z( W* E/ F. }5 g' g        // 设置预分频值.- m. O, F1 j9 d( R- d
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);3 h* H4 b2 J, y# Z8 g8 Y; d( S
        // 上升沿触发捕获事件8 l3 \% ?9 _) O7 P. V! \5 e
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
( E: R1 R  s# }4 ^        // 输入捕获后重新装载计数器值.9 x, [& J# M" ]. o8 a5 c$ f1 ?7 s# X
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);3 z0 E7 n# b/ v+ N! r2 t

. C3 l  T2 R- X2 e  Z& a        /*-----设置 ECCTL2-----*/
0 \: L7 K: r, F; b& _, R$ D        // 连续模式
( Q2 D& W3 J5 b, b9 i5 l- Q( h8 K6 P        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* g$ U# N6 L& M  P- k" ?; P5 o, J' H        // ECAP计数器TSCTR持续计数
8 X- u4 o  k4 `: a3 C        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);" ~1 o( l( z  v* g
        // 禁用同步输出和同步输入
! d  s2 R9 t2 W( `& U6 h6 P7 W        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: }; r$ t; X4 g' Y: \        // 配置 ECAP 2 为 CAPTURE 模式
- E; ]  g) T9 w- d. c: L% {* t        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% S- Y$ X9 J! |3 {( l1 v/ f
* m# H5 a1 l6 O# J        // 使能中断1 G+ C" F' J- q! Y' b
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);) M4 v2 f! T7 v6 o2 M8 a8 \, i. b
}
4 Y; c/ R0 G2 V4 v
0 P* A% ]' _; V/****************************************************************************/$ v7 P' }& f$ ^( g
/*                                                                          */% C4 V. X0 S7 U. s3 N
/*              取得捕获结果                                                */6 l# M* e1 ~( j5 a6 F( o7 S
/*                                                                          */
8 F- T8 [6 i9 o- x6 O8 T/****************************************************************************/
# j5 I( R! D% runsigned int ECAPRead(void)
) j- d9 x+ |: J* H{* k& x3 |  Y! [+ c; Z6 e! v9 }
        unsigned int capvalue;
" R8 |2 |  _) J# L  k/ P        unsigned long frequency;
6 a1 z2 y2 l, ^- x! c& @5 f
; ]1 x. l/ o8 b1 R! C( E        // Event1 中断标志
( F! ]! |( V: t5 n8 ]# E        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))5 E2 f2 w. \. t8 C% n
        {% i) g/ {% Z& B8 [1 P, y2 p
                // 取得捕获计数7 s' n) \: W3 }
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! v2 C! I* J9 Z1 d                capvalue = ECAPResult.cap1;/ a& ~# N2 g3 |1 i; }
1 s5 [4 F: a3 l0 B
                // CAPTRUE 模块 228M 时钟主频. ?3 c* ~0 Q$ w; R7 a
                frequency  =  228000000/capvalue;# c$ G" d4 @$ F
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. e3 s; e3 ?* `4 j/ f+ o/ k' i& _" e2 D  q
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* u3 }  f8 P* w  f" @* N- Y9 `) G//                IntEventClear(SYS_INT_ECAP2);
' N7 X' A- K5 j, {& N        }
9 Y5 l* ?; Q# H& A. h; j        return frequency;0 q4 S% p6 \9 n3 |& h
}
" k5 [: R, ^9 t+ [$ T
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。4 A, ^6 N% E& V! Z
[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