嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
7 a/ V7 Q+ J) t/ l! g& w! C2 u
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
8 H4 h0 h: k% v
/* */
' v2 h! ?# p' V; T9 E4 y) ^
/* 宏定义 */
, _0 E. k6 t2 Q" h
/* */
! w5 V+ {" u& H; a
/****************************************************************************/
& `6 e. [% L4 \& R1 v
// 软件断点
4 `% P4 L- H- M: A+ v" ]" f
#define SW_BREAKPOINT asm(" SWBP 0 ");
% Y7 E& c: t: ?) F, x3 ^, \6 F) i0 ]
8 o4 h* r% s) a( A1 o/ a
// 时钟分频
9 e/ F% x7 m8 R
#define CLOCK_DIV_VAL 228
5 A3 o/ _3 G- S7 V
. y) P4 B* q$ w7 y) X
/****************************************************************************/
( ?/ z8 f; g1 h, _8 u7 |8 D
/* */
8 Y$ [: E6 G! [: [* V& h" t% N
/* 全局变量 */
7 o1 S+ f! K4 Q8 Q' d9 Q" V( G' Z
/* */
/ ~, M1 P* A3 V' C" ~- e
/****************************************************************************/
& F8 A7 K. U, ]9 v* N
ECAPCONTEXT ECAPResult;
9 j) q( ^" \2 v9 K [
8 U5 t9 j. \" s- d4 `! j
/****************************************************************************/
0 B( i8 N3 G& k7 L) T( j; @
/* */
a/ w; A+ R! X# t8 ]: @+ I3 P
/* 函数声明 */
. _2 N0 l( X! @# R; |4 {
/* */
. V. \7 a9 q7 ]" D6 U
/****************************************************************************/
0 a6 \ b1 d# G& F6 c- U5 T
// 外设使能配置
5 M3 P& [0 u. f9 `
void PSCInit(void);
- T% t$ h- L4 h( {! C. p, f1 Q
4 d6 e: L; ]5 h3 E5 i3 Y
// GPIO 管脚复用配置
0 P5 X+ ^, U. I
void GPIOBankPinMuxSet();
: |- h6 Z& W+ R9 Q2 d& d* Y9 Y! J
: z0 ~2 V( n2 [, q2 o% J6 [+ ?
// 产生波形
) [& z6 C1 I: B; e' j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
* i# V+ G4 }3 y) g+ P
void ChopperWaveform(void);
& ?$ m1 l) f5 v4 V# c9 I
( e9 O c0 g" L( [* N
// ECAP初始化和读函数
4 f4 W1 j( f3 }6 M# {
void ECAPInit(void);
% u+ n$ ?* n, K% g. m; [
unsigned int ECAPRead(void);
9 m* P# J" p- l
0 }& d/ R& q& i/ w* `4 a
//ARM 中断初始化
/ {. @) z+ a" F, f3 ]$ m& w4 f
void InterruptInit(void);
! i- W& D: r: B" n" Y2 g5 T% C8 j' S
4 \- U0 p; i. \& v
// PWM 中断初始化
' Z$ D- U {( H7 C
void PWMInterruptInit(void);
& x" g# s: N& a5 `/ _$ W3 P
// 中断服务函数
: V% c: g* [0 Q" n0 F
// PWM 事件
2 z' {$ a) A, V( t" G, r7 e
void PWMEventIsr(void);
8 \, @! z2 O; c2 M6 M0 k) M* J
// PWM 错误控制事件
* s* y0 D0 w. S& m
void PWMTZIsr(void);
2 V" Z0 F7 ?+ K) w% P J
* W( |$ v8 N0 x9 b/ V: r
/****************************************************************************/
9 ]1 A5 B% `, h' w' [
/* */
7 i! `7 M9 ^! k( J* [
/* 主函数 */
5 }: t4 G# f/ C
/* */
y: W' f9 p, ]3 \. j8 [5 n3 q
/****************************************************************************/
8 I0 G# ]& u) G7 s& K: C$ Q. p
int main(void)
2 y# u9 \4 X9 J
{
" s- }6 t* v% Y+ S% g4 Y
// 外设使能配置
3 x. j& _! ?. A6 ?
PSCInit();
) ~0 l4 T! Z/ _5 |
" G0 v; {& l3 o4 A4 k; g! U; V2 t
// 初始化串口终端 使用串口2
% U; E, _6 u) l) x) V4 S. ^
UARTStdioInit();
. y( L4 Q* {1 a0 Z6 P/ E, V3 [
4 z& u% s8 O9 w2 g' X
// GPIO 管脚复用配置
|4 z% S. `) ~- y6 j' g- O
GPIOBankPinMuxSet();
2 j( g( z' J4 D0 g( f9 Y
6 I' f/ Q# O" r' e: s1 ] |
// ARM 中断初始化
# u, ]( {' z) t. s8 D1 J0 X: `
InterruptInit();
" l* q% O8 v$ t' W# m
+ a1 u i3 C; K
// PWM 中断初始化
; i3 m2 s& J$ t& P4 l1 r
PWMInterruptInit();
1 _2 l, m4 j% ?/ M; }
( c0 H7 l5 O$ r
unsigned char i;
3 v5 m" ?1 y% \& W# y
unsigned int j;
' }) z( k: ?6 }: K
, j/ B, T! N; u0 \2 o. L% q
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 ^/ v6 f) x) z5 ~
UARTPuts("------------------------------------------------------------\r\n", -1);
$ h; Z: G0 }- @# i
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 ]9 Q: Y+ o6 H9 ? e6 Q9 |
// 产生波形
l& Z$ R# B9 p8 Y/ R* {% C
PWM1ABasic(25000,50);
, C# v( F) n2 k8 F
9 z- B/ z+ |# N5 ] h) e- @
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
5 z, t8 N( ^! f( i
UARTPuts("------------------------------------------------------------\r\n", -1);
+ r* F" {! W9 f' |- C b- D
% I) ~1 o3 f5 r
" D: D4 V" c' } S( B; I. D' b
" J! ]+ u& q9 ~4 l K% J: {4 m+ P
UARTPuts("------------------------------------------------------------\r\n", -1);
! R; H0 S/ ^* C" _' h
UARTPuts(" C6748 ECAP Test\r\n", -1);
' H3 H/ ^9 `8 a9 K8 K0 g
// ECAP 捕获初始化
/ z' f! _! U) c& q6 A8 Z
ECAPInit();
7 X7 |1 Z# \" y) o
UARTPuts("Initialize ECAP.......\r\n",-1);
/ P$ f6 M5 a" p/ }4 a+ Y5 ?6 h
for(i=0;i<5;i++)
$ x4 @* u) g# z
{
1 \+ |7 W0 q! c' L& K+ a0 p
for(j=0x00FFFFFF;j>0;j--); // 延时
o- l4 v, e0 x! p
ECAPRead();
$ c K( I8 j+ ^( s3 G! K1 j0 B0 }" I
}
( P( D2 u$ S9 q. r- ]
UARTPuts("\r\n",-1);
1 E+ w5 |) h; C+ M9 h. j6 m, \
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' Y% U" u) E3 ? n
UARTPuts("------------------------------------------------------------\r\n", -1);
! U5 z! V. L- S+ E o. `# r
* L$ \% U- C+ a& j- l! w
// 主循环
% F: _; M4 b+ l
for(;;)
; u2 v& M* Q5 w- S' [6 p' ^
{
6 V" j" n% n: [0 M+ }( l
" c( p9 L6 p, V: l9 W% Q
}
! U! o/ T' {% }1 {, s& E" j& j w4 t- m
}
3 L9 e4 Z/ w( V. Q- ^6 j6 N4 e
7 P0 P0 z+ w/ j" f
/****************************************************************************/
1 ^9 s' M# A9 }' U+ u0 X
/* */
7 n5 B2 D8 B% j$ W& G ^( D
/* PSC 初始化 */
+ Q0 M& F1 N: l
/* */
1 T2 |; x ~3 T w
/****************************************************************************/
Y1 _: E$ H! `/ V( Q0 ]- L
void PSCInit(void)
% ]: U% [) h3 { u
{
6 w$ i9 I G$ Y. x6 v$ N: c: ]
// 使能 EHRPWM 和 ECAP 模块
8 s4 `) q, h, ]' R& f8 k z, }& B; `1 y8 g
// 对相应外设模块的使能也可以在 BootLoader 中完成
\: _8 Z; z/ y$ a6 `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* X* Q6 H+ [( R1 E7 p' c. Y. ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; \/ P0 m6 a4 Q! n
}
1 C% i; H9 m/ z# {; o2 ~' M
9 |) V: ]; u8 [
/****************************************************************************/
7 W( w1 i0 C/ l* @7 K5 o
/* */
! O. j7 c# L, `6 a- d5 ?, Z
/* GPIO 管脚复用配置 */
- H' \ u0 I2 v( \2 I" I' l
/* */
" q" V8 S3 q; v9 ~' J; x
/****************************************************************************/
4 I. ~+ O7 I9 w% _
void GPIOBankPinMuxSet(void)
' e- e+ U5 e& @* [3 W* W
{
6 p) \: ^ E+ K; g
EHRPWM1PinMuxSetup();
" x6 V3 A! r. s/ X
, V& k4 k# z, M1 s, U- {/ s
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, A; y3 L% O# Z4 q
// 作为捕获功能时管脚方向为输入
6 Y1 I2 }! Z$ Z7 V4 Y; q5 w
// 作为辅助脉宽调制时管脚方向为输出
7 r4 k4 A5 O+ R! S: ~
// ECAP2 / APWM2
9 k" Y/ y+ w+ p. N8 P7 _
ECAPPinMuxSetup(2);
3 @) x& W4 n. `0 f0 O$ C$ R( X
: A( ]- j% h9 i& v
// ECAP2 / APWM2方向设置为输入
6 d4 ~3 s( t2 ?( c4 e
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 z9 J6 c9 m# p a4 S$ M0 F, d, g
}
) J: k! Q( g/ A. T& k
" Q9 E. J8 f' i
/****************************************************************************/
! @& _& L* P: T: c% v1 { {5 c: C9 g
/* */
: ?0 f' c3 `) D+ z$ d. {& R
/* PWM 输出波形 */
$ x# d" ^ q: O: f8 ~; ~9 a% v
/* */
# a) w4 e! M: n. I- `
/****************************************************************************/
( M& O% u7 d% w. m7 G Y% L4 a
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. Z T1 o7 S7 S& [, M
{
* ^. }$ ]8 z. T0 {/ Y/ t9 K9 N2 e5 B
// 时间基准配置
& R! F% G% p" H! P7 Q9 J
// 时钟配置
+ E" ?/ {, X3 U. v
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
0 L9 j9 Q8 d( A0 S/ M {
" p1 t" ?3 I. j3 E
// 配置周期
* A& m& k( r, x: z
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% v) R% m% F2 Z `; L9 U
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% s" I: V1 }. a6 A
1 P' l% V- i# o. Q
// 禁用输入同步信号
/ q, w `0 {; @
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ i) v* h5 c' p# X) Y
" e+ |: g Q$ I$ _
// 禁用输出同步信号
3 N" P$ w) y* @ X4 V( s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
9 V; J4 M, M4 u$ _
% p# [/ R2 z5 l7 H
// 仿真(DEBUG)模式行为配置
% J9 s: n' u9 L# n0 q4 ^( W+ `/ S
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
O% S( j) [. v- I
7 f" O% Z' p- Z8 t7 r. J
// 配置计数比较器子模块
- w2 \: t A- P* d2 @" `
// 加载比较器 A 值
2 G& N. C+ n$ u
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
* ^6 ]4 B5 e( g
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; J4 [2 m0 n/ l$ a% y- j
( h$ s1 l1 x4 M5 H% r8 a
// 加载比较器 B 值
: ^4 ?* i; x) H0 H" `, Z2 z+ h
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" k5 }" P# O$ ~
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- s* Q4 ]7 {; j
. u3 |2 M7 K7 l7 V
// 功能限定配置(输出引脚触发方式设定)
* N8 x. b; C9 [2 X( r& S1 c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
W9 ?! ~0 J* @1 M* X: R/ O! S
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, O" s* n4 l5 r
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
_) E) T6 S. A- e
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 k* }8 f+ O3 F9 e! g1 R
" Z- o( V) T8 d3 y
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ B' |+ ~% a y9 B/ Y, u: }
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, a6 R3 a8 G" j" F
3 m* R" k" x8 v* C
// 禁用斩波子模块
9 H! V1 E1 Z+ x+ E# A
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 k+ x1 W% c/ S, v7 K- ]: O
6 \3 @0 w- t3 I2 |& s
// 禁用错误控制事件
6 z, I. e' J1 r% s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
; v; _0 d1 c( k
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& R' L* t' n* G% t
& T5 ~+ [# v9 n. ~0 Z. t+ N
// 事件触发配置
- o/ H+ e% `# N/ f: H# Z
// 每三次事件发生产生中断
/ B% @5 K& d6 m, _: v! J9 v
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: x8 }1 z7 a4 V: d4 q) h# `
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 g& O J9 E3 T8 K/ a
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
5 N3 ?. q$ g2 k/ \( E7 x1 i
// 使能中断
" x5 O& K* K2 y4 x
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ z, A8 f0 X9 A8 [
' B3 _: @' B: a* ~% e
// 禁用高精度子模块
. @- X- a9 M( g0 X0 T7 w$ D
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( _. b7 m* U, R5 k$ h$ |
9 y& W5 h) b1 x1 Y3 w
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 X7 i) a- k3 Y# \# s; S2 c* r
}
0 B9 X F6 I0 P) y
) g$ ~1 p( g( U* s. h# f9 f6 O. @: E+ O7 o
void ChopperWaveform(void)
M( p5 q# k: \+ V
{
" i% k1 V4 {2 |
// 50% 占空比
% O# A y8 q/ x! k0 w8 n9 ]$ z: _
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ {2 L' j! @3 z. m, u) T; C
// 4 分频
- h# T- c6 ?% F7 ^# N( ^
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 w0 T: \' @' T% h
// 单个脉冲宽度
. r T) ^* s! F0 X; i* Z
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 w: T" [5 j: H
// 使能斩波子模块
% J/ E5 h7 |( e% Y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! Q, C1 H% a, Z: o0 s
}
7 G+ Y& s4 ]( [! J* T( ?) n6 ^
' e4 o V9 l/ ]1 x" v8 _( u# |
/****************************************************************************/
& O; p1 i- ^ _) r
/* */
* d. j$ ?- h x$ Y2 i! Z# f& C
/* PWM 中断初始化 */
! h; O9 v; S& p" Z
/* */
1 \: q1 ?( ^2 F5 n
/****************************************************************************/
' j( W+ R" z# \( J* e
void PWMInterruptInit(void)
+ ^) w* ^, o$ B& ?5 X
{
3 y9 l8 s, I" ?) p7 j
// 注册中断服务函数
* Q' d0 Z! m: C9 _3 p% c
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
6 q8 Y- }* |/ E8 V
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ ^0 T+ S/ c, M
) c! l( G2 c( B! d( x; E' d
// 映射中断
2 m8 E- |1 A% K5 f
IntChannelSet(SYS_INT_EHRPWM1, 2);
; k# R3 R, b: B% d
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ M# f/ r( l t7 l, U3 t5 w$ y
) B: `, c) T6 @
// 使能中断
4 e% s# D/ Q5 a( X9 @ [
IntSystemEnable(SYS_INT_EHRPWM1);
5 g0 g& ?* j% {* |
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- b+ B5 {! O3 a7 a" t$ Q' h: D
}
8 }% P% L1 F; }- \( J: v
# J* E. `& E0 R, }
/****************************************************************************/
" b/ G I7 U& Z
/* */
5 ]$ e' R# t" ~, q5 \
/* ARM 中断初始化 */
3 a! F: x% ^- M: g: b X: @- m7 x
/* */
- F. m3 |, T N( u Y4 d6 A
/****************************************************************************/
! U* {1 o( U+ y3 \( A
void InterruptInit(void)
- F9 U/ s( k3 r. r q9 g _) d: f$ n
{
& u0 b/ x; S0 i: u/ u( W
// 初始化 ARM 中断控制器
) M0 K+ m; M$ u- ?9 ?4 x- r: h5 U/ d
IntAINTCInit();
, R3 Z4 v3 h# C
+ U* Z3 L/ b! B6 w/ C" p
// 使能 IRQ(CPSR)
" A' w" n* ^8 ?0 w, y# X
IntMasterIRQEnable();
7 h. Z; @7 m# T6 m( t
! V& D9 o9 h& U
// 使能中断(AINTC GER)
! P7 M3 F2 _3 T2 i4 \" h6 z8 V9 u+ J
IntGlobalEnable();
g5 z4 C9 e+ ^0 g5 ~5 Z( i+ B
. P% S; }+ r' q) ]& U) J5 o6 Z
// 使能中断(AINTC HIER)
; a3 h+ s2 L" m( C( _& c% c, a
IntIRQEnable();
7 a6 D4 j( c6 M J
}
* \7 }0 m7 s$ s0 t) L
" z' z/ {$ V, M `$ B5 v7 H: n( K
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
* I8 @9 B! q% R, h
/* */
" N8 Q$ r, q0 X- @, t8 E& Z+ \# z, ?+ e
/* 中断服务函数 */
4 o' y( W5 n" S* h V5 `2 S
/* */
4 B( J4 Z6 R% a. L- M
/****************************************************************************/
; W3 M5 O4 F, T( X
void PWMEventIsr(void)
2 R# ?4 \: i, ^! c G8 z
{
, T. c4 B4 m" l; p% }% Y) ^* e5 b( g! z1 j
IntSystemStatusClear(SYS_INT_EHRPWM1);
! b8 s9 T0 Q# d
# r: V0 H5 Y; Z; s# H
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
+ }' b' v# e* O# I
}
) p7 d1 R9 P: r# |- Q. L3 C
`- B# x5 N/ f: t3 X
void PWMTZIsr(void)
2 ~# G) |/ ?) {
{
5 ^. g0 z1 D1 M8 u
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
7 i# a$ k7 y4 w6 u1 L
' S& a8 } B- }
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 ?/ a( K& L4 G$ k$ x5 z# y, w4 |% ~
}
1 i" E7 L- X" m) m: V0 X* T
% N, B1 D! D8 y9 J
/****************************************************************************/
U2 Y& c- A, C. {3 ?! [$ T
/* */
7 Z$ K4 k- V0 u
/* 初始化捕获模块 */
9 D d6 G( @" U5 H
/* */
* _( @1 B9 e2 O% V, p
/****************************************************************************/
5 K* j7 x2 Y* |& k% x
void ECAPInit(void)
3 Z+ l! ]# a e+ i2 P
{
0 I2 i4 |7 s: b. M& H- @
/*-----设置 ECCTL1-----*/
% V1 m" X: I4 Z9 T3 o+ F8 R
// 使能CAP寄存器装载
2 C3 q5 u1 t0 C( R( P7 }; N
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; ^$ r, V. j7 t" S
// 设置预分频值.
0 ~. ]' Q. m$ D- F" P Z( h
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
( K, k* D5 h: ?4 J1 R
// 上升沿触发捕获事件
3 s4 K$ ^( p5 I7 K: t3 @
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
+ w; n2 ~0 A8 o1 [
// 输入捕获后重新装载计数器值.
2 r2 \4 v @1 h8 j0 U
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 |2 t6 a# E/ N. R8 O
* i6 r" `- u7 u! b
/*-----设置 ECCTL2-----*/
! l8 X3 ^7 G1 ^7 w @7 e
// 连续模式
/ n4 k* p% i- @
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
( {5 \. e) i" k5 C3 s& I
// ECAP计数器TSCTR持续计数
" E g) v8 E O8 F
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
' \; h) S, b, I6 ^( z
// 禁用同步输出和同步输入
h# w8 `# T. j& r( y% f' m) ]. L
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
5 e s; Q* |) }6 V
// 配置 ECAP 2 为 CAPTURE 模式
* E+ Y7 D$ [& ]2 ?0 Z e
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
6 G: Y3 X! I$ A% S# V [
! v/ w3 p! ~1 s- [- J% r
// 使能中断
/ p5 h, [. p9 [1 X' Q0 V# x
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 ?2 ~5 e3 W6 _/ a$ j+ C; Q
}
3 Z7 o ~3 G) Q+ @, s/ w' Z) n0 }
. A% t* A1 J( n0 e& g
/****************************************************************************/
: h6 @. G/ F& h9 L5 O& ^- P
/* */
; h0 H" g, k% A) T/ Y% \* q
/* 取得捕获结果 */
3 ~- _7 B8 X# P2 b5 r* e) A4 {! I, B
/* */
3 Y9 X& s/ Y [- _# @
/****************************************************************************/
+ X$ i( A% k- k$ L' o
unsigned int ECAPRead(void)
3 E, `5 K9 o u4 n N1 c! N( x8 D
{
) G8 t) ]' \3 [8 N
unsigned int capvalue;
0 }( ]% g1 \+ Z
unsigned long frequency;
+ n2 l4 J% o% R& b5 x; [. L5 T
# y" C1 y9 d$ P7 \6 T6 c
// Event1 中断标志
# u: u5 B3 G3 x( E$ ]! ^
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
) E2 Q: u6 m2 P+ c* y7 ^: O m
{
+ `% B" P$ K" [( U& ]
// 取得捕获计数
1 K3 _$ O- u! o# r3 G
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% w4 h' q: B1 }) Q4 R/ r/ }- W" ^
capvalue = ECAPResult.cap1;
& n u9 l! s H! |/ T" H
5 ?- ?. r& Q$ Q
// CAPTRUE 模块 228M 时钟主频
' E$ n, G5 k; o
frequency = 228000000/capvalue;
, L G4 ]: d9 x
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
9 }, \3 L: v+ L4 @9 N
5 Z: y0 E* e3 Q W8 R9 ~
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% d$ J# D* A1 y9 p; q( X9 _
// IntEventClear(SYS_INT_ECAP2);
2 _ f3 \* w" b; |/ V) T! e
}
# u5 T8 X2 X% @( I7 v$ k: Q& T) V
return frequency;
- ~' m$ _, t6 x& {! C: a
}
6 g9 ^* f2 Z- l* G/ n5 ^5 [. L
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, ^; h) U$ T0 O0 J4 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