嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
, i6 F* I7 d% V' |/ [( }9 `' i
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
V; K4 R7 ]3 J, t
/* */
. h9 M, i* k* T6 D) S* J0 e
/* 宏定义 */
h. z- b1 s: P. }& ^0 E
/* */
b# B G* B* ^
/****************************************************************************/
: S# V6 a ]. g. ?7 b" s9 ^
// 软件断点
2 g3 ^5 W% H" [: p
#define SW_BREAKPOINT asm(" SWBP 0 ");
' K! Y* |/ m$ {# ] {
" ^ n0 D2 M1 a, S" q( M2 H2 h( F) Q
// 时钟分频
' J$ Y: b. K2 \2 x% g7 E
#define CLOCK_DIV_VAL 228
5 f8 S$ V w e8 p7 J* r1 y
8 ?3 a @( q3 a+ f9 i" c' }* N
/****************************************************************************/
3 D0 Y4 g2 D' P e t" W* n; E
/* */
; N4 l9 }: s' l& R: n
/* 全局变量 */
2 i3 @; D" k( L( A- g- X8 f- ]
/* */
; X# T9 Q1 {" j/ Z
/****************************************************************************/
Q2 _2 o1 ~" o8 L# i
ECAPCONTEXT ECAPResult;
( G- v, t/ ?) o
7 ?$ q# }) Y: ^& A( U$ G" c
/****************************************************************************/
, { {- W+ Y' g; P- r
/* */
$ {7 }, ?3 q P/ ?
/* 函数声明 */
3 b `, N( o) S* _
/* */
; i6 D1 c4 X, t& u
/****************************************************************************/
2 ?: j$ t0 T9 A) G
// 外设使能配置
7 N; |; O9 @* \# E8 e ~# k
void PSCInit(void);
) o. F7 I/ y; z# }
" K3 |9 i; Y3 z0 C. ^- ]5 |" u
// GPIO 管脚复用配置
2 @; Z' A6 u2 o
void GPIOBankPinMuxSet();
9 H8 F, v( v& k7 [
; r8 k* J; G: k2 T; s; B
// 产生波形
3 V7 s7 S( z) }% W6 n4 r( k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
1 S# W+ W" x* r3 m" O5 E% ^
void ChopperWaveform(void);
, @8 ?4 M) @: b4 t1 g6 w T9 U
7 G2 z! |$ Q5 g' Q
// ECAP初始化和读函数
4 j$ j0 v5 X! ?" I7 x; Y3 d
void ECAPInit(void);
2 U# R9 B& v- w& \6 ?
unsigned int ECAPRead(void);
D6 P; R4 v( W/ L6 ] I
/ H- x$ G5 B% x, I# X
//ARM 中断初始化
3 o# o+ t* m) W& H5 ^2 k
void InterruptInit(void);
% K/ S5 b( Y* `% K6 J) V1 k- o2 T+ `/ v
- w* R8 T9 j/ o' q7 S2 \
// PWM 中断初始化
# v4 F1 {& b4 ~) G& R+ k
void PWMInterruptInit(void);
2 l5 {3 l$ e$ U b8 D7 `, l9 J0 X
// 中断服务函数
% S5 v9 k0 o! I5 w+ U5 f
// PWM 事件
5 f/ ]8 b' A5 V# x5 D H
void PWMEventIsr(void);
$ B. }1 ]; H' A |2 K
// PWM 错误控制事件
" g/ c* q9 g2 L6 r6 T& N7 ^5 m
void PWMTZIsr(void);
5 j2 o/ B: i b; o: }1 v& A
) i* o: ~4 T5 J& {) Q& t5 X+ ^6 i$ `' a
/****************************************************************************/
" ~6 c, C" ?: Y
/* */
: `+ F& z0 D- F q7 x
/* 主函数 */
l& s/ W s. D, F7 p$ b
/* */
" C& \( J0 |# ?. B* ~5 A5 U9 }
/****************************************************************************/
# `$ m2 S$ U: }: ^3 J
int main(void)
# a3 `: I' i- _4 w- b
{
6 J, x7 O @4 n
// 外设使能配置
1 B: V# y% w& y% B' s
PSCInit();
9 Q7 F Q* V* ]; U7 W5 T; G
9 z, Y) ]5 p; n0 X. p
// 初始化串口终端 使用串口2
4 p* r' [3 r; k
UARTStdioInit();
( J S# k( k0 {1 g$ h% {( k+ `
9 ` y4 Q8 |3 J* M
// GPIO 管脚复用配置
) { \8 e3 |& c& G* e" y3 t7 z# t
GPIOBankPinMuxSet();
1 f+ V8 {. H# C/ V$ x' @" b
& i7 A& A3 x6 p" O' ^4 z6 G
// ARM 中断初始化
# l; j" ?7 _2 L: ?$ H
InterruptInit();
9 L8 E6 Q7 p0 `9 q- K3 |8 x& j5 t. p
; L. G2 n; |4 G; W9 a2 Q
// PWM 中断初始化
8 ^+ ^ V2 X; V4 _1 b8 w- I
PWMInterruptInit();
; o- }! N! K8 i
8 Q( D( a4 }. g( L
unsigned char i;
# q: _% V K5 R7 J7 k% a
unsigned int j;
7 x5 O* M& S& R0 H2 d
+ P/ a/ Z8 j! [1 O3 x1 f. z
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ d3 l9 F8 o) s$ |
UARTPuts("------------------------------------------------------------\r\n", -1);
! k2 D& H0 K" _8 ^; J
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. l$ N8 Q4 l- D4 b/ R
// 产生波形
! S/ E- ^: m- }8 V9 d
PWM1ABasic(25000,50);
" U( p' |- i! K% v' R
, y2 h8 U! I% q& c& `( p
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
) H4 R* p) {3 ~1 g# {6 g( j
UARTPuts("------------------------------------------------------------\r\n", -1);
0 x3 B! {8 o6 u, z5 {7 h& B! i
$ X4 v7 z3 I& i- c4 c2 ~6 ~" K& d
+ u& ]( \. [( N4 X: Y' f
- e* ~; G |$ c+ c# F i5 Y. e
UARTPuts("------------------------------------------------------------\r\n", -1);
8 F( U8 o/ d" r( @6 f
UARTPuts(" C6748 ECAP Test\r\n", -1);
+ {. M8 S; U U7 J! u- a
// ECAP 捕获初始化
$ n8 T& J. U9 k# O' w! v/ X7 e. \
ECAPInit();
$ [6 n- O6 S: ^) s1 W' q! h# ?9 Q3 g
UARTPuts("Initialize ECAP.......\r\n",-1);
/ _: |) H0 K% a& Q& F
for(i=0;i<5;i++)
2 O) }1 u& D$ @- A# y. ^
{
6 a9 H- x1 h* {/ @
for(j=0x00FFFFFF;j>0;j--); // 延时
9 Z j: v2 }, j. y& Q5 Y- _
ECAPRead();
8 \; f8 \/ h1 I$ h
}
# |( W: ?# o$ J: q
UARTPuts("\r\n",-1);
: p( S( P5 N) ?1 v* r1 g
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" r% L& r$ i5 |5 ?1 d/ j
UARTPuts("------------------------------------------------------------\r\n", -1);
& k: C( D+ o/ j# j
: M+ G$ d s4 [$ X4 U* s, h) y
// 主循环
. V* l" l A1 I
for(;;)
2 h. z/ r! Z3 z9 ]. E
{
0 L( c s& N1 e. C \" m
/ |1 t3 @* k0 b& `$ O& V5 Q! F
}
( \# [+ i+ N# e
}
- ]. l: b* s! H' B4 K3 i1 b: G) S
7 H, o& j5 ]' e4 `
/****************************************************************************/
' o) V( e/ ^& f( X. x
/* */
7 W' I' P6 b( T
/* PSC 初始化 */
, m6 U( B6 }1 r$ c
/* */
( ?& z. p6 B" Z7 b1 [! g" D
/****************************************************************************/
+ y* `2 ?- q! G0 C
void PSCInit(void)
& B# a& V6 n% I: q/ y9 i: H7 w
{
$ a6 ?8 B# P# D0 n& b
// 使能 EHRPWM 和 ECAP 模块
# z/ X- d5 r& B8 e$ x( m" G
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 P1 \% q( N% q: z2 F" T/ {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; q8 ?; v% {9 J1 n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
R; M# K. o/ J
}
5 `4 J/ I4 k. Y/ O+ O
2 m2 x0 c8 R% p ^+ ^
/****************************************************************************/
9 Q5 r2 _# c8 C* O( ]
/* */
1 a5 c! ^' k# f/ n h) C0 w* e' |
/* GPIO 管脚复用配置 */
" u% p6 r G" T& }# @9 g) J
/* */
0 C, t* G# l7 \. Q! k% `
/****************************************************************************/
9 Y C7 \6 G+ Z7 Z
void GPIOBankPinMuxSet(void)
4 b4 }* J6 m6 g3 V5 U+ X5 k2 O
{
( F7 S9 f) S# v: `, E0 _
EHRPWM1PinMuxSetup();
8 L# W3 m0 ]# \; y! w) S8 j
* v; l2 R1 w( `! o; A+ a
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
7 @ s8 W0 g" p8 @. \- f1 |% M
// 作为捕获功能时管脚方向为输入
4 v5 @. k7 x( @5 ^# ?- j9 b* B
// 作为辅助脉宽调制时管脚方向为输出
$ c% A# D$ p' N% c) E" E1 k
// ECAP2 / APWM2
! _2 E4 f9 F& O
ECAPPinMuxSetup(2);
. o' c5 `$ \9 x, e9 u% L6 A3 p
2 {$ j3 \0 {$ U
// ECAP2 / APWM2方向设置为输入
& u8 t# |, j- d* J& v* `" O
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
6 x- D1 }. D/ w1 S
}
# R! C, C T# G: G) T
% E5 {" V/ `( B- Q4 N
/****************************************************************************/
( U& [& h$ L& l( t. a) W/ c
/* */
# w, O; T; c7 p! s
/* PWM 输出波形 */
/ T6 g% w" \' X8 q7 w8 x/ ~
/* */
/ D1 k9 s0 n5 g- s
/****************************************************************************/
' a& X4 ]! L$ D1 |) A0 e. J
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( E+ E* o- k8 j' k
{
: a, b6 y9 B* @9 j
// 时间基准配置
& y6 X% J3 L, K6 b9 @; v
// 时钟配置
! J# W2 i0 ^7 h7 D; g
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; R3 ]. _5 ]' [* u) i
6 R! Z- Q" t1 R+ t) I9 Z
// 配置周期
' x& [/ i- k2 J2 ?% ?0 k9 u5 i6 G
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 J, a1 S& T" ~4 R
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
( x: C- R. B) x) J% }$ b# o7 N/ _
9 F3 N! `9 ~6 m/ Y @; g
// 禁用输入同步信号
7 W: V6 k' I' ^! Y0 i+ k
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 C, |$ N6 C+ C5 |5 W7 J0 n
% Z- s$ h, V" y* s1 l
// 禁用输出同步信号
/ p; f7 o( L: ^0 c* [
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. S2 ]+ p# e2 ?8 ~ y7 G
0 X) ]) m. s9 K( s8 A
// 仿真(DEBUG)模式行为配置
0 \6 E6 w7 S$ l& L7 c' E+ v7 B
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" _9 j7 y* ?3 a* Y
! y D! `- @0 v1 |
// 配置计数比较器子模块
: S, J, f6 `6 J8 ?
// 加载比较器 A 值
% f* z h3 Q* m, Z( o, V
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 p2 r6 Y) z ]( N
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- {" ? L! s$ F) }
7 T; @3 f- X4 y) n4 k
// 加载比较器 B 值
4 a, q' b, L: T/ N1 v8 I
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: T0 \1 }# O9 R, Z. b
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ `$ q. ?8 A; ?$ L6 t
7 E1 t7 k/ ?( K8 n7 K8 x
// 功能限定配置(输出引脚触发方式设定)
9 N, I+ e. |: E( d/ U" u9 i
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 u+ w- S3 r2 q2 v. T1 y6 P$ M
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 Q Q0 \+ @, p( M
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! i, z7 j6 |! z9 i9 v
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ O/ n8 \, ^5 k8 @' c% s* P
, a) a4 c2 f$ d+ F- k7 l( p) f
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 K S6 x2 Z! R8 j1 `
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" U+ w2 h- |* E
% r1 d% ] l V* m
// 禁用斩波子模块
5 C7 E, k0 U, D6 i
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 |& A2 H: ~# M9 U( t
1 k+ F7 I( M8 j2 l8 T4 C
// 禁用错误控制事件
1 f6 A8 l' p2 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 v) b% @# Q! o# |1 I
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 Z1 h6 F- C* t: ?! E
# G# m8 ^2 W0 v9 J7 u
// 事件触发配置
4 e" @ Z9 U L$ O( ^( E$ @8 F2 I) M
// 每三次事件发生产生中断
! L* q0 O" r. y( j4 `2 `9 {/ ^
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 T$ n# S) f$ u5 d6 n, U) N
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 m8 P7 g6 D; Q$ s
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 C7 |8 Z. Y- r' V- M
// 使能中断
% p. ^! E0 S9 u* O/ V4 e2 q! ?% I
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. q2 {. o0 ~- I4 t( L; `1 q
6 [: k" `# S% t& K7 P0 h& i
// 禁用高精度子模块
5 O1 m7 o U0 @+ X Y1 Z4 l
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. p! b6 H1 F) Z8 P. O# U
0 P: i) v+ Y7 ]4 j
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ @. g) r. \( o. p/ t
}
5 `0 U3 Z& [* V- n
/ }/ g4 B% _) |
void ChopperWaveform(void)
+ k+ u- P H; ~4 q
{
- t) p" r& V+ `) E- p4 f5 G; V# z
// 50% 占空比
7 \9 L0 D6 J5 a/ N
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ P z# h- s! w2 Z" p
// 4 分频
5 s+ c5 p( D* ~2 y8 {+ H+ J9 W
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, H7 U! `- a: U) f/ n2 [$ i* D# F7 R: _
// 单个脉冲宽度
! S, z6 h; p* g6 [ _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 Z, }, E7 A, }6 A" D" p5 U
// 使能斩波子模块
; n2 o6 N& J# a7 {/ s2 b
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ [% L) J) l% w+ z* E" t" R2 C
}
- o H- C" ^! y' Z+ T. U7 ^3 @
# d3 X; L% N; J) ?9 m
/****************************************************************************/
2 f% E- _5 x9 d+ [& H$ e
/* */
# G c+ I6 p- s
/* PWM 中断初始化 */
1 I0 `$ }9 Z: ~. x
/* */
# h6 B; ]0 [, _0 B |; }: T& m
/****************************************************************************/
: ]1 u' r, ]/ S" d" ?
void PWMInterruptInit(void)
9 _! a7 f8 ?4 C7 R- z/ X
{
8 S3 u+ d% \1 I, R# u' ]" b% B* D( u
// 注册中断服务函数
# T3 k/ r' D$ U- k+ A. D2 Q+ c0 @
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 w& R' |0 l8 m8 P* ^9 L$ V
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
+ U+ L& O6 G/ W. C; J3 |9 h; N
' X& `* W" U% L$ M) z: P9 n: ]
// 映射中断
" i8 |: K1 U. h! K M& n: p
IntChannelSet(SYS_INT_EHRPWM1, 2);
6 s" w, Q! l7 K x7 a' z& Z
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" V* W! F4 { Z, Z/ l
1 o3 W2 u) U- R5 H0 R3 L$ p
// 使能中断
( \; h8 y G& E1 U5 W+ k5 r" O
IntSystemEnable(SYS_INT_EHRPWM1);
# A) i2 b- g$ M4 ]6 G7 H
IntSystemEnable(SYS_INT_EHRPWM1TZ);
, U0 @# }/ M7 p7 Y! S# \8 x! O; c" ^* u
}
# G, W: c) Y3 C2 w# l
# {: M W6 x3 }
/****************************************************************************/
+ O3 X& J8 w6 Q- S3 Q
/* */
0 m1 K# ]5 S1 X3 H( G
/* ARM 中断初始化 */
1 q: e: J+ y+ o) ?0 p
/* */
3 l; W: ]$ Q" e
/****************************************************************************/
@# b& V7 I1 d3 T" w" E! O/ _9 I9 N
void InterruptInit(void)
* o. }* y+ r1 W8 C& a8 o0 W" X: g; e
{
3 Q0 }- p4 L/ Z' p6 r8 K
// 初始化 ARM 中断控制器
6 a# M7 c" m0 o5 ~- h) r
IntAINTCInit();
# I# _- f- u- z! F; _$ ?1 P. ?
) {+ u& j2 t' U9 ?, D: \" o- _$ X2 ?
// 使能 IRQ(CPSR)
' K# U" P1 w7 D: [. [
IntMasterIRQEnable();
$ U3 a W. Y; @1 I- b9 {) Z1 z
. V+ i* s+ E4 W# T! p7 U$ o9 W
// 使能中断(AINTC GER)
6 i3 A) }0 P* S0 a6 c' M
IntGlobalEnable();
8 R0 }7 `. N5 L% P$ E
% a" W9 @; y7 _5 T5 w: x
// 使能中断(AINTC HIER)
8 ?# I; X& z+ ? h9 \2 q6 x3 d
IntIRQEnable();
6 U" }: o3 k2 k" m) ~+ k* z
}
) j$ [; `9 W. i( H/ W- D
% B, b) M; n8 l8 Z% k- O
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" M1 @/ T! S0 P' |. H: q7 a
/* */
/ K' n" L* y3 B0 L$ e o0 x
/* 中断服务函数 */
6 e" `) C; V- f2 O1 f x: {7 {
/* */
# H, l/ h4 R; d6 E( S M+ k4 F3 Z" J
/****************************************************************************/
) h6 a" _2 z8 T5 K, C) L: e
void PWMEventIsr(void)
h* o/ h' |* \- X2 k0 v0 V
{
' p$ ]- s/ P' [8 O1 z) R6 C7 Y
IntSystemStatusClear(SYS_INT_EHRPWM1);
2 W$ b" u3 c2 [& F
' _& S2 H& _3 v* Y4 U
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
( ?% j& Q0 c2 f/ G" }1 P S: j3 ^
}
. u- E( F3 U6 A" A4 |
/ z4 _! ]: n, T2 Z( K
void PWMTZIsr(void)
, v3 i5 y, J5 y
{
0 }# \& D3 f; |. _# M4 m+ `
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
6 q0 W. T0 V! C- Z5 a0 N+ r
' J9 o5 M3 G1 \8 I- L) E2 z
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) Y; O; a8 d# T g- w/ e. G i
}
" E$ \- V+ X8 W
2 R( L5 b7 g9 I3 U( j2 a4 g$ q
/****************************************************************************/
, p+ w) o0 a a+ u. L
/* */
6 m8 v: S- j1 m. h6 [
/* 初始化捕获模块 */
. Z& Z6 F D( ~- |6 I
/* */
- z" Z: k/ E- l, L
/****************************************************************************/
8 K1 c1 ]6 F( B5 _3 ^' `: q) h
void ECAPInit(void)
: X. x' Y8 ~- n3 d- i
{
6 L0 x; e7 g# e, \
/*-----设置 ECCTL1-----*/
* |5 O' Q! n& G% I' ~
// 使能CAP寄存器装载
: m6 c- M" b+ ]3 ]; f/ }
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
5 @/ I6 m u8 E. P. H, O. A
// 设置预分频值.
X+ n. m: z* o$ |" `$ Y6 A2 j
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
: ?. `2 i; P0 @
// 上升沿触发捕获事件
: Z$ W6 O, ^$ f
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" r, H2 U* t% B& M: ?
// 输入捕获后重新装载计数器值.
, Q% R' h$ S4 y7 K- ]/ c9 ?6 T
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
[9 F) J7 {8 D+ U
1 k) J) e) B9 s( h6 ?
/*-----设置 ECCTL2-----*/
& P0 V! ], V$ k4 V' H8 G2 s
// 连续模式
' U' U7 S0 Q! `, P3 W6 e
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, _! o5 N1 }5 b2 |' f
// ECAP计数器TSCTR持续计数
& Y4 g' n* K- x7 H5 r( \- ~& k
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 z. ^4 B, x3 u" j8 O
// 禁用同步输出和同步输入
% S( [$ y6 G1 B D* B; m$ g, z
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
! X: D4 C0 h7 k: r) m8 L
// 配置 ECAP 2 为 CAPTURE 模式
+ ^0 d3 \- s$ N* }+ L3 h, p
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 ~1 w' r! ~4 A7 @( y
1 n9 B. O" m# R" x
// 使能中断
- w0 f. K1 W/ Q* y7 D/ f, S7 _; j
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
1 Y' k+ c5 q: a. f) {! }
}
& C* N, D7 ^3 a( H% C! \' `$ R
1 ]. g! f2 q$ [0 C2 q( ?
/****************************************************************************/
0 C# r9 T' y# w6 k: ?
/* */
! G9 q8 i: \" {! O
/* 取得捕获结果 */
* y; c3 F" `) a& w
/* */
+ w V( j7 \' J* f& _5 e
/****************************************************************************/
& V( D% ^7 z# b) l& C
unsigned int ECAPRead(void)
- I' E+ O% q$ n. r3 w5 F
{
& r( Y, \! |5 Z
unsigned int capvalue;
; Q( {+ q2 m& @9 D. }. J; S. [! t
unsigned long frequency;
' U) J# {" {0 F' K) q
. Q, N/ |8 ]+ j- K
// Event1 中断标志
- ^, p' q( @" Y: T G
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
) ]" j1 b5 ]3 \6 _4 c% \) S
{
+ [ [3 j" A& A' N+ R
// 取得捕获计数
, g1 M1 h& }! N1 E* B1 M
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 E6 R% y5 G5 M2 h; j1 c
capvalue = ECAPResult.cap1;
( [+ Z \$ ~, K: f
5 d$ d. F( a; |0 b+ \9 a6 I, L
// CAPTRUE 模块 228M 时钟主频
8 \& k2 x2 w0 b
frequency = 228000000/capvalue;
" Q1 r, \0 u( h1 u3 f
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
- O7 S4 ~, r2 h9 u' y2 S+ O; k" I
3 m. w& |; ?5 Q
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: z/ ?7 V$ f, H j
// IntEventClear(SYS_INT_ECAP2);
( [) L# j/ [% M# c! O Z& G
}
) M: l1 u, t$ y& q* y; J
return frequency;
% u# [- Z, E1 _7 Q8 ]; N; V
}
; k) C9 ]0 a& N- w4 R
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( |& S7 e- i0 ?% N1 {
[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