嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 C0 z7 w; g" N% p
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
' } P4 g% ]5 |
/* */
: H1 a3 n9 q) n" S# P
/* 宏定义 */
% P6 _3 o9 L' V& g4 j% }- m2 N4 U
/* */
$ u0 Y% \1 a0 I" L5 J) h
/****************************************************************************/
# q$ L Z0 I& ?9 y1 i
// 软件断点
) l' a6 T/ M! i- Y8 Z# D
#define SW_BREAKPOINT asm(" SWBP 0 ");
$ M& w0 e* n [! M9 e& |- l7 x) d
0 _8 X3 `! p, l4 n5 c6 ~" t
// 时钟分频
. V, ?4 U7 g& G' ]' S/ ]9 t& W; D
#define CLOCK_DIV_VAL 228
8 p" n" n2 {- Z; s( { ]" g; p) @
- F( W( k1 e4 T* w2 K- _
/****************************************************************************/
' ?/ X0 {& _' A7 Y6 l
/* */
& s+ Y( u/ O9 ~% x5 T
/* 全局变量 */
# x- H8 g2 |: F5 |% \' J- \# j2 X
/* */
( {; S! N+ _ q- {# S z4 \
/****************************************************************************/
7 z1 c: w# ]* N1 `& v* p- H, S
ECAPCONTEXT ECAPResult;
: T; q$ B9 Z( O
/ K" k1 N! z5 @" n. D0 j8 E2 U4 A: Q
/****************************************************************************/
2 s! ?: U* ~5 R5 {
/* */
: F& Y% i# d1 H h
/* 函数声明 */
& S$ L9 f% s" q: ?9 p
/* */
2 D6 l9 _0 ?" n1 @$ w
/****************************************************************************/
, B, h' k/ b, M1 u& d4 I( s, _
// 外设使能配置
5 Y# H: T- N) p# z- z6 O
void PSCInit(void);
9 q) m3 @% S, `, I0 u3 N5 G# G
9 U7 f) S) b& V+ D0 [4 l* K
// GPIO 管脚复用配置
% E) {, r$ I- @& E) Q" Q) T
void GPIOBankPinMuxSet();
1 Z% ^# l. k$ c9 P% _
9 i" M6 o2 `+ H, Z8 P
// 产生波形
! E6 O3 m2 |( d. b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
! K; ^. t6 |2 [
void ChopperWaveform(void);
* H8 h4 S& P2 q, f7 N
. X0 ` j5 j' g; u6 @) e
// ECAP初始化和读函数
* ~, G4 i6 Y4 A6 x1 W
void ECAPInit(void);
8 L# U% h: B4 Z, J. A9 k( J4 p/ p
unsigned int ECAPRead(void);
- o/ r; {6 Y' c& Z& t& S& Q
0 `( D4 ^6 i2 g
//ARM 中断初始化
- ]& x4 R2 [; E; |3 \5 Z- F
void InterruptInit(void);
& D. w, k' c/ R
8 M% }+ n/ S, b9 X/ z
// PWM 中断初始化
2 {- o# u" O. f! q. C" W% m# X# t
void PWMInterruptInit(void);
# u) Q, p0 s3 ^5 b& ]3 b8 i( j
// 中断服务函数
# }7 @/ c. |2 a8 G& Q
// PWM 事件
/ u6 X) m, C0 x( l
void PWMEventIsr(void);
( b" }6 ?! y& q& ^5 {
// PWM 错误控制事件
( y' C* i( X2 x
void PWMTZIsr(void);
# r# F9 y, ? c Z" g1 w; w
$ p9 p* d& D; S5 \' c# ^1 _* [( G
/****************************************************************************/
4 H6 @1 O1 t* n+ d$ v
/* */
m* m: S. y$ G% S, |8 c
/* 主函数 */
1 L5 \# j: [" D7 c0 t4 {
/* */
3 k: Z& h3 X4 n
/****************************************************************************/
! @, R1 Q( Y4 Q/ y+ b
int main(void)
4 a; ~8 a* `+ O2 m7 ~- `6 U
{
& u. G! C7 B$ T# X9 X! o0 O
// 外设使能配置
" Y" r% q$ Y, ~) u6 V
PSCInit();
7 J$ Y0 T% W' N% |% i
4 v& w) m& J1 _. K
// 初始化串口终端 使用串口2
& ?' \5 t/ i$ }& n
UARTStdioInit();
3 R9 |* ^5 d- V& u9 w$ y
! q% L/ N) p# a# D
// GPIO 管脚复用配置
# u/ J Z: o& W" ]+ h. ]! A# \5 ~
GPIOBankPinMuxSet();
! s! x: Y" y# Y9 U9 R) @
9 A/ ?, R" r+ l( e
// ARM 中断初始化
- o$ S4 g! G$ F( ^; R
InterruptInit();
. W% ~; ^( V2 U/ z* L( Y, D
! l; d' E3 r: V) G
// PWM 中断初始化
* d; W9 \' I# N# I6 g# n5 Z, m# r
PWMInterruptInit();
- H5 E0 H$ k+ _0 o' `
- D n2 m# v* W6 j7 V! ]
unsigned char i;
4 W' c# T* m7 O6 x( O% C4 N# v9 z
unsigned int j;
- R Q! N8 J0 k% y- k4 ]
: R$ e9 A) e, O' r! t
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, j; r. c9 t0 l7 G" p, i; B
UARTPuts("------------------------------------------------------------\r\n", -1);
0 N* Z/ I8 T3 e% h X# L {
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
4 n9 T- o9 A4 q( f6 b% i s
// 产生波形
! q# Q- ~; x7 V7 |
PWM1ABasic(25000,50);
2 K0 X% k* e$ N/ \
' d: F" p# X4 l
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& ~1 B: [( I3 X; x5 l) |/ G2 h
UARTPuts("------------------------------------------------------------\r\n", -1);
1 _1 @) S) x% H. V0 l( j- g' [# Q) v
1 q5 t" E" w: Z' d; J0 W" q4 r
( o! p, X1 P% D- E
9 O) R$ ]: F6 T0 _$ m5 X
UARTPuts("------------------------------------------------------------\r\n", -1);
! E9 T- P" t! h- N2 M
UARTPuts(" C6748 ECAP Test\r\n", -1);
* j3 f+ R- T9 ?
// ECAP 捕获初始化
. Q q* O4 q' M7 ]8 S# F$ p7 \
ECAPInit();
3 @5 R* ]- J& J/ E
UARTPuts("Initialize ECAP.......\r\n",-1);
" D- P8 ~" l0 F# l; G
for(i=0;i<5;i++)
- d$ S9 k7 O1 o
{
, z: F b0 C5 \4 s) a, u- ^0 H5 f, I
for(j=0x00FFFFFF;j>0;j--); // 延时
2 [7 Z; v0 t( v9 c! Q/ s% K
ECAPRead();
5 J( _' F9 j( |+ `8 ^! J
}
) G9 X, J6 c! ^' Z+ m
UARTPuts("\r\n",-1);
8 F. ~2 w8 k8 ^, x* _; M
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 L0 k' d6 V8 S0 l3 R& G; i
UARTPuts("------------------------------------------------------------\r\n", -1);
) m1 W( u9 ?1 P! o/ d
# k6 s: r8 O4 G( N+ `
// 主循环
( {6 Y7 m1 P u) @) f& f
for(;;)
* o1 ~4 T: [& g! s' u2 H2 V5 n
{
- p6 G" u/ n+ [# n
% P2 ^1 ^4 V9 p. j5 W5 G# ~, m' y
}
; l y; T. `# H/ L/ G
}
3 _9 w7 P+ f# b) }) j* q* I4 m
/ s4 I4 Y5 g3 H3 {6 U6 c% n
/****************************************************************************/
- B0 e: h% x" |; I
/* */
/ C1 K1 Q( z% P9 E# {6 a
/* PSC 初始化 */
/ v( {6 X. A% L+ T5 B" J
/* */
, S( }2 H8 r0 u, t7 E& U
/****************************************************************************/
% V6 p8 e# P2 T; H- |+ O
void PSCInit(void)
$ d3 @$ n, L" f# D
{
. j$ Q; l) @6 ^: ^6 D
// 使能 EHRPWM 和 ECAP 模块
0 `4 X$ C9 U# y% O1 z+ g! o Y5 N
// 对相应外设模块的使能也可以在 BootLoader 中完成
' J1 G& m7 z( M; m" e: D$ q2 |2 t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 O- Q5 }3 s+ [% z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 m$ F" Y5 d( ^: h Q# K
}
6 _; _' u' l* N9 X
# A& h4 E3 N- Y6 Q1 Y
/****************************************************************************/
) c7 R3 _$ W3 Q) u! {4 `# M
/* */
! n$ F8 T+ v$ i) ^, `# Q4 Y, G: ]& ^
/* GPIO 管脚复用配置 */
6 H+ A g& l/ r# T7 E ?; O) G5 s
/* */
+ Z' F3 j' i7 V' p
/****************************************************************************/
8 `. Z# K2 c$ a, _+ ^% a& @
void GPIOBankPinMuxSet(void)
. |) q" C) j5 x. h9 V3 s9 k
{
& t' h5 S4 x7 T' A+ Q+ x
EHRPWM1PinMuxSetup();
! ?+ l( N* a/ u; X
3 B- }: i- ~: \1 h
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 S- |1 u2 a, ^3 Z
// 作为捕获功能时管脚方向为输入
4 u2 P N( q# m3 q u' Q) _
// 作为辅助脉宽调制时管脚方向为输出
' ^, J Z9 d) p+ C& J
// ECAP2 / APWM2
, J1 v) @1 @; s; M9 S0 e
ECAPPinMuxSetup(2);
: \# Q! U" J, t0 d
$ j5 K7 N1 g6 C$ B F/ z
// ECAP2 / APWM2方向设置为输入
( h0 h1 G# w- Z: F$ R6 I& U
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
0 C. _/ U: h( F( A% g# ?( n6 o( i$ E
}
* E6 _: e8 i" `/ `( @
2 F, s3 Q% N. e2 R3 o9 h
/****************************************************************************/
4 ^- S: n& g9 n% I
/* */
/ w( w: `, ]& R9 d; s3 R! M7 Z) e
/* PWM 输出波形 */
* Q8 g3 v0 N) [' E
/* */
. K Y& L. n. e( G
/****************************************************************************/
! w& R& d' V ]( B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 r! l( h4 a7 G) D3 M4 }: V
{
7 U8 K8 \9 ]: ^
// 时间基准配置
+ R$ [/ j' \. f/ }3 K
// 时钟配置
9 ~. t. m# l8 `1 S) G Y9 w: l
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 g) B5 Q. e4 d% q0 R+ \- `$ ~
3 \; R0 n3 k+ e* b% K
// 配置周期
/ G/ f, f/ x% g2 G6 m4 G0 s+ f
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& J6 g3 [ N8 E: G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
l7 a* n& ]# o
) |" \2 ]8 ]; p* I' q* v" K
// 禁用输入同步信号
2 X, Y7 p: V' Z4 U. _" r
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ @2 ~9 l/ ~# x. |3 d9 ^
3 M* {3 N8 ^* _* F8 w! G0 q/ K3 r# A
// 禁用输出同步信号
: D" t% U( {: R6 k' f+ U
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
7 x5 s# E& g; e$ J* t+ V1 B' r
& F2 n7 w7 X+ |6 L* a
// 仿真(DEBUG)模式行为配置
/ E7 W( m# k4 `! ^+ n$ w/ _
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( C! x( g0 i+ R4 g2 Y9 Y. `9 ^
* W( E- M; C/ }9 I4 T( I# Q
// 配置计数比较器子模块
- x* U1 H; z8 `; O& A. C
// 加载比较器 A 值
' `# a9 [! E9 _ H
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! C# q/ \4 a( D5 m+ W
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" Q3 {) m$ P0 O! i7 _
h% O8 M6 x- @: c
// 加载比较器 B 值
9 Q) Z N- U% t- s n- y
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, ]1 f+ F7 s6 Y7 u
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 l& x% X. ]- @ n C8 S. R& A
3 F0 [; n! J7 n. Z( n: V0 x& W0 W) z
// 功能限定配置(输出引脚触发方式设定)
4 K+ G. r# Q! Q3 ]3 ?1 L7 ?
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
u, I: {: e+ |& Y% h, g1 i
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 p+ T# x1 [1 f3 D2 ~2 F
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: |) h% x' D5 M" d
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; {. ?: T: M/ Y' g# J! P& t+ E
: w' s6 b, o6 l! Z& x
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
, F8 U7 e' a1 n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) x9 i) Y; ~$ \1 M) v8 N1 f8 Y: R
) Z% `, G: K+ I$ e. [) H
// 禁用斩波子模块
' |) p7 \- t( t# K0 p/ H1 _
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 Z6 C5 {+ |$ X4 U" h+ E) w
. F2 F( o" z7 S# |
// 禁用错误控制事件
1 _/ u( a3 t5 j0 O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 W/ C! O' u0 |. x( n
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 h) F7 Q7 [1 w) y6 V* }2 u4 `
' w4 f" e% I5 y5 }2 _& d: O y! ]
// 事件触发配置
8 G2 c( j# T2 C% h0 x
// 每三次事件发生产生中断
. }5 v: W& ?& o8 y, d1 O
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 E ^0 t; E6 Q9 |6 `( O* A
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* O8 V% h% w. m3 A, D9 g/ A/ `
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" A# S% @6 W: Y2 a# M7 K" F
// 使能中断
( @" o' O% x2 [0 l
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 s2 }' n/ ]4 q2 q8 A7 [
1 r: a9 p, X9 |9 k. L0 F/ H3 z
// 禁用高精度子模块
) |6 d% k* I0 z9 @+ g
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( ~* I& W3 c6 F9 ]) J$ i h
8 G1 k! L2 j+ ]; E
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! M8 t. X$ k# }
}
9 e2 d& O; s! ^8 x3 K6 e: n
# i! t' R' F* v% s; u+ D
void ChopperWaveform(void)
2 p' _. R4 B+ D M
{
! h5 O3 J: T. T' a% Z( g$ }
// 50% 占空比
; A' {2 [4 O/ u$ |; `
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 L% l7 V% w$ u8 Y" i& X
// 4 分频
2 F% G5 I9 ~5 e
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- b# r' K% ]. k( j3 u h3 s
// 单个脉冲宽度
# R$ H4 J9 b2 n. m+ @: _$ [; P
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% \3 P2 }, k8 S) @
// 使能斩波子模块
: G9 B: r; j `3 F
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 W% C+ T$ C( l# x
}
! w/ e: T0 d# }# n. J# u
3 `8 @+ V. L) P* k% E$ y, V$ u/ o) K
/****************************************************************************/
, M7 T2 x3 [5 o2 F9 {
/* */
. d' `+ }9 n/ K: @) G, B7 y
/* PWM 中断初始化 */
$ a7 w& y" a6 F, A/ a/ W
/* */
7 L7 s- t: F4 d$ y: r) V' x
/****************************************************************************/
H% \, \ |2 [
void PWMInterruptInit(void)
5 }/ W: w" L2 h8 B |
{
' E: J+ w% @0 |6 m# u
// 注册中断服务函数
: _) e( g3 _+ t! \' ?" C
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' a0 k$ N$ l% b, B, Z% p% J& I9 f. o
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; f, x) s0 a& h1 |$ K& w" H% |
5 J( y' V, F+ P0 U1 h, q' S z
// 映射中断
0 C4 K, F" V9 v& T. ^9 p
IntChannelSet(SYS_INT_EHRPWM1, 2);
3 x; K0 c7 R! T, l
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
! w9 f9 T6 ]/ j2 R- u
5 I g: D5 ~6 [
// 使能中断
9 h( m% P) A6 H; ~7 R
IntSystemEnable(SYS_INT_EHRPWM1);
) e+ w& t9 q8 Y+ a( i2 @! Y
IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 z( v7 ]1 S- z% ?
}
/ v: M/ `! n6 b- ~0 A/ X1 T
( v$ s. c+ a+ k/ O0 a
/****************************************************************************/
5 D2 w) ^0 Q+ g8 h0 Z( Y
/* */
' V3 W( @/ i; c1 s% _/ {# y
/* ARM 中断初始化 */
1 r# i# N- M. z% ^' ]) M
/* */
9 o; t; g' I d* f
/****************************************************************************/
+ W" Y# Y5 T; a3 i9 i
void InterruptInit(void)
4 K5 ?2 B$ [7 e
{
0 X* |) [' c9 _; H* z
// 初始化 ARM 中断控制器
+ J* P& j3 O( z- z1 k! D
IntAINTCInit();
. V0 p2 q, V, c; _* Z. }; K+ ^
0 G/ |! N/ O5 a3 k+ ~0 J5 I7 q
// 使能 IRQ(CPSR)
( ` C! w2 d$ _9 i
IntMasterIRQEnable();
, i6 a5 m6 V2 w5 V
; q- ]9 n8 \4 O0 L/ i
// 使能中断(AINTC GER)
. d2 K C4 q( G, v. m" G1 l A+ C
IntGlobalEnable();
" K ~9 F% M0 s7 [- n2 ?
( Q- c. A, `) @8 t" E
// 使能中断(AINTC HIER)
, S9 m' i$ U$ O& U: b; @
IntIRQEnable();
: f$ Y. s0 q+ p$ G) X
}
! V1 |6 b4 m7 @1 d6 ]
5 b7 _$ S: M9 w9 O/ O1 l
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
* v( s8 `" W' K
/* */
% W* P% ^+ o6 U$ K
/* 中断服务函数 */
$ s6 G: {. n( c, a R4 P! k
/* */
: N1 N4 d7 e% X! m% x! a
/****************************************************************************/
6 o4 b. M; r6 C( m9 O
void PWMEventIsr(void)
" M3 ^$ p* C/ j
{
* [# }) ~2 e& l5 }0 R
IntSystemStatusClear(SYS_INT_EHRPWM1);
% V) Q2 X! P2 }* ]
% z4 F8 w1 V! J1 b. k( z
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- A9 ~8 f! V J6 b/ I8 l
}
# B2 t: C+ n; \. }
7 P! s3 w9 N' g; e# p4 J
void PWMTZIsr(void)
( D7 C" H& T: {. Y
{
# r: g2 ~! c8 |2 i
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" F8 S% @/ w; G
$ B! z! d5 O, [; U1 F6 M
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
( _5 @' w7 m2 E4 v/ I% H
}
0 `0 ~7 ]5 A' ^1 Y7 W+ l9 K/ b3 N i
# p4 x: {1 H) R; f" r" G
/****************************************************************************/
# C* p% D" c; V
/* */
1 h! `; z* m |( a( d* N
/* 初始化捕获模块 */
# Q& g; H' z0 o+ a& f( r% t
/* */
# s. Y+ a6 g: A3 z0 A
/****************************************************************************/
1 i! T' g+ w3 J7 |
void ECAPInit(void)
+ }2 ?# [& U \- g; Q; W* [5 @
{
( C# c9 ]( r2 M- c* K6 b
/*-----设置 ECCTL1-----*/
4 S7 a) C ^7 F( g4 z4 U& X
// 使能CAP寄存器装载
' Y' R4 Q, U) r- J* L
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ c7 Z/ D: G) g6 V
// 设置预分频值.
- H8 `" ^* N8 i! {
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
$ N+ K& a3 o" D% o
// 上升沿触发捕获事件
- q% q+ j# k$ H
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
- B' k; J9 V7 f& R
// 输入捕获后重新装载计数器值.
4 }8 W7 X. O8 s. m' q! w
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
; {- g1 C# N6 }# r- R
& N: z3 s& p- _* G [" |! d
/*-----设置 ECCTL2-----*/
9 i$ o, ^7 k1 G6 x) s
// 连续模式
4 `2 C6 m) z# ]8 _3 Y
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, l Y: F$ H* G& [& P" x
// ECAP计数器TSCTR持续计数
3 R( b% \+ C/ k, g6 l
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
* D8 o& X. q5 [9 i" p- a
// 禁用同步输出和同步输入
. H, F: f" B8 W" }5 D5 D4 l. @
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
Q% x+ W$ v4 F
// 配置 ECAP 2 为 CAPTURE 模式
3 {+ i5 Z* K: w
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# [* j/ p! W0 z. I8 N4 h9 [4 F* e
, h3 B4 z+ C4 i0 Z
// 使能中断
K+ T9 O- f1 l" p. c$ \
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, Z( b* ?! L& P
}
: |% R9 S# l; I1 i3 v# a$ d$ k# h: ^1 b
+ ~7 Z! K: l8 S0 s) O& L
/****************************************************************************/
- J6 f2 w* ]5 X8 p1 o+ Z1 {
/* */
% T: }; v X, K" D
/* 取得捕获结果 */
7 R* ?3 f" K; W- G* A
/* */
5 v$ D' g( o( m' r2 \
/****************************************************************************/
! N- v9 Z8 W& C# c; ~ T3 a
unsigned int ECAPRead(void)
. G; ?+ R" y' w" u& I N- v
{
: h B3 f+ p( \7 n8 n( ?6 _% {
unsigned int capvalue;
2 p; C3 p) L) d% Y' \' W& N; m
unsigned long frequency;
3 t0 `$ D% T& D2 @5 t- l ]9 D
. x+ f0 N% ]# r
// Event1 中断标志
; \$ k$ K I6 h
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 S; i5 H# }! D
{
# _) u2 U7 i+ ]1 U
// 取得捕获计数
1 k2 x0 X [; r1 L! `8 _
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
& ]3 `6 D8 X* Y
capvalue = ECAPResult.cap1;
' S; z" b. y8 x. U/ ^9 }8 n
& S2 U Z! L2 J& i* r
// CAPTRUE 模块 228M 时钟主频
- S) u* E6 P' \+ j8 n
frequency = 228000000/capvalue;
8 M; K) R7 V+ w! [" t1 x. ]( M
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
' m9 M( `, m( e! V) ^( H% H! \7 v
7 y& d: o' S3 K" e
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ `; O. ?1 \' J8 p3 E2 ^# Y- c
// IntEventClear(SYS_INT_ECAP2);
- I2 p5 F) i* @% v Z: W& ?' U
}
( Z3 s& s4 K) W3 I5 M5 U
return frequency;
# m4 O- S. Q9 |$ |( M5 c2 E
}
$ u, K) B2 ?) y2 I
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 @- a1 F3 ]- F! d/ u9 O0 G; 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