嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家: K8 n# u) f6 y& i

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
* Q! o: w6 F' u2 h$ X+ u/*                                                                          */
' a+ D, L% T1 o/*              宏定义                                                      */
- q: j# w+ G! J/*                                                                          */- }) O2 ~% g. n' B, G  }% R* A( U
/****************************************************************************/
$ R" C0 t* \/ [9 i/ ~( W$ x// 软件断点6 T. p, K% u  n+ w/ ?) a9 P, t
#define SW_BREAKPOINT     asm(" SWBP 0 ");
# C5 J" A) p7 t: Z( b6 l
; K$ T: z, i, X8 a- M' Y' L: U4 u// 时钟分频" s- V8 B! j9 y) L# j( y: N
#define CLOCK_DIV_VAL     228
" Q- |" |" E2 j9 t# j' ]( @3 B% {. u) r2 e; ^
/****************************************************************************// A# J% I# K1 V) F  }6 o4 p
/*                                                                          */) y- |  k9 @2 n$ b6 d
/*              全局变量                                                    */
2 b$ N* u4 d4 z% V' z* Q! X2 R% R0 J/*                                                                          */
0 K' n; Y" c, n$ u( O/****************************************************************************/
2 P5 M( M1 ~) _4 }, iECAPCONTEXT ECAPResult;
, s& b4 |8 P& e* y, S& h5 ]$ U& G: w8 @+ ~) P; d# q
/****************************************************************************/
- v+ Q+ o3 j7 j9 D/*                                                                          */
8 I5 Q( t) A" j  {( ^/ q# [; |7 s/*              函数声明                                                    */, K6 ]# o: F! F( d( ]  {) t; ?/ J' P, x
/*                                                                          */; r+ _: L; Z8 x6 g
/****************************************************************************/
. i. V* M  d% ?5 Q4 D) f; d// 外设使能配置
8 G& W. J' Y9 t5 u9 d; Qvoid PSCInit(void);! l+ k& g2 C* v% v
( M' {, G- N' {% p  g6 M, a# S6 j0 N
// GPIO 管脚复用配置
5 K  x9 L9 D" j9 b' `+ kvoid GPIOBankPinMuxSet();+ ~1 @; E! Q0 G* X$ @( C
# A+ N3 A; V$ R8 `- u
// 产生波形! q# f  o8 {: |9 @% U. s+ V& r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# y+ f8 X: |- i" k  D. q, B0 u; lvoid ChopperWaveform(void);
/ `, \6 p1 w4 o5 F; X/ h' d7 S$ L; g& Y4 X
// ECAP初始化和读函数
; h4 q3 C' D0 Mvoid ECAPInit(void);% N' m( b5 ^& g2 E- ?8 Q5 m5 t
unsigned int ECAPRead(void);
! Y9 Y( y" f9 a+ e* O9 ~
3 {5 v( e$ ?, Z//ARM 中断初始化
) f+ J+ h. e4 A) Z3 Dvoid InterruptInit(void);
4 F( G  c5 h5 F, G, _' T4 o) J9 v1 b
// PWM 中断初始化' l/ R3 S6 v' C3 w
void PWMInterruptInit(void);1 O8 m& q2 K( D9 Y+ _9 M
// 中断服务函数
  L1 {7 p# M& t! v2 D& _// PWM 事件5 x; g$ D7 Q- a) k# `1 G. }* }
void PWMEventIsr(void);
% Q. Z6 m1 R% _! S  V  y// PWM 错误控制事件
5 k2 l% m) L1 M3 T1 s7 h& q& ]void PWMTZIsr(void);% }! A0 k. P- ?7 f4 c- [

6 f5 O& V1 l, m) [/****************************************************************************/
8 a1 l- X; i* G' [2 `0 b/*                                                                          */
7 a3 U5 _" S+ q( v1 G/ c/*              主函数                                                      */+ b8 x0 _! L& }* P! N+ x( m
/*                                                                          */' I. M! F+ @4 b0 O0 S
/****************************************************************************/1 @, e" ], b. E  U0 h+ [' I
int main(void)+ a2 o" R% y# m3 |
{3 u* _' U# I6 a) e! m( ]  A
        // 外设使能配置
% ^2 d9 J- H$ k( h3 y        PSCInit();+ w& {0 D! u- L! B* |

7 m/ F* E/ b) B  D        // 初始化串口终端 使用串口2
$ P# i# A/ u1 o2 I0 R        UARTStdioInit();
5 o. \  M& c' W( V5 }/ ?        3 E; e7 ~7 a" k
        // GPIO 管脚复用配置
0 M4 e6 p6 @+ g        GPIOBankPinMuxSet();
) ~5 r( Z. x2 s0 O
% G4 q4 Q3 t! K5 x, G$ Q        // ARM 中断初始化
. X' i4 D! _; o/ X3 t; B        InterruptInit();
8 C6 {0 p; C7 M! o9 J, g" @7 ?! P  o% [3 d& R
        // PWM 中断初始化( k' Z% b7 R5 S5 h; j
        PWMInterruptInit();' j0 o4 Y) d& y: n0 q/ \
& k& d3 E2 l4 p# Z; |4 e
        unsigned char i;
9 ^- e1 D  _/ c5 P5 y  ]; q. O0 D        unsigned int j;
1 U" N. w, w) c! Y
& J% l$ [! ]3 R/ E# j* T/ g% v        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);6 z2 n6 k7 h/ m9 W% C; ~
        UARTPuts("------------------------------------------------------------\r\n", -1);
; R, ~  v! W% O. T7 a        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);% k3 R. ^! f# c' t% s' {( \
        // 产生波形4 {' p3 Q$ o! ~- ]' @) @+ V
        PWM1ABasic(25000,50);* Z2 ?* A! c9 J

1 F4 R' ?, x3 z, {+ `! u        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
2 K4 d1 t2 B' q2 F- l4 u        UARTPuts("------------------------------------------------------------\r\n", -1);
" f. h; b4 {; b' f
3 l% C5 s% N( I2 I1 R  U& T2 g2 R

5 a5 {: {" K, q# `7 o3 W* ?0 O        UARTPuts("------------------------------------------------------------\r\n", -1);
; v! Z/ ^3 D' E  F$ f; l# C  j        UARTPuts("                    C6748 ECAP Test\r\n", -1);6 j' x- D2 g; Z0 ^
        // ECAP 捕获初始化, ~  x3 t) z! Q# ~: u2 K, ~! p& S7 q
        ECAPInit();
5 Z8 D$ w$ z" J+ D& Q        UARTPuts("Initialize ECAP.......\r\n",-1);" b) b- H: G+ d: i* @5 S
        for(i=0;i<5;i++)0 W' I: k+ B) O0 T. h
        {
1 a- c- U* B( C7 W: C; p( ~* }' W                    for(j=0x00FFFFFF;j>0;j--);            // 延时
! Y( ]) ]1 m; g, i, z% |- U                    ECAPRead();
+ e. a7 y- K' t, ?2 c6 b+ ^        }
6 w( q# M" |. }$ k        UARTPuts("\r\n",-1);
4 |4 B0 a1 r4 w! g        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
: F% `$ k9 h" y* h- @# Y0 @        UARTPuts("------------------------------------------------------------\r\n", -1);1 G$ B% i& f, C1 d, |
, |4 I  q# I) B1 K- I: y9 ^
        // 主循环
' s  O  `6 \7 O1 B' w1 t        for(;;)) n8 @$ v: ~: e2 u. a* R2 ]
        {
: N- H0 k; }7 j4 V/ W; o2 b, {/ j. k0 c: W, u3 d# I
        }/ \) X: o! }3 {+ Z# n
}1 _3 F+ V: l7 C- h0 O5 M
6 U8 O. o$ X$ @7 T
/****************************************************************************/
8 X$ K: ]1 b1 y/*                                                                          */
0 S% M& v# R2 l: C2 A/*              PSC 初始化                                                  */
/ M+ D" |+ b9 f+ o, j% @/*                                                                          */
& ^) I  G( S. q( h7 h- V4 A/****************************************************************************/- I/ ^7 @/ {! j
void PSCInit(void)) b$ V( A6 O4 n/ d) G! p8 x
{* f. z+ }6 l7 x: S
        // 使能  EHRPWM 和 ECAP 模块7 [+ n1 a7 M; I" V! [
        // 对相应外设模块的使能也可以在 BootLoader 中完成8 g; m& K6 ]+ [9 m% D- C
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ K- V5 N" Y5 \# }7 i& `( M
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);" `9 ?5 D& b0 k" E, C# f
}  Y; C8 ?" J, u  B( n

% @7 Q7 d  `' F, L2 h2 o/****************************************************************************/! l" I/ J4 l; L4 S
/*                                                                          */- @3 b# O  V2 D) k  @  L7 r2 A
/*              GPIO 管脚复用配置                                           */) a" L, D9 d, w: ?7 ~  n2 n- k' n+ h( y
/*                                                                          */, c1 F% d& T* X" W
/****************************************************************************/
9 T$ j4 L' v: e, n: o9 M0 R8 a. k0 Lvoid GPIOBankPinMuxSet(void)1 u8 }% O: n) d; {# n
{! j2 H: E# ~9 p! q9 V' |
        EHRPWM1PinMuxSetup();
" f9 ?. n7 b5 O! z5 F; H8 ^* N# s1 l, s' O' j) D* W
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 y( K. Q: Q8 O% Q8 |* M
        // 作为捕获功能时管脚方向为输入$ Q1 s! V- b; @+ Y, F! e# t& [0 k2 e
        // 作为辅助脉宽调制时管脚方向为输出
. s0 f3 Y0 _0 O8 J6 g6 g" P- [; h    // ECAP2 / APWM2
* J9 j, U( }4 e3 L' s        ECAPPinMuxSetup(2);( g; A! T6 S  T7 E2 i
& W  f5 e; c( E9 B( d% Z0 w
        // ECAP2 / APWM2方向设置为输入  K! o( ?/ Q2 O" l( d
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]! [* I- u+ X' ?8 k
}
% |8 @) B, w& ]. W' {! G6 i% _# E
' l! Q, D6 m6 H7 I- e/****************************************************************************/$ c  m+ K7 @5 v
/*                                                                          */
! V) Q" M$ _8 N0 j/ w3 `2 E2 w/*              PWM 输出波形                                                */3 |: Q. D# G8 x0 Z" f8 o
/*                                                                          */; a: K! z+ d- k' |
/****************************************************************************/. p8 t/ G5 `4 o4 H9 M3 g9 q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)& U$ w0 t  u  f
{
% s" a7 a  X* R0 M1 W! Y    // 时间基准配置
3 t- m' y  m7 Z7 ^7 T6 j* m8 D    // 时钟配置* H+ k# R5 W8 l" ~( ~
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);! V# V/ `# B( m# Q1 f! E; S
6 F' F* l+ i* k  R
    // 配置周期0 R# Y. b) }8 N
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- V1 F3 n; c+ i% [9 @( A
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
1 m6 l; ~+ p( t7 s& h' y
0 b: Y3 a1 c; F; A0 v  Q1 J6 D2 ~    // 禁用输入同步信号/ [+ t- K7 @* l+ ]5 t" h4 V+ l2 t
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# Z. P" ?5 S: i- Z. O- x9 i6 D3 U. V7 n8 l9 T5 ^0 p
    // 禁用输出同步信号
, c9 `. _" x) V+ O- |    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, [5 B9 E4 B$ q' p& m( P+ _0 y+ B* Q; ^% o4 ]: {- e, \2 A
    // 仿真(DEBUG)模式行为配置
3 I1 F* @+ ~7 W8 `& y    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- Y# l; V2 L! I+ _; L! X! R4 o" M
1 y& ?* c1 l' i& P% ^- Q    // 配置计数比较器子模块' k4 B  `# b0 L' s$ O9 G$ ]' [, \
    // 加载比较器 A 值( K2 @. \# Z/ }0 T, K
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 v; ^/ R6 L  ?7 J. o
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 j8 R0 l. [  j6 E' ]
, r6 y9 X' ?3 V2 M7 \) B. T    // 加载比较器 B 值
: A* v: b0 m* B+ X/ O. z6 v+ a% O    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: p! R( L* W# T1 `3 R: [/ F
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! g) T3 |) n$ v- r; J
  `$ m0 P5 k3 J+ j    // 功能限定配置(输出引脚触发方式设定)4 W0 F+ k" P9 r2 c. }
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
) `" Z; K) h" v( r' |' n* {  M* z9 J    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,4 {2 l' J  h9 H& l  C8 _
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
6 N7 I3 C" `& }. U                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 i: n5 w) Z  c+ c% t
# {# X" X2 d6 k& k2 c. P3 Y    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 t. S) O* b8 l& T6 F    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& m/ L5 w* d2 I9 L, t

7 ^% z3 {# ]! N3 L% U2 U    // 禁用斩波子模块4 {( W4 V0 g1 [& E8 s* r0 I
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);) N# J+ q. V$ u: z, n6 K( e
+ O4 ^* `, ^' {5 k6 k
    // 禁用错误控制事件0 L5 h/ k# j7 Q  B8 `7 s
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);) L& Z# _5 K0 s. r# q' i% v& T
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ n) B, O8 R7 v7 I
( C9 I( t& e- R5 r! x! r8 k    // 事件触发配置5 m$ L$ E. D& u$ U) t0 P
    // 每三次事件发生产生中断
3 L+ ?; @: n" @/ Q    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: q7 w2 ]8 l# ~. M# _
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件! Q0 _# ?- |" ?" Y2 h& J
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 m2 |8 F( H0 T# _3 U3 @    // 使能中断
2 M2 {; T9 X) u8 `    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! K% b/ z. \9 N
' r; u& ~& {# w8 R; P    // 禁用高精度子模块  K4 O3 ]" Z- q
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- ^0 Y7 h( I* k2 g" G; w6 J3 g$ v6 a+ V
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);" K% s# i$ H) ^2 H
}
. M8 ^+ v0 X% |( o$ U8 g3 }2 U1 Q0 a3 ?3 t& B; p. a4 X
void ChopperWaveform(void)
4 b! g, V  c2 i1 E{
3 z/ E# @) J6 t    // 50% 占空比( N  y5 b& F  n1 p1 u3 t. U
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ {! S* K( ~- q) T& y% e    // 4 分频. n3 s2 F5 ^- W; I  E% H
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" ~, C: ?# B5 M# w( i  v% @    // 单个脉冲宽度( n0 P: x( M( E: S' y: V; v, R
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) a" F- X) Q% j) w# @# p4 r( j( i
    // 使能斩波子模块0 r8 z- a/ a8 D0 X  J; U
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
* |( X" z4 |6 _# e4 c  Z$ {}
+ q9 j; h- \% h' j* V
# H. w9 D5 q  f9 h7 m1 P/****************************************************************************/
' L( j0 B. w5 g# A: w( q( B9 V8 ?/*                                                                          */
- D3 P! t5 |! S0 x7 k' o. e/*              PWM 中断初始化                                              */; M3 V! U2 n! q) k3 B
/*                                                                          */
' a' j7 l0 U. |: N! m; E/****************************************************************************/% x7 X. J0 b: J% _4 f
void PWMInterruptInit(void)
1 H* F5 s" w+ B3 p& N5 h2 u{0 O' f, A; Y9 |  K( `- K: s6 m* X$ X
        // 注册中断服务函数
  S. w+ Y% w; ^, e( U! x2 D) z        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% {; L1 q0 f8 R" e' [% D/ B        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
2 M1 h' c+ K; C
8 q1 X% G- U0 t- ^- x        // 映射中断
3 k7 R: C) p6 G/ Y6 N        IntChannelSet(SYS_INT_EHRPWM1, 2);
! q+ m# g% g/ b  j% {  c        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 @8 l# E& y* K! M: ~; E4 K
/ b) S9 k, F2 F6 n" l        // 使能中断$ N  @- m3 t% b- O
        IntSystemEnable(SYS_INT_EHRPWM1);8 s2 \; n: P4 `2 T/ {
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
- _( T  T' D2 ^; u- a8 E}
2 H: f. W. c/ b, O+ u2 F5 p) W
6 _& U( U$ f& W0 i# d/ V/****************************************************************************/
3 h3 g6 |+ N( @5 l- f6 }/*                                                                          */
  [$ B, S9 e- z9 {6 ~9 p5 s4 k/ g/*              ARM 中断初始化                                              */8 Q. o( W3 a3 Z
/*                                                                          */9 \& k) L5 k" V5 c3 R1 Y# F  h
/****************************************************************************/
7 `5 {$ h" @1 o; [9 a4 Z3 hvoid InterruptInit(void)8 f0 E4 B( W/ n2 l- z
{! A2 M/ f' r1 M; c3 G/ U/ y
        // 初始化 ARM 中断控制器+ e1 N" [/ E4 B6 N
        IntAINTCInit();! B' H/ G$ n; }' l$ x3 M: d8 j7 J
+ T4 D" s9 B7 g  {4 x( O: h. r
        // 使能 IRQ(CPSR)3 n. I# I' E7 o' f2 @" b
        IntMasterIRQEnable();/ j7 X5 ~- W% D9 a

4 o9 C- z5 b- K& S        // 使能中断(AINTC GER)& Y/ ~1 Y6 i- w* L2 r3 C0 e
        IntGlobalEnable();1 L+ |; L$ `# R1 |2 \  C, N
, a+ N1 G, I, A7 Z; u9 Q
        // 使能中断(AINTC HIER)
3 \, y8 H! ~: O/ {        IntIRQEnable();
/ Y  Z) K3 y; _4 \% M6 k8 E0 G9 q. v}, C5 `! {; ]1 d

' M6 ?% [* [' S' t% K( O9 B6 y+ M4 X
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/7 \; E. n6 }) Q; a! a
/*                                                                          *// J, j. o8 }" v% p3 O* }8 w
/*              中断服务函数                                                */
$ d- }" G* c3 {; X/ O" f/*                                                                          */
; W7 |4 r* e7 Q3 d% H! {/****************************************************************************/
# o" I9 L3 V: G, u2 wvoid PWMEventIsr(void)
  q* b# c- i. W0 j4 C9 M+ _{6 Z" y! |/ M" }# D) s
        IntSystemStatusClear(SYS_INT_EHRPWM1);
! m- E% J) B# a: T2 q& I& ~# ^1 ]- q8 s: G8 u8 ^- J
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
2 B& _  A: B/ g6 I! ]! |; @}
8 Q8 u0 h$ n  i1 {; h8 i, D& _# K) S/ a8 |0 W
void PWMTZIsr(void)
( {1 ]/ K, H: I2 H' n: _' U{
: j# t8 C6 w" `$ q        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);0 o. P0 P: T7 w7 r, e6 r# r
$ }2 @  I: c* ^+ ~
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
8 Q9 P3 [$ X6 j6 M}
7 j  u+ Z8 A( [( m( l3 c
; W, O* F. Y+ T, I/****************************************************************************/
! b: a* `5 ?$ [. |/*                                                                          */3 ~8 @# k; J9 u& p# t1 k. m
/*              初始化捕获模块                                              */
: }, P; I8 f# n9 H6 J/*                                                                          */0 [0 U+ Z+ K  [& H
/****************************************************************************/+ Q4 [6 p) U% u' L8 N
void ECAPInit(void): \& V% T4 L$ l# S& L+ C
{
8 w6 E4 L/ B9 J. [" F( p+ s, v, \        /*-----设置 ECCTL1-----*/
6 D1 n) w( e0 \( g' y0 z- \        // 使能CAP寄存器装载
+ m4 Z- R* W  g4 G9 P# H8 d        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);- T6 X6 Z9 f: J7 B5 I' S8 L
        // 设置预分频值.* A) I1 q# P6 L$ C
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; c2 ~0 ]5 G8 V& X0 V        // 上升沿触发捕获事件
& j2 M$ l5 g0 q' P$ s( @* v" u        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
; J9 Q: o3 Y& O* H        // 输入捕获后重新装载计数器值.
2 \, L. r- R) H3 C8 o# ~9 w3 h        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ z* b( B& p. z- U- {; g. d7 P9 S) L/ A6 C1 V  p
        /*-----设置 ECCTL2-----*/
4 J6 E4 C( O3 p1 h% d" L- ]* q/ C        // 连续模式
$ y) E% R, @+ f0 g        ECAPContinousModeConfig(SOC_ECAP_2_REGS);2 B) i# E+ m. ?$ K$ ]
        // ECAP计数器TSCTR持续计数
/ A4 w" q9 S' }  [- Q( Y        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 O$ T  n0 d% u7 X6 {        // 禁用同步输出和同步输入
6 r+ W5 o+ N5 f! H2 p) D        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);6 @& ^; O6 P+ v8 {6 M  [3 L
        // 配置 ECAP 2 为 CAPTURE 模式7 s% K+ e: j! B/ v) T6 B
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);8 v( ]1 u! S* g! C1 L/ I

  l8 K8 {8 E& y9 y        // 使能中断4 q6 s7 Q; O! X) m" ~5 d
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
" L/ b9 r# _/ m1 |}  \3 \6 b+ i8 c4 e, A, ?0 e- \. t+ a
3 n, p( f# ~" }8 |
/****************************************************************************/: W$ d' L  `' H/ K( K
/*                                                                          */$ Q' }* ]8 \, j9 c, M
/*              取得捕获结果                                                */# g9 o  I; l. s/ k$ V5 V
/*                                                                          */
+ Z4 D9 c$ f2 h. q- d- ]% Z: O% i) @/****************************************************************************/2 E7 [' |% ?& c" N7 J$ _" q7 b
unsigned int ECAPRead(void)" r2 u  l# h3 v  z. S. z# |! \  n$ b
{
3 r* ]& V+ l: ~& e7 b9 C! f# L. g7 b        unsigned int capvalue;
/ ~$ h) C% s4 I        unsigned long frequency;) J5 e# b+ t9 y4 ^

4 E5 R: ]2 c; T* @0 w! U        // Event1 中断标志' P* L7 ^6 C6 F; l. R6 B
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
0 o4 C$ K( C! c3 D8 e: X        {; m8 A. y/ M9 t1 N- @2 M
                // 取得捕获计数
$ i/ w4 f" D$ l) h                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
" p* f8 q  t8 x/ l- A                capvalue = ECAPResult.cap1;
1 \: p8 [- k4 ]( _1 U: E3 X1 t1 H) D- b' P
                // CAPTRUE 模块 228M 时钟主频
+ _! P9 V' F3 G/ v% l) k                frequency  =  228000000/capvalue;, _4 N1 L, {5 |; u# W" C
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
$ U. X. s1 a3 n; C" [6 @6 c7 m0 ^" j/ m8 v) q$ ]
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
5 Y3 M+ k( d% w1 r: W8 {: f# @//                IntEventClear(SYS_INT_ECAP2);+ w* x( m6 ?& O! ^: w& O
        }
0 E- c3 ^8 Y9 d/ A$ F        return frequency;( \2 x7 }+ j: U4 V
}' J1 F5 m5 a. P2 M! H

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
. e- L& B) i. Y[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