嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家4 g2 e2 {: e; S& H$ y* U1 n# T5 u/ n

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/+ O- K- M$ s* C2 f+ R( d/ Q: M
/*                                                                          */& _+ ?4 w+ |8 }1 _# W. z* G5 Z4 h
/*              宏定义                                                      */
0 Q7 n% m& a4 e& J, N& Y) g/*                                                                          */) T9 W1 D9 ?4 n  E, `
/****************************************************************************/
2 T4 U2 i7 I: C  F0 w& J" I// 软件断点
7 _' u5 v1 D; D6 }#define SW_BREAKPOINT     asm(" SWBP 0 ");
1 k4 [- V% U" k7 }' ^  q+ h7 D5 _4 e1 \9 f2 }4 X
// 时钟分频& a! I+ m8 o2 O& X4 i
#define CLOCK_DIV_VAL     228
7 y# V; C& c( {+ o* T- x
7 f; U- R7 K- m/****************************************************************************/
3 C! _) I. E8 e9 D& H/*                                                                          */
, _/ @3 W2 F1 j. T/*              全局变量                                                    */: M* i% t, H' S5 |
/*                                                                          */0 d& H: z) U5 ]/ h3 p+ x2 T* y
/****************************************************************************/
, n& V! N" N8 n' }: ~ECAPCONTEXT ECAPResult;
8 H' I% G, R9 F" N6 `5 \) }) Q7 {2 L8 u: ~
3 I+ }1 o: b. G3 L) W5 U- u/****************************************************************************/
& c  c) d' K9 F# N8 r( ]/*                                                                          */
7 L- i8 v, w- w( a/*              函数声明                                                    */
% \: X! ?( A' p& O& I/*                                                                          */8 E% t: z* Q+ S9 [5 f
/****************************************************************************/
  f- N! @3 o8 E- \3 g  k// 外设使能配置' t' `8 t' m4 f1 {% K! @
void PSCInit(void);8 b8 G' Q$ d! z

- f  b% o) J3 A7 W9 B' v% Y/ {// GPIO 管脚复用配置
2 N! I9 l% d& F4 N( I2 j2 b: wvoid GPIOBankPinMuxSet();) s& H0 r3 U5 W5 g: P
" F& n+ x5 Z3 d5 P. E" A) q
// 产生波形
8 w9 `1 o% {  W& ~7 w0 n( `void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 W9 J- {8 u8 |void ChopperWaveform(void);0 T  d% J% G* V0 G

' s, G# U" p2 m// ECAP初始化和读函数2 O. h1 U# j+ i, Y
void ECAPInit(void);
( X8 r. I( `  `5 |, A9 }unsigned int ECAPRead(void);
8 G# `' D& g6 u3 o9 O$ N' U  G2 u( }# M) z5 e: G5 g! ]3 q1 |
//ARM 中断初始化
/ V$ R* ~2 B# }9 A" Mvoid InterruptInit(void);
) P% U: r' @, N5 I0 w( F
( l) s5 G* @" _% n* B; s+ v: @// PWM 中断初始化/ W9 \; V5 m% `) V/ Y! j; y
void PWMInterruptInit(void);- ^/ m: @- a5 `$ {0 ^, y. K/ M* v
// 中断服务函数% w" _% L7 o2 b" Y) ^( u
// PWM 事件$ J6 r# y+ N( J# N* ~) ^* n3 K8 o
void PWMEventIsr(void);
1 U, P7 r5 K: H8 c0 i- `// PWM 错误控制事件+ P6 L& r6 C, w: s3 J! t
void PWMTZIsr(void);
5 `6 @0 ]4 M; H1 d$ Q7 U/ S5 r+ z$ h- o
/****************************************************************************/
1 W, N$ |2 q$ v. s& k7 k/*                                                                          */" d# A) w6 |3 o% z9 S6 v7 Y3 d
/*              主函数                                                      */; D; ]& z) ^6 z! x$ ^) P3 B
/*                                                                          */
& @6 T3 Y( ^7 s: ~  w) F1 J/****************************************************************************/
" [8 g3 a5 D! Eint main(void)
* n' o- V# y. I' a; Z) p{7 R5 `" O; d; b' `  e) N; @
        // 外设使能配置- x+ {  G' g, q
        PSCInit();0 s% W4 G2 z4 i* V

5 [, D$ X; x* o- }3 L        // 初始化串口终端 使用串口2
2 N" k3 Y! f2 S6 a0 ]: d8 o! f1 T5 o: U        UARTStdioInit();6 k6 J: D# u0 |. |# t1 b& x
        ) Z3 m; ]4 ^% E6 n/ B
        // GPIO 管脚复用配置9 |$ W( E3 B1 o' x4 k' y
        GPIOBankPinMuxSet();
- Z) [7 l) g9 _  T$ D) W+ E
1 y7 y/ W) a0 F! x  R        // ARM 中断初始化8 ]6 ^7 D- r' b
        InterruptInit();, I( ~/ |* v  {6 C  j! B: E
  \. }+ W2 ^) ~4 s
        // PWM 中断初始化9 g' d* P# u: }7 N1 X/ [# W" p
        PWMInterruptInit();
  l$ c2 n1 u# M9 N. o% Q$ f( t5 u3 r6 `7 d; N1 m5 i) v
        unsigned char i;
0 U$ j' r0 d: v& k0 ~        unsigned int j;% s/ F  ?1 C6 c, q
- R6 X2 j/ n$ S9 O
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ p) f) Z1 m7 |1 W" \6 J+ x        UARTPuts("------------------------------------------------------------\r\n", -1);
5 i) O+ {0 S% f4 v        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! H, E' x' l' ?! r( P
        // 产生波形
* U0 T. V. H+ g) D0 Z# N! E5 x  H        PWM1ABasic(25000,50);
8 ?" E& v' Q, {; I
4 S7 v1 D* J5 a6 d        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);- u0 p& L* ]3 ?1 H
        UARTPuts("------------------------------------------------------------\r\n", -1);
& e" F$ }+ F: z3 W- _5 {6 J+ f3 L5 {3 v+ p

0 s- V, A6 G* e! a# A+ J3 m
( \$ [; ?% I2 R( w& d3 k        UARTPuts("------------------------------------------------------------\r\n", -1);5 l: H3 M: U' ~8 v1 n1 b
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
" b4 v( N3 P+ \  d1 {; N        // ECAP 捕获初始化& s; g6 C2 ~. }6 `2 X7 @
        ECAPInit();  K- c( g+ O/ [) V
        UARTPuts("Initialize ECAP.......\r\n",-1);4 D/ ^* r% S! d' m
        for(i=0;i<5;i++)
+ e/ `8 g- ~/ N3 H        {( g, \9 y- O! ?) G) H; }6 C+ V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
6 a6 v1 U2 W8 O  D/ ]$ i, M                    ECAPRead();
  C. Z5 M. W& ]0 b) a) h        }+ W1 C1 @0 l" x. C! I2 {, {/ O2 n7 i, h
        UARTPuts("\r\n",-1);6 ]6 C$ \. ~7 @! N% ^2 T! y
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
6 h  _4 i) y9 g8 s5 C        UARTPuts("------------------------------------------------------------\r\n", -1);: c$ |: T* e8 O8 U
. f% _" R- O# Q8 s
        // 主循环2 _: y# |; ^2 _* w
        for(;;)
, r" Y( t& Y0 B& b2 `+ q        {* q# O/ b' y8 Q9 ?+ Z+ ^7 D- |4 u
9 i( M. {, O- L0 F2 Q; l
        }+ y/ Q1 V8 ]/ ~' v) ~4 w8 x
}# x% H8 R, w) }" Z. I# l% m6 W! v
* b2 e, E. d& r/ \9 n& a
/****************************************************************************/1 T4 p& W5 ?0 C1 L9 o& M
/*                                                                          */
0 y4 _* c6 ^, k/ T, b( f4 D/*              PSC 初始化                                                  *// n/ \  O- u! a% X$ O" Y/ L8 T
/*                                                                          */
; P: L6 X5 i; T2 a0 z/****************************************************************************/
) y( K4 x, E; S8 q5 ?* Qvoid PSCInit(void)$ G! o0 b1 s! m6 Q! R
{
' n% @+ C- F: D3 d  D        // 使能  EHRPWM 和 ECAP 模块4 D; O- A& ~4 m! G9 m5 a1 q3 ?) \
        // 对相应外设模块的使能也可以在 BootLoader 中完成
8 E  T( s! n" K" a    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 `+ L, y' P9 B    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, \0 O. k4 K8 e
}$ V0 v, D) U$ V& O

& m  B; j9 E+ d4 O. R/****************************************************************************/
0 l& N- l& O8 W1 F, D& [/*                                                                          */
5 h. j; ]7 T& j! l7 L* w/*              GPIO 管脚复用配置                                           */
5 A1 h8 _/ y9 I/*                                                                          */
( d' [! h8 p/ o/****************************************************************************/
; S" D7 e8 x4 W% ivoid GPIOBankPinMuxSet(void)
2 m3 E* g, ]* F1 b$ H; n3 ~{
7 u* s8 ?& c* D+ n: t* }9 z        EHRPWM1PinMuxSetup();
- J7 w3 z6 g+ Y( ^5 O5 i
( z( T- t" C5 b' X8 i# g& s- Q1 W        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)( P; }7 v1 ?* Z9 G7 F
        // 作为捕获功能时管脚方向为输入
) ]4 g7 v* O! x$ v% C        // 作为辅助脉宽调制时管脚方向为输出/ |' n" r" N& U  O
    // ECAP2 / APWM2
) }- u6 I/ ^2 b9 E8 d& |        ECAPPinMuxSetup(2);
7 V% `5 P" }' }4 M& y/ t
' y" j5 D8 \' p1 a% r        // ECAP2 / APWM2方向设置为输入
3 G0 T5 M4 ^/ b, T' ?2 K        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]9 ^3 N  y4 l4 ]+ J3 y0 g
}0 x7 H, }, d' P" m
4 u; r% _* T6 h3 J: U- W
/****************************************************************************/
9 |2 c  p/ l6 X0 q* i* v; v& F/*                                                                          */
4 P- {  q" g1 K$ N" r1 G1 E' q2 M/*              PWM 输出波形                                                */
3 g& \3 v2 X5 A; f# ^/*                                                                          */
7 _- p8 i* L: I8 c+ ]( z! o; E: i/****************************************************************************/
9 M* H0 k+ [. T# Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)& Y2 ]  |7 n+ ]6 M0 n
{
# [& j" h( a8 D7 K& H# ?8 h    // 时间基准配置
) _% L. o0 a3 l. f! R* i' X    // 时钟配置
& _4 n% K" M* i( {    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 y# K6 R' T9 P+ `+ z. e
% j* Y* Z) L% S    // 配置周期
( o7 G2 }2 m, Y. I    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 u! r; x' ~0 e  {+ Y0 l; u: D5 K+ _                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- P* z+ d0 l4 _$ R5 Q+ b" x
% x" U: L) u/ |4 _9 R
    // 禁用输入同步信号
; v$ N9 b& h6 [# X( A1 ~    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);/ W9 e5 ]4 x% N; X/ r

% m  Y9 n: e' T    // 禁用输出同步信号
6 {0 c9 h2 {2 H1 n9 X* d4 J    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);. _9 x9 K: S! u
% O; b( R9 h: }/ \+ l
    // 仿真(DEBUG)模式行为配置
" c5 j- S+ G& p, |    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* Z9 C) {2 K0 N5 Z# \) p- [9 o: j8 M$ K3 J
    // 配置计数比较器子模块9 D2 l  _1 w6 {& A  D; \
    // 加载比较器 A 值) }9 {2 q  I; A& q* i& l
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,/ e/ L8 [2 ]) H7 T$ ?5 L
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);/ p( \/ Y- @0 T* o
  E" {; S4 e5 a
    // 加载比较器 B 值, ]2 L5 `8 N' Z5 `
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 r( c8 x" k+ s: O" B
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* G- {' T2 n- p8 ~
$ U' E& s' ]& e# K* |( w+ ?- p
    // 功能限定配置(输出引脚触发方式设定)+ l$ L# d4 F  N$ T
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ X* v3 m6 k; Z2 }1 P/ I! `$ `    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ W6 Y! O. E: _: H9 H) u                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
  K5 Z( ?' l" q7 R  H! w3 ^                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);+ u2 ^2 `+ ?( q! r. ?7 {
! C( ~+ L+ i* h
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
# r$ ]# Z9 X) ~! T0 @2 s    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 y% x. T& s* M( i; E( ]- r) y% r% ?
    // 禁用斩波子模块; B( p. I( H% @5 t4 ~9 O+ M# s
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
% E8 `' Z/ W9 `. @
/ @) J1 v' U. |0 [- D+ L    // 禁用错误控制事件+ Y6 D0 ^- n0 _/ a& Q
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 C6 O! o# f+ l: C1 N
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);/ p2 S& u6 `3 |% k
  W1 d2 m: @% H  g, ~9 d
    // 事件触发配置7 s# f7 ?& ]7 W+ C% U% ~6 e0 V" x
    // 每三次事件发生产生中断! Y" U1 T+ o% a, q; y4 s1 L
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);3 ]# W0 e, i/ q1 k; Q  E4 d
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件( f$ U2 Z8 S  |! v* O
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' Y7 s$ u2 b$ J! x/ e    // 使能中断* {6 {0 Y' S. s3 F. ?, K2 ]) W1 [- u
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
5 W$ u% s4 U% ^9 p
% n3 r' |! W, Q  f' u* z    // 禁用高精度子模块: W8 Y2 }$ f, D
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 G' p2 j0 E5 U

! v$ B8 k, O! G- |6 }  Q, @) \    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& S* u$ p4 i1 G4 n: g# B
}
$ c9 x7 P9 |2 ]1 h
. Z) a* s$ R1 U- Evoid ChopperWaveform(void)2 O. ?) y# n5 A$ b# q7 h: |/ i( H
{
" I6 ?3 L' t/ X( b$ ]$ O    // 50% 占空比& s0 R1 c# `( I* ^* Z+ d* b7 c1 d% J: `
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);* P+ k) v* N$ n, @( W4 J7 s' h
    // 4 分频
6 }1 |! B) @! @2 b' K1 s    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ B# @- {& W3 d  R) i& h% c! ^    // 单个脉冲宽度( f$ h* Z5 X( O
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ A. O% z. z" I0 ]/ l- x    // 使能斩波子模块
" L4 G2 P2 t/ w6 b1 C    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);9 N6 n9 {# C0 f- P& w' p
}" \9 @0 M# q9 ?# V' H: K
1 c( X; F3 b- V, Z1 b
/****************************************************************************/
7 |: |2 ~* Q5 P( Y* b/*                                                                          */# M: o3 w* g2 L/ l- n6 r
/*              PWM 中断初始化                                              */7 _& c; c6 j, _- U
/*                                                                          */$ M* o5 E9 y- ^! G
/****************************************************************************/
& Q7 f8 b$ j3 k% e0 mvoid PWMInterruptInit(void)/ l) o- @" X+ g/ K; x0 e
{; A' w! C4 ?6 G9 r' F
        // 注册中断服务函数0 R# r9 `+ t2 ^# j$ u. P' G2 R2 W
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* m! p% J. W0 Z3 ]* x  S        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% y) c+ d2 \" ^- I9 h: k

/ m( ~  M- x- ]7 j% z        // 映射中断
' ?) |4 l# ^; a( n5 F$ x5 Y, F        IntChannelSet(SYS_INT_EHRPWM1, 2);
) Y2 J" c  Y+ \8 {) h- `( L* A        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 g2 U2 |0 X$ F% N) W  @  e7 b. @* d" j* \' b6 o1 q5 G
        // 使能中断
. K5 s; Y9 X1 T7 [+ B% B* d0 I        IntSystemEnable(SYS_INT_EHRPWM1);
7 U. P8 Z/ Y# s        IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 j; j- w* W5 Q5 l( ^}& H/ O$ Y. B: Q/ m# }

% G5 V5 E$ ]% @/****************************************************************************/! E1 U4 f/ O9 W$ d
/*                                                                          */$ T1 y5 n9 k* w$ o+ Y
/*              ARM 中断初始化                                              */- G9 R8 c6 r. m4 D- P
/*                                                                          */
" N* c. p! k5 r* l1 u" P7 r/****************************************************************************// m" f! d' R# r% I2 l- M3 Q8 O
void InterruptInit(void)& |4 _/ H, n" l% i; ]( Y
{
. x+ U) R. \' E0 g( f        // 初始化 ARM 中断控制器
- P/ M" Y" m- W0 \3 u        IntAINTCInit();
* c; z; E, I& ]  g2 ]+ u0 i! W0 a: C% J$ s) n1 a
        // 使能 IRQ(CPSR)
* F4 t$ h+ |7 G  H9 B  W4 s        IntMasterIRQEnable();
2 g5 W/ T- `- {/ ^
. V" x+ L5 X3 G' b5 L        // 使能中断(AINTC GER)
/ c1 S$ _; `# |! w  p        IntGlobalEnable();
7 V. e, H# B3 ]
8 _# }4 K3 Q5 _3 Q        // 使能中断(AINTC HIER)$ y/ t# R, {3 c9 ~6 o$ Z( S
        IntIRQEnable();9 ^6 d7 \, R7 K7 u; [
}# S9 M+ F! e9 N$ J1 ?

+ r5 _& i: M* C2 N
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/6 @$ F- X6 |9 e
/*                                                                          */
9 E" R7 u0 ^5 i: w# u  g/*              中断服务函数                                                */
% ^) r1 x" d2 S% X' i/*                                                                          */' v4 U+ l, H% D) ^! F
/****************************************************************************/" _, E2 e  {. F5 [9 \+ M; |/ U* c8 L
void PWMEventIsr(void)
5 Z2 m3 e1 ?; J2 ^. ]: T+ q' |6 w  q{) c4 X: }  P$ q7 L. [8 L8 ]  f
        IntSystemStatusClear(SYS_INT_EHRPWM1);
, B. x4 y/ G2 b+ U" q5 x4 V( @& a; O0 b; a3 V+ b
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' n3 O; H6 I; b) N+ ^}& c7 z4 V1 Y' F9 [' y9 R  X, b

) v: @0 i  T- D9 C# ]0 nvoid PWMTZIsr(void)( Q5 S6 n& H* J( e- h- n
{' ?8 _- c8 Y3 D
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 C7 j& Y' j4 f( v1 M+ p' I4 s# b& F9 d2 Z7 J7 z) }+ p
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 T) ?! \1 S1 k- D; J" V}
' Z2 e# ?6 ~8 ^8 j2 n& S8 ?6 ~$ g+ W, U1 f) F
/****************************************************************************/
% o: ]( u' N" E# ]/ l# w1 c/*                                                                          */4 s6 m2 i0 \7 j( V
/*              初始化捕获模块                                              */
' r$ ~! s4 ]& L% t- F& s5 w/*                                                                          */
) j* |4 Q4 C' {. ?/****************************************************************************/& D5 n8 \8 b& G4 f
void ECAPInit(void)1 b3 @  I6 W, q/ w+ d
{
0 H& H$ h8 z5 I        /*-----设置 ECCTL1-----*/
! e4 _" W7 K$ C& l: h; x        // 使能CAP寄存器装载  z6 z# q; K; ~' \2 ?$ b
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
4 ~$ R& o8 T' K. W        // 设置预分频值.
/ N, N3 M4 |+ f( G4 i% C( N) f2 \4 r0 N        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* h1 i: Z: J% p) B9 J- l/ [        // 上升沿触发捕获事件
3 M  s( L- J: B        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);3 i' Q& ~8 A2 L& P: Q! m
        // 输入捕获后重新装载计数器值.
) b# s1 a) l% _) w( s7 `- z* r# \        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" {, p2 f; {( x6 i$ i  ^( ], `. D4 \; B
        /*-----设置 ECCTL2-----*/2 ]+ Z$ D$ z( J" a
        // 连续模式
1 t0 U) ]& r- R0 P6 w$ E8 {        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
' I; a2 _8 j. m/ T        // ECAP计数器TSCTR持续计数
& |4 z7 g% g) c) e2 s        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& R: i4 Y, M. L) U, ^4 T        // 禁用同步输出和同步输入
  R. w8 e0 G# `' e        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; L8 p, R6 Z7 j* r
        // 配置 ECAP 2 为 CAPTURE 模式
. Y5 a4 p1 o, h2 o9 x        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ j7 a; {% s& H& z! Q) i
: D* y3 M+ W& E5 C: q. ~" M        // 使能中断
2 C9 ^6 i/ N/ Z( S! A# n//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);! H0 M  a* I9 ?/ ]! \
}
6 s4 f' h; ?0 U! G& D# y* b! N% d" a6 P
/****************************************************************************/, i0 j1 r- A) c. c% n& t
/*                                                                          */
* f6 v, [+ R7 U3 }6 H6 p/*              取得捕获结果                                                */( A+ d! t# ]2 I: U. R; }
/*                                                                          */
# X: }: m8 g: [- T! f+ o7 S/****************************************************************************/
+ c, Z( ?# i& Y+ @6 _3 S- F0 e+ R2 _unsigned int ECAPRead(void)
: Z! ~, L6 s  {" ?  Z! \) Y{
9 D; b/ K5 B5 A" }( c        unsigned int capvalue;7 t2 R- z7 G6 s( ?4 {
        unsigned long frequency;8 A+ C  I: h9 s4 D% f# v1 h

0 u" ?; L, \' {$ b& c2 O, K        // Event1 中断标志
/ t( J9 [' G: _7 h7 S7 Y        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
/ D$ j* K1 I7 i8 m+ v* U, ~8 n        {$ f' U' u: Y3 L
                // 取得捕获计数
# R* I% n# \( c. [                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);5 |, s! Z* {) F1 h( Q& R. e- {/ O( A) f
                capvalue = ECAPResult.cap1;% [7 ^+ C: V. C

# l5 h1 T3 r& x5 D8 j: w                // CAPTRUE 模块 228M 时钟主频
$ u' v, a! V) V% F* F                frequency  =  228000000/capvalue;
+ ?8 J( o. E) M2 |3 R                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* i0 l% H2 Y9 G1 h5 W1 e2 M1 ?- \) @1 P& m
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);* z. `& \. y  J! ]$ f
//                IntEventClear(SYS_INT_ECAP2);
/ @' _$ a% @6 _8 u        }
& F' Q, i! j0 N3 g% u: Z        return frequency;" @1 g' i2 ], y0 c; |
}( }2 s( L9 E% x) f- T+ C% x! |, @1 ?

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。3 \* S9 x6 J. q' D- M' r
[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