嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& c7 x+ |% w H- z
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
6 i' e# V3 o8 T1 [2 T8 y+ y4 k# `. H
/* */
/ H- `* N# B" \
/* 宏定义 */
* F8 d$ |+ @+ W# k# T' l
/* */
; A/ y+ A: O3 \3 P
/****************************************************************************/
& x( T7 Z7 ~3 U. Z
// 软件断点
; B& \: V- z2 y" g8 B: Y$ U9 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
( m+ B) u7 A% q, U# {& i. {
8 B$ m" i( q) |' N+ d5 J! ^2 q0 h
// 时钟分频
+ D E9 o& Y' D& u' y
#define CLOCK_DIV_VAL 228
: [4 ?( t& T, q x( c2 L& r
$ A$ ^0 a% y" Q( ?8 F! L. O
/****************************************************************************/
, `! F0 T, E: M5 F
/* */
. R5 R' |& F; H/ \- B; e
/* 全局变量 */
' t% Q+ v) m/ p; n. Z; @) F# f
/* */
1 z: u+ m" O5 A0 ]- R5 T/ i
/****************************************************************************/
5 C( j0 n, Z" z4 k& h
ECAPCONTEXT ECAPResult;
) M, C: r# T4 ~* v( w
% y/ t1 q# k% V$ c( K
/****************************************************************************/
v# d5 G p- m$ {% w% J# e
/* */
' k! G$ f( F, X
/* 函数声明 */
; y( p5 r! F$ G8 _$ ~ X% p% y
/* */
- y4 q3 C; I1 S
/****************************************************************************/
# r1 {9 N" O' b# f& a* v
// 外设使能配置
- h J* s8 |* i* m4 I1 A
void PSCInit(void);
+ T" ~5 x4 V7 d* Y) r! _# P- z
2 Z. R `6 l. m% H. W
// GPIO 管脚复用配置
) w6 | y( K" K7 k$ T
void GPIOBankPinMuxSet();
8 o$ j t1 Z0 G3 q) S {! R E
* \1 d9 \- O1 z! R; _( P; N; l3 [
// 产生波形
2 r# u3 a, |# U; D' R6 v1 t8 x
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& m4 ]( ]$ X8 u- |
void ChopperWaveform(void);
5 d* x$ l- ?3 @( ]! Z
) J$ S+ a& x) h4 E. H
// ECAP初始化和读函数
, R. N( V9 b" ^% @6 A
void ECAPInit(void);
; }: L2 l! `# P* I' L, l, i* O
unsigned int ECAPRead(void);
8 `6 F2 g; G( h Z6 ^
0 ~2 X' `5 g# \- Z% j, h
//ARM 中断初始化
3 M* C! j F8 x8 M$ s% i
void InterruptInit(void);
- E' T/ k& h% B- V
8 C$ |2 @& o- _& ~3 J- h/ R
// PWM 中断初始化
& J' J. e& g6 m: ?1 f1 n
void PWMInterruptInit(void);
v1 k5 p$ Z ~( X, O+ }8 u
// 中断服务函数
2 G6 s# b! c6 l# r! P
// PWM 事件
$ Z8 F: T- @- b
void PWMEventIsr(void);
3 \) h& o4 ^3 w
// PWM 错误控制事件
& W6 Z9 a1 g) N! X& t
void PWMTZIsr(void);
' i1 A) h( D* u
% ^: f5 m) C4 D
/****************************************************************************/
|/ c! n/ R% e% v3 _
/* */
/ k6 D; g* K% [& l& V
/* 主函数 */
$ {, q& L7 \5 u3 y0 a7 q
/* */
9 F# i% @, U. g" x, b" p
/****************************************************************************/
9 J( j) z( H' [+ Q) m& R* O4 Y8 K* @
int main(void)
( o- V' H2 C5 s' Y' L1 l
{
4 m! a |! ^/ p' t
// 外设使能配置
7 G$ l; h' n) Y0 x
PSCInit();
6 F4 s' u+ y, q- K2 u2 |5 i9 I
. a; S" B& O8 N7 }$ c* G
// 初始化串口终端 使用串口2
% a2 U0 m2 Z; @. S- V
UARTStdioInit();
$ l) C$ a- b: B$ ]( p3 ?% r. ]) P6 L
: X ]+ M: H1 @" h, ~/ [! T. y
// GPIO 管脚复用配置
- r1 H& j" s( C) O3 b) |& E
GPIOBankPinMuxSet();
) F# C) v$ O" J) l$ H
6 z+ t+ t$ x R
// ARM 中断初始化
8 K2 ^, X3 c! m, R% v% ~& P3 }' m# p
InterruptInit();
6 c: F/ ~+ k. x& d
E' n7 j f: ?8 m$ \3 j" F
// PWM 中断初始化
. v0 h" {/ w% z7 v, f8 I& t& v
PWMInterruptInit();
: P2 C; f0 f; K J5 P% c
* A3 [$ A7 n" a' m0 p B, I: `
unsigned char i;
( W8 g$ S. v8 v/ x
unsigned int j;
$ C% m; a' f% I- B3 O; g0 ]. E: @
( _ i! j8 f) M5 a4 ]; b8 J: I: G
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 P7 T; d- y% ~" y5 w# Z
UARTPuts("------------------------------------------------------------\r\n", -1);
6 V+ _' H0 Y: a" A+ h- j7 y1 u
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
' W" C4 I O1 c8 f% q; K
// 产生波形
6 r8 T! V: P* Y
PWM1ABasic(25000,50);
8 {; H$ L# p( L. L- E& s
& S; B3 D$ ?8 C/ l/ Y; k; v
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
y; Y, [2 t$ o5 V/ B( ^, H4 W
UARTPuts("------------------------------------------------------------\r\n", -1);
. f/ s. m5 R( i6 c5 a( V# G; a
% ]1 {; i' K" B* j
) p P9 e7 i/ e# v4 p0 Y( t: ^
: s" X5 c6 _* J+ U* A
UARTPuts("------------------------------------------------------------\r\n", -1);
- r+ {$ e7 H8 \& k, p
UARTPuts(" C6748 ECAP Test\r\n", -1);
- ?) M9 Q+ [. @- o; J
// ECAP 捕获初始化
! ]: a* ?" h: t
ECAPInit();
4 h* g) C- w! |6 X1 K
UARTPuts("Initialize ECAP.......\r\n",-1);
2 [. K/ D( I! N" X9 o
for(i=0;i<5;i++)
" v( @ v$ k. T. L( O
{
% C! p5 [7 s3 n- Y9 A* [; p5 J" L3 y6 V
for(j=0x00FFFFFF;j>0;j--); // 延时
$ U8 n) o- U$ w' p d* ^
ECAPRead();
) V+ P W4 W; o3 z% Y# \$ G! y c
}
3 F8 o% G7 z7 a y. L
UARTPuts("\r\n",-1);
& f+ O+ u& a3 p% g4 n9 N7 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
# p& ?' @8 x# V
UARTPuts("------------------------------------------------------------\r\n", -1);
9 A1 A. n- `' i( L/ Z. B8 N. n% ^
3 e: Z+ ?9 r9 W
// 主循环
* D$ @3 G, f" `; |3 G
for(;;)
( \4 H9 C/ w8 z" d, A2 m" R! k" R
{
5 g. b! w% q" o) @1 F
8 t/ k9 k \! {1 p5 A
}
3 x7 @( L) X5 G2 f6 {1 p
}
! B4 Y2 P6 W, c
+ k7 i7 J; ` ]3 p" u ?; t
/****************************************************************************/
. `# _( X% _$ b4 D
/* */
9 M- X' Q% C7 a6 s! N0 A9 m9 J
/* PSC 初始化 */
: Y4 z3 I! R' M# e. N
/* */
. {9 Q& f1 ]! D# q
/****************************************************************************/
$ S8 t, j6 w( p: o* z- k7 J
void PSCInit(void)
! u/ X1 X! h. s2 f: [
{
: E8 J C0 {' p- h0 W2 B9 `
// 使能 EHRPWM 和 ECAP 模块
* p' _. y' e7 ]4 I$ M, Q$ A3 i
// 对相应外设模块的使能也可以在 BootLoader 中完成
# `1 w2 J4 `' V5 m! l0 d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% r1 d! o' |( s, r3 t5 y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; R3 q& r# H B+ p* I
}
5 a6 D' p j6 X6 |4 w7 C2 e% u
# f6 i1 C7 f8 h8 D, P% V9 G G
/****************************************************************************/
( m$ L5 n( U7 i- b. O
/* */
9 |* a. u0 m. s
/* GPIO 管脚复用配置 */
: n9 {* `5 X7 C' A
/* */
2 L) W+ a; |6 [
/****************************************************************************/
4 L, w. D) Y' m* e4 E
void GPIOBankPinMuxSet(void)
. H, v# A! T: k( W- S0 Y6 i" e
{
6 y" p: D5 V! x" h6 s
EHRPWM1PinMuxSetup();
+ i9 x( o" q% |- _3 q
" `6 _. a$ q4 S$ O! U( I
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 x9 U* Y8 d) p' a& E
// 作为捕获功能时管脚方向为输入
1 \% [ Z! c$ @6 { i) F
// 作为辅助脉宽调制时管脚方向为输出
S) ]$ Q9 f1 H0 B# o
// ECAP2 / APWM2
1 [" \$ z9 m W# n. V& z2 ]. f
ECAPPinMuxSetup(2);
@% D9 Q2 `* Q0 y
. ~5 M% ^9 x$ T1 R
// ECAP2 / APWM2方向设置为输入
! F7 J) ?5 @- o. L) d. n
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 |7 w" u* u8 e, d1 c
}
9 b9 \- l# X8 B( R2 c
/ m! x: n9 e5 A9 @) L% k/ p
/****************************************************************************/
+ i( u& w9 Z! N1 e( Z- p
/* */
5 b5 W" `4 j$ `4 o8 |& n, b1 q) K
/* PWM 输出波形 */
3 l6 a+ f& }# C4 }- A8 f
/* */
. n! ^9 I7 t) u* j& Y
/****************************************************************************/
2 A7 `7 W7 X6 T: c/ P$ P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. p0 P4 C5 i0 @6 I5 j/ |1 b
{
/ j6 g% `7 k& c$ h1 ?" v
// 时间基准配置
; k+ G. ^2 Z4 }7 J! k0 P# |8 J/ g
// 时钟配置
$ T% E# ^1 e. o% o* U
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ]/ P; ]$ `7 w- L+ L2 I; k
" @8 S4 g Y/ N7 P' t+ P
// 配置周期
% G# f, }; @* ?; G$ E' r
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. }# D- k% }9 Q. ^- f
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# t2 t4 N% o- J- l
5 h: P* Q; C9 H1 I. a+ Y4 E( z
// 禁用输入同步信号
% ?3 C1 W9 o3 U }4 U
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! W8 [: j( j1 a- M1 Z. [$ }
) h* ]6 C- K: t' E5 x: Y
// 禁用输出同步信号
6 S- q. H1 O$ U3 _4 d( f
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" V& u2 R, U: z
3 i, b' `5 }( Q2 p4 A
// 仿真(DEBUG)模式行为配置
- F; l" U) @3 L" F4 h" Y3 K4 r" O
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' p9 w% D# ~# N8 F4 u# a
- m z' E7 Z3 V0 @/ b
// 配置计数比较器子模块
& a5 D9 m# n7 i, v! C" ?# H) n* n5 U9 i
// 加载比较器 A 值
( I/ t$ @# F& @ l; x4 Z7 R3 X
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! Z7 |$ H0 \# ~) R8 @' z9 _
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% Q6 p4 a% V+ W. g" J
0 i3 [7 b! ]! o4 O0 j$ ]; H; ]' `
// 加载比较器 B 值
0 D8 d, r' O1 Y$ j( y' d. h' v
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
E V5 Q6 Z. Z! Q, U9 o
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' V/ e* `% {3 v: Q8 T3 f$ R
' [( o' s% W# F# c; Z
// 功能限定配置(输出引脚触发方式设定)
5 }( J1 H; l% J( @1 m! j9 f( I
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& y5 v, V' z* J s
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ g7 W2 `- x! W/ i7 k( t5 m. W+ u% S
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ o8 [. l& \; X8 t
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: D& C2 Q6 J& r- j: V
3 e; j, |" u0 p
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 C( t! q( E% {- J5 u
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 c( k& m% b& X& k. C
+ V! W2 o1 b1 }; q
// 禁用斩波子模块
# g2 b# W4 N5 o# d2 O
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 f7 `7 u* e G: T4 K R
+ ?* g+ ]! d% x6 }0 [4 A( D: H
// 禁用错误控制事件
: ~, Z4 E& V' K4 Z
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 v, ^+ P1 L, y2 ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 ~# W! I( k3 t* r( l% f8 t
$ K: K& F. _9 l. D5 `4 z
// 事件触发配置
! ]7 J `; G) \# ~, [
// 每三次事件发生产生中断
# l0 d2 _; ?. u0 J6 u# N1 O
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 W7 D( P$ }+ k: j0 Z9 l8 i
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
' g* g4 ^5 s6 \& J7 o
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
, n' t. Z( [. p8 M( x! r' O
// 使能中断
" ^& N2 `9 `; u5 ~. C# A" P
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! x( f( n. W$ x5 g
" ~; e2 K3 I6 s8 L
// 禁用高精度子模块
4 h7 Y. D3 J- z7 u( R
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ \* _9 x: q" x" O; a7 T
4 Q6 Y9 c: B5 Q) g: U
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 t" _# W! F) g4 _
}
2 Y3 ^7 |" j! ^( T; l8 e
& j f+ Q: Z* q, A; p
void ChopperWaveform(void)
/ c2 a, O' N' B8 r3 B# P8 e" b
{
Z1 B7 r1 [$ M0 o" c4 [1 Q. ?6 A3 j
// 50% 占空比
( |+ \6 _5 R7 I
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ z; m4 L: C' R& f
// 4 分频
' B# ?) H. m* C3 ~
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( Q- c9 |$ q: q. f9 P2 d% K: k
// 单个脉冲宽度
% o4 p$ w- J x# Y8 p8 C
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. C3 C9 }! `/ d0 d# L5 K* D
// 使能斩波子模块
# x4 K! e8 R6 x3 w. b6 i4 ~) I2 W/ _
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% ~" v. k/ x1 h* @
}
$ j! P; ^9 l! ^* }' h/ l# l
" i, e& i5 L: d! P
/****************************************************************************/
9 o' [$ P1 C* R% H' o4 e# h
/* */
9 |+ W% x3 S6 N* I9 L' I
/* PWM 中断初始化 */
- P+ u7 _: z: B! ^
/* */
/ \% [& m9 P* u3 z
/****************************************************************************/
, p: T6 j+ ?& W" z; y( y
void PWMInterruptInit(void)
! c2 {2 C' T, p5 W8 Z1 y/ w3 r
{
7 x/ x7 w6 F2 s% k0 A/ b' U
// 注册中断服务函数
: k P6 H# E, \# ] y( s* D# @! ^; G
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! W6 p! ?9 j0 Y3 r+ R
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ i! m; M4 M' n7 w* A0 s; H
5 T- |1 Q7 G0 D: t* ^% `
// 映射中断
, z: z0 }7 H/ m1 c& H
IntChannelSet(SYS_INT_EHRPWM1, 2);
* V* K7 K9 r8 H. f' \( u; e
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* E4 r5 N" o* V
5 v" }9 s9 d4 v1 \: L. u7 s: B
// 使能中断
" `1 S' b3 r- f5 z0 P l i8 ?: W( O& M
IntSystemEnable(SYS_INT_EHRPWM1);
1 X% K& |8 a4 ?6 j& d8 ^4 h9 O- [
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 Y1 {) r1 N# [
}
, H/ ?0 M/ C$ W. _! m& h
1 F( x3 E. Z% y
/****************************************************************************/
! J2 r0 ]! y; z! R
/* */
5 U) j1 l* O, }! Z
/* ARM 中断初始化 */
: n; d/ v' ]) q$ @- D- |! ?
/* */
3 \# C5 I6 |* i3 W" `2 I9 k- ~! u
/****************************************************************************/
( {; T- E) p5 Z7 o7 ]$ s$ V
void InterruptInit(void)
4 p' O) ?* L* m: Y, @1 C
{
& {/ w3 L$ ~- k' {
// 初始化 ARM 中断控制器
* V! X) \' M3 t) t! ]3 O( _
IntAINTCInit();
s6 ~. Z q2 R* ^2 {. A* a
9 a# x5 N& M& e6 \) `! ]( X
// 使能 IRQ(CPSR)
2 k4 L) @0 c. u' B+ P, L" ]
IntMasterIRQEnable();
/ h2 j# \+ @. B0 E6 a4 v
. _! N7 `( G$ O* r8 E: \
// 使能中断(AINTC GER)
0 b( ] X: e1 G! ?7 V" r/ w
IntGlobalEnable();
/ G+ G, Q) e1 m" c' l& j4 C! l, K, {7 W
& K$ f- x8 Z1 ~2 f0 r
// 使能中断(AINTC HIER)
; S; W4 M, J" v( G$ ~3 _
IntIRQEnable();
$ n' A9 n) C7 v
}
- \8 [) f9 ^2 V
b1 U7 L" q- l+ U% W& h
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
+ _- ^1 ~4 c, j E2 ?3 g
/* */
5 ]! Y0 \5 g8 \5 P6 s( [
/* 中断服务函数 */
, B- ?/ f4 C/ H7 _, o
/* */
* }: f3 d/ E5 Q% b! p4 _8 B
/****************************************************************************/
9 G4 g% [# R; L5 m8 \5 h. X
void PWMEventIsr(void)
, |9 g0 S# s! ~& k- x- m
{
/ T ~# \/ T" j+ W6 Y% {
IntSystemStatusClear(SYS_INT_EHRPWM1);
: }' V- Y. ^9 }8 J, B: h3 U
: a" e0 e* {% l: O
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
: Z" b+ E. `3 V* G
}
2 N' `0 l) Y3 \6 g- O
0 _% D' w/ C9 s: T
void PWMTZIsr(void)
* B- K6 Q b% G: C
{
4 m1 a% O0 k7 I6 C! f2 R
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# N" i: [) h; Q2 e, G8 C
( s# p/ v, O8 z9 F7 i
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ M, ]0 R5 i3 _2 c. A8 e
}
$ V% T/ }0 o& W
3 j% W! X+ D$ S2 M7 q
/****************************************************************************/
2 }( W8 O5 l, V5 d" x- N: u
/* */
- w# x# {4 z, `# @$ f4 g( D2 ]+ K
/* 初始化捕获模块 */
& y, p5 x2 n; X1 U0 D6 a. J1 w0 b
/* */
/ B3 h/ i4 z' C' ^( U& Y1 ]1 O1 F
/****************************************************************************/
8 d; Q0 }4 N$ E' o6 M
void ECAPInit(void)
/ R S2 p- I* v+ \+ V u/ O
{
: p: Z9 r: ^" F) A. ?
/*-----设置 ECCTL1-----*/
& }0 I7 @# @ d$ H: t
// 使能CAP寄存器装载
9 w7 G6 ^9 c3 U9 _& p; X
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
" n% g0 r% ~- p [7 G5 k1 V! }) r9 H
// 设置预分频值.
" S! [! _7 Z! ]2 w' W3 b4 Z
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 Y) ~$ H7 W9 `7 d- D/ ?& `' y
// 上升沿触发捕获事件
. e5 K6 M+ C6 t6 s6 c' R# R
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& W3 D. X( m! l; ~ `
// 输入捕获后重新装载计数器值.
* A9 ^+ g- S) C4 J( ~3 o
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
: ?+ Q4 e) A& ?
# F7 Q& r' N8 ~, }4 E! e
/*-----设置 ECCTL2-----*/
. A" {, K, F, O' o2 r
// 连续模式
" h" U$ ~; g2 p# W% M
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, ^; E: o$ A3 }" y4 N% g
// ECAP计数器TSCTR持续计数
$ d1 h6 h- q# @# c& L4 \
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 y3 }3 e" z* u4 Q/ G* @4 W
// 禁用同步输出和同步输入
' `+ S. w" B5 a
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- q2 ]$ g) a2 h) a, i
// 配置 ECAP 2 为 CAPTURE 模式
: u/ R5 }5 J4 ~( w
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 `; w! N4 }6 i1 U7 r' F
, x, M" d% S# P, k, t' M5 U- P
// 使能中断
( k* X, C5 q" G5 O+ Q7 ? v; N
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- y: X( B) T! t
}
$ P# M3 T7 p' Q# F2 J* a
; Z$ U- k, y3 x( T
/****************************************************************************/
% }6 u# T& p/ m1 E3 a
/* */
. T) A# M* E2 W+ d( |( u" b
/* 取得捕获结果 */
; F, x: I) F( G4 W0 m" V
/* */
# m9 M1 w/ `; C1 t# p
/****************************************************************************/
/ |* [4 z: _" l( H' n
unsigned int ECAPRead(void)
' h: L' K* B6 U& z0 [# t" U8 ~
{
' @ x) b7 p5 L7 k; |1 \
unsigned int capvalue;
/ _ N1 S, Q2 c- y& c6 o
unsigned long frequency;
1 ?, }8 C9 e9 z* Z8 R
% K" G, ^6 K" |+ a- H m
// Event1 中断标志
. }7 `8 v( x$ q4 ~- }
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
2 ~/ |# i8 H5 H
{
. G7 |' B5 m8 z- Y$ }
// 取得捕获计数
+ z0 N$ H; P) l( C( m2 X4 L' }
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 b2 @5 {* ~% e1 P/ \
capvalue = ECAPResult.cap1;
% M0 P$ X: |% v7 K/ N$ ~% i, w, d
/ |& U( e6 }4 X" B
// CAPTRUE 模块 228M 时钟主频
, r8 R' @; J3 l2 `+ [4 F1 l) r
frequency = 228000000/capvalue;
7 h3 P8 e: f% E# A) l' K0 ^
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: D" F* Q+ _# l4 s- {
S) M# M+ H( @- |, [' N" R
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
+ K3 W1 l' m# d ]) b. _! J
// IntEventClear(SYS_INT_ECAP2);
2 B& @% l# I3 A, c& f& l" g
}
) M1 V6 f8 P6 I8 M! B6 h1 ]" {4 t8 Y
return frequency;
+ D/ [: C% c, A% o# U
}
; {4 V/ ~0 R( w) X3 k1 d
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; p" R+ f/ V9 M) t( e0 ?; d9 W% `7 a- i
[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