嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- Q. b" l4 m7 d+ e" r
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
' O5 z  A  p' O$ t/*                                                                          */3 Y2 k: i; x+ p9 }6 N
/*              宏定义                                                      */& y8 W( G% G6 d8 \/ N* S
/*                                                                          */
$ ^& S  c! ^3 D  [( p( U/****************************************************************************/! p2 o8 G5 L" v% M( O* [# H
// 软件断点
% V1 |  j5 a# P/ j# h5 y4 I. n8 o# N#define SW_BREAKPOINT     asm(" SWBP 0 ");
0 ^* W8 D; a+ ~. A5 m3 j  {2 Z0 |' R( A& ]& D+ L" [4 c- e5 e
// 时钟分频
- T( }4 R% {8 `1 i( a! c6 d#define CLOCK_DIV_VAL     228
, F9 ^7 B* ^4 `# \9 ~: o$ ]8 J
+ q; D3 Z! |0 `( t- r' V* g/****************************************************************************/
" m; ?1 Y2 s9 s/*                                                                          */7 S  B% A1 Y# Q5 w3 }' D
/*              全局变量                                                    */
6 Z: F* B. |1 |9 s; {/*                                                                          */& Q9 P5 p# h% Q" c& V1 q  U
/****************************************************************************/1 s$ l# j0 \# `- S
ECAPCONTEXT ECAPResult;
3 @4 g( ]1 W& k* V& u
; T0 V9 J  K0 w# d$ p  S/****************************************************************************/& d/ C7 B4 A9 r. _+ n$ P/ S. `
/*                                                                          */9 h& C' L( q8 |7 m8 J
/*              函数声明                                                    */7 K0 Q  r/ I7 P( L+ r" k0 }
/*                                                                          */
: U8 r2 v9 S2 c1 t; n/****************************************************************************/; u* f& L: }* C# A" c
// 外设使能配置8 J! c  N8 t/ }5 [4 Q
void PSCInit(void);
; G0 V8 l0 _5 ^6 P0 V+ F/ ]% c% j4 A
' _1 P5 s4 v3 g; f5 m// GPIO 管脚复用配置
! `$ w2 D' ^6 P: Z$ X7 u0 S& n4 wvoid GPIOBankPinMuxSet();/ j" r3 z' ^, d4 U2 J3 N# k7 r

) o- Y+ ~) n$ G, e$ V// 产生波形
' d0 a. S% I( ?8 Q6 Yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);( O$ L7 b! P/ H$ q/ u
void ChopperWaveform(void);# h+ P% n0 l" z2 w- d
* `- _# }' M8 Q8 e  |$ n
// ECAP初始化和读函数( z$ e! P5 C& g: f3 F
void ECAPInit(void);
! V  @9 Q' ~/ a( uunsigned int ECAPRead(void);
; u+ u1 _( }5 \4 R6 H4 e( H6 ^0 R- Q5 ]; x- |
//ARM 中断初始化$ V5 q2 P2 `! ~2 S. Y- j
void InterruptInit(void);
% e# w$ ^6 v' f5 E8 }, h9 ~# {
3 |: X1 {+ \  a6 V5 R$ g// PWM 中断初始化% I! Z! p; d6 |8 D; j' `7 a
void PWMInterruptInit(void);( ]4 |6 A* j7 n9 u! Y8 u( l
// 中断服务函数
6 }' |! O9 d4 r" b- @, z- |// PWM 事件1 M, `9 e( O/ v9 L; m
void PWMEventIsr(void);4 i5 N" t; O& `. f
// PWM 错误控制事件' }# R( f  n  }
void PWMTZIsr(void);
$ u% F9 G4 R/ D$ {) e9 @7 [
- }: Z) a7 H/ V. R& k. l/****************************************************************************/3 E, p- `( J/ T
/*                                                                          */
' N: P; d4 v: k; E$ ~/*              主函数                                                      */' |4 g! I! b8 K/ \, f
/*                                                                          */
7 l" M# K2 S7 @4 ?0 d/****************************************************************************/
  n8 ^, M; y: R( S! q0 mint main(void)
6 D- P1 K7 E4 N& N& L! W6 V( w) o{
! a6 O% S" c" X/ d8 e        // 外设使能配置
' F0 F  Y3 g  {8 c# Z/ a2 a  R        PSCInit();
8 F" u6 m/ ~. s+ _& s! F
9 F9 P0 a7 Y- k% o        // 初始化串口终端 使用串口2
  n8 D# w: l2 B/ U. P5 d        UARTStdioInit();9 ]- p; h6 ~. r
        ' [3 R- h* {5 b5 D! K
        // GPIO 管脚复用配置
- |$ E- p) Y7 V, D# e        GPIOBankPinMuxSet();. w. G, ^  e7 F  `/ K1 v/ P3 B- b: B
* }& h, p1 S6 ^3 {# ^' v
        // ARM 中断初始化
7 {& Y' D" H) L- r* t- l        InterruptInit();& b5 F  ]. R  h# d9 |' W
& J7 Z' R4 ^+ A4 c" X
        // PWM 中断初始化
7 y# x, p7 o. ]- t8 a8 s        PWMInterruptInit();
: z) [0 U) a( D2 D! a  K
6 n8 h, }+ D% g+ ^9 c0 F5 f6 p/ F        unsigned char i;1 ]. H1 B  N& x8 l9 k
        unsigned int j;  k- H9 Q  m$ g& u
( r9 }* h% A3 v8 v# R, r$ e) _2 m
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);) Z4 a" ~& v$ w1 b
        UARTPuts("------------------------------------------------------------\r\n", -1);
1 }; x4 d2 ~/ a7 J; J4 t0 _        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! B* S/ p. w1 _$ G! F6 v9 b& B& K
        // 产生波形; B% t: X. h4 q* l
        PWM1ABasic(25000,50);( e) Q% o% F2 W8 O, p' c( p

% |. C, R4 X8 z5 V3 x' g  d        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);% w+ n6 j, M/ A, G. ~  M  _; r
        UARTPuts("------------------------------------------------------------\r\n", -1);
! l/ n$ _% @1 U3 R" z# L2 @3 E; p5 O! V. d; ~2 B8 k

( C2 R& g. x! v3 A0 y' Z. O& }& \
        UARTPuts("------------------------------------------------------------\r\n", -1);
2 W- {0 x4 w, q4 e; a. @9 R' c( g  n' y        UARTPuts("                    C6748 ECAP Test\r\n", -1);, `( @6 N9 |! t+ Q' h$ T5 w: r7 P
        // ECAP 捕获初始化4 o! ?  O/ G2 z; M! ?& T
        ECAPInit();3 y9 r/ u9 E1 Q0 o+ S' c/ a
        UARTPuts("Initialize ECAP.......\r\n",-1);
1 ~& \& A# M+ e1 Y  U7 A8 g        for(i=0;i<5;i++)
" U! K" z3 K# Z        {7 J) ]/ o& @0 C$ O* }& v: }
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
! W  n$ e+ v. N: `1 N                    ECAPRead();
3 {4 P: n' u# |8 R0 Q6 S! r8 ]- {        }
( N& N) J0 ~$ w5 I        UARTPuts("\r\n",-1);
% i. k0 t3 Q8 v0 `        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
2 `2 F3 t* u- r: S. K0 E        UARTPuts("------------------------------------------------------------\r\n", -1);
; B( O. Z6 D( r+ z
; |3 s9 Y- F! g. T1 U" ?9 Y% l        // 主循环
/ C/ u0 E! @, \( Y8 }- s        for(;;)  E# o! m4 C0 F+ W3 }0 S
        {5 l: i4 m9 I, J; t& y  Y! |- p

7 j3 `& _6 C9 V! ?1 m# n        }
6 n0 \/ B) i4 U$ M% s9 Z}7 t  H5 P/ X; [) }4 D, ?3 B! }

+ F7 ?  `7 I6 l+ R! ]$ A/****************************************************************************/
' \" h+ t) [/ O# c+ y/*                                                                          */) R' |4 O/ r5 }% D
/*              PSC 初始化                                                  *// ?+ |6 C1 n: B, g5 r2 o% O
/*                                                                          */
( |" _! U4 h% \2 \/ b5 M/ E/****************************************************************************/; ^" w* p/ E0 Z  \! k4 y/ b; S- \
void PSCInit(void)
* `. P+ ^& F$ I9 m# r* I. i# w& {{+ j0 I' B. S$ w. ^
        // 使能  EHRPWM 和 ECAP 模块
+ e- W) `' v9 H" D        // 对相应外设模块的使能也可以在 BootLoader 中完成
5 e  X! h- @+ I% I3 O" e    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, Y, i" l. D4 n: A. @* e% S    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ ~" t9 v% I: B5 q; d1 o+ ^}1 B# t+ y4 T( H8 Y1 T6 _& v6 y
8 e. @( D5 U! n; Z. d; y# f4 E
/****************************************************************************/0 V7 G! y- \1 s
/*                                                                          */
! A+ B: Y+ y9 W. V3 u/*              GPIO 管脚复用配置                                           */, r+ ^! ]+ H2 p; m1 i  p% H. q
/*                                                                          */% b, H8 t/ Y- Y2 g9 D" l2 F* r+ W
/****************************************************************************/+ I% S# T2 w( W) E
void GPIOBankPinMuxSet(void)
- q) F, m1 z# A) {6 I{, y9 w- O: d- g9 J& f
        EHRPWM1PinMuxSetup();+ r& Z" X. a5 Q$ e0 p9 A+ c( F

) |' |* n* r, y0 g& g        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP), u( F: `3 c; d: K; c$ @
        // 作为捕获功能时管脚方向为输入) N3 y5 l- d1 o) l
        // 作为辅助脉宽调制时管脚方向为输出
/ T' `- J3 v. j' q    // ECAP2 / APWM27 u( S/ B& ~: f+ L
        ECAPPinMuxSetup(2);
2 k- |2 p( y* u+ n* `0 V/ \  O$ S$ A4 x# h
        // ECAP2 / APWM2方向设置为输入
# [5 R3 o$ S4 H! w; U7 w        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]$ s% W5 [; J/ v; D! F8 t
}
: m! Z6 t+ J0 w( A9 @3 B% ~3 U
6 r6 w2 w9 M# Q  \# l$ z/****************************************************************************/
9 d& m7 i) C; H& h/*                                                                          */
, \: w6 p+ e/ [2 v1 ~& F6 A/*              PWM 输出波形                                                */9 x  Q. L; k3 n$ r" n! U
/*                                                                          */
& C2 ~  @+ \# `+ F9 c/****************************************************************************/2 y7 E/ L" p# t# Q. Z2 w3 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio), c! G3 U# Z% x3 G4 W
{) k! [5 c9 Z1 k5 M
    // 时间基准配置# V) d, O& Y. F- [3 ~
    // 时钟配置
  M# t) l& a& g# L, Z    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);5 t& |$ v* l7 L

/ M1 N4 P6 J4 X1 |$ Y+ z4 t    // 配置周期, l+ N( U2 F  ]! k  w
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; \+ C9 G  @: ]) t2 E7 t3 q
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 E# d  G& t; D& a; r0 [+ y

  I3 m" G% M& X3 z+ D    // 禁用输入同步信号
% P! l% f1 Z$ F+ \1 a* [    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; x# e# H. K) w% [( p  |; r% D; k* H  j0 G9 g
    // 禁用输出同步信号
/ U" |/ p$ Z6 F3 _8 v- P    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);9 L( Z- W) U4 U3 S0 T5 J6 s- m
) o" |) X+ z4 M; R; s" H& S+ M5 T
    // 仿真(DEBUG)模式行为配置
9 O' t) d* c6 c( u- j    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 I; c9 \. O) P2 C6 l
3 V) a5 q4 j  ]! Y! `3 D! {
    // 配置计数比较器子模块
" w: T5 i* H5 X. }' [8 K    // 加载比较器 A 值
) f) k: G3 i2 b6 b    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- V, h: A" p. Y- T. q: X                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% D# Y% ^7 T% Z+ Q$ R( z/ e% M! I9 k6 f1 _. Z+ F4 C
    // 加载比较器 B 值4 t: r! K! A% C, |+ l
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. ~1 f8 T9 C! V) m                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. K4 f: u6 A6 k0 t
* L. i. h5 ?1 V. c/ l
    // 功能限定配置(输出引脚触发方式设定)
- D$ Q9 S; b% A! w    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 u8 l% z( m& E2 |5 i7 C
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ S# F4 q* w: Y" Z4 A
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 f( m7 Y) a9 V1 _6 f! E
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);% O/ d0 e$ @! A( x- `6 q
# y7 O/ E! k+ H  V- m3 \: N. O; ?0 y
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
, Q) i% |% n0 X# l    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, G5 L' G$ g& ~+ F
1 O+ ?6 `, l% J; ~& {. H* X
    // 禁用斩波子模块% M) v( Q& ?) [& r7 ^9 {8 ?
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' ^, L% f$ I$ M7 T; C
1 G* |1 d5 `4 T( t2 p2 h% l, V    // 禁用错误控制事件- q7 ?0 P& v/ b
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
* ?" w; ?, X6 S7 K7 k    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
5 Z8 Z- q, E' r$ b  b' j, j% z4 U" y  C6 I
    // 事件触发配置3 Y6 r) t& X: ?
    // 每三次事件发生产生中断
2 M' r3 }4 n$ b+ V4 |! O" r, D" C    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- e6 @1 @- `6 }7 Q$ J1 ^8 o  j* I    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件+ ^* Z1 }6 @9 R8 _$ t
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
: p$ m( q7 X1 ^    // 使能中断; N- u8 A% E, t: Y/ L
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);  D2 B1 S1 Y9 K* f

& w, [9 F0 h2 C5 ]' j) [    // 禁用高精度子模块
* x* s2 z$ H8 ?9 c# t( ?- ^# ~    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);% _% f1 R' ]! E& t

, k( R; I9 a( _* M! Y5 n9 y1 z    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 t' z& n6 \) F4 b; x}! T8 x+ a# e. R5 s. u! ]

3 d+ M, I- g: j6 N/ x; I2 Avoid ChopperWaveform(void)
$ a7 Z5 t/ N+ v; b! Z2 u* p{
- U6 k" G7 f: N# y    // 50% 占空比+ c* c; D9 v8 R7 i0 B5 w1 K
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* L3 f% U& m3 ^    // 4 分频
* [' U' e& j1 r) o  m& Y- a    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);: s' l; @" F! o- F
    // 单个脉冲宽度
; w, P7 t: J4 d2 G" ^    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);! {. W9 C7 V2 g/ X
    // 使能斩波子模块- |+ b/ g& s( k9 J$ I2 ]
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# z! X1 U5 o( J3 c! P% ~, u}# ]" q2 i; V& [4 A) {' w

" x' i" h+ h( E' L' u& \/****************************************************************************/9 X3 I% n) P( _* r& d
/*                                                                          */
/ c2 T" ?$ u1 R6 ~6 [- L% _/*              PWM 中断初始化                                              */, y- h! r7 b3 a6 E# j$ G
/*                                                                          */* ~! ^  K3 c( Z& C8 a. z" z* B
/****************************************************************************/
6 W* N- n( n3 C# Q8 K+ r+ Wvoid PWMInterruptInit(void)
; x/ @1 A" p% i2 f- s8 t  W{/ \5 ]4 T4 m6 d) ^
        // 注册中断服务函数
( d( z* }' G" y/ C/ ]" X        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);3 g; t3 x$ o& s9 P0 E
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% C9 p" ?( A6 Q  {! j1 H7 y/ E
: _. s+ E* `/ R/ E$ Z/ p4 C+ Q+ y, @! L
        // 映射中断! [" m+ ^8 y1 x$ S; L: g
        IntChannelSet(SYS_INT_EHRPWM1, 2);
3 q0 d% o! s. Y        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);% Z! Q' i) g/ v: ?
6 W2 c$ ?2 B3 _, I. Y7 \
        // 使能中断' i$ ?2 a' F9 ~5 Q+ _3 W
        IntSystemEnable(SYS_INT_EHRPWM1);
' Z0 t7 O) {5 Y5 ~; T# a        IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 p( Z6 }) J3 ^: y7 j% {( `}3 {- f5 q) Z$ r! P! ]

% `6 c! ]& o( g4 I0 v7 `( W" o: `8 ?/****************************************************************************/7 ^! b. E2 X# j9 I5 t3 X6 i" u% m
/*                                                                          */
, W0 n+ y9 P5 A* y6 J/*              ARM 中断初始化                                              */; L& I3 _- w2 k% [  F6 f- v. g+ I  L
/*                                                                          */0 w' E; I" h+ N7 R
/****************************************************************************/4 N" e1 ~' ^6 W
void InterruptInit(void)& B' y. P2 x3 _6 j/ P9 }& ?
{
. L+ T. H5 u* v6 Z7 ]& {        // 初始化 ARM 中断控制器. r) y* i' O- `* X3 m' v9 @% X
        IntAINTCInit();
) R4 }6 w. L! B* u/ y; v) Z2 x
5 z5 r/ l  J  a" p        // 使能 IRQ(CPSR)2 I- y" y3 @% H' M( O+ m& i
        IntMasterIRQEnable();
  u  N9 L) N5 R
0 g/ {$ L2 O$ K2 A, z4 ~$ ^* K        // 使能中断(AINTC GER)& p( m& O" a. F! b- n% I7 J
        IntGlobalEnable();# q2 ]2 b- {# u  f
) ~# F$ K; o# v1 b& ?/ {. L! w' |
        // 使能中断(AINTC HIER)
" o- `9 K. k1 x+ g1 t- I        IntIRQEnable();
$ m9 [/ _: W+ d/ d}) H# J* X% d( h$ c3 E% k
6 g# y: z$ y8 U" Y

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
" u$ E$ i2 e2 n, N, A3 m/*                                                                          */% N& Z5 g! Q9 G2 V2 P
/*              中断服务函数                                                */
6 j$ w: t3 q. Q8 J2 n/*                                                                          */# b8 B* K& V# Z- F$ r- e* W: F
/****************************************************************************/
2 z1 e! O# G7 mvoid PWMEventIsr(void)+ X3 r9 C. t) S, e0 j& Z; I
{
! r/ D8 z) J- w  Y/ F) @) b& {# ?        IntSystemStatusClear(SYS_INT_EHRPWM1);: S9 H) o! f1 J3 W6 t: @; K3 H
9 |" E* c& z3 X& i
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);" J. U- M5 j% I  H1 H
}
9 e9 q* X! C) P$ c
4 x5 O1 c2 P0 n# l: B( evoid PWMTZIsr(void)
& n, ], s, H% o% j{5 X' u, I  ]/ i9 ^+ ?5 y" p. R7 `
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);) E$ I' I& o) o( N& w4 b

' M: h3 g9 D; S* c' _" q- O( h    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);% X; y! U  v+ r) _+ m# v
}( o" S- q8 g( @* f

0 |$ |5 d! S' |9 o4 M3 A$ s  p/****************************************************************************/2 Y* y7 \, n' V! Y' q! a0 g/ `
/*                                                                          */
" A. V$ o) ~+ A1 |7 z" p/*              初始化捕获模块                                              */& `/ t" c0 r( d: O
/*                                                                          */1 h, ~1 r/ z4 a7 _* n3 L8 I3 Q7 D
/****************************************************************************/
+ N/ \) r- B8 X4 A9 t, H4 wvoid ECAPInit(void)# P( ~; B& \$ Z5 c$ ~: Y, ]
{/ N0 H8 m3 b  M' C7 W
        /*-----设置 ECCTL1-----*/" d2 v) ?) I/ B( Y; ^" Q% L
        // 使能CAP寄存器装载* _3 s( `, Q* x# R, s
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);; r& s8 _3 g; ~% _( `. n# v  `
        // 设置预分频值.: x! x1 D/ q) m
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# d0 U  L8 Q8 |! b8 F
        // 上升沿触发捕获事件
6 V$ E& i1 H  G% w: \2 H  z        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);, d+ {; m/ w1 L: H$ x1 M9 m8 m
        // 输入捕获后重新装载计数器值.: X3 f$ e4 M5 P3 x3 ?
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);1 W2 y2 p# ~+ b7 I0 e
$ K( Q2 e1 {4 b$ N4 L4 a% K
        /*-----设置 ECCTL2-----*/
6 @- G7 G5 L, G* n: a: R+ [        // 连续模式
7 E3 x/ l: N8 ~: ], ^' {3 d: Z) d        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, @* j4 C+ u. S        // ECAP计数器TSCTR持续计数
3 F! G7 z! `" O2 f        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ J- g; _/ S5 [        // 禁用同步输出和同步输入) N: c2 P5 Q8 J" z, b
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);7 U( k5 u' D. p: a) T1 j8 K
        // 配置 ECAP 2 为 CAPTURE 模式6 K* w' }: y: `9 D7 V4 s
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);, }- h0 h( Y1 \" O" r/ ^) e
4 a: K6 I7 D% ^% ^7 K2 C
        // 使能中断6 G! d* @+ J9 o4 F" J2 K( D
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);  n% e' I* o  F' G
}+ I% |' _8 _- [: H

, M  `& c3 N  o7 x& C; q! |/****************************************************************************/
9 o4 J6 m- U7 g3 j- `/*                                                                          */0 U0 Y0 w  x8 M+ u
/*              取得捕获结果                                                */
  e4 _9 l+ ]$ E5 T4 M/ W+ X6 L/*                                                                          */  O) R6 y, \0 I" S$ ~0 T  s5 ?
/****************************************************************************/
9 T" n# l' o. q2 ?# `; [unsigned int ECAPRead(void)
$ |6 n, Q$ M4 h8 c2 ~& E2 w# J' S{
2 y0 r# d; l1 {) m. U' L6 N2 P. ?& W        unsigned int capvalue;
+ U" Y/ U. d  F$ @! z9 O+ Y        unsigned long frequency;
) i/ c# t1 j# s1 |: E) V& G2 S* Y' B
        // Event1 中断标志) t1 _) K- \4 w' u9 ~. p+ v* m1 b, ~
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))& c9 n& [* Y# _  j
        {
7 ^3 |, f* i. O( g5 Y                // 取得捕获计数
- L6 {4 E, h$ X1 J- N+ ^6 h- o1 i                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
# i& W" T9 `& J* b7 x2 N# ^+ s( \                capvalue = ECAPResult.cap1;
) m- X/ N4 K9 Z' r% f
; h: v- {3 N4 Q                // CAPTRUE 模块 228M 时钟主频. D, W6 q0 t# S+ t
                frequency  =  228000000/capvalue;
4 v  J3 S2 W. |% m9 F" s: r* n* s                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);5 s" N$ O, f  b3 j

; E0 p4 n) Y$ a! r# J( r                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 T7 S2 p3 k5 Z, U7 g& ^2 o$ \//                IntEventClear(SYS_INT_ECAP2);
* }* p1 j; s8 o2 C0 C        }1 d- O: Z# J7 E+ }) b
        return frequency;- a( b8 Z' b6 p# f. t6 `2 }& v! s
}
" O( c$ C6 z% |4 x: l! X
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。1 ?- h. O7 g5 ^7 }' l' 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