嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家1 s' a4 g5 Q3 R7 \: }

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/; m( \5 |9 R' Y5 p$ d( F4 C
/*                                                                          */, V9 U$ Z6 Z. s& {8 s
/*              宏定义                                                      */5 c' V; D5 I! x! j/ R, i- r
/*                                                                          */$ C0 Q( A7 `" J- n0 ~$ z; X' _
/****************************************************************************/5 B9 F4 ^& q9 T+ H9 v$ z
// 软件断点" r6 L5 ^4 `, i6 U$ A4 g/ P) U" ]
#define SW_BREAKPOINT     asm(" SWBP 0 ");
/ N% x+ Y  ?/ o4 {' M
3 L' k& C; J! B' _// 时钟分频3 K0 }- N" ~; N) w/ Z; ?' k
#define CLOCK_DIV_VAL     228
$ U% a$ e( X  i0 i/ w) h
5 B+ M% p" z5 q/ S7 C/****************************************************************************/
- a, W" q3 x0 E+ u/*                                                                          */
# N& W* X' ~6 G/*              全局变量                                                    */9 ?3 ^, v' o; y2 K: j
/*                                                                          */1 V, Y  Y5 n9 S) y3 ]: o
/****************************************************************************/
' M( N+ A; z8 R# E; pECAPCONTEXT ECAPResult;
0 o& T. c+ W$ U
3 u" h! I+ ?3 m/ A- i: G/****************************************************************************/2 O' [; I  b+ g( _6 I  `5 Y
/*                                                                          */
5 X! ^4 U1 P% @, s! r7 j/*              函数声明                                                    */# {. }$ `) e# _8 y
/*                                                                          */8 M2 O$ m# K/ ^
/****************************************************************************/( H# b. O% N, X: B
// 外设使能配置% e7 `/ P$ z( b
void PSCInit(void);( P$ D, _$ A3 G/ C# t# L* S

$ ~4 y' ]5 @0 P1 v( A// GPIO 管脚复用配置$ {0 k6 m1 }5 B
void GPIOBankPinMuxSet();# ^6 i* p' L3 n! `% L

7 n: ]7 i2 s+ S7 v& o0 x: x  [% P// 产生波形
; {2 r3 X7 Y' nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 B* q7 y5 C8 g- B" T) _void ChopperWaveform(void);7 s$ N/ I8 n9 _" t' ^6 j1 D8 m
, n& O+ p1 n2 I9 }6 U: @
// ECAP初始化和读函数
# n6 g$ x1 Z$ m% w9 f1 f! X# H8 mvoid ECAPInit(void);
+ F1 ~! M/ p; L9 }/ f+ funsigned int ECAPRead(void);
, y* z8 K, V! c5 K' b$ G" o+ ]# p
1 P0 ?& Q2 h" I7 C! h6 y! ]- k5 F: e//ARM 中断初始化$ s1 H" m  n4 }6 L( L3 q
void InterruptInit(void);' c. w0 i$ q+ m, Z' L& C

' J& l% h$ x8 o! j* r// PWM 中断初始化
3 v, ]4 V: _7 ?$ H6 D0 P$ [void PWMInterruptInit(void);
9 Y+ P& E1 d$ T// 中断服务函数; \& W) ~1 W. `( \: R' x. _5 y$ ~
// PWM 事件
. r  u2 s+ V  j0 j% @& Yvoid PWMEventIsr(void);
( w, P* C; p. F// PWM 错误控制事件/ b4 Z' c! i/ N6 D% G* [7 \
void PWMTZIsr(void);
. n' ]& d5 F! P) U
0 m2 t, c6 }6 P, e/****************************************************************************/
; E! h, F3 I$ l7 _4 \$ m7 c% o/*                                                                          */
# ?9 u) K5 E. H, E) M( w4 A; a/*              主函数                                                      */$ s5 {; N% [1 U$ y9 e7 e
/*                                                                          */* l& z* j4 s$ c% |+ N* h* g
/****************************************************************************/9 C8 G6 N/ E- w: m/ I/ s: M0 v  T
int main(void)
0 }/ s5 E* s" H' U8 r- e{4 s  |) v& W/ C+ K% M8 `
        // 外设使能配置# ]8 N8 ^# l. k$ t( N
        PSCInit();& ~6 _1 J0 R+ J2 N; r2 j1 h

( ]% [5 v  z  W' `, C  ?' u: ]& l        // 初始化串口终端 使用串口21 X0 ]5 Q/ V) ]7 j4 ^8 i
        UARTStdioInit();
$ f- R; x$ X" e% {  K% k, O/ H       
7 j4 o% q* w' l  X: K        // GPIO 管脚复用配置
% _9 f+ R5 u+ h5 B        GPIOBankPinMuxSet();
3 X6 y! R- ?6 M. f8 w  W
4 S) V, x9 p, p4 Q8 Q" V        // ARM 中断初始化
2 h$ i: P5 Y9 ~5 C" q" i6 |        InterruptInit();# Q) M/ Z  w" [  O- I1 L' w7 I
4 Y( L0 s; J" S4 e' e) J; F% H
        // PWM 中断初始化* X$ [+ }" y' e5 ~: r/ x. H
        PWMInterruptInit();1 m# N  R5 a7 x$ h5 @
& x5 I5 u( R9 ?# q( t) l* V' d' `! u
        unsigned char i;
7 I* N* H: B+ h( u6 N. e        unsigned int j;$ @" Z& e! _; @. L. g/ I# `

( {" A) I. K0 i; A        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);8 D6 h6 G% g$ G
        UARTPuts("------------------------------------------------------------\r\n", -1);
+ J2 ~% ^% J# p4 D4 C        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
) ]! L3 Q8 \- m/ z5 e        // 产生波形
7 o9 s' j9 \; g  M# Z" t% {        PWM1ABasic(25000,50);4 s  t) P/ s$ ]) X; _$ h" ]: b6 d7 Q

0 q; I( z3 E; \        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);" i' g1 r9 p( l8 k: I
        UARTPuts("------------------------------------------------------------\r\n", -1);
& E$ \* }2 c4 h+ ~
" A9 j( _0 t# q; \
- T- l9 \! z2 L, n8 [) x$ ?3 [+ P( M5 M
        UARTPuts("------------------------------------------------------------\r\n", -1);8 w6 p; q4 J' M5 e) p3 k
        UARTPuts("                    C6748 ECAP Test\r\n", -1);$ O% U6 v) `% f
        // ECAP 捕获初始化
" k9 D+ x9 V$ H9 n4 {2 C        ECAPInit();
2 b1 E$ K+ `. o4 E; L- S! e) t, Q        UARTPuts("Initialize ECAP.......\r\n",-1);
/ l6 q3 u2 D! x( Q1 H" h7 f        for(i=0;i<5;i++): ?+ o$ B) W  B: B4 I
        {: g5 U. r. V: W8 I( c* M' I7 V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时) {1 r) a) R' p5 S2 R- F
                    ECAPRead();# }7 x8 W# v+ b6 P" ]8 @
        }
' C' Z% T0 Z' J5 u* J; X        UARTPuts("\r\n",-1);
3 n3 e, e9 a$ i9 d0 q& m        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
0 q9 m4 G9 S, u, P        UARTPuts("------------------------------------------------------------\r\n", -1);
/ m: K8 b0 |" {% d8 _8 t! v  b: n. i/ }. Y4 A5 o* ^$ t
        // 主循环9 p2 F4 h. ]% B
        for(;;)! @1 G6 ^0 Z9 m- D. @
        {
8 D% g# c- }- A8 Z( z+ n0 _& k0 t! H. @& b+ F
        }
* D: S: u# w! z1 a) s  L}* S7 P* `" n) ~

$ ~/ G9 C# {( k+ m# k9 E! f/****************************************************************************/
) t" I, p6 q) \) ~2 g4 w9 @/*                                                                          */
/ j  c/ ?  u- p3 k6 F5 `/*              PSC 初始化                                                  */$ K' H' a0 B- B9 h; q6 B* l
/*                                                                          */; p5 p  m$ B, J) z) F, H$ |
/****************************************************************************/, N# B' |  S7 U
void PSCInit(void)
+ J6 c/ z* y. J{; z3 K, G' S9 u' n9 {
        // 使能  EHRPWM 和 ECAP 模块, ]+ @, h0 Y" U) [4 Z6 s9 H
        // 对相应外设模块的使能也可以在 BootLoader 中完成
/ o$ \) N/ Q: T; s, q* m4 l    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( a/ R& ?3 [4 o- \2 y, f' t
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 u2 W. V  I8 I% W4 i; C; u
}1 X% `8 P* \5 Q

, K; A: j+ I9 P3 B5 Y% P/****************************************************************************/) H7 y/ d$ m! z! n4 p$ M0 J
/*                                                                          */
  g* r: }/ ?$ n# T2 W- E/*              GPIO 管脚复用配置                                           */
' s+ e; J3 `, a2 k4 S1 Q' b/*                                                                          */
+ n5 @8 V# C- d7 `! S6 D3 b- ~/****************************************************************************/
% }1 _( u% a: w$ l7 S% Vvoid GPIOBankPinMuxSet(void)4 Y# U- b$ [: S* l
{
* s: T  w, }& ~4 H- U- V& b3 |        EHRPWM1PinMuxSetup();. }3 M$ p8 \) x( D* x- _- {1 I
6 |$ H7 ^$ a* _
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, [7 Q, a) V8 x/ Z0 P( I& D: f1 }        // 作为捕获功能时管脚方向为输入
' T, z! T9 \* s# v( l' V* \        // 作为辅助脉宽调制时管脚方向为输出
- u* b4 o2 Q  t" ~5 e    // ECAP2 / APWM27 O4 S$ s9 {$ c6 V
        ECAPPinMuxSetup(2);5 b$ O/ W& R5 I1 `/ w

5 m% U1 @9 G, F' j- l# O% A        // ECAP2 / APWM2方向设置为输入
! d& A! u: @7 S( X& `$ t        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
: C- B  X! M' x. [" X# W}
1 N0 f  U6 W% }) u
7 [  ^$ S; C$ @- k/****************************************************************************/5 B5 t7 g7 P+ V1 i2 g# h
/*                                                                          */) p/ p5 k0 s9 t! L
/*              PWM 输出波形                                                */
$ C6 K' u0 f. \9 ^5 N/*                                                                          */
* ~; R5 ]' P9 ^" o! S/****************************************************************************/
. l& Q# G+ i4 V5 G5 e1 ]2 ^void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% ^6 D2 Y  e/ k, M) x+ o2 a{
" C6 Q: {' ^2 ~    // 时间基准配置
( E% B/ m2 C4 O/ n8 M    // 时钟配置
2 b' |% N' n) E2 j! U. a/ v    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. `0 Z$ G# u' u6 c7 |3 X9 F7 a/ q) d* Q, \2 o9 L
    // 配置周期4 G1 @2 h! ~) i. k4 {/ ]. [
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 ]) q8 }1 Y. t7 l, ^% X5 ^                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 T9 {# Y6 s7 i9 M9 {
" u+ A, J3 R( x. U7 ]; ?
    // 禁用输入同步信号
* ?9 ?, o: m& ?3 B    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, H) G+ i  F* ^+ Z
: [0 R) T0 ~& w& h# D' N    // 禁用输出同步信号
& t6 {; ^& f$ b9 _/ }4 H/ H    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);0 H( d; V" l$ c3 D8 G2 T

6 R+ t. W, t5 Z; l* k# E7 e& C* `    // 仿真(DEBUG)模式行为配置7 U4 b# t: ^- o" @
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);' ~. D& a0 a: U  s2 F7 @" Y

* @: p: v. i9 @. e( M0 M5 Z    // 配置计数比较器子模块
4 G: O9 R8 b/ L. p    // 加载比较器 A 值
! e4 ?  w* k% V4 {' p, G    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) r+ x8 Q1 ^1 X* H; I7 S  \/ ?" X                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( F8 q3 {4 X& W. \' p
. E" q/ a) L' }& {7 _
    // 加载比较器 B 值
# ^+ {* y* e  }- N) ^$ ]4 P' N    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 Z" ?# T' u, n3 f9 I+ W; J/ m* I* D. ]% @
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, R" ?9 y( u- T6 p8 c
# M# P$ J" @( l. b    // 功能限定配置(输出引脚触发方式设定)
) Y  i! e) W; i    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
6 p$ `: r* C9 @' V% L; @+ D: T    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,: u  Q7 E8 a8 \6 Z8 t% a, i
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
0 Y% A3 a! G& k8 }' n1 @8 a2 t+ O                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' ^) _5 @, p- U: k1 r+ q

" L3 i% |4 m3 J    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
0 A- L4 h, q" n    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 x3 \& l3 y5 V6 q) L1 X

5 i/ y( `$ g7 P# C    // 禁用斩波子模块5 y8 ~- P) s+ B. D
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);7 t- Y) P* r" W' G

0 Z, F; w, H, D    // 禁用错误控制事件
$ c, @" }6 V! ~- P1 s4 y! a- m    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 K/ P3 ^$ b( O; V+ ?
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: y( b0 [4 h0 i$ X0 {0 R; z- g6 q& Q' l
    // 事件触发配置
( b# u! L# M5 ^+ a: u* M( z    // 每三次事件发生产生中断
1 L& d$ c$ i- w6 b    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' t9 ]4 b6 i8 f2 x4 r" \    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件$ _) w' b* L" N! S. b
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( t( V) m1 Y( D' a    // 使能中断
+ D( a2 J) q& J; f2 V! T    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);$ e! g3 {2 N- o4 L' Y

4 S! B8 l: o3 C+ ]    // 禁用高精度子模块' u: x9 d7 A: C8 `  P! F8 D# L
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);/ |' L: `  K9 m% P) `! r. o

* X: @) m0 Z3 V8 g- |, X4 |/ g    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: }8 j  F. t# q# ]0 v3 r}
5 c' g  ^8 q5 L9 s: s8 f+ O# t3 ^4 O9 u# o6 ?
void ChopperWaveform(void)' ^1 V( @; z# C/ v! Q$ [& a
{: M. f3 e1 h/ E7 h& D7 c# p/ B
    // 50% 占空比# b% T4 t2 d9 p: u/ U' K: c5 q
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
  W, e, ^( x4 O    // 4 分频
% z! i! v+ @1 q# z    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 ?! |( {' q( R    // 单个脉冲宽度
0 L) S, V" H4 S+ l- I- z! E' Z    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
; T+ X. z6 B8 W    // 使能斩波子模块
, s  B1 p6 H  C5 s. ]    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);. a6 e2 j9 a1 r7 Z0 ]% G1 ~
}
6 ?# r1 t$ o0 [. c8 v$ Z, |% C% D8 y* p9 g6 {
/****************************************************************************/
; C9 ^% p7 l  _1 D+ v  N) A/*                                                                          */
0 ^$ H5 \* d, c' Q$ G/*              PWM 中断初始化                                              */* G5 g  S" x6 u
/*                                                                          */
1 f7 ~$ _  O& ?' e4 e) l% R2 F& n/****************************************************************************/
" m  L: u2 T8 {+ q$ o, Tvoid PWMInterruptInit(void)
% F, ]$ P: S" n{- p7 e9 w9 r, C, k: N, D
        // 注册中断服务函数
" z4 a3 f. B( n* m- N        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);- \- _) Z8 t- ], ^
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);- b3 h: J7 b7 t9 i

" ^2 g  P5 O) ^; X% x4 p        // 映射中断
2 v  n: W0 d5 x# C$ ^        IntChannelSet(SYS_INT_EHRPWM1, 2);
+ G; U% m7 t0 e* Q, V% Y        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);9 g( w8 V0 D+ r  n3 N

( u! i9 N, E) B  ^5 Y) |        // 使能中断/ k6 k' F( m: d/ ]* `3 `
        IntSystemEnable(SYS_INT_EHRPWM1);" h  c% H  h: X! u5 N
        IntSystemEnable(SYS_INT_EHRPWM1TZ);& h7 P! a8 @( E/ B5 X6 J, c' S& H/ x
}
( I8 i) C; Z2 g3 k% g2 q
$ T# r$ [4 k, g. O& P- W  }7 V) b/****************************************************************************/
6 T* W2 K5 D7 O* D5 f& h/*                                                                          */
/ M1 s/ N9 o3 d" h7 V/*              ARM 中断初始化                                              */
& J  ^, r& o! v' L/ `- V- F8 U% X* u/*                                                                          */
+ t! U* p+ P4 ~% j+ C3 V3 z2 v# T/****************************************************************************/
5 [" i0 u" [6 k( h6 x5 l! {void InterruptInit(void)+ x, S1 ?) Y" n3 a+ p" v4 {+ b
{
1 Z9 V, R0 A6 h0 z, p( B: S% ^        // 初始化 ARM 中断控制器
) z) ?+ A& f3 o9 f/ H( U2 a4 s- }        IntAINTCInit();
+ ?/ m9 }5 c( P; f5 Q- ~8 s# T, P6 W$ f- s0 p8 z7 V2 V
        // 使能 IRQ(CPSR)9 F9 T0 h, Z9 f. W+ _+ r6 S
        IntMasterIRQEnable();
. C' Z' C6 L. E2 u: l
, j) U: O& P5 k  y        // 使能中断(AINTC GER)$ Q& {' T+ Z1 O& |6 r( E
        IntGlobalEnable();, ~# g6 y5 P$ R0 [2 Y

' j! p2 _9 Z# {0 r        // 使能中断(AINTC HIER)
, U5 x  z( Q  r& I) l        IntIRQEnable();4 F; V' Z8 r/ Q6 |  v+ r* [% L
}
' a% ~) r. h6 p  l  c1 |6 e/ k- A, v4 }# `! K  L

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
" K  h# r8 E5 h. t4 w/*                                                                          */  R) E; N1 U' b4 N; Y" O0 `2 U
/*              中断服务函数                                                */" o6 ?  |# K" g6 _" h) w( F0 V
/*                                                                          */& H+ U9 D( g9 n6 S# s+ Z% A2 E- O8 c
/****************************************************************************/
+ Q: N1 }8 a/ K( j8 A* Avoid PWMEventIsr(void)( J$ H  p6 _+ ~: L  K) D. ]; h
{
5 C  y, q$ l: w  v3 R/ c5 D; ~        IntSystemStatusClear(SYS_INT_EHRPWM1);! K5 ~' b+ o: }2 N+ n+ H* }

6 `6 v  w' x" Z3 E& }4 C2 s    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);+ @# z/ T# [" {5 o
}
6 X7 }* s$ {. \) b) y: |) t5 a: O# D9 [' e' @
void PWMTZIsr(void)
7 E" v. }3 C5 \  e{
$ N( p$ h4 R; k  I% J" }        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);' R( H& i" f" q
3 P& o6 b+ H( e7 u- {3 I
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 j3 P' t) b1 `( u6 O
}
0 T2 }' T  u7 }. r2 [5 o5 H( n) h
/****************************************************************************/  ], K5 Y* U$ d7 p
/*                                                                          */9 [$ k$ }  N5 [0 [6 y
/*              初始化捕获模块                                              */, T- T$ C9 @, r# Z$ Q
/*                                                                          */
, C# H' t# @5 n" J7 Z/****************************************************************************/: `" T+ X5 }  q- r  l
void ECAPInit(void)4 L6 c9 ~9 ~, e# X0 @/ T- U
{
3 f( A& g# t) r! g        /*-----设置 ECCTL1-----*/3 H! G/ `# e+ W$ o8 N: b, h8 ]
        // 使能CAP寄存器装载
$ N3 U* \2 t/ ]8 N$ s/ |) Z        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 C, d4 K+ |: r- r. V* q        // 设置预分频值.
: f4 \5 v* r5 X6 x# ~  J        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
" H% }% j9 S  k, I# T        // 上升沿触发捕获事件1 u8 y. W8 G% a) l2 g4 i
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);, p; e5 E9 ~" O8 i; A
        // 输入捕获后重新装载计数器值.' W: v  w8 [- a5 T, |
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);/ J2 R2 U# m5 t
+ e/ ~* A1 I& f9 u$ _  J3 Z0 N
        /*-----设置 ECCTL2-----*/
, F8 [3 D  O( T' ]$ U        // 连续模式
& x! |4 |9 V1 Q% O' k  |        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- _7 `3 x8 v: U2 G        // ECAP计数器TSCTR持续计数  P/ d9 I4 \- Z' O
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' v( b& J$ Q3 [; V5 B! F
        // 禁用同步输出和同步输入
: D2 p$ ^( |3 a  L/ g0 x9 U' ?        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- a4 ]+ g% Y/ y3 }# f$ N  g* v        // 配置 ECAP 2 为 CAPTURE 模式8 @8 e& w, C+ d
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 N. s  {8 L0 l3 O: v% d( ^/ V" g6 t$ n' Z( o% X2 A
        // 使能中断* q% c+ B: \/ E( y
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 y( r+ @( I' y) U+ {}
, D1 H% C! C# v* d" d. M% [6 f3 E4 @* j3 E
/****************************************************************************/7 o! X# p& B9 w) v1 F4 J
/*                                                                          */
' D2 ?9 S9 E% J  J# i% y# W! C: x2 z3 {/*              取得捕获结果                                                */
2 q+ D5 ~* v% ]  B, z/*                                                                          */
% X- Y( M% f9 W- g+ ~/ z+ R5 [/****************************************************************************/& S: k9 d! O/ f# x- @  Z
unsigned int ECAPRead(void)2 U% l/ }2 J' G- i* w
{
5 J4 a- r* ?" E) C        unsigned int capvalue;
5 |7 k- `. Y- i$ s2 V0 [        unsigned long frequency;
4 k$ A$ P! g* j% l+ d, {) u+ T% {' R$ Z& \
        // Event1 中断标志
5 \; V( R+ r3 k9 i& ]# t2 v% A        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 p+ j  r7 K) r  x0 @: F        {
  o: {  E0 V1 @: Z: [7 [: Y4 k                // 取得捕获计数9 r2 O) s+ s2 _$ w: j! `+ A
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. q4 R- J& `0 y6 N6 W* [  p                capvalue = ECAPResult.cap1;
3 n1 ?' ?& s0 |. _& W1 {" @* i& P+ j! P+ h
                // CAPTRUE 模块 228M 时钟主频
; e4 l, u; n; a6 r; ]8 ]3 h                frequency  =  228000000/capvalue;
4 P! V: R1 T  M* ^1 B                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ k: H) a5 V$ n6 m' C% I( Q
" z9 e( a  J4 F. S: e2 @- R3 O                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);9 u8 w4 O& e. H7 x7 s5 k3 M
//                IntEventClear(SYS_INT_ECAP2);  P) Z$ W1 }3 J
        }
! d( K4 p" }2 l" a) P: k( l* U1 P        return frequency;" R- `' X+ q0 J6 w! K9 K* z
}
# v7 v9 y; p% A2 X+ a$ T
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。6 u& w* k; M2 a# 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