嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 V/ G3 w+ d+ w! C& B, g* f0 H
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
( s# j! [ Z6 ~- h' J: v* [3 |2 L6 h
/* */
3 Z: e6 P% c+ l, h) j" T g9 E
/* 宏定义 */
3 q9 ^* Q) |. u) x+ m
/* */
/ l0 N, U; G; O! }5 t0 U5 d
/****************************************************************************/
f. x7 b3 H+ _* J/ R
// 软件断点
, r1 [. V3 A6 |$ L
#define SW_BREAKPOINT asm(" SWBP 0 ");
/ g( \1 a0 z- {' o+ F* d
2 @2 H2 ]7 K9 Z$ g1 P
// 时钟分频
* e) \9 j8 J" x# ]) |2 d% }* N
#define CLOCK_DIV_VAL 228
/ V. [ _9 q# m, o8 |
" j# {% W. `+ N, V% N1 V& d
/****************************************************************************/
9 y4 K+ c" L4 l. `/ e3 w
/* */
F: w; \, q& p% I7 P. N& H4 A/ ?. v' o
/* 全局变量 */
) P1 ?. i3 z1 ^& `/ n+ c/ r7 p
/* */
/ r, P3 N2 R. ^8 w6 y, n2 T; p
/****************************************************************************/
8 y+ P/ Z; M: ~: f
ECAPCONTEXT ECAPResult;
7 m% b. _9 R+ A. e p& `0 e
: T {& G# j, c
/****************************************************************************/
' R) m: T1 y- ?1 u# I" w3 P
/* */
' E. c7 u$ ~5 j( X) |/ ~
/* 函数声明 */
! ]% E- ]' |& f
/* */
- l5 j) w' i$ P, P. \! o
/****************************************************************************/
, D; K" ?+ k% M
// 外设使能配置
2 D$ c3 N3 T) E, v" C: A
void PSCInit(void);
$ K2 {# p; k- @- M A
& W3 p0 o. K( L `
// GPIO 管脚复用配置
0 _5 V/ F ]' Q* Z. S6 V& f9 P
void GPIOBankPinMuxSet();
! N! u- n7 h& b; K' b- O$ h
; S+ M% v$ R. P- Z3 d/ \- y
// 产生波形
0 [6 I- w; b/ \7 u) s6 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
' X' a( A s6 W. v) W; N
void ChopperWaveform(void);
3 l9 a$ U& \5 n( A1 ]
. r% `* B# g% I: `& i
// ECAP初始化和读函数
7 s0 T! d9 w: r0 f) _% t
void ECAPInit(void);
! y: d2 ] f, J0 |8 F) D5 G4 c8 r" Y* g9 M
unsigned int ECAPRead(void);
4 }5 q* S/ D% q e
9 ^( G# [7 L+ X
//ARM 中断初始化
5 u5 f& G6 C) ~& O4 ^2 _
void InterruptInit(void);
# R6 T% i+ L9 Y; _ B3 o
0 I5 z+ J0 X( _
// PWM 中断初始化
+ E% x/ t& Q/ [9 Y7 D
void PWMInterruptInit(void);
* g% K S( J6 s9 N% y5 t5 T- n
// 中断服务函数
& t( n3 i' ]+ Q d. p
// PWM 事件
. Q0 n) ]* D- v4 |
void PWMEventIsr(void);
: B+ s( Y' u% T" @' v
// PWM 错误控制事件
' U- N ~& E$ K5 h( N0 }4 I S, ?
void PWMTZIsr(void);
0 T. O/ V/ n8 y0 S' i6 `5 z
& ?9 w' f7 w: P" ?. t% `5 K
/****************************************************************************/
" }5 Z) ~ v" B. [" j7 ]
/* */
6 n2 d' B. _: ]0 c+ e7 q0 J
/* 主函数 */
) a' Z6 U7 |% B' B& o7 D
/* */
/ q. b& g5 z# w Z$ H" J: k
/****************************************************************************/
% j$ P0 o. w/ c7 t( `' E Y
int main(void)
h/ s4 Y: i9 \
{
) o+ l A4 b; u
// 外设使能配置
- [6 B% O% p& a* X% e; A, d
PSCInit();
; S6 }+ \) a+ C5 U
% l1 Y5 C2 e* ]. y
// 初始化串口终端 使用串口2
3 _+ L1 I: B& W3 v$ j
UARTStdioInit();
- ^$ n5 D/ S, b. z: z# y7 R
1 @2 p* j6 B: q+ a' k$ D
// GPIO 管脚复用配置
% J, Y+ @+ N" _: C# M2 x
GPIOBankPinMuxSet();
, }8 x+ `/ m) b+ Q
) g* p% [% @! A ~" v) q5 z. t
// ARM 中断初始化
* i0 Z% g8 e* e
InterruptInit();
, f* m$ K7 S) S2 h' P
) z" \3 T8 O! `& O- ~7 i& x+ |5 T$ P
// PWM 中断初始化
- e& ]( m7 E3 {$ J/ ?/ ]
PWMInterruptInit();
1 U1 L# T8 [2 f& N8 C8 _
' `5 I: x, U7 A+ v
unsigned char i;
0 } q) W# M% `2 J6 t, _: E: p
unsigned int j;
( z' \3 z; r* a9 J+ E+ y; Y4 d
% i4 w- W9 D* W# D% D' p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
0 z, a6 O: x p# A" t- H. s i/ K
UARTPuts("------------------------------------------------------------\r\n", -1);
6 r% h- m3 t) t' K# Q# ?/ n i
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
( b7 c6 a! f+ z5 i( f; F. v+ [0 D. J
// 产生波形
# Z5 `$ J! {6 |; L& M
PWM1ABasic(25000,50);
7 ~: N @' D# M
: u9 S q2 k1 J4 C4 I9 H$ `
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. {/ F0 Z. C8 A
UARTPuts("------------------------------------------------------------\r\n", -1);
" e2 V5 C# `- w. q7 A$ e
4 E" K7 p: M/ Y$ b7 Y q: q% O
8 H) m8 g. X! ^2 Y3 V3 b
9 L6 P3 _5 n4 M$ n, W
UARTPuts("------------------------------------------------------------\r\n", -1);
- ?: h {* G- j- O
UARTPuts(" C6748 ECAP Test\r\n", -1);
, T( j _7 S3 a) Y# R) N
// ECAP 捕获初始化
u! y5 b; a3 R/ W9 G
ECAPInit();
- j; G$ \' z0 d' Q: k L K
UARTPuts("Initialize ECAP.......\r\n",-1);
7 d8 U* r' v! l2 @
for(i=0;i<5;i++)
% z# h; i2 Q! Y! Z% r6 Q& j
{
; p. i( K8 c" y$ Z& m
for(j=0x00FFFFFF;j>0;j--); // 延时
, S: l1 |) \( r, F* `5 y. T
ECAPRead();
. E6 M1 O3 T2 B1 k6 o
}
7 e# Z w. Q' ^/ B
UARTPuts("\r\n",-1);
# d' d& q& W; {/ r2 v& u# e# U
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 q7 y$ N. A3 r1 i8 p# E) U' j1 a+ G
UARTPuts("------------------------------------------------------------\r\n", -1);
# D- y0 ^, }" D! q
$ b2 y3 r' {2 D- Z n) x' ^
// 主循环
% i+ {' a' G# w5 G. x: Q4 o/ y
for(;;)
7 A1 e8 ~* _' O c- o$ a7 }
{
) g" N7 W1 U; M3 n c
$ b L+ O' e$ d( [6 y
}
6 `7 \, M! i) |4 k3 o
}
( e! Z. E5 K- Q2 a' F" o
* O1 {. n" j; J2 u4 X
/****************************************************************************/
8 z8 d+ Y. U+ I
/* */
% [" o6 ?, [. ~0 c
/* PSC 初始化 */
# A& {2 |4 t# w0 N `6 k4 ~2 u
/* */
) \4 M4 H" W0 }1 }% M; Y* N
/****************************************************************************/
]/ y" t: {5 k h# {5 P, z
void PSCInit(void)
" h$ ~; g& D. e. m9 f* c) Z2 a) z& z
{
6 c7 b" L; Y6 V- L
// 使能 EHRPWM 和 ECAP 模块
+ j8 k7 x8 f" t* `
// 对相应外设模块的使能也可以在 BootLoader 中完成
) ]% {2 T4 c& U* P, \+ J4 c
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
u; b" Y4 L) y4 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ D. ^$ d4 a, |$ t5 c
}
( e2 i6 s3 g9 L! D+ g& N3 `
2 t, R# O( }" c8 u5 c6 b+ v3 F
/****************************************************************************/
7 Z: {9 e1 O U1 O# S( L& y7 V
/* */
& y, U; x! u1 [; i$ U q) u
/* GPIO 管脚复用配置 */
/ J" R# K, @1 }' S9 a% C
/* */
! \# ?0 \5 m! G1 X
/****************************************************************************/
5 o4 i# M: C1 U: I& z
void GPIOBankPinMuxSet(void)
* j5 k0 X) y) p, ~6 f
{
# O. D1 r4 e! M% r
EHRPWM1PinMuxSetup();
: {! b$ A: o" H
: q0 R* R6 S. L! S( q2 k$ C
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ y1 v) W5 \2 v% h
// 作为捕获功能时管脚方向为输入
2 ?2 L6 W) E, x; c }( x
// 作为辅助脉宽调制时管脚方向为输出
% d& `3 T* C) x! U0 p/ i8 G
// ECAP2 / APWM2
' W' x6 o/ ^# q* X1 \
ECAPPinMuxSetup(2);
1 ]4 H: S* u! P" j+ m0 B9 r1 j2 f. h+ b
, B: G0 D5 Z. }+ }
// ECAP2 / APWM2方向设置为输入
* M0 z6 u( R1 h$ {7 q5 {
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! \' n9 T( x5 u: _
}
* w- ~8 L& ~! j) y- D6 S
6 |. H5 {0 c5 B; F8 X$ s* _, r
/****************************************************************************/
# M! y. Z: M! j3 s
/* */
( c( {$ `5 u, l: C
/* PWM 输出波形 */
4 Q* s) x0 P. M* @
/* */
( X* C1 J. r8 z1 Y4 o$ J
/****************************************************************************/
. B* ?# l( q* z: i) |/ p Y/ J
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 b# r- d0 X C9 t% V7 k+ k$ s
{
# p1 U5 V& r" @% s z
// 时间基准配置
' {" d. a9 b$ @& u+ H! w5 f* w
// 时钟配置
% \6 y! M7 ~& E! H: V
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' |' K e9 R2 ]! d
+ I; c8 N0 e, `1 d, r* J
// 配置周期
* V0 a3 U: {+ b; T M
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* M# m! q1 P% N
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 E j/ N; ^: [# n, l- E K& H
0 C/ u* a7 O& P$ q
// 禁用输入同步信号
) E- g3 R5 J; O, }3 p9 Y/ l
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
. m& p' T+ ]5 o
, N H% S6 ?( R! B5 c( h
// 禁用输出同步信号
2 z2 D& e2 T+ ^- w3 s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 d) \- Z8 V/ ^
3 ~/ m- l6 X, L, y- F
// 仿真(DEBUG)模式行为配置
' Z) Z: z( A8 M
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 A- w, ?' @9 R0 w; A- l; R
& G7 w9 V5 i9 v3 d/ q( ]8 L- y
// 配置计数比较器子模块
; [4 z7 |' x+ O1 h% L' h
// 加载比较器 A 值
% _9 S2 @' q9 i* s& J+ m
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; ?- P8 H' \' Y) Y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
l5 C: _; u& _6 \
7 k" c3 `9 ^3 V, p3 q) e1 |" i o
// 加载比较器 B 值
) [+ n/ z3 T! k- G9 `
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. Y5 d" K" \ ?3 K1 D4 D3 H" t
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# W+ \# d+ C( [$ l& {! F M
; q1 N( J7 V2 F
// 功能限定配置(输出引脚触发方式设定)
- h8 O6 g n, z* c4 _/ n4 s
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 A2 _$ P; c) b% \+ x4 u! d
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 Y7 S: }2 w* ~9 ~. m
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 J. Y$ U! R$ Y! E# {( K
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ x* }' ?* q) C" M- J' c% g/ Q% q
1 B+ z0 Z. w8 h5 L" s
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 ?: x% N5 |- U+ m1 Y6 K- B4 x
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 d9 A/ u' X8 ], c7 B# ?2 q
2 R$ q0 R! { |5 v5 [. Q4 R( u
// 禁用斩波子模块
* o+ G& g0 {( M: `4 T+ {
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 I# v! P7 R0 n6 T9 d$ _" F* L
2 {& s4 t$ Q, g# F' S
// 禁用错误控制事件
( U' p! t& H0 }4 J: F9 B* }8 t
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: s# _( c% t1 y) n" c ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, ~: U) \3 r7 B5 ~) L
; w$ f) M i+ `
// 事件触发配置
; e+ b% y, _ s& O$ d, p) G" d
// 每三次事件发生产生中断
& k$ p, N9 b; x7 s( Q" K- K
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
/ R) V7 i7 q8 @/ X
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
: G: e8 P: @8 H; p
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. t+ T* _8 Q: V7 w
// 使能中断
$ c; C, {- i7 }: i1 @/ f
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" `, k$ S* L/ l9 ]8 @% j
5 ?5 _! d4 _# S9 P$ E5 @ z* G
// 禁用高精度子模块
' @- j5 m: w3 L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 s9 R5 t ~" G3 d5 n
5 r9 m9 _- W; \$ z, L& Z! ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 ^- e0 a* P1 ]7 p* r! ]4 l
}
* J" H2 ]" }( Z% s# n4 c
% I' }3 x& l7 O2 V
void ChopperWaveform(void)
& L! W& `6 H6 g7 L+ V, L1 U
{
+ ~* H- C: l) I' t
// 50% 占空比
- E( { S: z) M+ b
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 M- [, `1 [4 {: X
// 4 分频
; B! ], G- E& e9 q! h6 l
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 u! i- D& A6 B% J+ d
// 单个脉冲宽度
4 w2 @ h% p4 z0 ?, Y; }0 q
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 W# M3 g, C. ~; K
// 使能斩波子模块
p9 j8 o3 |* v$ I
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 z* o9 x" _. _: h
}
# r' k# ~7 g) `* T' i
) T8 L7 P1 }8 v/ q$ L
/****************************************************************************/
0 T0 a' y3 K/ @# f+ `# n
/* */
% E" r3 w5 ]; G4 \8 [3 |
/* PWM 中断初始化 */
& w& n8 B' ?8 i) U
/* */
+ c/ N7 }- M1 |% D R
/****************************************************************************/
3 X) ~/ ^5 n5 H6 ]
void PWMInterruptInit(void)
( o: k- I" i9 y E, Q9 \ T
{
, U+ z1 M, x! \: ]6 B& I. i2 E' {( j/ d+ @
// 注册中断服务函数
4 m+ i9 {1 R7 o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! P5 |8 c4 \# F0 ]
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 d4 T& s* G" Z7 z" S
- c. k; a6 H+ [; `0 Y
// 映射中断
& ], B2 j* b; }- Z1 V
IntChannelSet(SYS_INT_EHRPWM1, 2);
' D' `6 Q' Y/ r
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% ? G6 y- l" p' i3 ~; S( z, x- Y
6 d, l1 P. I. j9 w4 \3 t
// 使能中断
& J- c% |( Y4 J* S/ z8 Z
IntSystemEnable(SYS_INT_EHRPWM1);
- E. N6 p' B" `! t8 k
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 A; V$ b$ h) l
}
6 n/ t/ D$ F I! f. h% Y, \
' V2 |# Q5 i4 q. P% p+ l5 j
/****************************************************************************/
; T. A) j9 v7 P i- C( c1 ^. h
/* */
9 Z; i% f- k4 j8 M7 e/ `
/* ARM 中断初始化 */
+ h$ e0 |: } E
/* */
4 |+ {8 s5 r- r: ?3 ^% j
/****************************************************************************/
- A; [& i& l) F2 r: w" O
void InterruptInit(void)
) i/ p0 S0 ]& ?- l
{
! R7 M' a! N2 M% @, S& r
// 初始化 ARM 中断控制器
5 z( \9 M8 t7 }
IntAINTCInit();
! j7 f5 ?! \8 P* i6 b
5 s' z' j. ]1 W! I! s/ R
// 使能 IRQ(CPSR)
/ h1 F6 m+ U3 h8 X5 q8 \7 F3 `/ o
IntMasterIRQEnable();
4 L% d, C* H6 X5 C0 s& K
7 o' `2 M$ d6 E% G6 P
// 使能中断(AINTC GER)
# {# F" P0 w6 M
IntGlobalEnable();
# e5 a K, |; O9 L
) v6 L! j! a* Q# k+ X, c. l3 N/ l
// 使能中断(AINTC HIER)
' [. F, l8 h3 {5 ]/ h- r$ D6 ~
IntIRQEnable();
, R; T- M' M w
}
5 {% Z7 Z3 A _0 z7 v4 N$ @6 p
; h9 `: L9 l5 a+ `' R% y2 @
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
: b% w3 Z3 X! [6 H {
/* */
. P$ D2 p8 ^6 j K+ S
/* 中断服务函数 */
! q, Q: g$ x6 g2 R2 @+ {
/* */
9 F. k2 E6 m$ L/ d3 z- O
/****************************************************************************/
/ }$ Z: k' b+ c5 _2 ^" |
void PWMEventIsr(void)
4 O7 A7 Z, q9 W- T
{
( I C% |! V, A$ R! m+ g5 }! w
IntSystemStatusClear(SYS_INT_EHRPWM1);
4 B8 u C2 n8 y* X5 y
, x. t( D, a% t# B) G* S" P
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 ^: e5 M" S0 G+ ~! f
}
6 \3 l! A: L" C/ B, c8 e
& X4 Z$ H& {% V% r: |* ?
void PWMTZIsr(void)
3 A# f- ]% v: ~8 J( O% K
{
6 I8 z! f! S; v* J3 \/ z
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 F. g, t e7 }9 e( L, a( a G: H% P
0 n- B+ ^7 }/ f
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' n( o5 Y% I6 B
}
( H: L% [4 t! c- @9 S) b2 X
' W( ~, ?5 }( \7 z
/****************************************************************************/
0 N/ x" U3 \# N& ]# E1 M
/* */
( r! W; h- b a# J5 s7 D1 g' t- `/ |
/* 初始化捕获模块 */
; L8 [0 p. ?& ^* Z, R/ \
/* */
: e. i# k; H% K" x, j6 C
/****************************************************************************/
& V8 L; Q |9 u+ K5 [2 e
void ECAPInit(void)
1 n' g: f5 f4 k3 n
{
- E" N; D* \' t
/*-----设置 ECCTL1-----*/
' l1 j6 `) j. _
// 使能CAP寄存器装载
- t* C+ A* `2 E @3 Z
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. z4 L# A8 t+ p/ z/ c# A- S' g
// 设置预分频值.
; D# V4 T& Z' W+ L* y9 H! R
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# w; s& E4 u0 p( I
// 上升沿触发捕获事件
" @7 \: T! k9 t7 z2 }0 \
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 e1 d/ R8 W3 I e! C
// 输入捕获后重新装载计数器值.
7 s" X% m- i, _) y$ e$ j
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ s2 A8 s* d9 a8 U0 O
$ x/ n" o7 J( l
/*-----设置 ECCTL2-----*/
1 i: H' F# t& W3 P- O" n5 ]% H
// 连续模式
! x$ L5 `; p) M
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- \( Z& d- l$ k* d* P1 v
// ECAP计数器TSCTR持续计数
( P- x; i. R. S9 p" E" l, E
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 ^+ |2 e$ j; \; m/ U2 k
// 禁用同步输出和同步输入
+ i! G( q! Z; L9 U1 i; G' w% y# R, Y
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 G/ J9 c' `+ r( ?$ W" g5 q8 z
// 配置 ECAP 2 为 CAPTURE 模式
5 w: x. I8 K. w/ k3 e
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
( H; \& ^2 ]1 U& V8 b+ W, |' n
( Q& U+ ^8 e2 K+ j4 d2 S" z
// 使能中断
9 Q$ j. y K5 p- C8 i
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, X# h0 \& T, Y* ~6 i N( O# b9 F( }9 F O: Z
}
/ b7 s, n& X2 [' k( `0 \4 g
. I* k6 L: Y. c8 X
/****************************************************************************/
* z& ^6 \4 ^; B* a" w! [) d8 W- b
/* */
7 _4 ^! j0 k. \8 g/ P
/* 取得捕获结果 */
9 {6 ~- y8 P+ C# Q, Y& q' I
/* */
9 z- g- J. U4 E7 l0 L! c/ ?( B
/****************************************************************************/
" D& ?. s5 q. c' ~1 [# P0 O1 D: W
unsigned int ECAPRead(void)
4 o# u7 m9 q3 d, q# H0 ^$ w/ z$ e& f
{
! K" ]! F! P9 I/ V3 Z; h3 A& ^+ S& V
unsigned int capvalue;
7 D" {' |& N" a# d; c( ]( q% g
unsigned long frequency;
. L9 t. c- e: U! m" O7 b
2 N5 _* B9 \& \$ D- y9 s
// Event1 中断标志
/ _& P0 N. S4 }# m9 }8 v0 ]+ Z$ G6 r% O
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
+ c' l5 \( Q) u. _# L
{
& M, J4 |7 C2 U
// 取得捕获计数
1 y3 _$ b2 e* k9 p
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( S5 k0 \ T5 W% A. |# h
capvalue = ECAPResult.cap1;
. B: @& o, k! ]
0 g, B$ ^& u6 K& Q% d
// CAPTRUE 模块 228M 时钟主频
9 ?# ~6 }" j/ t4 b' y
frequency = 228000000/capvalue;
1 S( C( i% [8 m! B8 W1 [
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ ]5 }9 e* ^9 t& ?$ x2 [
8 V4 B+ Y% _0 N8 w
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 H4 Z. r8 U; p3 I; l
// IntEventClear(SYS_INT_ECAP2);
! ]3 H) `$ Z7 N# N
}
* i O# E' x! b2 j* f Q
return frequency;
* S9 J4 s9 ~; _% `' i0 ~
}
% p" _9 Y$ C. F, C& Z
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Y2 k2 P7 j$ S- k, R) 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