嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% [) j; D% `6 Q' [2 J
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
/ v. V& {7 P7 {9 M' h$ r
/* */
; l* v5 W: {2 I9 A
/* 宏定义 */
( A0 D1 T6 v; E) n$ }- M L& ]
/* */
* ^* f2 q2 A3 y6 S/ i
/****************************************************************************/
! @" D- M6 r% F; y+ }% Y9 @( G
// 软件断点
/ y7 R) d0 @/ G
#define SW_BREAKPOINT asm(" SWBP 0 ");
3 i# } l/ I6 Z+ p+ W, b2 d
6 A: {) H- i- s$ K5 e
// 时钟分频
! K' _7 H W" l' W' A M7 g7 |
#define CLOCK_DIV_VAL 228
: ^% O5 a0 e! _/ Y
' |/ O2 Z8 B* I$ Y' i: S- _
/****************************************************************************/
! F- ~8 ^. x0 m, ~5 x
/* */
2 |+ T) }9 Z1 A1 e3 A; y2 e
/* 全局变量 */
+ h) r7 E2 |( L7 O5 I
/* */
6 W, \! _$ U* O5 m
/****************************************************************************/
! k3 K5 P5 J# ?$ n6 ]
ECAPCONTEXT ECAPResult;
0 F6 U1 c2 g" a
. a q8 T2 c2 x! m
/****************************************************************************/
; E. d+ N5 `$ M
/* */
/ f% f% N3 L b: u7 C
/* 函数声明 */
5 L& Z5 G6 L' t9 N
/* */
3 o, t6 I& o: ?7 l
/****************************************************************************/
/ P6 ?" c5 @0 W& A8 u5 C
// 外设使能配置
0 o% f$ a4 [. N# f; p
void PSCInit(void);
5 }6 t! U; Z' l/ ~; w% @# x( D8 Z
" e1 a6 x; J, u- ?
// GPIO 管脚复用配置
% S1 G$ A _: u8 s) e2 s
void GPIOBankPinMuxSet();
1 a/ U" `/ w0 u& h& ]% J: p4 u
# ?4 f$ e% f: f/ L
// 产生波形
" s1 V' G6 i. {* A: b, _$ O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 p4 h7 `; I/ J- w$ o4 P
void ChopperWaveform(void);
# D4 ^6 `3 ~/ X2 X/ r( `! Y
9 J: }; [& M2 e& [/ J
// ECAP初始化和读函数
7 r# b" |' ^. I L5 i
void ECAPInit(void);
# O1 N# l# {9 y" q) G
unsigned int ECAPRead(void);
. b! P* v$ b& y7 H
: c8 c' _" B$ T Y* D, r
//ARM 中断初始化
: \; o) T0 d5 |% Z) w& A* b
void InterruptInit(void);
0 C( j% I7 m5 x! M \
% S. t7 o4 ^4 n& l! \7 g! w
// PWM 中断初始化
, t1 [$ n C4 ~7 m$ F7 ~5 ]
void PWMInterruptInit(void);
% p" e5 X+ v$ o9 @1 o
// 中断服务函数
3 P* _! G$ _1 E; I7 c% ~1 m
// PWM 事件
$ a! \& {; y) |* Q, Z- m
void PWMEventIsr(void);
$ s7 r( _2 h$ H# a( T; B
// PWM 错误控制事件
/ j; C1 S2 P7 Y/ l# K: R
void PWMTZIsr(void);
7 ~2 H& j2 z* v9 n( y
$ h* d: |, }/ Z# J q
/****************************************************************************/
- _; a" k+ U! y) \9 u5 ~
/* */
4 K. S7 J9 t; d3 X: D/ }
/* 主函数 */
9 s' V4 h# \: [
/* */
" ^* P6 h/ h$ B; L
/****************************************************************************/
% O% e( `4 ^; J
int main(void)
4 x; L9 w' r3 o
{
& W2 r+ P' P0 E) m
// 外设使能配置
$ z# L' t, Z( S2 L p4 h
PSCInit();
) P9 V. n* [# I1 O$ b2 J* J, |0 M
( L" C" t5 |" |5 p8 [
// 初始化串口终端 使用串口2
/ k% Q; W* Y* r" z/ l. k* }- I
UARTStdioInit();
- J$ r" Y0 {; c7 s- J
& i( \- w; M! W# V, F4 m5 h# j! q) d
// GPIO 管脚复用配置
' ~! [) m _ u' e4 X6 B
GPIOBankPinMuxSet();
% J' f2 n% [+ r1 o
$ H) f- o' b. ?0 g6 @# r
// ARM 中断初始化
7 a/ x/ x6 w u) ?" O# H! w
InterruptInit();
/ r( S2 J4 q: d, U
* L1 ^5 X# [2 w9 J) `# q+ A/ j$ ^
// PWM 中断初始化
! U$ V$ u, P6 Z+ k! ^+ y
PWMInterruptInit();
) @/ s. |5 n( U: N
* g! R0 ?; y2 w% p3 m. g
unsigned char i;
5 {3 ^: j! t( _9 A& @# \
unsigned int j;
/ y% \, P8 D @& K! E2 S1 l
5 c: z/ p. C$ h+ j. P- Z j
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; }7 z" w9 c3 b1 n" ]
UARTPuts("------------------------------------------------------------\r\n", -1);
6 q6 L5 g1 o" V( ~; I
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 s" q- @( p, V( n: Y
// 产生波形
$ `# x* S) v8 {9 j
PWM1ABasic(25000,50);
R2 Y( {% k2 K f( P$ a* m$ W
2 Q* {& q" N( Z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
: y8 x( w" W. ?6 R) d5 X
UARTPuts("------------------------------------------------------------\r\n", -1);
, Z) E1 a: p# r3 [. K1 F: F
+ K% d4 o! s g9 c' n
* y& |3 ~! u3 j9 `% B, M' O& a
4 \. F; k# \) z* W0 j) _
UARTPuts("------------------------------------------------------------\r\n", -1);
: D( k1 ?( d9 O. O4 s, c$ s8 ]
UARTPuts(" C6748 ECAP Test\r\n", -1);
' c6 t: o5 w' d+ `4 r5 r9 F
// ECAP 捕获初始化
+ W6 `2 Z" x i$ |+ K
ECAPInit();
, L0 `+ u5 C Q, U$ d& @6 u" H7 l0 m
UARTPuts("Initialize ECAP.......\r\n",-1);
0 n7 M* q; [& `2 }2 d1 j
for(i=0;i<5;i++)
, o% |- E3 |% Y6 T7 C
{
' D+ g# Z! F( L5 Y* K1 t# w. B H; n. z
for(j=0x00FFFFFF;j>0;j--); // 延时
0 X3 r% B; S$ o6 y# I8 d/ ~. h! Y' {6 g3 \
ECAPRead();
1 F6 S! \8 \8 I. `& W( d6 R y7 L
}
# V- i2 j2 k2 i. L7 A$ C# |$ k
UARTPuts("\r\n",-1);
- _) W- `( @' ~+ w% X6 u; z0 j# W
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- r+ h& B7 \7 A" d
UARTPuts("------------------------------------------------------------\r\n", -1);
; r; v( x0 t' U0 L# k2 f: T& Q
$ G9 |6 q9 N0 d& Y0 ]- d
// 主循环
: x5 k! i0 _/ h, l! _
for(;;)
2 z3 O! S- |; V, u' R
{
" B+ y' N( C6 G v
# \7 y2 W- S ?$ d6 y6 D" t9 u/ L
}
! I% l. c2 u9 y9 m( x$ \
}
6 R4 p' i" j9 X
. [; ]& k! \& e0 E# o: n" c
/****************************************************************************/
( k6 j# Q/ p3 B% e. `3 `2 F
/* */
' A7 l! c, C, @9 ^
/* PSC 初始化 */
- D+ l; M' l7 q6 }% h+ _
/* */
, N; r9 [4 t) U+ `
/****************************************************************************/
. {8 g& J" V2 m5 W; p( I
void PSCInit(void)
' B/ y8 Y: h; D- {& u
{
& X _& `8 `# X7 y
// 使能 EHRPWM 和 ECAP 模块
4 I+ o4 ?# V# `5 ?
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 ^% K( R$ d6 h$ p- }8 `3 w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 V$ B; G6 |) ?; U) _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
o0 c6 y! G- r7 A. R0 O7 o
}
4 J& t# r; X+ [; b/ c
9 Y4 P( I- r g6 l( i
/****************************************************************************/
, q' t8 |- S5 a0 |
/* */
) a' ~7 x8 u' {
/* GPIO 管脚复用配置 */
1 K' W: S8 g+ |! b% g
/* */
- N- J! `% r- S. }8 a, D
/****************************************************************************/
6 l+ b+ x% X- e" l5 Z( J! T
void GPIOBankPinMuxSet(void)
! j8 T6 j% U `$ ~
{
$ q4 O9 F0 F( e& M: D; J4 O/ r* w- s
EHRPWM1PinMuxSetup();
5 _; ?' M; J! `( g Y$ O$ A; A# o! p
5 w' C! ^- X8 @
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 y& S0 G- z2 `: q; z% j
// 作为捕获功能时管脚方向为输入
. v8 v; ` H& U$ L6 U6 @
// 作为辅助脉宽调制时管脚方向为输出
1 w# ?9 m9 \$ [5 d
// ECAP2 / APWM2
% K9 k2 x$ k5 k4 C( E; P* Z2 Q' ^
ECAPPinMuxSetup(2);
! T% |! h/ I. l9 i/ b
# p1 O; X$ l2 I R3 R7 J8 d0 s( F
// ECAP2 / APWM2方向设置为输入
: u( I+ ], a3 A3 i3 @. h0 i% X) A6 [
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 S4 C) o' A0 @+ j
}
6 r6 z4 L6 t% L4 g: J1 m( ~% F9 @
3 R5 R# f, Q5 j
/****************************************************************************/
. i: K1 `! }$ z+ b' L0 V% J U
/* */
5 N2 ^ W7 R5 t* w, p* a. C+ u
/* PWM 输出波形 */
: F2 ]8 o% q; k3 R6 {$ ?
/* */
! E1 N$ K, t- H5 q6 Z
/****************************************************************************/
% K4 q2 ]8 E/ @) v8 v
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" X. m' l: w! E1 B
{
* g* m' L* ^! t. U
// 时间基准配置
1 J H' ]2 q( d) u: H# s0 V5 j1 C5 J x/ l
// 时钟配置
& M* X- ~3 i' A6 i( `( j
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. x/ L2 a! X8 @0 j
) X" L9 X. Z5 d) Q! q
// 配置周期
# k8 G% s$ V1 V6 W
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* M# }) D- F6 w K+ C, @- E/ D
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 F+ @; x+ I& }# M) r4 P: q5 p' u
) Z9 z, p+ c9 C0 ^; W+ _% \( Z
// 禁用输入同步信号
, ~/ Y8 f: V: U; d4 B& m: _6 l
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* P; R' I. p, L$ I/ N
3 ?1 x' |- K- N" C- f
// 禁用输出同步信号
/ x1 P6 S3 M! j. B* C; |
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
[4 f5 D+ n- n6 r, Y
* k" ~; [7 n5 I) Q& n
// 仿真(DEBUG)模式行为配置
4 V2 A+ L& t) z' P* U! F* e
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
% N' t9 R, x) Z7 [ a
( C- k: S' F* P5 O& p; {
// 配置计数比较器子模块
& d: ] ^; Q( e
// 加载比较器 A 值
% E$ Y, e$ p' I$ R
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' B4 h7 |, `+ T8 J
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 _/ Z& V- O! D8 z: w# K, x
1 X# k C% X, l+ k3 w; n
// 加载比较器 B 值
* ?1 }# w& F$ S& J9 X0 y- \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
% l) |) Q. F7 l1 s
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* d% h! K, c, e4 H% G! k
" D0 I" S* I( i/ U" f% Y. \& z0 q
// 功能限定配置(输出引脚触发方式设定)
' L( g3 t" w& z# ? q: N
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 @5 T1 B1 f5 s: x. H8 i& F
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 f6 ?9 g, x! O3 K& c. @! ^
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
, D2 b/ f. k" Z& q. W6 q& X5 W: Y, T
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
# j0 K9 C( Q1 p
1 M" ~+ [0 T" W$ ?$ v) g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
- d3 C6 t4 ?7 y1 N* l! D' W: v! V+ f& A: G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 o( N9 }# c/ ~
% Z. \2 k, F$ s6 C& B B
// 禁用斩波子模块
7 r6 ^, L% ~" D, g
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
4 z1 s+ n# ~7 L' c0 [/ B
" X! `9 t) h4 F+ G `5 g' g
// 禁用错误控制事件
2 H2 ]1 h* b1 F1 m* H- u+ g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 A. v& \* T& J5 _3 _
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) U; Q) ]4 U. g
, }) @, N8 ?% q
// 事件触发配置
$ ]$ |( F( Z2 d+ A; S- R, z# o
// 每三次事件发生产生中断
h2 s# z# q- ^! w
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 t% ]; V1 ^) x$ t1 I/ @/ U) `
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, t; d: R' o3 U" q$ L# N% }0 u
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. J3 }. }* ] S4 { j- `
// 使能中断
! X' K2 y" q% o' N8 S5 V' R
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ _2 G2 R4 G3 B$ U7 A- y
$ B" p2 x" q) v6 S- M* m
// 禁用高精度子模块
2 `8 c5 [% D7 V2 J
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 Q9 i8 h& L# u1 O0 y
; @/ R2 o6 H& D6 Y* x/ e+ ^6 q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; S3 `2 ?% z+ }, I& ?9 F/ m4 t
}
9 ~! R# A% B: m6 V3 f
2 G5 ^' {- D6 \- _% j# Z
void ChopperWaveform(void)
3 B7 _$ |: P2 L1 h
{
- G2 L( Y) T& J9 n6 i
// 50% 占空比
" t6 v1 ]& E" H! ?$ D' O; T1 N
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 L( G4 Z: r9 V
// 4 分频
6 F' v4 O% X- H7 @
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
. h; ` ?$ n: Q$ k9 b5 b
// 单个脉冲宽度
) W( L( N' W+ ^
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
" K* Z/ X* {4 [
// 使能斩波子模块
% m7 Z+ m' Q8 _3 ]! g2 E) Z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 l4 l' B. h5 P% \( @3 P
}
, \' e5 R& X8 c, L' k8 \
% Q8 I4 O) t" ~9 \! j- i4 u
/****************************************************************************/
3 p0 k; ^7 n. X2 S$ r; R1 W( [
/* */
1 {3 K/ Z- z, N
/* PWM 中断初始化 */
0 c" J- R$ r2 i8 w5 N
/* */
- V/ G2 S# b* i2 e' v
/****************************************************************************/
# D) P4 ?% C( {
void PWMInterruptInit(void)
" m5 R. G1 H: p" X* J
{
2 L7 o* T3 ?3 J, |% i% J
// 注册中断服务函数
' ?" n% H. _! w5 { j
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' t" X4 c& w" y$ }, j0 Y, _+ _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ t+ b3 E5 @0 f
5 N! m1 s0 Q* I
// 映射中断
1 a" H% G6 ~# r; I- B ~- \5 w
IntChannelSet(SYS_INT_EHRPWM1, 2);
! P! m/ S" H% K& J1 K# `( j
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: X, v$ P6 \4 |0 w" ~1 ^
. U3 l1 D( l* I; A1 k% l
// 使能中断
! s3 R) I0 j' p- e6 A8 _
IntSystemEnable(SYS_INT_EHRPWM1);
6 L9 x3 ~8 E( S
IntSystemEnable(SYS_INT_EHRPWM1TZ);
: `2 x; e6 b$ T1 o9 A( [: u
}
0 i* Q7 [2 w% b3 ]; n9 N& A4 K
% t1 c2 ?& M" H7 ?, T8 E
/****************************************************************************/
, q9 Z/ ^* f: |( K
/* */
2 k0 T6 ?) P* b$ F/ f- u( |" U
/* ARM 中断初始化 */
) x; c" s) P# X% k4 x* g+ S
/* */
& R+ l+ r. n V8 M) v( {2 ]) ~5 i7 ^
/****************************************************************************/
: C* B. `% G f1 q
void InterruptInit(void)
% w3 X) ^* W; A8 e6 O' {
{
+ O O" n+ v/ l6 k+ Y a, d1 w+ Q
// 初始化 ARM 中断控制器
; s/ Q9 t U# W" F4 M- q+ ~$ C
IntAINTCInit();
; |: ^2 {- }# {3 s: Q$ E" }
8 a. t; j2 h) [) [0 ^
// 使能 IRQ(CPSR)
5 H- b9 z( r' O* V8 h# H
IntMasterIRQEnable();
1 Y* s6 G6 i2 |* c3 F
9 f4 h9 _+ n& r5 z/ P6 }) P$ u
// 使能中断(AINTC GER)
; D. x8 k/ u3 \ q4 [1 M
IntGlobalEnable();
$ V+ V, ?6 ^" m; v* J3 O1 z
$ p2 A/ u9 v; q8 ` o% W
// 使能中断(AINTC HIER)
9 M+ `, o1 q: y7 f. W
IntIRQEnable();
6 V( E* q" |! [$ N
}
% c9 t4 _4 \9 k4 j u6 Q8 v
3 l: C( c$ l- m% @, H0 J8 U3 c$ @
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
4 {2 r$ p# {$ n$ a r$ _
/* */
1 X- G( e( ^5 Q/ l, G" H( d
/* 中断服务函数 */
3 }9 u& B' a. b/ t8 a
/* */
! b: g7 J) `0 e' ^% q
/****************************************************************************/
5 p$ l8 {0 i' P
void PWMEventIsr(void)
8 M1 Z* |1 I8 Y, g+ G
{
2 B# \- v5 x: \; t- F6 @) b( c
IntSystemStatusClear(SYS_INT_EHRPWM1);
4 ~9 F+ {- B7 @% K# u1 P
# H' x" N4 p2 S7 L* C
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
( n- O% g/ z9 n# z
}
6 ] I) V9 Z4 d6 [: b, D1 s3 k
0 u/ z4 y' B- p- I5 x4 T6 a
void PWMTZIsr(void)
; Y6 P! P9 Z7 x0 j+ J
{
0 \# X6 F& L. G9 d. h! I
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" M( Y, e3 O0 h' j7 C
8 U8 L: g: ^. q* W4 ]0 N8 W
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 j: {! B" A: [( _7 }
}
; Y- r3 J. Y: }9 |
- R l: E2 q% `6 @
/****************************************************************************/
& k2 N: R' X- B& P- X, y4 W
/* */
" H, S' J5 _+ J% ~+ R1 w9 M
/* 初始化捕获模块 */
9 W) I0 ?/ e o5 p* {
/* */
2 k! j' P; U# y, b. h" W5 z" V
/****************************************************************************/
0 J' q" b( {5 {- k1 \( x+ K8 Y6 Y
void ECAPInit(void)
2 J9 t% {4 F/ o
{
( `# [$ w1 S: g- v9 {8 h7 V ]
/*-----设置 ECCTL1-----*/
- G$ a1 U- n" C2 Z5 Z' n6 |
// 使能CAP寄存器装载
3 p2 A" ]$ _) `# A3 ~: P& B
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ G. V6 B) C- ?2 L% \
// 设置预分频值.
8 ^% ?4 A7 q% }4 P
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* ]. G" @6 M/ f& a
// 上升沿触发捕获事件
& A$ n$ S) o7 e
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& Y% {8 T' O: ^6 T1 ]* A+ Z( T6 \, w
// 输入捕获后重新装载计数器值.
$ x7 E9 d3 ~3 V, |, c
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- H/ |# a! l9 f; y7 K1 O3 H
/ b Z. d7 `6 E
/*-----设置 ECCTL2-----*/
! u1 \, D% o& H3 T3 c+ n
// 连续模式
6 a/ A. W/ G" L& u; R( C$ R
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
6 m, s+ A$ J" y5 W7 L0 s
// ECAP计数器TSCTR持续计数
5 R" G) B$ D7 F" B+ k
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
' c$ d0 {. b0 T4 p. t' B
// 禁用同步输出和同步输入
/ p+ Q9 u! [1 B& ~. v. s- N8 b
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
7 [# a9 s+ i( T6 R% _
// 配置 ECAP 2 为 CAPTURE 模式
+ ]6 m! Q S2 W! P" G0 p) f
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ y+ B2 [, H: k. y
9 C7 ^2 E0 F+ R! e7 J
// 使能中断
. c$ u$ Q1 t8 _% H. S% C
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( F4 t6 c* q7 w& D7 O
}
% q+ Z1 C* ?9 g
) ^& _& ~8 n8 e; r2 Y1 t
/****************************************************************************/
; Y$ @! z- g6 R, N$ [+ t
/* */
& E8 y+ J `5 T. U
/* 取得捕获结果 */
8 m% f; P5 Q! ?8 O2 c
/* */
. E# q: Q% {9 l1 u7 t/ y4 D( V
/****************************************************************************/
* G. \& [2 I6 `, J# Q) Y
unsigned int ECAPRead(void)
6 N1 }6 x% N/ Z: m3 z, A
{
3 T, f7 G# u$ b; H5 O
unsigned int capvalue;
' R- m$ r2 x8 y/ q2 x
unsigned long frequency;
& { K& t* R! p5 t: l# q* }: N
8 @7 ~$ A p7 C( ^* E
// Event1 中断标志
6 T1 H7 x+ j+ Q: A
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
0 l8 s3 w1 Z. b, G6 p$ ]$ c
{
& |% F S- |2 m6 Q% z: a
// 取得捕获计数
" I/ {1 b" u+ w! I! J
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! t- Z3 r6 ^1 R2 V; F+ n$ q
capvalue = ECAPResult.cap1;
% R1 z. h+ s8 O+ ^1 A# K) D7 D- ]/ I
8 w" m: _$ M7 ?9 V5 `" a c# k7 O
// CAPTRUE 模块 228M 时钟主频
& g6 b4 \3 @0 [" q. }" n6 z2 L- \- E
frequency = 228000000/capvalue;
" q) j w% [3 M2 d! G G
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
! y- c7 A) S) Q+ Q. D' A
3 N% U( ]# R. j1 Y) S8 a
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
- g9 w ]4 x; ?( C, D- i7 o
// IntEventClear(SYS_INT_ECAP2);
B* I) S" E: c0 |4 b; n: Z
}
3 _! L s s$ A7 L) f3 m" j
return frequency;
9 s% R; b' M1 ^- k+ b7 k
}
6 _+ m# {1 k8 J; P
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
' v& m5 _0 s4 v3 W
[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