嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
8 o3 s8 k8 ]: e$ ]
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/* a* _8 V( ^5 H, E) K
/*                                                                          */
0 v6 f* I' y- P: Q. U3 h/*              宏定义                                                      */
5 l  W- [2 Q' l/*                                                                          */  P. J6 U& y, Z2 c/ o( K
/****************************************************************************/
+ q$ @; Q4 ]% k  D& L// 软件断点2 i% P8 w  b9 I" o9 k) H4 Z4 u4 h
#define SW_BREAKPOINT     asm(" SWBP 0 ");* M) B# k4 R3 f
5 G, {0 I* |# \$ j: b
// 时钟分频
3 `! x# k/ Z3 O#define CLOCK_DIV_VAL     228
- [& l+ L1 w3 |7 M7 Q/ h  l' R) E* H3 r+ j
/****************************************************************************/$ ~) t0 {8 W' i
/*                                                                          */& O! ?0 R: \0 o  g8 `
/*              全局变量                                                    */
( Y# P# F1 P6 z- s! P" t/*                                                                          */
4 J" M: s+ [- W+ ]  [/****************************************************************************/
, P5 q# s1 f9 Y# zECAPCONTEXT ECAPResult;& v- A% e# ?  Y( A
4 L* m/ K1 Q: X  D
/****************************************************************************/
8 \+ r: ?% M, J4 m2 ~$ B* ]7 o( t/*                                                                          */
# w( l  K/ i8 D% e/ U/*              函数声明                                                    */9 O. |' _  u" B. ^6 \& @! B
/*                                                                          */
& I7 J" J) e' u4 z6 w! I. U% `/****************************************************************************/4 E+ ]$ S  s9 |' V4 {
// 外设使能配置8 ?9 ?$ [; V" A; p# y0 d$ p
void PSCInit(void);
) n3 g% S+ g# t: ?# p
9 ]0 R9 t3 x* K" z# E2 q5 H) l' {// GPIO 管脚复用配置4 K' {6 Q- F& \! G% Q( B" O
void GPIOBankPinMuxSet();) l- c8 m: n8 F0 u4 N
5 m, ~- C$ t# V. G- Q5 F# i
// 产生波形& X) ^5 e8 S* ~; N& [2 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 z# V3 I5 D. c3 z  kvoid ChopperWaveform(void);
: q/ E* X1 }" `- P# c
6 o% O; F! r3 b// ECAP初始化和读函数
" X& J4 W' u1 a. E3 `2 d3 avoid ECAPInit(void);/ W' c5 r9 A+ v: M
unsigned int ECAPRead(void);
" \2 X8 ]8 V+ j0 Q- f
' p! T& g6 W2 i6 \//ARM 中断初始化$ o5 v1 x- I% n4 n& v7 B, M
void InterruptInit(void);
# `) x: t9 f5 L/ p  x- }3 @3 w. M7 g  K; R$ ~7 M
// PWM 中断初始化4 B6 l. Y0 X8 T# k$ ?
void PWMInterruptInit(void);2 m3 R# m5 l: D* c4 `
// 中断服务函数
# _0 A$ m2 M: X( D// PWM 事件7 {: o+ Y* Q6 V9 I8 c& D4 I9 v
void PWMEventIsr(void);
6 t3 k% C8 R: s$ b0 N) j+ H  Z% B// PWM 错误控制事件3 E0 d- f' K) h2 r
void PWMTZIsr(void);# i0 D* B+ p- M- Z

. c; a  \- I) D1 n7 W$ j/****************************************************************************// n. [+ _& {4 e/ v
/*                                                                          *// l& r" i; e1 u% y  `) S
/*              主函数                                                      */2 d, Z9 V6 m4 W9 \/ q: S
/*                                                                          */
- h! q. _: `! h: l4 m6 d( `9 ]/****************************************************************************/0 a/ l! [1 G# l- U$ L# K
int main(void): o0 w4 g( t( [* y1 t+ E
{( B# o; l1 v  r$ k
        // 外设使能配置+ z( ?/ e* n3 k6 o0 w/ e
        PSCInit();$ Y) d( Q  A& P4 E- F/ x- ]6 B
) p, \# |, R3 j' G8 Q3 O
        // 初始化串口终端 使用串口29 }5 U3 o$ w9 `( x
        UARTStdioInit();
4 E% _* `1 a2 X' Y+ ~       
: O/ |$ S6 ]/ g        // GPIO 管脚复用配置
1 N0 f0 Z& a$ _# M4 ]: T8 |- i        GPIOBankPinMuxSet();2 i' t+ [6 N/ p) R3 u. B

5 I$ D) c$ a+ S7 o        // ARM 中断初始化
) X' U0 R, k& Y( t  w        InterruptInit();
4 r1 e: o: t; H
, A6 D- ]- O* [+ m2 h! @        // PWM 中断初始化9 W# }: t1 d+ P# ^
        PWMInterruptInit();. D1 L6 ?. @4 y+ o
+ o. T5 F3 v: \
        unsigned char i;3 H) d9 ~! R( f0 H0 ?& m- X
        unsigned int j;
. Q/ R" p, p" {8 p
4 U% c, T% |) i: A        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
- a% i2 C! }( n7 o: f        UARTPuts("------------------------------------------------------------\r\n", -1);
& y! X! u9 d4 N: Z! T6 \, f        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
! [! ]& L) ]; g        // 产生波形& O) T: s4 G/ q) S( b: _% q
        PWM1ABasic(25000,50);
8 T: ?8 H! G, r; W. Y4 S
& h. U* N# H0 d- s# O! d; O        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);+ q1 B0 D' H- h& b; c3 u8 X8 e
        UARTPuts("------------------------------------------------------------\r\n", -1);
5 s0 x  \8 V+ A5 w6 q7 W  O6 n# @* H6 D' O9 e' s

/ x3 E* g: J  z- R( O4 R0 g5 n; W
        UARTPuts("------------------------------------------------------------\r\n", -1);
7 F4 O' g& c5 q7 X+ ~% k! L        UARTPuts("                    C6748 ECAP Test\r\n", -1);
' p: u  `$ X, A  |1 d& t* A: m        // ECAP 捕获初始化5 w- n0 b9 l* Z0 F% [, x' c6 G
        ECAPInit();# `# k* u& y) {. L  |
        UARTPuts("Initialize ECAP.......\r\n",-1);# v" w7 n9 ?% n) J3 W$ V0 X
        for(i=0;i<5;i++)
+ l4 h7 Z. ?+ f) A; {        {
. B7 @( J  c( V- L% e' ^                    for(j=0x00FFFFFF;j>0;j--);            // 延时% @9 o& d# b5 Y+ i2 {1 U& p
                    ECAPRead();
, Z# `6 d4 }- L' R: H7 C        }: z: q0 g9 n' ~1 b4 a6 Q' |
        UARTPuts("\r\n",-1);
% l4 X5 D: j( y; A        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
2 i# X: g9 c2 ~; F: w        UARTPuts("------------------------------------------------------------\r\n", -1);9 Z& O" N) S/ r. T* G8 g3 E) B

4 Y8 h/ b% `: p: f# U        // 主循环0 ]) |  e9 b2 g- e* Z8 Q
        for(;;)
% {+ h; v) ^: o2 @: r        {0 D$ {( u- Y0 n  d, n

$ Y* i& V/ x. @' _- I  m/ C% i! ~; m# p. p        }# ~  ~2 v$ i/ D
}
: s' D+ G% z  m1 ?+ c3 s- F" q6 |/ g
/****************************************************************************/
4 Y! b- ~8 U8 s/*                                                                          */
& w! c+ P- m" Y" r$ N/*              PSC 初始化                                                  */2 [7 R/ K) q/ `! y
/*                                                                          *// J0 `; L1 t1 C( A9 M; k/ ?9 A
/****************************************************************************/
+ c$ m/ P* n) b" c4 n" }; Svoid PSCInit(void)) ?: j* {! R5 j$ X2 {# K
{- Z" v# B( u. G. m
        // 使能  EHRPWM 和 ECAP 模块
4 X0 R" @6 ]" S* L+ |        // 对相应外设模块的使能也可以在 BootLoader 中完成
# Q' N& k+ Q6 q1 D0 B    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 ?7 v6 \4 H! v6 E6 B: ^; d
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. ?/ p2 Q( c* l  H0 p}
) I" Y8 x" P' N% M( o) T% K( k  u/ ~& Y2 H
/****************************************************************************/# a& D% D1 R. n- ^3 Y2 @( g  B
/*                                                                          */8 V6 o( h1 @/ B: G% p- S
/*              GPIO 管脚复用配置                                           */
$ j- u5 w2 [: K1 y+ J) m' [* g/*                                                                          */
7 q' B  U1 m" ]/ i0 F: q/****************************************************************************/$ J* r+ w' n: `! p% z9 d* Q  L7 w. X
void GPIOBankPinMuxSet(void)
; ~9 V6 A5 ]' K) X{
8 i& T& k! x1 I9 O' Q( L        EHRPWM1PinMuxSetup();
$ C. _0 M& i7 N
$ @; [! R; ?  o        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ F3 M: i! C/ ]5 b+ Z, y        // 作为捕获功能时管脚方向为输入
0 b# P3 c% D' U/ E4 ^- _* l        // 作为辅助脉宽调制时管脚方向为输出
% T3 _. N1 o& ~# s# q    // ECAP2 / APWM2
, y( {+ {; o9 v7 u; J$ L) \' k& o        ECAPPinMuxSetup(2);2 m  \  s8 D$ p1 C6 u/ B

. S) Q" X% ]% @" h) b        // ECAP2 / APWM2方向设置为输入
' r% G% D2 A# ?* S        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
4 \! s% _! L# N6 ?# R+ R7 k" g6 u6 `}1 s9 X" g" b2 y  F* o( h1 W

+ x; g! g9 r6 ^! I# _0 J/****************************************************************************/
& c% v* M. b  J6 W/*                                                                          */
  k. B' g; f5 j: R7 \  p# _/*              PWM 输出波形                                                */  X: e0 ^, e5 U4 e
/*                                                                          */
/ }( h9 ^0 t4 n* x! f: Z! c/****************************************************************************/0 c8 t) m9 c& r$ a: j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 ]( c' ]9 J: ~+ @5 V{: d- w" x, X2 d- \1 j
    // 时间基准配置
: A7 k9 n6 j! u5 R    // 时钟配置9 {) W2 j/ V2 s  P% n5 \/ D
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( U, |+ K; d* Q5 D
5 G% o( _6 S1 t/ i$ y    // 配置周期
+ U; a7 k! ?+ H; s9 m1 G" @& S    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,& f* t8 S; i9 A5 ^& P) b
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ A+ H% J  ?0 i5 l  @- K
8 Q7 I( V9 ]! [" W9 g8 N# \# B    // 禁用输入同步信号
8 H* d$ ~7 ]( z3 Y. Q. m9 K" E: ~# V    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& [3 H- p9 E  n$ L0 F

' C# T/ H) D- s$ H7 z7 P  x    // 禁用输出同步信号; ~+ j) d6 e4 c2 i0 ]% u9 u- n+ c4 z
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);8 X$ n3 R- Y0 n% K8 R6 z# {& N

4 c4 Q' F$ [$ ?- V    // 仿真(DEBUG)模式行为配置
8 J2 S4 ~, p- E  _1 \& N    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( l1 i2 N6 M3 L/ w
" B8 y! ?2 f  O$ G    // 配置计数比较器子模块
8 X+ I5 ?: k4 P; Q3 _3 p    // 加载比较器 A 值
. T7 p, _+ Z: n% }; t    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE," z  e( s/ U2 O
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 B/ J( B& Y  p: a  D% ?

2 }9 ]7 F# D/ x) @( `* C. y; J    // 加载比较器 B 值" [- r; U6 H4 Z  f( Z. D
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 I; ~" A( v/ R7 \9 R+ S# i5 T! e
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, D( P& c5 G* p- n* i2 B" t. I# Y. D% i
    // 功能限定配置(输出引脚触发方式设定)
3 X8 a, v6 J; H1 w. G! C. x    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出7 ^: m3 S0 G! Z+ V* U6 I) F5 c
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,% D. v6 O3 q+ {- R: O- K
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* |% ^& ]" \' H' u
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);# e4 N! ]4 a9 S+ v. r
# P5 x, a' n% `# E
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ M# _, i- _" ?4 ]5 {  e7 W# N
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);% P" u, L* P, k3 J- q
5 P: @' d0 ~* [) S: w+ _/ X9 }
    // 禁用斩波子模块6 |' y9 i$ |) U# s! X) n2 @9 g
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- T. M) n& q1 B" B4 \
  B* E2 b* A3 H6 b" y1 h! R    // 禁用错误控制事件6 H! F, g+ @+ J, M
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! X7 K2 z- a5 v* ]    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, C- b: R# o* u& W: K" E4 O2 s+ G
    // 事件触发配置
6 h5 C1 }' Q& l2 [! V4 P    // 每三次事件发生产生中断
# H& z; ~6 R8 z" u8 ~- c    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) w* j, y3 P/ Y9 T# B( b  j7 I    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 ^/ F7 S( K2 Q. H    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- Y9 l4 ?; @% v6 A4 s    // 使能中断3 F3 ?$ s3 Q% n2 Q
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);* `3 v6 M9 i' L

: y6 A0 c5 f8 S! @    // 禁用高精度子模块9 Y2 M8 D  @  L( x
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
) W# J5 y5 ?- i# d0 |- P( Y. {$ a) G& j
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);2 h& H" M0 S1 C9 Q! p& i0 t1 j
}
' q7 ?( d/ `# Q6 K" {$ J: u. e- T7 _2 p! `0 H% d
void ChopperWaveform(void)
- C: e6 i  U3 M, Z{4 v; ?  i+ |3 g) E
    // 50% 占空比
8 W8 v, c; _  ^' l    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* V6 l: C. F6 o* K7 S    // 4 分频; g1 |! E  F5 O  F
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);8 ]( g9 s* R9 L$ j9 P5 W
    // 单个脉冲宽度
( W  _/ [! }0 D4 z& h    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 m6 J* g6 f  I2 l! i# K    // 使能斩波子模块/ U- B; h4 V* g! m  n4 V. M
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ Y$ W- r$ M+ L% h9 ?, ~/ Z7 H& ?}8 A$ G' T5 B% C; R- K: K7 ^
4 }* w' A- K. B
/****************************************************************************/7 m/ y8 G' P# O( i' D, \5 ]4 }7 k, e
/*                                                                          */* f) W* r/ @( k2 ^4 C
/*              PWM 中断初始化                                              */
+ J# w. R; {) Q, F/*                                                                          */
3 n# ]3 r+ u+ U5 V7 U0 ]/****************************************************************************/( p+ ?9 O- T6 k. y& F0 Z1 U
void PWMInterruptInit(void)
* {# i8 J! A3 d{0 L7 J8 m% o& b4 K" r
        // 注册中断服务函数% V% e, X7 v  E8 A8 q4 T1 V- \
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
. g" B8 `: s5 V/ M        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 ]! `, c: S. Z0 E0 [& L( Y" J& l! w( f9 v" k
        // 映射中断
, e& I& U5 D6 e4 Y        IntChannelSet(SYS_INT_EHRPWM1, 2);7 s1 d$ a% v. f
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);* g: }+ [1 w% [- E# F

0 f/ L/ u3 U3 \        // 使能中断
+ {! S7 p% X% N# B# |        IntSystemEnable(SYS_INT_EHRPWM1);
3 }$ g; e" ~6 L1 A; ^0 u0 j: w        IntSystemEnable(SYS_INT_EHRPWM1TZ);/ u; J8 ^& J  X7 J
}
, }6 u1 ]' r+ q# a
+ O; H$ d, Z5 t+ ]! Q, E/****************************************************************************/
$ V; H" K/ `( U! Q# r7 J# K7 V/*                                                                          */$ F/ Z- B1 n# j0 p* Z, [
/*              ARM 中断初始化                                              */. u! x' r( ^& U$ A. v
/*                                                                          */: @8 H0 d5 j2 H0 K4 T
/****************************************************************************/
( a$ G' O- B. b( a& J9 j; lvoid InterruptInit(void)
8 N$ ]3 [( a3 \{9 w2 t! l, E* K7 ?, t
        // 初始化 ARM 中断控制器
3 j6 K+ e4 o: o( c        IntAINTCInit();6 N( x3 I- ^- Q4 j# D; Q. Z1 K$ R
4 P2 }  O" G; N4 _$ a
        // 使能 IRQ(CPSR)
1 E; O: l! H/ `2 a  C$ q& C2 s        IntMasterIRQEnable();
: J% a" v- _' t% x, R& Q; S3 m6 R# L1 x" f0 u6 ?
        // 使能中断(AINTC GER)
( r. H+ w1 R" v! Y. X        IntGlobalEnable();$ Q- A$ c. K9 u' v+ d0 Y3 F. p

( [* t$ U- [# }1 Q9 u: x* M        // 使能中断(AINTC HIER)
# L# c+ u, S+ {) d$ o6 k        IntIRQEnable();3 m) y1 U3 ~7 n6 T! j' G- E$ w
}9 s* }3 f4 m  `5 g/ k

' {) B' l% {" ^5 W
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/1 E- u! [! \; o* d% `$ m
/*                                                                          */2 m/ \/ C" R- U# d. Y" t9 z
/*              中断服务函数                                                */. {; b3 ?2 W9 y6 L
/*                                                                          */& o: x. i! J5 W; r: b  e+ M
/****************************************************************************/3 V6 I" w) x0 O9 [. @) l$ O3 V3 m1 [
void PWMEventIsr(void)
' N8 B* o, f6 [2 b! I' W{
5 `6 z4 d9 R1 O3 c        IntSystemStatusClear(SYS_INT_EHRPWM1);
" ~# V( c2 w/ H' j( c# N/ w4 o7 T+ G: x! G0 c
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);( p$ |8 D( a. `' \* ?7 C5 |1 D7 J* M
}
. S) y7 H+ G# @6 g2 E' ~) {/ A3 }& C/ R) e0 T* u
void PWMTZIsr(void)1 ?5 h- v6 Y9 T# k# F8 G9 w" ?
{
1 ~# w' H0 c4 o: ?2 {  B, ^0 R- X8 r        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);: {. b/ q& r3 g( D& c

- j; z0 Q/ m- c2 s( F6 J    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ s4 k# A! c2 Q. S9 \% w/ p}
% G' J& ^" m! Y9 o( e' C/ L) U) y: y# m/ B- A( t+ G
/****************************************************************************/* u  M- R7 d$ P. x( b0 Q
/*                                                                          */
- P- H/ n$ g! K# L: N/ |) w7 m& g! \/*              初始化捕获模块                                              */1 @% h. }$ z' a2 g; v. D, N; R
/*                                                                          */0 H, G1 o5 R8 t% S+ F/ F6 n
/****************************************************************************/
/ }. t' b# n6 r& K/ \void ECAPInit(void)
! ~& \  M6 j3 V1 k. L, u$ g3 i{  d4 s; O2 b1 L8 h6 x( _# a
        /*-----设置 ECCTL1-----*/3 w1 y: o  O1 f3 ?0 Q) g
        // 使能CAP寄存器装载
! O$ H0 ~( ^3 [        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);' \0 H1 Q7 b2 C! l- G3 `
        // 设置预分频值.9 n9 ?# j6 D+ Z3 S2 S1 B. |7 L
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
2 X7 P  X6 g+ M: o2 Y& ?2 A        // 上升沿触发捕获事件
5 J8 }4 ?* A5 y  H1 m        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ J% L4 g9 h# j8 i" }% @5 K        // 输入捕获后重新装载计数器值.
9 e7 C/ @) E4 \- l  |" x! \        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 U' L* m! O) c4 u; X* {3 v1 ?& w  [' Z$ D& M
        /*-----设置 ECCTL2-----*/
, K$ e" z, p' }8 ?8 ?% S4 I        // 连续模式; ~) {$ P; c+ D) k' s9 D
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);9 e) k9 D6 ^0 p" B5 I
        // ECAP计数器TSCTR持续计数- [! c6 T& i& F. H+ I8 o$ l7 g2 Y
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);3 E6 M5 i$ h( G: p, b8 x
        // 禁用同步输出和同步输入
- V' W; A7 d  u) [4 l' P9 e        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);! W; |3 P6 ?" C$ }/ K( S
        // 配置 ECAP 2 为 CAPTURE 模式" D: F, s' a! u
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# C: [# ^( r, v) G2 _$ \1 O6 i2 [7 C4 z3 a& Z7 \
        // 使能中断9 a& R8 L  z& d$ H
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, L. T  K$ w( T+ a& z}
" W7 j+ u0 I2 H0 p/ S7 ?; T# d1 n4 S3 M6 W
/****************************************************************************/
5 y/ ~" [% m: R( V, Y/*                                                                          */* C( D) L* O- A% p! \' u3 o4 M
/*              取得捕获结果                                                */
9 b8 A! Z5 i- f0 T& g/*                                                                          */" D5 F! W+ s- z% G. V
/****************************************************************************/- q! h$ w  A$ Y: T
unsigned int ECAPRead(void)  z, g. A* u: A' A7 d& J& A) p% W
{
# a/ T  F* e  v2 j1 w! U        unsigned int capvalue;
! y& E& U! A/ l7 [- x        unsigned long frequency;* S5 ^2 V! x2 J( r) w, q
* R5 V5 c% s0 b& j! r& G
        // Event1 中断标志; f9 h2 q  S# x5 v1 S9 t( F$ i
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)). [" {  |- ^1 J# b/ w
        {) q6 y- B* d; x8 h9 j
                // 取得捕获计数
6 D) G2 R; k" U                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* ~" B+ H9 X! ~                capvalue = ECAPResult.cap1;4 x# P( K+ I5 N

% C- y3 f& W9 \8 s. y                // CAPTRUE 模块 228M 时钟主频
, p; H& R/ k  y) _) e$ h4 _                frequency  =  228000000/capvalue;
0 }1 W, m( i1 M9 [4 ]5 m/ \- H  q                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* F" I2 [& [: J, @& F! |* h# [2 ?8 f% g! |: I
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* T8 @  e9 ~9 X( T. |( l* i5 t//                IntEventClear(SYS_INT_ECAP2);
3 F0 ]1 K/ K, [! \2 e% W& v5 F7 W2 r        }0 P% `0 X) j0 Y7 F; Y
        return frequency;
. a. c; R3 v6 S; T2 Q2 v. K}) t( x  G5 f; V& W% p* X! T& _

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