嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
5 ^ C8 s" J, G5 p% _. _
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
' |8 [9 L0 U+ C( b- F$ v" |. R" \
/* */
* j6 { @# E* v
/* 宏定义 */
, ?- g/ t9 e: t
/* */
9 v" L+ O+ a; I
/****************************************************************************/
9 r- y- F! `8 K* C" y
// 软件断点
]7 Q, L2 U9 `& G. N
#define SW_BREAKPOINT asm(" SWBP 0 ");
6 R5 F) C/ p# Y2 Y
: ^, E/ ]& ^6 p9 d4 K# R
// 时钟分频
( h) E2 W! [: |! k B
#define CLOCK_DIV_VAL 228
. b2 }# Z7 _; U
; t( }$ p7 y ^4 w3 H$ y G& {
/****************************************************************************/
3 y; q, v, Q8 F" O, Z0 w1 F
/* */
' L8 k; Z2 U$ R, q; B `$ F
/* 全局变量 */
& U/ ^. k- W1 [
/* */
+ O0 c* N" D' i2 T+ |! n0 h% p
/****************************************************************************/
' s5 U! x. g( ]( m3 h
ECAPCONTEXT ECAPResult;
- @$ W$ x/ H( K6 i5 T" @& ~
# n" q5 b) J% S. {
/****************************************************************************/
\7 L0 c; n# h4 F4 N% H
/* */
; l7 w8 g# e9 ~
/* 函数声明 */
0 K4 u: [. w: G; x& ]9 K5 K% b* { i' t
/* */
: X& U- D9 g7 p+ M! Y
/****************************************************************************/
% k7 Z5 T6 ^6 A" B+ T7 l
// 外设使能配置
. M" T0 D3 z# ?' X/ ~5 p0 p" i
void PSCInit(void);
n. Z" x/ G) ?% J4 b# f
1 p& C4 N) r+ {9 P f1 z- t c
// GPIO 管脚复用配置
2 _! F2 m. b3 F, C' R1 p
void GPIOBankPinMuxSet();
$ s7 m) G5 y6 S
, k7 F" W% N& A2 b7 s6 n
// 产生波形
% ^9 r4 v' u5 U9 l6 D$ z) M1 m- E5 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 U1 j0 N# s4 p& m# c* ]
void ChopperWaveform(void);
- Z9 G. `' n% q: I2 L* [" J
; ]; L5 \5 [: q. j# h
// ECAP初始化和读函数
; d& u$ l9 t# {6 X5 V/ O; i
void ECAPInit(void);
% M9 ^) W. a( L, o! ?
unsigned int ECAPRead(void);
Z* U9 m8 k+ ?2 h; S9 X+ h
& n4 A+ N( K7 w3 F9 m/ u& ~
//ARM 中断初始化
0 Z9 O$ L5 O0 d9 T* Z1 L' T5 F' f7 z
void InterruptInit(void);
0 X0 Z* l9 R; X8 I+ I- k* w
: @2 W5 D2 O3 b
// PWM 中断初始化
% g a- u/ N$ n% h/ d' N S
void PWMInterruptInit(void);
6 Z4 k% x8 v4 M% H
// 中断服务函数
* F C! w0 E% F( q5 B
// PWM 事件
* t4 V- C* I& ~
void PWMEventIsr(void);
' V6 ]; }5 ]/ U/ h4 {
// PWM 错误控制事件
3 ^' \* x: x. K4 }- I) I5 Y
void PWMTZIsr(void);
. n2 K8 o; s8 y, Z
$ _/ q0 v2 c& I& V
/****************************************************************************/
" \* k) V; E6 A) {
/* */
2 ~. Z o) k/ D! Q5 s; n
/* 主函数 */
+ U" d3 n: I8 z" X$ L; V% J
/* */
2 }6 P* R; s7 ?9 ^) l* R$ |4 x
/****************************************************************************/
- T0 i- o! `, {0 }2 X; H
int main(void)
) D3 [0 K, X! K; a
{
2 |2 ~9 W9 X- c8 k1 f( D" s. O2 M
// 外设使能配置
3 l& h d! c( g# y. R0 }) U/ V
PSCInit();
& l, k1 L+ d2 z6 M: y- `$ [ N7 q
9 Y+ A7 @! \ Z% Z; U2 v* ^
// 初始化串口终端 使用串口2
0 F& F! R6 ~0 J
UARTStdioInit();
3 w' X+ Q) h) g E. [
! x7 A9 i. e2 ~; ^
// GPIO 管脚复用配置
. B4 f- p9 `. u. d# e/ L* k) Z
GPIOBankPinMuxSet();
# R( u- h2 R c% Z% v+ t$ S
- o i/ Y' F$ L
// ARM 中断初始化
1 y8 G* X. R5 u8 X
InterruptInit();
1 u$ ]8 _: D- Q
3 c' T% q+ ?* u3 [5 [" p
// PWM 中断初始化
2 w& u+ C% G& U7 E- u! Y# L
PWMInterruptInit();
& y4 \8 H8 k3 ~- T' r. ?. g
; Z* }9 j( z5 f8 O" `! W1 v& P
unsigned char i;
8 g6 R. O8 {& z. g; y4 s& U
unsigned int j;
4 V. V5 k. L0 Z/ z6 z" C
* f' b/ s2 G5 z2 O ]3 r* E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& @+ S: T9 g1 D2 Q. m' m- L
UARTPuts("------------------------------------------------------------\r\n", -1);
7 C0 b( E) H$ a: w2 D3 r1 D' e7 U
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 l! \9 C; I/ Y% Z/ T0 [5 o
// 产生波形
5 I* C9 \1 K) p. u9 x9 }' y
PWM1ABasic(25000,50);
U6 s1 ~& E! O8 ~- J5 H
4 l+ [" X6 J; c K# L9 f2 e. Y- Z: ~
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
- g) K+ {' ?8 [4 ] h1 X2 j
UARTPuts("------------------------------------------------------------\r\n", -1);
. C1 Y/ g4 l: k, o% v U
8 j) m+ w ]/ j" n+ h/ S
1 A3 B c$ L0 \% i1 N
! i3 }$ a u7 G# N4 @8 f& }
UARTPuts("------------------------------------------------------------\r\n", -1);
5 T2 T) }) a1 }) c/ G
UARTPuts(" C6748 ECAP Test\r\n", -1);
" ] W. W# R; l: ~9 j8 d+ `( Z
// ECAP 捕获初始化
0 O, | {; Q( J F3 C% m! D
ECAPInit();
' J7 R: h3 c0 U& W) y9 @7 b$ W
UARTPuts("Initialize ECAP.......\r\n",-1);
. N$ M$ I J$ W1 q9 f8 g
for(i=0;i<5;i++)
2 H& B; n4 ~% X$ r! u& U
{
8 U6 [- E* F1 O6 y8 E% i
for(j=0x00FFFFFF;j>0;j--); // 延时
) q& s' z0 \! B2 U' D
ECAPRead();
4 O5 y7 r1 h2 x6 C
}
' z) S8 A2 n6 O6 b1 e# r
UARTPuts("\r\n",-1);
- F; ^; j) V% g6 i
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
. }# W, v, [, x/ m% v3 E' Y, ^
UARTPuts("------------------------------------------------------------\r\n", -1);
; R8 T8 A9 u; N: Q; H) g1 t
" V, M- L+ t- s5 T1 U3 y2 q
// 主循环
' S7 M& c u. i1 ^, y; q( C
for(;;)
! ?% @/ ]3 C* ^3 y, E& F$ Q
{
( {, z! Q4 `5 k q1 |" W
# K: s7 M& v* c6 G
}
# m) S8 a5 D/ [" U- v! ^
}
* v7 `8 z8 x5 p6 W/ k g
+ K' f2 Z2 J. `; R4 x
/****************************************************************************/
7 @6 t. `# O4 J2 F7 `4 |/ C
/* */
! o" T" d: C, p3 l
/* PSC 初始化 */
; v: f' ], `2 b! z. E. ~
/* */
9 K8 R& Y4 x- X9 U: V
/****************************************************************************/
# q3 k9 Q& M Q8 f; E. B
void PSCInit(void)
2 R s9 o( c2 B5 i2 j
{
& k( R) O+ q2 R* l4 ~
// 使能 EHRPWM 和 ECAP 模块
5 S1 q# g( E8 }- d& W7 F
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 E# @3 Y% q- {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 p- u& r! A, \, L9 b9 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 X5 p1 Z. U3 o& B' v& D
}
& u- q% h" w$ w0 ?" `: a+ I9 O! `& v
6 @+ q) e0 }. [$ T0 W
/****************************************************************************/
* F4 t8 C* z- D& s5 t
/* */
" K. B7 G1 @+ h# ~
/* GPIO 管脚复用配置 */
$ {/ F5 j/ b1 ?
/* */
% W" z7 M4 c$ u* ^% i6 ^
/****************************************************************************/
8 e- a: }9 z+ B( c
void GPIOBankPinMuxSet(void)
2 O* P! _" I% x. F: p$ I) r& }
{
7 k) J$ R3 b. z+ N
EHRPWM1PinMuxSetup();
/ u7 U' F, J6 k' f
; `. m! ]+ {2 O- R% T
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# E) C; @$ t- R, F' @% z* p
// 作为捕获功能时管脚方向为输入
# ^ Z1 M6 @3 C1 K5 a" Y5 }, f
// 作为辅助脉宽调制时管脚方向为输出
6 H2 N2 a$ F* z4 x" r# u# S3 T
// ECAP2 / APWM2
9 B7 y( n! P$ C( H! q6 p
ECAPPinMuxSetup(2);
Q3 _$ F1 k# d; s+ `$ D& o! M# R
2 ]0 p" w$ z3 G- B; F
// ECAP2 / APWM2方向设置为输入
( H/ s) J5 C3 y7 I8 h' W
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
" r4 U s& p( s) H& f" j
}
) r8 H3 c# Q' i$ y% p9 N
3 O3 U. ?0 I1 X
/****************************************************************************/
6 b6 Q m0 M. I& R
/* */
' L7 S: b8 J4 P) B0 w
/* PWM 输出波形 */
# j& }/ f6 _* G" }' z; s- _" v
/* */
% r6 m! N! ^% @% \- [; I. }& k$ G
/****************************************************************************/
3 s6 g) q3 ?3 h) h% g
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 v$ j8 R$ x( P7 ~6 {3 }& {$ E0 `
{
. B5 p! U! f2 k0 p1 B) B" e
// 时间基准配置
/ ?3 L2 x7 Y9 j
// 时钟配置
2 ` y2 l1 M8 G3 }3 f
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& {! K1 D$ |2 Y) w
+ T$ ~# X& c; N( x& s, p
// 配置周期
* V) z) F( S; d5 j6 u, I- b
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( m" G4 q' ^: t. V! r! U3 r4 C1 U" Q
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 P/ |4 q! \; u7 @
& q. X/ q2 c5 C& k* d% O
// 禁用输入同步信号
J5 x5 M) e2 }9 I, w
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" f' I% _9 F! t% s4 h
z0 ^) T$ `, i& f
// 禁用输出同步信号
6 m& z) @' x6 z; c! o. Z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ z6 A: n L6 z! f
# F S$ Y' h1 A7 K6 p# p
// 仿真(DEBUG)模式行为配置
6 j! |$ ~6 N6 F- ]# C
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- Z% B; h" B8 t5 x9 Y; _' R
7 K2 V3 K7 J6 r% Y1 E; e- K. c0 p& a
// 配置计数比较器子模块
$ d: V; E q5 t* F: E; Y- G
// 加载比较器 A 值
+ ~0 V) l' I/ @5 _1 c
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
, n( b% V2 ]) x" T; t
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 [3 i1 \5 I' F: {, z
( B" I. E! |& H
// 加载比较器 B 值
% u/ @, S4 `0 t0 X6 h: x
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& v9 b: E; ]: N5 }4 h
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% M( }( p- L+ p' |& x
- x4 E3 {# E8 d- o
// 功能限定配置(输出引脚触发方式设定)
: [1 G4 i% W2 y7 R/ ~# A4 ]
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: g) ?" c* }0 W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
* X) K: t( S0 b
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* x$ x% p: N" w! r& D7 G& E0 m
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& S3 ~; J5 D/ Y$ I0 K; ?
. l3 \: A/ N- t& B: w, ~
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ k5 t8 p: `" W: r
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) _' i) ]. e; t% b3 j, Z9 U7 O
% @6 i7 w& Q5 Q
// 禁用斩波子模块
' Q! r! a' a# M0 T4 v5 I
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 n' u5 W0 C. Y, ^3 [) W/ y
% G: {4 e1 t/ r' J- x; g
// 禁用错误控制事件
) r4 h4 }9 \' q9 z$ ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& X0 f0 R5 B$ X! P, Y% Z1 @1 x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
" u7 n1 c v' s1 n' l* j2 {' B; {) o
# I1 P& f" a% Q1 _1 p+ X9 w
// 事件触发配置
* V2 [6 F/ ?9 u
// 每三次事件发生产生中断
( A1 j& `5 s: \8 [
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
Z$ K( X- l" ]9 M, t
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 Z5 ~0 I/ _" }
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! h! z# q1 c* i; p3 b) Q
// 使能中断
2 Q- V. {, f) Y# r" `$ b
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
& `+ [2 H5 W: W4 R# J% k3 Y
9 f: g+ P4 q$ A8 h
// 禁用高精度子模块
9 E4 P. d2 l1 @+ F
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' i2 G5 x6 j+ m3 U/ ^: d% x
$ ~/ M' _, T. G1 ?/ h
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 h+ k3 E- s# Y' d
}
4 L& i2 b! R' O
; A, u* k+ m1 f% m% l% g. {
void ChopperWaveform(void)
0 x, p3 W1 O" ?9 g% h( B
{
* n0 _, }6 L6 q! T* v5 g
// 50% 占空比
, c4 \4 R' t* g- c3 |6 b
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
! _- K3 |) D5 D
// 4 分频
+ j. y/ n: M0 C3 X
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 `# I: b, P' B! ]
// 单个脉冲宽度
2 g. Z* u, f; ]) M7 Q' o7 @
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. ?) c6 @1 X' y, J# g. R: i
// 使能斩波子模块
2 V3 q2 K8 n" Y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! ]* s) O/ ` X6 ^
}
( Q$ D% h# m% J$ l4 D" h4 I
3 V( |4 H: N2 A* ~9 o) y
/****************************************************************************/
$ t* m9 V* F* Z0 t- x" g. m* Y
/* */
& r% ]1 r# F5 F1 Z: c. q3 N* g3 [
/* PWM 中断初始化 */
& L5 k" a# f3 h8 c+ B1 d+ ]2 J
/* */
+ u) r% o5 ~3 H* ~" b- N2 C8 r
/****************************************************************************/
8 }& ^4 _% [# n
void PWMInterruptInit(void)
0 e) e) M w. n& J' v+ R) j6 i0 S9 K
{
1 \- @( \5 l* F% S% s* y, M
// 注册中断服务函数
" @ _# H2 |' T9 d: U3 |- n0 ^
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( P2 V) f5 H7 K' z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 Q) q. Q v" l2 [( } C
3 ` t. x4 V' z* N9 m
// 映射中断
& K+ k, v: j# @/ H
IntChannelSet(SYS_INT_EHRPWM1, 2);
& j6 |6 ?. x3 M$ C
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" Q8 K& r+ u% m
. f$ m- ?9 a1 L; V: d
// 使能中断
1 v+ l: w% H% L' i% Q& y* x7 f0 ^" E
IntSystemEnable(SYS_INT_EHRPWM1);
# o) `; D q, V$ ~- `
IntSystemEnable(SYS_INT_EHRPWM1TZ);
. z" m; e& S9 Y
}
7 `. k' A9 W0 B) }" i5 z4 i
! b0 o8 P' m0 N( \ w; s$ [! G
/****************************************************************************/
6 _- x7 B9 f" x# S! k! k" I9 X& x9 a
/* */
9 ?8 \) ~+ ]' ]* I( S
/* ARM 中断初始化 */
/ @4 A) l( Y$ o) [
/* */
0 a4 Z- I' @7 m; @+ J, g+ g: E
/****************************************************************************/
' ^5 u, O; A' ?& h/ L
void InterruptInit(void)
0 m, J; w" _; P7 X; w/ L/ c
{
. z4 T' Z+ l6 q3 e$ S
// 初始化 ARM 中断控制器
: ^) M% U" M" E; ^
IntAINTCInit();
( J& k4 y2 b+ X/ Z) q4 h4 i
" M4 |) D ?( S4 X. | Y$ p
// 使能 IRQ(CPSR)
: [+ L) n( q, w: @, S. P$ I. Y, r
IntMasterIRQEnable();
) o' I* w+ H. s0 x) Y
3 f( r! l& A# F
// 使能中断(AINTC GER)
% ?7 q& ^. a6 G7 ^! R( F: x& X
IntGlobalEnable();
# V/ c# k) a6 _; ?8 f
+ w! b' [: u: A/ j1 U
// 使能中断(AINTC HIER)
2 J5 y R! ?+ F% W% X& H
IntIRQEnable();
5 C! j% R0 W( r+ p6 `/ a6 r' N
}
. @9 P0 E3 ?: p. u" ^/ a* i( I
5 i0 A' Q# s+ f& ~0 b( R/ k
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
% F* p8 ?& J) O4 Q. C
/* */
- l, T8 M1 n% B4 Q5 I! R3 U
/* 中断服务函数 */
/ d# |8 L) ?% g0 C% g Y. m& G
/* */
, S9 A" x6 n+ i: j4 i7 h+ {
/****************************************************************************/
4 ~8 b0 P1 q" T6 [, _/ ~6 B" @
void PWMEventIsr(void)
+ ^4 ]* A! E7 }; m) @
{
' K" V: M8 i3 c1 l& f% w# W
IntSystemStatusClear(SYS_INT_EHRPWM1);
# @! v) }" ^: b" z* j2 u
- Y2 F& [3 _/ v) W6 W$ \; ?, Z
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
A' l, q1 x0 ^/ {" P. t* P# P
}
" v* e1 y1 J; M( T& p' j
! ?( {" a6 q2 q1 ]9 Y- `. S k
void PWMTZIsr(void)
. A( r* U' {4 M4 d- k
{
/ E4 p& Q0 x% Q. T) K
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
) l0 s% _' a; F4 X
' p1 \. q j3 `* b* B
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) c8 J) m8 \$ a5 U
}
) \% M9 H; E: v) G8 P1 U; I
! \6 r9 Y& T5 @! X. |
/****************************************************************************/
6 Z* m8 A9 @+ ?6 I3 d
/* */
5 T4 G; [8 E8 p5 i9 r7 |, J b
/* 初始化捕获模块 */
! m0 P, D6 p& A' a) U7 ?5 W
/* */
: t2 w, |2 e# g6 z8 i
/****************************************************************************/
- e) g4 l- ]& _4 f7 Z% Y
void ECAPInit(void)
2 f0 r+ N$ n$ F5 W9 w3 T; S. @
{
1 z) p) r* @" _
/*-----设置 ECCTL1-----*/
& }+ i' j) I( \$ s' |: J# R0 @4 E
// 使能CAP寄存器装载
: j; W- R& m9 c% }, y+ z) B
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
C) {0 p( ~" ]) Q. U
// 设置预分频值.
$ X6 H; p; u1 s$ h& e+ d
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
& C3 x# B# d+ C8 H. K9 U
// 上升沿触发捕获事件
0 s7 `: G+ U) k+ i0 t
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 n2 w3 D7 B8 g$ m, R
// 输入捕获后重新装载计数器值.
! @3 }$ d0 M$ }# N7 V
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% B( L& i4 |# Z. @ ~2 d
4 W4 @8 d3 D1 _% |0 m0 a9 C, k& {5 p
/*-----设置 ECCTL2-----*/
. ?$ m" ^% ~ h: z9 [: H/ S# L
// 连续模式
: U! d$ m/ G! b! N/ a7 k
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ f% _: f" w; [- ^: q
// ECAP计数器TSCTR持续计数
- ^3 L( M- g g y; d
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; y: Z! a4 z9 a. ?0 D
// 禁用同步输出和同步输入
' T4 k( p5 X6 L+ i. Q6 ]
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
7 |2 b* ^, w3 _& ~+ n
// 配置 ECAP 2 为 CAPTURE 模式
& Q0 r c: Y' \ o: {4 y
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' g. M; [1 i" @! o
0 r# W7 r, J, l3 ^) V/ b( D
// 使能中断
3 n* b6 R; k4 Y2 W' d
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
* V& z4 D/ p+ U9 ^' V
}
6 G' i- h# @1 ?! v
0 h3 F" J" p/ s' D! j
/****************************************************************************/
1 O% z2 K3 Y% P' E) \. K( D, J
/* */
- T5 M I2 L( S) m# u2 @) b
/* 取得捕获结果 */
. ^: i1 W! ^9 c4 f7 u( s
/* */
4 Q t* ]4 G* _& e
/****************************************************************************/
7 G- a" L# J) c; z
unsigned int ECAPRead(void)
/ K" C; u4 K. I1 e
{
& T9 B4 ~! _& G+ `6 q: V
unsigned int capvalue;
+ A4 d& {/ K) [) z c
unsigned long frequency;
; h/ ^. C5 [% F$ v: Z. j/ k$ n
+ s; @, ^. X( `% B" u, \% Q
// Event1 中断标志
3 G& z6 c; P& K- t9 E, X
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
; T+ P; D* S, x7 n
{
5 o" A. D7 n/ z0 F" }) \! u- J1 U
// 取得捕获计数
; {2 W( X2 U* [
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
3 T* W7 P' Q! w! g z
capvalue = ECAPResult.cap1;
% W+ @5 M6 q: Y$ p) l' O
5 b' Q. y) d) |+ _/ |1 F* c4 E4 f
// CAPTRUE 模块 228M 时钟主频
4 Z- T9 b" b7 t3 ~! b+ h
frequency = 228000000/capvalue;
4 V/ I) u! | S6 z& j
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 h7 ~' D1 e. i! H, `7 ^
& P% `+ ]5 L3 q& w& L
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
1 e- t2 b* l J5 k
// IntEventClear(SYS_INT_ECAP2);
& U' u8 u6 s( k2 ^
}
) B. ~2 W# g" ]) _: N
return frequency;
7 B/ u5 W( D6 Z9 d% h6 }
}
8 l1 g0 E- { g$ F5 `; e+ e8 a
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% D" b$ k5 p; J1 G, @
[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