嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 T6 Q( k5 g; b. q
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
8 m0 ~4 L+ S* ] y
/* */
( B/ `9 g- }& Z
/* 宏定义 */
; A5 J- `/ v( A& }+ c/ M
/* */
8 u7 j% `* S9 P: e, F( o
/****************************************************************************/
3 X- G8 d8 Y& r/ r
// 软件断点
7 M2 b( |/ k4 C9 ~
#define SW_BREAKPOINT asm(" SWBP 0 ");
: z$ |& h J- _( ]; o
! H8 M- V& w1 O8 ]4 n a
// 时钟分频
( _! C$ e! P/ [2 x, x. l
#define CLOCK_DIV_VAL 228
/ N" G4 k: w! [' P5 z/ D
) ^9 \6 B* z5 h; H$ ~% M/ ]
/****************************************************************************/
" X8 s3 \ R" a% \: z/ G
/* */
6 a0 e9 B. N3 y7 k. D) Y
/* 全局变量 */
+ U B0 ?1 a' T3 b" o
/* */
2 @# l P. H4 f1 L7 |8 ^
/****************************************************************************/
; g2 O7 M$ U% ?/ A# }- z1 D+ K
ECAPCONTEXT ECAPResult;
8 K! e8 w, S; n' o! S! N
$ q, t6 ~" A" L1 F4 v h# A( b* \
/****************************************************************************/
% D' H7 P( V( ?* d. V
/* */
: K; e4 b$ \! m/ A
/* 函数声明 */
$ ^& v. I" o. } e
/* */
. X) y2 B6 V/ z1 w# y* I4 d; x
/****************************************************************************/
$ I3 Y9 ?* x) n, S: Z3 n- f3 B* e
// 外设使能配置
0 f6 _; q8 k: j9 t' Y2 r
void PSCInit(void);
* M' r5 ]9 E# y3 N! @: h) u' X x
9 h+ Q s/ E# p- q$ R4 d7 d9 i) L
// GPIO 管脚复用配置
" E6 @( r, i B8 {" g# O
void GPIOBankPinMuxSet();
) U. H6 g# a1 g, T3 D" ^
3 O0 I# X3 r% p4 ?/ a' ^. Y4 g
// 产生波形
8 r: p1 _# x5 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
) D7 p- r" L& n3 Y: y
void ChopperWaveform(void);
/ s4 I& B* t$ w2 l8 J
: J9 T. ~% d; ^/ j7 W( }
// ECAP初始化和读函数
5 I% l, L; @: I
void ECAPInit(void);
$ d3 _6 y' @) n% ]) o8 R% C+ o
unsigned int ECAPRead(void);
8 j8 n: L# K6 r; J$ s0 ?
b" @: ]$ s: W4 B5 \
//ARM 中断初始化
0 s7 s5 z4 n* U1 T9 q" N4 t( k3 B
void InterruptInit(void);
2 A, ]1 W- Q" g+ z
8 A* }, c3 ]' S5 G- f: ?
// PWM 中断初始化
7 Q3 t! ?- y* R: ]4 V8 V0 V
void PWMInterruptInit(void);
. ]2 Q: P7 L9 t: E! e- {
// 中断服务函数
! O H' J" i8 z. a: A& e' y
// PWM 事件
5 S* E7 p1 E( m7 x" I, h
void PWMEventIsr(void);
0 ^( b$ m# u5 @) z* A& Q% S# y
// PWM 错误控制事件
$ ?4 T( ^2 ]0 P `! h
void PWMTZIsr(void);
/ Y) o$ a# ^8 f- X1 i
, Q4 o0 F7 n4 ]4 b. ~
/****************************************************************************/
8 J2 r% C% D* S# D3 d& p9 G& F
/* */
+ B! |& z" Q' d* Y! V2 U0 W
/* 主函数 */
3 P1 ~. x* R, Q3 H" }
/* */
6 w* I0 g' i# n2 z" ~
/****************************************************************************/
) y' f- | u' ]; [$ l& U3 h
int main(void)
- P, M; ^' E9 X. g" z4 L! k$ w
{
" z& V7 y ]( i! D, l3 ]% a; A, H
// 外设使能配置
7 Y4 d: H. t7 a! t8 y
PSCInit();
% n+ p9 J- J1 @ j, N
1 A, p5 a3 s" h8 p
// 初始化串口终端 使用串口2
4 H( @, e+ p( Y: l& V- N/ ?: q1 C
UARTStdioInit();
; \2 c+ A) ^4 f; P8 D
+ C% ~! K' I8 M( D! }9 ^0 _0 g
// GPIO 管脚复用配置
. p* [2 F7 X! X7 h+ N
GPIOBankPinMuxSet();
. s9 v8 G9 t1 m
5 A4 C* \/ J6 ]3 |, W
// ARM 中断初始化
% @# X" _% N: F: C4 X$ @
InterruptInit();
. s2 _ c' {" M" D0 v, K
4 u; F8 X) S% e
// PWM 中断初始化
! e- W _3 D6 z% u Y
PWMInterruptInit();
( u. ?5 J6 z+ x7 _8 F" Z( c4 `
. H" I7 M. W" d6 p
unsigned char i;
# }9 T4 R) C9 L' T( f8 f4 z
unsigned int j;
9 ^: L; y8 a! x. G% Q, A
7 T! w2 w6 ^4 v9 A9 u4 ?
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 O' k; M" P7 J0 R$ h6 {( i
UARTPuts("------------------------------------------------------------\r\n", -1);
$ P( v9 \* [7 F5 D- Y7 d8 Y
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ f3 y5 g: v( ?& |' h
// 产生波形
" r1 z- B1 ]$ ]5 p# H
PWM1ABasic(25000,50);
9 Z# B% i& b8 p# w; E' I
" n' \% k# e) i
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
! t" ?5 D# _1 q' V& a
UARTPuts("------------------------------------------------------------\r\n", -1);
9 H' g2 ^4 a2 V% w: [ @# w: s' H
6 T) Q3 P% [/ S; r% O P* i4 t: S
$ @9 k+ }! R& b! M; P
7 d0 l1 k2 e7 A
UARTPuts("------------------------------------------------------------\r\n", -1);
) F9 A* r& F' u7 b5 v7 d
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 j$ }. |. t. b9 ^" p! U3 g1 d2 h, N
// ECAP 捕获初始化
8 \0 H5 E' Y* H0 X' Q# y
ECAPInit();
- H# q" V0 u1 I1 b8 d5 a( n
UARTPuts("Initialize ECAP.......\r\n",-1);
8 v& N+ ], y1 `% z
for(i=0;i<5;i++)
$ J8 [8 \# k( D: Y; o( b
{
: x" _% w! m4 _# c6 W: v: d" V
for(j=0x00FFFFFF;j>0;j--); // 延时
9 k! h2 J5 y* x' Q' g, M& W9 h
ECAPRead();
/ \3 L1 u: h! X1 ~' ]+ n2 E, \
}
* I9 w' e* P, |' Q) ^8 E$ _
UARTPuts("\r\n",-1);
# M9 ]$ H0 x0 F: p) R( s
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' I7 d& i, e2 h) U% i
UARTPuts("------------------------------------------------------------\r\n", -1);
6 A2 n; s" f: Y% X
/ N! `, C# h$ U! Z. @
// 主循环
3 y+ G& N# j3 {& m# Y7 [8 i
for(;;)
( d7 [( `6 y# @6 }! ]5 v
{
_9 j i# i- F; t+ R
# p f* G, r! [8 l- J% q
}
: J7 N2 L3 }9 w' w# O2 R* q) T L& }
}
% \- x' G, f. k1 {- ?. d
% @- D1 l+ @9 C8 N
/****************************************************************************/
2 z0 j* ~3 R$ q+ [
/* */
% t3 s7 x; U# i2 S: W9 |2 S
/* PSC 初始化 */
, F$ H/ U" x2 Q" M4 Y' @6 \
/* */
' M8 _9 k! m# x3 B( x
/****************************************************************************/
! C0 ^8 C2 W8 I% c5 c& ?) @
void PSCInit(void)
4 t! l7 H( a8 a9 ?/ `3 w4 f6 X
{
) d0 @" H8 A: J: b
// 使能 EHRPWM 和 ECAP 模块
, n ^3 s. n6 I, ?! z& {/ I
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 D' d& t' m; P! D
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 }0 A/ Q8 H! a4 B0 P3 h7 {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 l% V. N5 b4 R) p8 {! y% R" U i
}
& f' n5 T1 ?& _/ X
2 j8 H4 |. T4 M N8 \$ q* b
/****************************************************************************/
0 I5 m; }0 q, k! E7 \' d. U
/* */
+ r$ P' `6 z7 w) B7 p, A L
/* GPIO 管脚复用配置 */
* x3 m; c* Y* H5 {
/* */
) ?9 }! l+ E3 B- ]+ {
/****************************************************************************/
8 c1 C! X3 v! H& ~- P6 A
void GPIOBankPinMuxSet(void)
4 I8 L! M! C& B+ L
{
' A/ I$ I9 u( l+ g2 q3 ?
EHRPWM1PinMuxSetup();
- \3 G# W. i U
' V2 _% b" B3 O3 r- L7 R
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# _1 {% U6 n% _3 y3 ^1 j
// 作为捕获功能时管脚方向为输入
8 _$ h' H, W# L" I0 r N% I
// 作为辅助脉宽调制时管脚方向为输出
7 }$ n" j; r4 W2 M: }
// ECAP2 / APWM2
; d8 s9 a, x; L1 D! o4 O
ECAPPinMuxSetup(2);
: p* z( o6 i; t- N
8 N6 F Y! T p, [
// ECAP2 / APWM2方向设置为输入
+ z6 d( h, i+ E' F7 n/ x
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
+ I+ A" i6 j. I0 E2 G0 F2 B
}
, `+ c! u2 m* t, _) ?7 y5 b; U
9 ?* v4 j& Q+ f- ]" J1 j' m0 m
/****************************************************************************/
7 g9 R0 m( C/ X. ~. G; E
/* */
) Q/ `8 Z" S: N8 p3 E, n
/* PWM 输出波形 */
% E+ e! J2 K; Q) B9 E
/* */
+ p/ v8 o6 [! l" Q$ Q9 X x# u; \
/****************************************************************************/
% S M7 G- u G- d; t. Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
8 k7 x- P" x" v( N
{
7 i* q ^) a. ]- d
// 时间基准配置
8 ?4 a+ @/ D& U, o
// 时钟配置
+ n% {0 ]7 T9 }3 [
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ^3 s: E& p; |4 }
6 [# s) \, t8 D7 N4 g
// 配置周期
/ `% C7 ~7 {9 ?0 L
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* I1 a/ ?+ \% k8 G+ y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
8 |9 J/ Q- m8 p( c3 Q
& H' P- l. F s2 n- j/ b6 z& X4 v
// 禁用输入同步信号
/ h! x7 y* V. E5 Z
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
0 b4 M$ w& a. E3 i2 R5 ^
8 u$ I! P2 r2 f& Y# w0 c
// 禁用输出同步信号
4 q5 O# q: k2 K( f0 c8 @" K4 x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
: f; T% A% G4 H( l- _" P
8 Q( t1 w4 d+ a5 W/ `" x
// 仿真(DEBUG)模式行为配置
% g, M3 p: v& c9 U7 O' j# g
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
& [, Q# J0 A4 l @- F: |8 `
. T7 D' z" l" s) Y4 d) N; u3 h
// 配置计数比较器子模块
! K6 q5 T* p" Q, i# { g
// 加载比较器 A 值
, k, q% k3 w: \& }9 Y3 z1 p, P
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' m" O3 V! o$ Y( m+ S* A
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 j% c7 q' Z% U9 P
( i0 Y+ n9 C% @6 H/ a6 S0 G
// 加载比较器 B 值
* e; F' x! ~0 [7 q/ k# G4 Q: ~! j
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
- d$ F1 `' t" i# A7 v5 }& s, d L
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 z, y0 f0 m E5 x' w$ U8 A
$ w8 ~( s* a' H0 K& w
// 功能限定配置(输出引脚触发方式设定)
) {$ d2 v- g+ t: t2 D6 Y& v7 }* e
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
6 ]/ g0 k/ b; D8 j9 I. Z5 Q8 g
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. z- l) i/ N0 c' _$ N1 _8 V1 v
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
, q7 i9 x6 D- c" f: Z4 d% J# Q! U- k
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ M( @, a4 T4 _5 J+ [0 u1 M [8 u
9 t9 m6 z% O) i- l" P, v
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
) v3 @# i3 F* t3 I3 r# Q& O4 }- `" t0 t! g
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 m" h ?; f N, u: H0 q: z
% d+ F* w q/ b: L# Y1 n
// 禁用斩波子模块
% t0 D. \% O7 }2 I( q4 v* t6 [( p
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 F+ w5 I% r3 e: T, v2 a
& z" ~0 d0 Y% E+ K, [2 g
// 禁用错误控制事件
: C7 R% l) q4 P6 r0 f0 m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' ]7 q9 I, S8 ?# a3 u# }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 Y& I' u3 v( p( I! N& A( p. U
' V* w: ]! ]) L: ]' d _+ }* a
// 事件触发配置
" i* Y9 P- R$ q4 Y; d
// 每三次事件发生产生中断
5 b4 W' `! D- K7 v) z/ j/ @" s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
5 k5 M' m0 q5 y# W
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% k/ j6 ?. T, [! i) L! g( k
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ ^6 y; U6 I. n; B3 e
// 使能中断
, H- J( t" w" b1 m: @
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! m5 v5 A; J. d2 M4 e7 ]
9 B6 Z2 y$ n- `# ~# j9 S5 p
// 禁用高精度子模块
3 s! [3 C2 t3 u' v$ p y U
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
: w& W2 N% e; y# m0 w
4 y3 e5 B1 N& b, i' G9 m
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 z1 n5 o& T* X
}
9 C+ n( ~: v6 R9 a% S& @+ B5 `
5 x0 M& Y8 [" w6 h" C( X$ w
void ChopperWaveform(void)
4 ^, y' O' w4 L* R
{
0 }# E8 m4 H1 U5 f
// 50% 占空比
4 G ]! }4 S8 l4 u! P; u" w {8 K
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 E( O. Q' T4 [/ }4 ^0 F
// 4 分频
" `$ W K& l9 ^! W
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& y) M: g! d* I9 M/ U+ f# z
// 单个脉冲宽度
5 Z- Z' L0 i, _- f% S$ M4 {7 y: p
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# f7 x1 e( V; z& R1 s- \7 Q
// 使能斩波子模块
' h0 P' e* \ X
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! y5 f; t( @4 _0 X S, M
}
/ X5 \3 C7 e6 I# h# P+ ]
" S4 x" R+ p, E O9 x
/****************************************************************************/
( E3 ?0 S. v( V+ g# w
/* */
" u: E( ]! G$ Z) N
/* PWM 中断初始化 */
1 }2 K Z; Z5 p
/* */
3 Y& h' x! d, y, f& ^/ j% n
/****************************************************************************/
, R& y# Z+ T1 n u6 t
void PWMInterruptInit(void)
" P. B2 t4 p, P. R% a8 d7 b) K4 G
{
2 u, a. A) Q) J# d$ E: q( U# `% l
// 注册中断服务函数
+ @) v$ q; x, }4 s
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
$ l, H D& l( H3 d; K% G4 P
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
! }1 D: K- h" n2 D9 B7 H ^
1 Q* S V$ D H. \' n( o' G6 I
// 映射中断
* t9 e: m. l8 q- {
IntChannelSet(SYS_INT_EHRPWM1, 2);
+ y; C7 n1 {3 k3 B2 A
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 U E" a; C8 {0 y& ~
4 o4 H3 G$ [; L; C9 T
// 使能中断
0 ^1 Q- i {( N h, f; A9 t* Q2 E
IntSystemEnable(SYS_INT_EHRPWM1);
~1 w3 \) j& G, R8 z
IntSystemEnable(SYS_INT_EHRPWM1TZ);
) ~. ~% c% L. R
}
* H0 W' k; q7 I# I0 M, o2 w
' w8 t0 s/ a7 Z6 g. q( S0 S
/****************************************************************************/
7 j' C; l+ g( ?- \: T8 B
/* */
7 h* b5 I# D4 e7 f' a* X: m- E
/* ARM 中断初始化 */
: d3 E' b# U# ]
/* */
: ^9 b) Z3 D! M2 `6 q n5 m
/****************************************************************************/
% U8 E2 s0 d. V5 s4 U9 I! i. w
void InterruptInit(void)
' L8 l& h) G% p8 n, D6 S5 m, R6 p
{
, B1 {% `0 `# M' l( M
// 初始化 ARM 中断控制器
* g3 g6 _% `4 H8 R- C9 e
IntAINTCInit();
9 n5 |" I/ z8 f; B, k
2 r' ]0 X! P8 w' d$ s; L4 R
// 使能 IRQ(CPSR)
3 v% [1 J: w/ I6 |4 e) I4 o
IntMasterIRQEnable();
8 F* O( Y3 q7 D! f0 g: m9 ]; i( B$ N. U
" e, L. K7 s) C$ q
// 使能中断(AINTC GER)
$ y% l; M8 t1 U! ~7 d: i0 A @
IntGlobalEnable();
7 N' @1 U; v- l8 |: o
+ _! P& s* |* y, ^
// 使能中断(AINTC HIER)
6 C- ~/ b0 t0 _" u2 I# }! \3 n
IntIRQEnable();
5 f& D F5 H; R6 k7 A
}
& u, B8 r$ T" v* i" n
$ g' Z$ X) C) u/ _2 L
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& m& ~* @; B! \" t
/* */
. b% z9 Y6 O+ e- f4 {& X# P
/* 中断服务函数 */
6 @- z8 z! F4 k( E8 e
/* */
, R R; a' s" E v3 D; W
/****************************************************************************/
% J$ M3 }/ G* h$ ]8 [
void PWMEventIsr(void)
( _- Q: X. r! t M2 I
{
2 E8 `; J2 a0 i
IntSystemStatusClear(SYS_INT_EHRPWM1);
( `/ d$ S0 R6 \: b4 i& Y0 e
2 |0 {1 P2 E0 S5 b. P1 ~+ ?; }
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" R. ?% x/ v( R% T& n2 C
}
! I) m7 w# v. ?
# F! J9 O+ z/ a8 Y6 `. Q
void PWMTZIsr(void)
4 F$ v; p1 O7 V& e
{
/ ?7 n W* w; J0 @4 G- z
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 K) I. s! |' w0 Y8 [1 R. @
# x" s- u' C% `
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! E8 O+ _% n3 a- _6 H( b* ?
}
; L, G' S3 ?# s7 \, ~) b# h+ ?2 p
+ X [* L) ^% h. [- I8 R+ D
/****************************************************************************/
9 L# X5 A) V8 C8 @/ e
/* */
( C! C+ y" ]+ p' V) h4 e9 a
/* 初始化捕获模块 */
/ B4 A- _% D6 W
/* */
& t2 z9 ~$ J) N6 O/ {
/****************************************************************************/
$ \. f& r. u7 F: S' U
void ECAPInit(void)
- p$ T* }& u' O0 a
{
$ L, ^6 ~1 `9 Y. Q, H/ z
/*-----设置 ECCTL1-----*/
6 R* C& P) j9 ?- l4 ^' |0 w" B
// 使能CAP寄存器装载
3 b' N- b* D+ W, {
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
T& Q) r4 v# W) P, R
// 设置预分频值.
1 v+ R* r. G9 c% C
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
d; M; [% u2 n/ e( w4 A
// 上升沿触发捕获事件
& _* `# X; b6 R% L; `9 u/ B6 U7 H
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 D. d# U7 b% F( I
// 输入捕获后重新装载计数器值.
! u' T4 W4 Q/ [( p3 @8 j4 e
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- o+ C2 |2 Y6 I2 w- x
8 ]' C( K9 s) G9 H
/*-----设置 ECCTL2-----*/
: m q7 N2 S9 }5 p/ F, d* `
// 连续模式
# ]( w1 Z) G1 o: V$ I" k
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
! F" `+ i/ C% {3 J+ d4 h
// ECAP计数器TSCTR持续计数
5 |6 C/ F7 N0 W$ g
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
- n' i0 O: A& l( i
// 禁用同步输出和同步输入
4 E1 |* l2 I6 n) c8 _
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( @4 t! C7 E# ]5 j
// 配置 ECAP 2 为 CAPTURE 模式
) X. K% n: o* n7 N
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 s1 z+ X# Q9 ]7 ?$ ?. l5 z2 z
8 b4 n; }( h \3 x3 L& ?6 f
// 使能中断
& H5 R+ o$ o; Y* w0 m3 Z. ?
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
' y) a* f+ h5 w' k8 s
}
+ z2 O- l" l9 \! C3 q
- A* V1 }1 x1 w
/****************************************************************************/
# z& P8 z4 Z) n S1 N
/* */
m) ~0 R3 j" g% }
/* 取得捕获结果 */
^* Q8 d; W6 f$ U$ D' z9 L
/* */
- E: ^ M6 T# P, n7 s5 |. K
/****************************************************************************/
4 }0 i r& g' a' z& B/ d4 Z0 f
unsigned int ECAPRead(void)
% T; L8 K) H3 J1 e9 {. p
{
9 \ O# W! ]4 \$ s. E/ x# u, ]0 _1 D R
unsigned int capvalue;
. i/ ~+ }, h T- H- u9 ^
unsigned long frequency;
# i+ r5 p \* q. ]: |' N$ _
L; u$ E( r& K/ R
// Event1 中断标志
% P, G" d" }2 I4 i7 J: B7 O6 w
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
$ l8 p) R9 |0 ~; F, b1 O6 i
{
% ]: J, @4 T0 Z3 i+ _9 t
// 取得捕获计数
, q3 M8 Q5 @ y& n G R; E
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 Z" b) Y9 M$ O4 ^, @, ]
capvalue = ECAPResult.cap1;
1 y2 ?% p* [. x/ c
4 L6 g! V5 d) z6 ~& Q( i# K1 \* n
// CAPTRUE 模块 228M 时钟主频
' W5 U" K! J9 J, U0 b5 Z
frequency = 228000000/capvalue;
, w# J8 Z2 g1 }/ m( I f; z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; i( x2 X. S4 T0 R# }
4 }. U8 I8 m2 M! H4 p
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
7 G& F/ ?! _ E8 Q$ W7 e3 S+ j+ m
// IntEventClear(SYS_INT_ECAP2);
0 a; ?* }7 _1 p4 F/ Z# a
}
/ d: W- \1 ~7 @) a( R e
return frequency;
8 e: i( h8 x( n
}
, u! S9 e8 d1 _+ x
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 t: S8 ^! b& E
[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