嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" r( I2 B r3 ~$ O- A
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
& ?0 S9 s) d, e J* b% H
/* */
2 `1 d1 M @0 w* x; d+ f6 w
/* 宏定义 */
& @- l2 ?: P( _4 \
/* */
: ~1 _6 p3 A1 g$ E% O: f$ F
/****************************************************************************/
# A4 k! k! O" y
// 软件断点
+ c" U5 v. \ q- e3 V, |( h
#define SW_BREAKPOINT asm(" SWBP 0 ");
+ u W' R: |+ z6 Q2 {
: M | _1 Z6 e7 S$ e
// 时钟分频
4 ^. ^4 P1 c* q1 l
#define CLOCK_DIV_VAL 228
1 \' l1 Y# r9 @7 t! N7 |! b
) p {! x2 y% v' [
/****************************************************************************/
* w0 c" ]4 e* J" Y \
/* */
$ d7 g9 n6 @9 r: B) p1 r2 m
/* 全局变量 */
, ~3 R8 d! R5 s- ?: R
/* */
6 Z" p" }0 c% g$ g" f* m( I& c
/****************************************************************************/
8 Y* Q4 D- W3 w% t. W0 m
ECAPCONTEXT ECAPResult;
: ~4 b3 Q. T5 _# p' @
9 b6 A/ k1 _5 H, B3 ^2 Q9 m5 \$ u
/****************************************************************************/
4 ?+ \, s& h1 ], }$ |9 q
/* */
- m7 O0 t0 q6 d; X6 A' K& b/ P
/* 函数声明 */
; S( T/ X* D4 Z1 \0 P9 p% F' w
/* */
* n0 ]- X' ~) _: g8 w* ~, s* R- x! H/ [
/****************************************************************************/
W( l4 a) V) K9 N M& ^! ^* ^
// 外设使能配置
s2 d! V/ R. ]# G
void PSCInit(void);
1 d- R+ `/ S9 b; B9 g6 k
' h2 d. |! B( b: l' ^) Q
// GPIO 管脚复用配置
8 i% `+ E9 b1 [. J
void GPIOBankPinMuxSet();
* Q; R8 U! y2 C0 \* P
/ y5 B4 g! _( ]' K
// 产生波形
1 a* \9 v; l. B1 l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 n. K4 E. _7 G) v+ Q
void ChopperWaveform(void);
; G+ v( S) @# o. E9 Y P4 {- ?: s
0 W. J' z4 v6 C, z0 E( f
// ECAP初始化和读函数
" j3 i4 D1 [3 l1 N- @
void ECAPInit(void);
/ I8 j8 m* o- P1 C8 ~
unsigned int ECAPRead(void);
. U# X3 L% r* F3 u
8 x, I6 ^* @0 r5 L4 |! U
//ARM 中断初始化
6 R$ v' H7 u( O& i
void InterruptInit(void);
& h) n2 H7 l4 P. C2 b2 F; v+ D3 S
& w* B. `, u6 I. B$ _+ J
// PWM 中断初始化
# d/ }& t5 o& X/ `% e, ~2 Y
void PWMInterruptInit(void);
1 H% A; g9 J. Z' m9 U, `) w& s
// 中断服务函数
- W: ^4 x# f: F% N$ g
// PWM 事件
$ o2 ~& a5 o$ W' L
void PWMEventIsr(void);
% d2 d w+ a. G& I% }
// PWM 错误控制事件
" Z4 }8 Z( z$ D2 |( h+ a( |: g: a! B
void PWMTZIsr(void);
" L, q1 c" U, P# w) ^7 z4 t
: M. s2 t( U, L' p8 U
/****************************************************************************/
9 _1 {: ?1 F/ ~" a- o2 u
/* */
7 v b8 t( I3 v! T% \
/* 主函数 */
! |) K* v' H, Q6 V' i3 f
/* */
9 P: P4 V9 }! B% a7 k7 N
/****************************************************************************/
4 ^& p$ _" ]$ l( b
int main(void)
% }% Z4 {4 x2 i, r) m6 n
{
. d3 Z; L3 x) }5 t h% f$ A- ^
// 外设使能配置
% ~- _. d, x& r: q7 Y
PSCInit();
5 i7 u6 c0 T% d! u: o4 s
6 r" i* G* W# o; z$ t$ t
// 初始化串口终端 使用串口2
+ P. p" N- u, Y" T4 ?8 v
UARTStdioInit();
. Z2 n; w& i, b
& S9 F! O/ H3 s: D% l3 O
// GPIO 管脚复用配置
; T4 i) K1 A& @1 t& O3 ^
GPIOBankPinMuxSet();
; ]7 h m9 x$ r! }- ]0 L' r% o
V/ v& M* n v) H, l& s8 s
// ARM 中断初始化
* }/ N, `' r' y2 J" a! {3 W$ k
InterruptInit();
/ t6 e2 e s* _! W0 I/ Q
+ D* x/ m! s3 Y J6 ?( _1 S
// PWM 中断初始化
" t5 Y9 S. v; @
PWMInterruptInit();
: M! ~ B- s$ X
2 ~1 o' N+ ]3 Q3 L7 R2 u* F6 r
unsigned char i;
) T; x. E) a9 E0 {- `8 {% c
unsigned int j;
2 p; ~& w, H" u# x* y2 U# O2 w2 i2 F8 y! F
0 T1 }" r* x+ }3 X4 g9 i3 E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; C' Y `: v8 o1 j" x
UARTPuts("------------------------------------------------------------\r\n", -1);
1 ?$ M; `) N; s! q
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
D: v8 F& I& M1 n5 D; t/ a
// 产生波形
# h9 E5 h; V, L- @
PWM1ABasic(25000,50);
1 n/ c( m( y3 L* v2 Z7 F7 J
7 l9 X: g; c& S+ m' g
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
* @2 Y5 [2 x' i5 o9 s! R: p
UARTPuts("------------------------------------------------------------\r\n", -1);
7 h* v; ?+ E: x; d) r! p8 {6 R3 q
, j- P5 X! R5 U8 }( |! K
# U" C' E/ s2 Q6 M! l! G0 F; o9 ?
8 ]8 U- |3 P0 Z- R/ ~9 ~
UARTPuts("------------------------------------------------------------\r\n", -1);
7 ~- O5 M3 t! Z: O+ ^1 q' y; u
UARTPuts(" C6748 ECAP Test\r\n", -1);
n, N! T G% C6 g- o& N$ t4 ?% v
// ECAP 捕获初始化
u7 m4 _- p9 s# S" |+ T/ H" t
ECAPInit();
; G' r5 Z8 P S1 C4 i1 U8 u
UARTPuts("Initialize ECAP.......\r\n",-1);
9 ?% }! m( O6 t: x) h l6 Y
for(i=0;i<5;i++)
! k: V" r3 h. @% O& T
{
# o1 q. f$ I6 c+ k8 H2 D# w/ E
for(j=0x00FFFFFF;j>0;j--); // 延时
1 v3 v4 i @4 G+ c" U, J
ECAPRead();
% |3 K. ^7 y- i8 n# @
}
8 `: G( o9 y8 z. U1 i( D
UARTPuts("\r\n",-1);
. {' `3 J2 |& b. N8 O' i! h
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
. x5 L" P8 v' b+ i7 S* {
UARTPuts("------------------------------------------------------------\r\n", -1);
J2 U, B, x$ C) q7 l; l8 r
, [: q% S+ y( ]3 ~ ^/ x
// 主循环
5 g" u. l2 Z3 Q# i) V
for(;;)
8 _+ X6 Z1 R; Q6 \
{
6 k v+ b6 f4 j8 C- n5 p$ A0 d0 f
; c+ p7 \0 w+ v( C3 w# S
}
& T' K" _' R1 P9 ~* w2 R$ o
}
8 j8 a Q" X7 s1 R% B! [+ Y
& x2 O0 W9 V8 U& C2 P& E0 M! q/ }
/****************************************************************************/
/ Q; E& w, ^2 l
/* */
2 p+ q, `) P: S( o
/* PSC 初始化 */
& A' g; o7 o6 Y8 o" j
/* */
6 W1 Z$ F# E# `& x( x ^. s
/****************************************************************************/
( F. H: V4 a+ R& w- p, p. F
void PSCInit(void)
8 S+ F' i; x2 ^1 n$ H% I- p. d
{
/ d/ G% r ~4 s7 y4 D
// 使能 EHRPWM 和 ECAP 模块
7 f: G# \* i8 ^7 E& f
// 对相应外设模块的使能也可以在 BootLoader 中完成
8 G5 K F/ i6 C9 a: |4 p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* }2 |1 ~( w; ~ T& t# A2 D
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, w, f w+ |3 s6 @5 C
}
8 @. m9 i6 p3 P$ C) d
6 F* n9 {( }. D8 \' i3 E
/****************************************************************************/
! }" V, h0 Q! o" G
/* */
. i; f0 g+ u, f
/* GPIO 管脚复用配置 */
9 V R# h7 \3 ]
/* */
+ }9 ^2 \) ]* S1 k: Y
/****************************************************************************/
) ^4 @8 s% }6 Q7 ^0 T+ \4 E0 r% g
void GPIOBankPinMuxSet(void)
- x2 D M: m! V$ ^+ h" N* K
{
0 u; @% m+ U* R9 i$ B8 S
EHRPWM1PinMuxSetup();
' ~5 J. @6 h _8 r
9 \" l. g. w3 v# L2 w7 A; ~
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
. y1 k1 {: q$ e# j4 c/ I* Y: _
// 作为捕获功能时管脚方向为输入
2 f+ O. Y# a1 ^; T
// 作为辅助脉宽调制时管脚方向为输出
3 Q+ h! s5 }' P" A) y2 b" X
// ECAP2 / APWM2
0 y$ \ A+ ^* p0 g: H
ECAPPinMuxSetup(2);
# F3 e' X' [/ a, v$ F1 ~
7 r4 G! Y7 q$ r
// ECAP2 / APWM2方向设置为输入
* L* j8 V+ l2 ` e+ }
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
$ d# @0 W* E% h" `9 v6 B
}
' A4 P5 [6 b# i& ~$ J
+ ~% e; ^# q% F9 z- R7 S
/****************************************************************************/
( K* n2 k7 b1 ?' G0 T/ |- g Q
/* */
6 a& v6 t" l2 \1 _$ i3 u
/* PWM 输出波形 */
- v# K5 y6 C7 o9 V
/* */
( N R' ~ C) P' C q
/****************************************************************************/
6 p/ c* x9 Z: y8 k/ T) l2 j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; \, u( E1 s& Z3 @( T$ D
{
1 X. T8 _7 I) R& \; ?' e/ r! C9 C' T
// 时间基准配置
% u0 V) o6 F: `9 T% X6 U% t' ^! g
// 时钟配置
" |2 S: X+ C6 n) g# g
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
$ g: }# Y- H0 C6 V) \: P, @
9 K) U; z6 O& x) B' ^& q
// 配置周期
2 c! {. F8 v+ Q1 A
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 j; K& }' B5 w( b
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ J" X, Z' b0 B
. C2 U! \) H% F5 d' F
// 禁用输入同步信号
9 r' v1 K4 i$ w$ }& g* v/ I
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: I6 E1 j: B1 |9 n6 l. h8 N
* _' y% q* \2 E& w
// 禁用输出同步信号
1 k0 Q9 l/ B, y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- Q8 }% H) F( u @3 P% g$ Y7 Q2 a
( U& H% ]& Q6 E. z2 t3 Z
// 仿真(DEBUG)模式行为配置
4 _7 X# W. m' v2 Q9 \7 T9 ^
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 G" B8 }0 }; J; M* O+ a5 e
: j3 p, {& _7 A q
// 配置计数比较器子模块
. |* n( f2 t. c0 E
// 加载比较器 A 值
' D/ A) W$ a$ K/ Z0 c$ ?
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' M1 ]4 }- c; }. V" y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! l* y l ]2 V/ R# B
- v* k( @' D# g- z% t
// 加载比较器 B 值
# \! e! r7 Y! D' T# [/ ?# H7 D
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 Q( e& J* ] c; w+ ~
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 L3 H! Q2 A; i9 {/ e) g
. e! E9 _1 T4 ?- e6 J5 N
// 功能限定配置(输出引脚触发方式设定)
/ @* C1 [; N% E$ G# N1 q3 W. v6 @
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' j, o% n7 g7 k
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. g8 B4 a9 x! u0 Q+ w8 D/ r
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" K/ e1 P! }( B+ z2 b+ A2 q5 |
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 T6 X, a' A. f% T
2 s$ w: ]" c8 l! r% ~' {
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
% P8 k- O/ i! k B2 ~$ W
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
& ~! T9 T. T6 K% j
/ z% ]5 a- G/ q5 u
// 禁用斩波子模块
2 b" C% v' I; u/ |
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, y' g% o3 P% _, g; n* Y
* E/ k) l$ L3 }# r
// 禁用错误控制事件
- o$ ]2 u/ M$ j3 U* F, p
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 t; ~ {. }4 s: r1 ]
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
" _1 L- `/ X9 T2 Z
; W) Q- w' o8 k0 O* O
// 事件触发配置
! ~% [6 c) E$ k6 H1 ^9 E3 ]
// 每三次事件发生产生中断
+ i4 h- K6 n& ~2 E( b% o( o
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 X6 V3 w' X8 j. F
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) t1 Q2 r; y# X4 @; Q
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. }, @9 J4 C! X2 C
// 使能中断
' a/ C( Y' u$ R8 i- p, R
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) h5 j2 m8 F3 a5 {/ C
- m$ z# K+ D) g3 Q! N6 a
// 禁用高精度子模块
' y) Q7 L& n/ k9 i) U0 v9 W# ?
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
: _$ `# ~' w' g3 N) D
# t0 r5 f9 L f6 I
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" O; w6 h0 W+ t) G
}
: M) j* C) f3 z+ T3 h3 l
x6 f! o. J3 w% |! K" S
void ChopperWaveform(void)
- D+ N% C) A3 g7 }+ F9 {
{
) |8 `* E R- D( a: C1 r# p* Q
// 50% 占空比
( K5 c* W! \3 }* N! j( M9 ?& i
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* B2 ~: x0 H* l+ l) u
// 4 分频
& m. f) x0 d2 _# h2 H
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 W$ H' Z ~4 k- [1 e
// 单个脉冲宽度
m( [5 c2 Z. N* l% c' a) t1 t
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, O2 J! [- M/ ?4 Y7 j! T4 ?
// 使能斩波子模块
8 A" s8 Z/ O+ R0 y3 Z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 F: c [! ~9 v1 F$ z# u0 V
}
% y9 j( _% }$ D6 \8 A
" c$ N& }- d( X
/****************************************************************************/
8 t8 q6 b# y i# p8 q
/* */
! K! y; {" z& w! U! x- Y7 _0 D
/* PWM 中断初始化 */
r$ u/ S! U3 v! f$ G; |
/* */
- C& G& G6 m6 \$ \5 {7 W [
/****************************************************************************/
# q- E! f0 O( _0 m2 k( [4 l5 t5 Q$ N
void PWMInterruptInit(void)
* K3 R, I( U, C" h; ~) d! _5 d7 c/ [
{
`5 k5 b' i& }( s! N
// 注册中断服务函数
' m, s2 r4 R, x5 Q
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
/ K6 R! D0 a. g& V% h
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. u/ V8 }/ Q' n3 D
/ D9 |( r" ~% T* `6 q
// 映射中断
! Z' |* f; L3 [
IntChannelSet(SYS_INT_EHRPWM1, 2);
$ h+ \- g) M7 o
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ F/ e" ^! g r+ o1 U* Z
* Z, t, ]. b" C, M
// 使能中断
1 ^+ H& v) I7 Q0 ?! d
IntSystemEnable(SYS_INT_EHRPWM1);
) M0 m3 e" R4 {7 m
IntSystemEnable(SYS_INT_EHRPWM1TZ);
% S4 ?1 S. t6 j3 D- R
}
9 d$ V6 Y$ D( J: I2 j2 R& e
1 }! O, y7 Q& ~' J
/****************************************************************************/
, {' p8 }- r" h! U R
/* */
) Q$ z! t9 p9 [6 L% l3 O
/* ARM 中断初始化 */
2 P5 j7 y2 ~$ Z2 @; Z
/* */
8 F: k9 E! P3 d5 ]% `1 G" O2 ]
/****************************************************************************/
7 E# Z: X# T1 V( r- |2 ]5 T. l
void InterruptInit(void)
- F& V9 E8 b' c
{
' y X: x5 F5 t. r6 Q, v
// 初始化 ARM 中断控制器
' a# w4 `/ \& X& D2 |
IntAINTCInit();
. S% r1 f G7 D) t$ D
% d9 c0 |9 g; N8 ?* u" K% c
// 使能 IRQ(CPSR)
" e) E# V% d4 h4 y7 h+ i
IntMasterIRQEnable();
! Y# C7 \8 {+ C# a: V/ c. A
$ G- f: b9 R P3 _' E* l* X
// 使能中断(AINTC GER)
+ n6 r8 j9 N* R0 M4 q
IntGlobalEnable();
, k$ r' ^" N3 ?& K% `
* f2 `& T7 C6 J& x
// 使能中断(AINTC HIER)
8 w6 v- h% ~( p& C2 p, W( V
IntIRQEnable();
/ p, G+ x& V8 ~9 r( |
}
: p- k5 z' Y) W- T6 Q# t- P u
; q3 l! ~/ z8 x" J e: x
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
; V: d3 K# |( h I
/* */
, Y* }* A/ q2 K( K7 y0 r6 J) N" V4 p
/* 中断服务函数 */
& Z0 Y9 d$ ]! d! [% |
/* */
& z5 }( S+ x9 f; D) U; I" q
/****************************************************************************/
/ w9 _/ w1 ^! \, a
void PWMEventIsr(void)
% L$ r0 r* K' G$ d( U8 |2 i
{
* t/ }+ N% W, {% `$ A: \9 z
IntSystemStatusClear(SYS_INT_EHRPWM1);
3 k' s- @; H3 g& `/ g" G) R8 X! s7 A
) u- d) R, V" }: p1 e
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' P. Z! A2 K, s8 `6 T
}
& f8 u1 u. W0 O- s' p1 M$ t2 l
7 O; r- g" \: C' C4 Q& h, i) n
void PWMTZIsr(void)
, j( p" G: N4 U% h* U. {* l
{
2 e1 L1 H- d& v; o8 N; j7 K+ J
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
8 o: v' {$ b! v; X
0 E7 K0 G( W" z, x* }/ R
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- ]: ]0 Q6 b7 @7 ^" P5 P4 _& K1 ^
}
( f7 S9 Z) c3 F
z4 j3 k, Y* R/ R
/****************************************************************************/
1 s* B' R' ^9 \9 t6 g9 N( l$ v
/* */
; }. h. Y" ]( z* [8 Q! A& H
/* 初始化捕获模块 */
1 S2 g8 r8 _& i( t+ Y- `2 O. X" w4 o
/* */
; Z" d+ y; S1 M) `- k9 K
/****************************************************************************/
: l+ Q/ v7 F. y
void ECAPInit(void)
( u* I* [3 \* }# _
{
, |% k0 w6 `8 C
/*-----设置 ECCTL1-----*/
8 p, x, e n4 W* |9 O+ f& m
// 使能CAP寄存器装载
- A! \- n3 S- [7 J# M2 E
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
) R' A5 u; {/ J6 t5 @9 @% X! A7 p
// 设置预分频值.
1 K' u! K# l0 N
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
4 w! B) u$ ^ X/ V; S! V
// 上升沿触发捕获事件
* X/ R3 X4 z5 b1 T" a
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. K/ S, j: O$ B5 S5 x/ s( J; Q
// 输入捕获后重新装载计数器值.
3 c$ I! K: [0 ]/ x, j& k
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ t8 o& Q0 s1 t5 ~7 J0 ]) |
) w* s' v& u* q! R& }% S2 C
/*-----设置 ECCTL2-----*/
2 h n& }; x% R( v
// 连续模式
; v& M! C8 ~2 ~, L
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ x- |+ p! _4 t# H
// ECAP计数器TSCTR持续计数
' o7 q7 _. `$ M8 r! ]7 @: n9 b9 |
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
% c1 e. w1 \0 D3 ~. ^3 i
// 禁用同步输出和同步输入
; J' t: ~. M( x8 }. \5 |
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- ^( ^4 `& r+ D G
// 配置 ECAP 2 为 CAPTURE 模式
( W& m' F" ~7 q6 A+ [3 Z; D0 O; C- B
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 U) [' P z& s5 A x8 I0 l5 Z
4 s2 X2 H, z; w; {. n9 U
// 使能中断
( M/ W n) f. E0 K4 L
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
8 X) k4 ?6 u+ V
}
2 q- O& G& I, o1 h, G% W
8 ?- u, p* X1 B
/****************************************************************************/
7 _4 n5 i2 C$ G% }
/* */
$ g+ R, H3 q: |$ t3 z9 N
/* 取得捕获结果 */
# w4 Y8 K+ \$ F0 p) f) ~
/* */
. v! J5 U- o7 n7 D: b0 W$ T- X
/****************************************************************************/
, ^) [1 O) t8 Q
unsigned int ECAPRead(void)
5 X8 [- m2 |* X" E7 V
{
5 y) ?. C+ D' V, X- @- r0 r
unsigned int capvalue;
! o# T _8 y4 O& Z
unsigned long frequency;
3 e+ g' e8 j5 X- Z6 O! P: E( T
" U. w) D5 l" E1 h! h. A
// Event1 中断标志
, S; H& y1 W! `; ]8 v! B
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
# B _9 }! Y; I, U7 R Y
{
' {2 g4 a0 n- o4 _& [
// 取得捕获计数
2 _4 t+ B3 P! V' Y
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 V U+ X& a) c8 y a9 S2 v
capvalue = ECAPResult.cap1;
* B9 R6 e' O$ X/ R/ V
, V8 J j. A) C) N# P
// CAPTRUE 模块 228M 时钟主频
3 D" I" X( x* w. ]0 u* m) n6 G
frequency = 228000000/capvalue;
5 z$ l g0 Y) I
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
9 x' }2 [4 q3 y5 o4 C- }: M
1 E" s% A" \9 H. p4 M! _
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% T5 Q. W2 e) F4 M8 L
// IntEventClear(SYS_INT_ECAP2);
+ t% \- _+ t* A" i: n' ]" ?9 b
}
3 h6 U1 f: e5 S7 d* K
return frequency;
% K7 r, \. U+ z
}
I" o4 a! \( U* a
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 Q) _$ k: w; o" [' o
[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