嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家" X& A) s5 e0 H6 c- v. d

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/' d2 h9 ~' ]5 S' P( @
/*                                                                          */- M% j- M. K$ v) Q
/*              宏定义                                                      */
4 e# z: ]( c9 j: L/*                                                                          */& Z5 ^1 c# S4 Y/ b% I8 a
/****************************************************************************/
3 U: d0 ^( r7 C6 n& \' z// 软件断点+ g, c, d9 }9 M0 k* o  ~
#define SW_BREAKPOINT     asm(" SWBP 0 ");
+ @! n' K1 i, u8 U, c* u9 A" t8 w  M# T
// 时钟分频* j( Y2 l9 w4 U0 a. z/ y: _1 Y
#define CLOCK_DIV_VAL     228% L& H2 p& p" S4 q% l$ _& e

7 a7 e( l$ y  P% J3 g3 y3 A/ q! a/****************************************************************************/5 Z) d& w$ z4 j3 n7 l5 T* t4 l: e+ f
/*                                                                          */
) U0 V0 I& H' f* N* u9 c! y/*              全局变量                                                    */( g$ L# U7 d* {* F) t( Q; m& W
/*                                                                          */
1 t, B3 x: Z, Y5 x9 S/****************************************************************************/
% j3 L& l" @3 Z9 t9 _+ QECAPCONTEXT ECAPResult;
4 K( X. i1 g, r5 f
1 X1 g. ^" f1 C3 Y9 e8 M" a2 {0 C/****************************************************************************/( G  V1 I3 `5 T# M% p% h& n
/*                                                                          */
0 u$ O: Z! l* j' {: C% q  S/ n7 N/*              函数声明                                                    */, C1 n5 \8 F. B- e4 ?4 Y$ H& C
/*                                                                          */& h: O& }+ m  S! q
/****************************************************************************/2 m4 {" g5 W$ Z# T
// 外设使能配置
5 V3 u# v% f) S8 cvoid PSCInit(void);. A/ {+ R" v5 E1 C9 n
2 e$ {% g. K& Q6 f5 X8 l
// GPIO 管脚复用配置
' Y& Q# P+ P2 y) J2 ~, bvoid GPIOBankPinMuxSet();7 b! b6 P. e5 w. H  h% B

; m/ \) L% l; Z5 P/ z// 产生波形
9 |+ b) Y( @. a4 @  f! V3 Bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);2 O% w" }4 q% _6 G1 o: e
void ChopperWaveform(void);
5 N: N( i. L. @, K% P
$ N6 D# u6 ~5 p/ ^1 F- S// ECAP初始化和读函数- @# Z# Y1 [9 u1 O3 l2 u, r3 y" E$ X2 ]
void ECAPInit(void);
' X! {% l7 [4 J$ bunsigned int ECAPRead(void);
' C. K0 _) h( T0 z! G1 T
! m  L4 J9 T+ H1 D3 d! H1 }//ARM 中断初始化) S4 A, Z$ S8 R/ y. H( P
void InterruptInit(void);4 y0 v/ C1 [6 L# g8 \, R2 ~
, V7 N: m' n8 f0 G1 ^3 q9 |1 l
// PWM 中断初始化
) D6 ~- X- W" G$ Y3 D. gvoid PWMInterruptInit(void);
8 L! m. @. Z% p, z. `6 ^// 中断服务函数
- ~3 o1 T2 i7 T- V% w/ g// PWM 事件1 D, g' s' ]5 O8 N' K3 e" D' G  z
void PWMEventIsr(void);
. ]) I5 B2 B1 M// PWM 错误控制事件2 H; o9 [/ i! n0 S6 m
void PWMTZIsr(void);
6 J/ m3 d& H1 D; @) s' G- R
% W7 u& v, k% d+ R. X' N/****************************************************************************/  ]8 M* a# A2 F* @: d9 k& A2 I9 H
/*                                                                          */
. V' H( s* z! z6 l/*              主函数                                                      */% _/ g* h9 T* i2 ^0 ?
/*                                                                          */4 _: G) f5 F# s, R
/****************************************************************************/
8 ?4 x$ h/ c( T6 f1 cint main(void)( g* l- v7 t0 m' a7 ?
{
2 Q- o4 U# d7 @& l! v        // 外设使能配置
9 e/ _; g: r: Q4 l+ P        PSCInit();
. f4 X* X/ @$ F' o3 t+ ]0 s5 f2 Y; |; |# e. p5 [4 X
        // 初始化串口终端 使用串口2
" c. D  X( S9 G8 p        UARTStdioInit();
0 H, J: g/ L* O, G        0 [0 L: S. h# N  l; o
        // GPIO 管脚复用配置
0 T+ Y2 ^& w/ y# u! t1 @* b3 v        GPIOBankPinMuxSet();6 K# i" D/ u. l, y# o. |

! u4 T; C* |% y' x. B6 _        // ARM 中断初始化
: A3 Z; D1 E% U        InterruptInit();
1 [1 i  D9 `! C* z$ |2 e, m- T* |. A4 C
        // PWM 中断初始化$ O1 A" i4 `- r2 \) K
        PWMInterruptInit();
/ K' a8 {9 e9 ^+ a1 s9 Y/ _$ Q
        unsigned char i;$ v3 d9 O) D. b; n8 i% M
        unsigned int j;
6 Z; e1 C7 _: T0 o0 q" _1 A) v6 F% c' T
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. e+ f: S( v+ N, R/ ^. [        UARTPuts("------------------------------------------------------------\r\n", -1);
5 V' u! u8 \! V/ J! p$ |' i        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);- _0 W; J8 J7 i- }: N" J+ W+ T' a
        // 产生波形
" t3 S9 O( }! n  A        PWM1ABasic(25000,50);7 s$ T7 x# f- E6 S' a8 ?

$ I. z& m# U, {0 ]        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);3 I  z+ }2 P% v( Y
        UARTPuts("------------------------------------------------------------\r\n", -1);
* O; |9 a. s5 l( z2 ]- h8 {" W1 F/ _$ ]
! `& c2 U! i$ ?; N. p  j( X) u6 [

0 q/ y) d5 ?/ h# G' W        UARTPuts("------------------------------------------------------------\r\n", -1);
  f$ ^# ]. V/ U' X        UARTPuts("                    C6748 ECAP Test\r\n", -1);( N  s4 x- Q) N7 d$ w' }
        // ECAP 捕获初始化
8 J! t+ q' @2 a4 g; ^; k4 ?        ECAPInit();$ L3 l$ W0 z7 M- n
        UARTPuts("Initialize ECAP.......\r\n",-1);- b5 k: e* d/ \. Z) |
        for(i=0;i<5;i++)
4 O# \6 t9 S+ i- w3 `        {
" k0 j0 {% e" ^; b( C# j. S                    for(j=0x00FFFFFF;j>0;j--);            // 延时# ^* [, a7 A. l) B2 f6 s/ ?2 W* G
                    ECAPRead();
3 I; ^4 O% K5 a        }
6 ?7 V( Z! [' F! K" n        UARTPuts("\r\n",-1);
1 K+ p; l* f1 A  {        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
: N/ x5 v5 ~( C7 e# c. b        UARTPuts("------------------------------------------------------------\r\n", -1);4 P8 q2 o" W: `9 G8 X: g6 c' Z

2 r) m9 x, D+ {+ \7 m        // 主循环
, M( y, u: d) V% v) k: V% {3 N        for(;;): W% i# L8 B0 [+ H
        {
) M( j% V# q% I6 t# d# C$ I( n+ K+ S: }$ ^2 @8 X+ U
        }
% i0 q8 j. M: p' ~, f}1 b4 q1 x% `: x7 ?) L/ w  w5 J1 f) X: A

' w. h7 G( f' K/****************************************************************************/5 A$ S; z9 I% o; |6 k; L' I) y
/*                                                                          */2 F. f8 Y# A$ n& J: H) K* m9 C# b8 T
/*              PSC 初始化                                                  */9 l: Y/ v' y1 u( x+ ]# U5 y% S( H
/*                                                                          */! o* T6 [" d( C) _, e/ n
/****************************************************************************/* j3 h+ h6 V7 v3 J0 ]/ \! W
void PSCInit(void)$ A! H( [( z1 o+ Y4 x8 I
{: h  l& m% g8 s* Y
        // 使能  EHRPWM 和 ECAP 模块
8 f( p1 l) k7 v, B  }        // 对相应外设模块的使能也可以在 BootLoader 中完成
+ d7 _1 @  t/ h  M    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ k, Y/ G4 ?6 i, f0 i' T8 o    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 e5 M6 b( ]0 U7 Z- }3 b}
0 _, O$ X1 E1 D7 V5 t% B' ?1 A) N' {7 j8 {& o) R3 m% F. Z
/****************************************************************************/6 ^3 I* D4 Q/ ]
/*                                                                          */, `% M3 u' x" p8 ^$ @
/*              GPIO 管脚复用配置                                           */
) I7 R- p& e& u/*                                                                          */# m2 ~' j" s& d: n% Z; x7 x
/****************************************************************************/, w/ D% R4 j1 G) ]! w- z
void GPIOBankPinMuxSet(void)2 e. q6 o  B) v, m
{
* x- ~6 G1 h+ O- e$ D" j+ v        EHRPWM1PinMuxSetup();
$ i( T  F/ V6 g* {
7 I  {! j: h& S+ `6 U        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
6 {/ l; }" l5 ?- q        // 作为捕获功能时管脚方向为输入
0 Q7 H! c7 j$ D        // 作为辅助脉宽调制时管脚方向为输出
/ L0 t9 u2 k, H6 Z* F" t    // ECAP2 / APWM2
' ]7 X/ J: U  e: i* Y  {2 \        ECAPPinMuxSetup(2);
- }( [' O! t6 ]0 q
1 r0 R1 P# `2 b        // ECAP2 / APWM2方向设置为输入
" H2 I, P1 j! c        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]) \1 c1 @# W0 Z
}
8 J* ~, S5 U1 V# \) `/ {( |+ o0 C8 V2 b0 p- n2 u+ V. _9 Y# I
/****************************************************************************/$ Z  D5 L4 B. T" P$ o: e
/*                                                                          */) C' W8 V# g( D1 U
/*              PWM 输出波形                                                */
! H9 V+ c) i. ?, L/*                                                                          */
( A+ c3 D- l: A/****************************************************************************/7 o' b" {: q5 e* Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 u3 w: G  i& H9 m9 _, x1 r{
3 g1 W. q# C# H) F# a2 a# E    // 时间基准配置* X4 ~, r! a2 l8 [: a
    // 时钟配置" V$ f/ B- ~- [+ L9 w
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- ^" c  l% L0 d# a
# U) f7 n! i- w3 F8 }' e    // 配置周期" y- T3 G4 R- v+ v" K8 f, x
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 }" P. P1 `3 F+ a5 ^. T0 G( S                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);! b9 ]5 B& ]/ H2 m  q3 G- x) Q
+ C2 ?8 `0 k3 f% X: p3 R
    // 禁用输入同步信号
9 c8 ^( ]) r3 A' z/ O    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);$ P7 d# C# i7 A  Z8 w( A6 ^
+ u, h  p/ ~4 i$ w6 G2 v( i
    // 禁用输出同步信号
+ s$ u- j4 R% u: Y) n+ O  x+ Z    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);+ W4 [7 j* t! a9 `2 W$ ?

6 N1 t! l4 ]& G" Y: v# Y8 f* H    // 仿真(DEBUG)模式行为配置" d( }9 P. v* `* i+ m! _* k
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
3 |, |5 i9 k8 T4 N# S! w2 G1 i& B. e) L' \
    // 配置计数比较器子模块. K  h% h/ C' ]' n& D5 H+ ]) M" d
    // 加载比较器 A 值
  V+ I6 t7 ?7 }% J- J' x9 d0 p    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,- g0 W4 z* O# V/ J0 y
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);  G' E6 u. L4 Q( P! {* t# U4 `

- F" n* |  ~2 ^+ E$ |) F    // 加载比较器 B 值* I- D. B8 N" |; e! H6 r! h$ V$ }
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,( d0 r$ d; u( r6 C% T
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) z/ v1 Z) |' j- p/ w* [  c* r& ~. Q& E8 J' M" L
    // 功能限定配置(输出引脚触发方式设定)$ t" Y, u/ J/ M2 F1 K9 B( r6 v
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& ]6 L% N8 X8 K
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 P1 w3 ^5 F6 M6 ~* f' z( ?# d                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,$ I  z) I& f5 S- H
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);" v2 R# P. T. I2 \, r* q; ]6 S
+ a7 w0 _! w; V! n3 V
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ x. W4 ]0 e4 h& U: R& C" z
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 I8 f8 L' f- @1 ~. O. r

9 u0 U- F! c: |/ T9 d    // 禁用斩波子模块
* |$ l" ^! k/ K' S4 U    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 V$ i8 R! b" K. ^' c4 O
) c& k& b  {5 v5 d9 T8 D    // 禁用错误控制事件
; M- A4 y4 S5 o$ e8 P) }. M    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);& ]: E( Z' i# w# c; k. n
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' q9 ]/ _4 ^: C3 w  I1 A) [7 I7 a
# ?! x1 p! k! z    // 事件触发配置
- F8 ?  q  w& N* v8 T7 b) \+ v3 R    // 每三次事件发生产生中断, G4 _+ Z9 [0 ?% q9 R! A
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);2 g% {7 F1 h9 A" P7 |
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 u' F$ r2 d5 u0 p- n  g5 g    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ S9 n+ Y/ |  d; N9 ?- R  m& A    // 使能中断
+ P+ j9 G3 b/ r  N    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);/ s/ t; ?5 U! i3 ?/ g' ~

/ g* Y, G) `  T: o6 U6 I- l    // 禁用高精度子模块
1 g; Q2 p4 d( _& k& y    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! C  x# q% W! l# d3 z2 n) L( d
2 Q; ^% x/ I: A0 B) _7 a3 h
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 L( r6 A& A& G% ?$ U5 q: x5 P: }7 R}5 i+ S+ c) d- P* J4 X7 E
: E* O# ^$ q( ]( p3 x. _& t# _
void ChopperWaveform(void)
% Q2 A# s0 F  p9 z4 O* p3 k7 A6 w{# k, d% q9 b  o. c0 L4 D  a
    // 50% 占空比
; Y6 Q9 J+ g3 B    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);2 u& G# c  W1 _- d: I" O  Q  z
    // 4 分频
6 H) G5 P: P1 R, Z    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);* W; M6 _% Z! o
    // 单个脉冲宽度
: f, i; T( j- u+ M    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 X1 s( t2 w/ t, L7 c    // 使能斩波子模块
6 u; \8 K; f( l    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);# p5 f$ ^2 ?5 \: ^. M! d: y! \
}6 v; I" M: Z; w% p1 a

5 y. h" @0 j) Y) G9 l6 m, c! S/****************************************************************************/1 x. f4 L, a5 {. T1 e
/*                                                                          */
9 p8 |/ o8 }9 O! u7 l: [) v( Y/*              PWM 中断初始化                                              */
4 e+ U' k1 k6 q4 z$ e0 ~/*                                                                          */# f: O, x5 ?4 p
/****************************************************************************/$ _% Q6 G* m! b
void PWMInterruptInit(void)
7 Z* S# Z  r/ F, J{
+ ~& [* s( E3 {$ K/ j, M        // 注册中断服务函数* q4 T  _* ^% F, L+ f3 P
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! f1 F% U- T- K        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);" K- E7 F! @9 [

$ x& S/ E! J; ]( n0 L( i; j" l        // 映射中断
$ B# X9 f$ r" o& B8 m        IntChannelSet(SYS_INT_EHRPWM1, 2);
: M$ r1 `5 Q. N! Q2 @0 E1 J        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);: p7 q$ ]* j6 G; ^2 ~
2 b8 y/ W4 i- j: t. f
        // 使能中断7 t; s2 [" Y1 y' _) G+ B
        IntSystemEnable(SYS_INT_EHRPWM1);
* m2 n" T6 z/ m2 t3 v6 a% |0 J+ d        IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 x9 D& [8 z: o) K}; U' ?1 H7 M* M% a9 d: u6 J$ m
# x0 q$ {6 M. u- k% D. ]
/****************************************************************************/! u( F- ~5 r% m; [' O" k
/*                                                                          */
) I9 r- `: [" m; E/ \( s8 Z" @/*              ARM 中断初始化                                              */
- v9 i0 g5 V# h1 k/*                                                                          */
! @8 b3 G9 k, M5 C' ~- [4 P, R* j/****************************************************************************/: f4 }/ F' O4 B1 R% s
void InterruptInit(void)
6 ?* B4 A9 r1 j) ~- [2 ]. K2 r{
( ?" z- v. S0 G        // 初始化 ARM 中断控制器
8 |" J! B$ K5 {3 N1 A7 F! S        IntAINTCInit();
: W$ v) Z4 H' ?; W" w* a  V* G! w6 _: G, W/ o  |* u- r
        // 使能 IRQ(CPSR)3 i4 S# {0 r0 e* e3 z- G
        IntMasterIRQEnable();5 U, Z) B0 e! {$ x6 H

/ I* ]0 |& S% Y: E& b4 m# h1 j        // 使能中断(AINTC GER)& P% o$ ?- \0 d
        IntGlobalEnable();
  O; J1 ~1 M' n. b3 _
+ @* L% _7 A7 ]; n        // 使能中断(AINTC HIER)' W7 |+ |/ e8 A0 `) K1 e
        IntIRQEnable();
* V$ T6 u$ o) s) U- P; Y( t}( B1 g2 J0 u% _5 Q

# j4 e) F; T& M% z
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
- t# H; A1 @7 z( E6 {, ~4 z/*                                                                          */# Y* a; W- k. G( E! z
/*              中断服务函数                                                */
( f$ \* }1 {4 G# M/*                                                                          */
4 l* g  R4 C7 _) L/****************************************************************************/
8 j- Y+ M0 w" X5 X6 `4 \void PWMEventIsr(void)
4 h) R+ m/ V- J; Y$ w5 x. P$ ?. x0 P; C{% U( z& Y1 T1 ^6 d; W9 f" \
        IntSystemStatusClear(SYS_INT_EHRPWM1);1 h2 x( l9 G1 A, ~$ t9 B" o* d8 W

: ~. n4 T; l# B; @    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 k5 X8 P1 N7 _9 t}5 i( R% c# M8 E, [9 e- \- ?; ?
2 V+ E$ F- V) \
void PWMTZIsr(void)
. T/ G6 C; x# [" d{, q! G* q( H) d: Q
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# q, k) J( M: w- r) C
. k- x6 E& q. |1 L3 f
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 \6 M4 Y# }4 i7 c* h; B( Z8 ?7 L}6 }" l& W, ?# z5 i. f

2 v1 d, c+ K' N! @/****************************************************************************/0 O" I/ Q( J3 m! B% H' F1 T& j
/*                                                                          */
4 ~& M! d7 a6 M3 o8 x8 p/*              初始化捕获模块                                              */9 o; x% v6 t  ~& A- Q5 r0 G. J
/*                                                                          */
9 E( N+ D% p: G$ E/****************************************************************************// X$ }0 z5 q9 `' N( S' s4 J* R
void ECAPInit(void)
9 B+ ?6 L0 I; l{
0 H  f8 q2 j9 [" [- U2 @        /*-----设置 ECCTL1-----*/- u/ k8 m! y& A* x0 M) H5 [9 j7 ^
        // 使能CAP寄存器装载
" ^' Q% }/ d8 ^8 ]2 Q5 s        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ d& h+ r. O  M+ B1 x: B4 X8 q        // 设置预分频值.9 p1 R3 }# g+ t& F- u
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);- P# a! w% v: \
        // 上升沿触发捕获事件: `0 y2 X: w2 N( f$ W; Z' Y! x( ^5 r
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);8 ]: @, q/ P7 z, d, W
        // 输入捕获后重新装载计数器值.
) J3 i" Y" A. v$ G$ {9 n& I% }        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
0 B- j: ?; e/ a$ i% Z( q" r: `2 c6 L% ]8 P! A
        /*-----设置 ECCTL2-----*/
- [2 d( ]. r8 s1 c5 b        // 连续模式
! S, `4 T1 {, P6 A  U: O        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
4 j3 n- X( i9 X4 _& f; s        // ECAP计数器TSCTR持续计数) A; c( Q$ f2 X0 `
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 L$ V' @1 n; n: y! c        // 禁用同步输出和同步输入8 t$ m% q9 \, J
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
3 a& o0 t9 x- C  w+ w  F7 z) L        // 配置 ECAP 2 为 CAPTURE 模式
* @. C) h5 d: K1 u* E/ [0 w        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
$ C! W& R+ H# _, P4 j: i6 h8 U, x7 ?6 F2 G
        // 使能中断
* e1 n% z7 j. f6 M2 Q* r1 E  L- I//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);. P9 x. ~' R. W# c
}
5 z, y: g( i3 _  `. G" f$ A
+ D" X- U, G2 N$ ^/****************************************************************************/2 T% V; n8 K# }) F: g: _4 Q
/*                                                                          */# ?7 ]' f# k: x6 H
/*              取得捕获结果                                                */5 l2 J; E4 J& G' @, L
/*                                                                          */! Z6 C9 n+ M5 s
/****************************************************************************/, P* ]) Y+ r8 Y$ W! p) j; ]
unsigned int ECAPRead(void)$ O/ U: F+ m, \4 b, H
{
" {( s3 y+ t$ H% N* y6 w7 j2 b        unsigned int capvalue;
8 C! H1 p1 V* Y. q% L, x9 e6 k. \7 D        unsigned long frequency;
. g0 x$ s/ h, m) R, ?! ^( A* u, l# ^9 N/ J) I. u
        // Event1 中断标志
- `- K0 I! d, m4 w, {; n        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)): h% q2 }" e0 s' W+ T! [8 Q
        {
% l' h6 Q& [4 `: `' F2 ?0 l                // 取得捕获计数
; J2 q9 q* k& n% D. K  d* M9 `                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);1 G" g# |8 w, s: q, A
                capvalue = ECAPResult.cap1;
0 B' h) d& Q/ U1 Z  A# h
! K& g& m. M- Z& H4 O                // CAPTRUE 模块 228M 时钟主频
3 n7 Q6 s- U/ W8 T8 b$ v3 ?; H                frequency  =  228000000/capvalue;
# j, l( K" ]7 `$ o3 B) S' b                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* ]+ @, ?# B8 H' _9 |1 C1 ^/ Y1 x& P+ F9 N
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);% q3 i0 D5 g1 `: q1 Y
//                IntEventClear(SYS_INT_ECAP2);1 s% R: r: X/ V. ]+ {
        }, H8 w' j& U) q+ @" A0 t% S1 v  s- [4 r* P
        return frequency;
5 e# ?; i4 Y3 [. m: J}- u. q$ N8 u' H4 H- r0 z4 f! e7 x

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。, O0 C1 }, ?# e7 c: ]' ?
[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