嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- [. ~/ v! }$ |) U
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
8 Y! D& k* B5 K a% k
/* */
) H: W, V% k; {
/* 宏定义 */
, T: O6 M, _( m7 V& s, h' P
/* */
1 F7 s8 ?# v' }. v* ^
/****************************************************************************/
; r% J- Z% G! Q8 h8 \7 S8 ^' y
// 软件断点
: B* ~3 M( N! T, e, E) `4 O5 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 E! O# ^% O7 D
2 K) C& p. o( h
// 时钟分频
2 i7 P$ s7 q8 R7 E% ?
#define CLOCK_DIV_VAL 228
7 Z1 ^3 ~; k; z" A. u8 T
$ {2 W% p: k. H- G+ P, b* i' k( z
/****************************************************************************/
3 k0 l8 l/ c% e: F. G
/* */
7 I: w3 L: Q3 B: U7 w0 h
/* 全局变量 */
8 |; W+ n, m1 N$ G2 j. V3 r ]
/* */
( A4 r* g) b0 w4 Q$ R8 x7 e
/****************************************************************************/
! j( ^, _/ o/ z+ m
ECAPCONTEXT ECAPResult;
$ R2 y% o! ?$ Z1 I
: H3 @' n$ ?8 i1 _- m1 @4 G
/****************************************************************************/
6 b& g, h4 ~( H: v. n6 k; o2 z
/* */
4 K$ M7 h6 u, l
/* 函数声明 */
0 P3 ^, q$ }6 P, y7 K' c& b; M
/* */
7 u. E* p# n# ^
/****************************************************************************/
$ Y& N D( V4 p( `5 C/ h
// 外设使能配置
" u, S0 r; t6 Z. d2 ?
void PSCInit(void);
4 Y; X p/ n2 K; W" l
9 T& e& I \9 q& C* j0 E A2 |
// GPIO 管脚复用配置
) {6 b% c( a) m) f( l
void GPIOBankPinMuxSet();
0 J8 `- A& U1 ^" a7 F2 A+ Z. O7 u
! X" P. X9 f2 I9 J4 r7 }# o
// 产生波形
3 c P! w3 b/ j- r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& ?, Q/ P) Q- V" W4 x7 Q V
void ChopperWaveform(void);
1 w. U0 L. U! B" k) g
: R, \0 R% t: x' O0 a
// ECAP初始化和读函数
, _* A1 b. W* w% U9 \7 f
void ECAPInit(void);
6 i# m0 n2 U, @* \% m
unsigned int ECAPRead(void);
8 y, o' U+ |+ b! {
* V9 P7 q, x+ J; I
//ARM 中断初始化
- h7 _% s. N% R8 j
void InterruptInit(void);
) \3 o' L% @) I; Y- ~: h
; V2 ]# k8 p$ J7 B
// PWM 中断初始化
8 {, ?, W0 R/ s" @' k9 b1 M
void PWMInterruptInit(void);
4 h3 V( `5 J$ I1 X) P5 Q
// 中断服务函数
/ p& k* S& H& e8 U& k% H: G$ F" k# i
// PWM 事件
, x S0 O% ?" z" V1 r' H
void PWMEventIsr(void);
7 w @! U& `" ~8 J9 E
// PWM 错误控制事件
) m: R& e- h8 c$ `# [% z I1 F/ k
void PWMTZIsr(void);
+ Y( t% ?$ A r0 l
1 g* o( k! c+ k9 D/ ]( |) V I. K. Y
/****************************************************************************/
! i2 I+ E8 p& ~6 u
/* */
5 K8 g1 V1 N# e' p6 Q
/* 主函数 */
& E( f; W, v0 s$ Z f
/* */
1 E3 u6 r7 Q1 P$ s* V
/****************************************************************************/
& w6 K8 H2 y8 m o
int main(void)
4 W( L8 D& u% Z" X5 r
{
, f- P" n \2 A( h/ P3 m, P" U
// 外设使能配置
) l% w/ A* c* j- Z$ [, q' ?6 y& l
PSCInit();
! J5 d! E; C" b. w9 a5 e# G+ e
) t C l" n% U
// 初始化串口终端 使用串口2
* X, K# O% n6 |0 t7 U+ p9 O/ x
UARTStdioInit();
1 Y# F- a. `+ t( A' N
7 L/ b+ _; e! v+ x5 P% C4 c( T5 [
// GPIO 管脚复用配置
) H6 J$ _; k `& B7 G
GPIOBankPinMuxSet();
& j" @# C( K* W) I
' C* k1 f: n( Y1 F% g
// ARM 中断初始化
# p! o3 }2 [. i# ?' w
InterruptInit();
/ ~ Q' h; S; y* O/ i4 N- W
* H3 a" b/ a( _+ Q `2 y. ^5 y
// PWM 中断初始化
; Q1 o! Z6 H5 D! f! R
PWMInterruptInit();
3 ^8 y) z4 e$ B5 R0 w, E6 R
% q7 R) Y! _8 s" v% |" m$ {4 z
unsigned char i;
& J3 h4 K+ A3 h$ X
unsigned int j;
. P8 V, Q' B% l+ T2 I" d( ~" ]
, i5 q! Z% {" M X9 o
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: p& e" D& x3 {9 s0 V8 }$ r9 ~
UARTPuts("------------------------------------------------------------\r\n", -1);
8 X4 Z- `4 y% I3 M f
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! P4 k. b% O; Q0 X; W6 }
// 产生波形
( G0 `2 t. k( x# M' f" P
PWM1ABasic(25000,50);
s% h, B7 a, ]& v9 n* R
8 S) [: F, e" t* c$ e9 m
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
; s& \; o# E& j; h/ A0 k' ~( K: J) I
UARTPuts("------------------------------------------------------------\r\n", -1);
$ a- \/ ~& V9 X) o1 E6 P
( u7 D9 r% q! \8 q/ \
% M8 v: o9 B, q, N
/ m$ t( z+ i5 O. Y! z$ e
UARTPuts("------------------------------------------------------------\r\n", -1);
0 K) X% T, a) f: r7 R8 p5 B
UARTPuts(" C6748 ECAP Test\r\n", -1);
1 \- z w* B% y6 g; _
// ECAP 捕获初始化
7 u; h$ H7 S6 H# F% _8 e
ECAPInit();
- y: g- ]8 P; V. d, {% [% V* z: T
UARTPuts("Initialize ECAP.......\r\n",-1);
& Z0 ^' T$ s( o# f* c5 N$ B' s6 y2 S
for(i=0;i<5;i++)
# I! x. @/ {) d2 w0 m+ B
{
: x Y+ [, a% G/ J5 Z% g# b8 K
for(j=0x00FFFFFF;j>0;j--); // 延时
/ I0 F6 z; M- m. B& G' K7 [, h
ECAPRead();
% a. j8 C/ ]- O' K' f
}
; d+ d2 X: Q# ~/ B( p8 k
UARTPuts("\r\n",-1);
/ _! t+ {( Y0 Z: N( F7 V; I
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
0 x" @" H7 n) c
UARTPuts("------------------------------------------------------------\r\n", -1);
. M' L7 G M% i c9 R
1 K: }4 D. y. m" Y) Q
// 主循环
1 z. T6 t2 Y1 F5 l
for(;;)
& s8 t( a5 |, N3 Q4 P2 }
{
/ d, n' }7 v u
% H# a; L2 m- z/ A
}
9 |- u, I# E' r
}
1 P3 O9 }6 P n8 k
F. X( X4 v# T! W) P
/****************************************************************************/
8 r; K) z2 o' @- L: y7 z8 ?
/* */
1 A2 F: v" a/ ?7 r+ Z
/* PSC 初始化 */
: }* j/ K" a! t5 P
/* */
" T' [* F5 W* f! B- ~# t/ Q- U
/****************************************************************************/
1 N" t# v$ M4 q. q$ I
void PSCInit(void)
, f$ {8 p" N6 N+ C
{
q" }/ b- a# @' h/ {8 ?' w. P
// 使能 EHRPWM 和 ECAP 模块
/ R! T- R$ K7 _% s7 K
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 I9 |3 J; x ^, X2 U+ L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 Q9 `, c0 _7 H1 {- m9 \
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 u, W7 Z+ G1 d6 k8 ~3 X {
}
& P4 ?2 I1 Q3 q( y8 \8 g
]+ \& w% O4 H! Z
/****************************************************************************/
) j/ ?& q0 ]- [+ ~0 D5 I
/* */
5 _# G9 {. s7 b' l2 G5 U" M
/* GPIO 管脚复用配置 */
* T ?% |1 K( O" `3 f
/* */
, Y$ [! {+ c7 c# N
/****************************************************************************/
6 V; o# x+ }; z& Y4 l; M6 U
void GPIOBankPinMuxSet(void)
L( M0 C1 S9 b
{
4 [0 l) q& ~/ H0 M8 {5 z, e# v$ c
EHRPWM1PinMuxSetup();
& j) V4 H1 _2 n2 `
: b0 N% I8 t+ } d. `- d% g
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 l0 t& C F& a3 r! s
// 作为捕获功能时管脚方向为输入
) D. I5 {# G1 k; W3 B* H/ P2 y. ^- n
// 作为辅助脉宽调制时管脚方向为输出
. y5 M3 O3 l' @: d* a2 I
// ECAP2 / APWM2
9 }; d$ }" H2 W# V
ECAPPinMuxSetup(2);
- i! X7 J6 G) ^- ~; V* P
0 j% |" W2 }, c, _1 s' g6 p
// ECAP2 / APWM2方向设置为输入
7 c' g0 H( R4 Y1 z" R* E* p
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
9 h3 Y6 t& T$ G4 M
}
5 I5 t, x1 @5 g0 |6 C
9 `. |: Y+ c$ k, B
/****************************************************************************/
- ]/ L( N) n& h; L- W: I
/* */
- c4 j2 y l* k! O/ {: O
/* PWM 输出波形 */
. ^, \1 T7 _1 q$ w* i
/* */
5 H( X2 B5 e* `* }
/****************************************************************************/
- f: ?8 f- T( Z V/ h; b) f% q* a* k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 C+ O. d# n6 {, u* D; M; a
{
/ n& j9 ^+ s3 H' p
// 时间基准配置
7 V/ ]: h6 ?2 x3 G' C U* P
// 时钟配置
& a4 I; w6 g; W2 T1 I% `" v
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( K% r e% \6 y& J0 p) a
' R/ v M& t4 B' ]
// 配置周期
" s8 ^4 d! D" E# L# _9 @6 q x+ g
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
, j: a7 e( P( b) t. J8 m& X& V! e
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: W) \$ W$ ^7 T
- h( T0 W" a& R9 j/ [& s
// 禁用输入同步信号
7 b' F, X! {# {
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: [5 n" u( \5 W, ^3 \* Z
9 M L+ `9 ?9 }
// 禁用输出同步信号
8 r3 W" P; A. V: x% Z, ]7 |( j
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% [6 Z# e3 k+ `2 j
3 I8 E& F {6 @+ L: ^( h' X
// 仿真(DEBUG)模式行为配置
5 y# J5 l% @( [) o
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( W! s/ }; H! U8 h- @8 Q
" K0 f0 A3 v# e
// 配置计数比较器子模块
# r! {/ V J0 s) q4 j' H
// 加载比较器 A 值
; j0 O% C' o3 R4 [
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
4 [% a; z$ x. @3 ^& V
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; _) [" e0 u+ U: I9 r% t; i7 H
( ]. p; F4 V: k+ l6 S4 `5 t
// 加载比较器 B 值
6 c6 B9 P. h: q/ t$ c" b. L# P7 w8 e* n9 P
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 q, L4 f/ Q% L' d4 I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* P5 U( T3 B0 T4 i0 d
1 f* D, E d# ^. M
// 功能限定配置(输出引脚触发方式设定)
" l& E" r( f9 t5 ?
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
( m' u# S! @1 G4 J4 i4 g
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 M) o( l* ?# T2 Z8 K! k. k
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
1 r4 w+ x4 G) }7 e; d
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 ^; p. h0 @( l# z# N8 v
6 Y# k" p" }$ F, H
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ \) c* A6 ? \+ _
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 O, ?! k4 U$ H
) s" ] M) z. D) L
// 禁用斩波子模块
* S# S' v6 l; T; D( ^$ f
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
0 Q, z+ {6 M; z1 [# ?3 W/ G5 l
3 E7 q0 y: }- R
// 禁用错误控制事件
$ U% y4 P, q$ B% k% I0 i' c: k
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' A6 c, o( T$ U' z, F/ V0 d
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 e2 m% W! i" g* ~) d* ]' Y
9 X; H2 k+ T2 G- Y
// 事件触发配置
) S, g; z6 d5 R; O& I* ~/ q- R
// 每三次事件发生产生中断
$ k0 F) a8 f n
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 B; Q9 x4 x" w* ^
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% [/ i3 S3 i0 w9 s+ w9 a- e7 M
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. }0 G& Z3 k5 o1 b9 V' Z% |7 j1 Y
// 使能中断
' v! X3 K6 A" A
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( P( k5 c- }% d5 C9 Z5 \
3 g4 Y y0 x s- g( D( ~
// 禁用高精度子模块
3 s" z& u6 H0 j$ D
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
{5 G; V. l1 P# n* N
. G) `& Q* J2 A0 D. _ @4 R( L
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 `2 B) {) w; @7 @8 \" I
}
5 ]" s1 t$ ^( ~+ z- \
/ w! ^7 j; G1 E6 z* |
void ChopperWaveform(void)
2 _+ C2 E6 ]6 d( @$ n
{
/ m+ y( p! P: ~% d1 L4 f% O
// 50% 占空比
% y8 r* [+ j4 `/ q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' e( {- `" T. L% V7 ^" s- J
// 4 分频
4 n3 A% Q/ R& I D
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! c% s7 i% @3 b3 R
// 单个脉冲宽度
) \8 C1 X* `5 G; f; v
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 f( Z5 _2 m' y* o/ B6 D4 U
// 使能斩波子模块
+ ?2 L- f3 U# k
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# s r9 k5 _% l5 z+ l
}
$ |/ D9 t" f# O% n! b
+ K7 g& z9 u P6 \1 ^4 w; P3 F9 p
/****************************************************************************/
/ u( f# t& m0 n6 H
/* */
( D }7 B0 R8 A0 h
/* PWM 中断初始化 */
9 q2 v* K6 K3 q2 h/ ?
/* */
& n3 J8 z: z* V" U2 s2 z7 L
/****************************************************************************/
: k" K. {) G2 m+ T( L
void PWMInterruptInit(void)
3 }, ^! w9 `! h' F' o
{
* d+ L9 z' \5 ?2 c4 s* c
// 注册中断服务函数
# x8 a* n r* E; j1 K* o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; E: B- n7 f& b% N+ w
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* V* Z8 G. c+ W/ P5 l! R
8 ?+ a, ~$ _, A$ } {
// 映射中断
( f- z5 L8 ]3 \9 f; e7 n
IntChannelSet(SYS_INT_EHRPWM1, 2);
! g2 I" X1 j- J' T0 ]8 `
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
5 P2 }+ _( j6 x$ u5 I
2 N' g) F+ V! q5 B
// 使能中断
1 L! h& x# Z8 R+ C4 x- q; v
IntSystemEnable(SYS_INT_EHRPWM1);
) x* f+ Z$ L( p) R
IntSystemEnable(SYS_INT_EHRPWM1TZ);
% ` U2 \5 }5 u0 Y$ J. z) b; r
}
. ?& T( A9 ^& _3 J7 t- b& @
; `1 f6 A7 Q3 i j
/****************************************************************************/
, {* Y5 Z6 D) L
/* */
* h* {# Y+ t0 t7 C2 P
/* ARM 中断初始化 */
: r& {+ K0 r" C. n$ P
/* */
* _- Q) Y3 @7 P' F. t* l; k
/****************************************************************************/
- G5 {6 Y$ N/ ?6 t3 d9 H* K
void InterruptInit(void)
, O# R, m; o/ J: l
{
) O! V0 W" |7 `% M3 {3 x
// 初始化 ARM 中断控制器
$ J8 y0 N! }/ e+ y. E6 A4 Y5 J
IntAINTCInit();
2 Q- L3 z" ^. T* y8 \2 W$ h
/ _3 A& Q- v Q3 \7 _1 G7 e
// 使能 IRQ(CPSR)
! I* T0 @( B3 |# Z$ {( f! q1 n
IntMasterIRQEnable();
2 W5 T- `3 [, Q }( }% n
" D9 s0 w ]2 U) B/ p7 e, E
// 使能中断(AINTC GER)
- o: e/ v5 v( ^% t9 N
IntGlobalEnable();
* P; \2 d$ @! _) i
# D; k) R. Z& ^7 j, {
// 使能中断(AINTC HIER)
G' E4 T6 v3 x7 A4 R+ b
IntIRQEnable();
6 F4 W5 A, X* f6 Z9 F9 z
}
/ L+ L+ J( Y1 X$ p
0 H S* G: Y; ]) y# W
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
: F0 ^' i: F; v2 p. D6 k: P; ^
/* */
0 Y' C, u3 c$ c+ i1 b$ u9 |
/* 中断服务函数 */
0 A: |% b- r4 B/ R
/* */
' e8 w0 [% h0 j# ^
/****************************************************************************/
p1 X% D: u/ ^2 V6 N
void PWMEventIsr(void)
2 F$ n, H8 L" m0 f
{
( P1 A0 r0 \* H
IntSystemStatusClear(SYS_INT_EHRPWM1);
( R0 `, G; N+ [5 u& }) o6 N
% A$ L# k* G/ b M' p5 U
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
S) ^, c" c5 l) W% f
}
) Y% h5 ^5 N3 O
, {6 g7 L& `6 v
void PWMTZIsr(void)
( {% q1 c* R# F
{
: v, n$ d2 U+ Z" o4 U; u) T* s. X- s
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
, j \) J7 k- X; y/ t% ]* O
7 y& N/ w7 x$ v# Z$ u; @/ W- H
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
8 ?2 x3 K: O4 Z/ {2 q' u7 S! U
}
8 ^4 A) o. V; }) _2 y
$ \ E; s4 X4 ?- _3 d( N% V
/****************************************************************************/
$ J8 B4 E' ?# g( ]+ d9 d
/* */
! K* U5 {% d( f* f! y2 i' _
/* 初始化捕获模块 */
1 l) \6 \! a9 x* u) A! H7 K
/* */
9 \5 ~7 r l+ T" F2 c+ L9 y8 A" B
/****************************************************************************/
p @! y* e9 G$ F
void ECAPInit(void)
2 a0 ^1 C) @5 j% h' L( O
{
& b& j, n; U8 S
/*-----设置 ECCTL1-----*/
+ g' E* ? E+ W4 F- m
// 使能CAP寄存器装载
/ N6 o# g) p, J/ x
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
' G+ g* X" ~8 R& Q
// 设置预分频值.
2 l' O5 U/ j2 {& h
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# w: G+ j! i6 R, i8 s" X
// 上升沿触发捕获事件
( t% C0 H+ P( {+ ]" C$ H
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
# O* v1 U9 }, z" \" ]9 g. l B
// 输入捕获后重新装载计数器值.
3 f* L/ z7 _3 i
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ W) m5 O6 N; i# y" Z, l
3 i8 B, K# s4 C
/*-----设置 ECCTL2-----*/
6 Q! R9 I: X7 K+ a
// 连续模式
- ?' A) j" }4 @# V' E/ U( H
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
4 b2 v( K8 y, h
// ECAP计数器TSCTR持续计数
6 x9 b5 Q) g: |8 B7 _. V
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
7 x3 j+ y0 `# z4 [3 X4 P
// 禁用同步输出和同步输入
D% A/ ?8 f8 F& ?
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- w. a4 p' \9 `! ]( c5 w
// 配置 ECAP 2 为 CAPTURE 模式
6 O" v0 q' ~ }
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ X7 f- @4 C; G" S
5 Z. f- ?% _# ]3 H0 [% x( U
// 使能中断
" L; v' Z, l# ]0 `. `6 T
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( t* y8 }2 j) H& j
}
; d' P* i% {) Q7 R, ~, m$ Y. C
0 }# q, | b( y) t
/****************************************************************************/
1 N# w0 T# m0 c5 K- Z. B
/* */
: B5 E5 @, n; F4 N" z0 T+ R% {
/* 取得捕获结果 */
0 a1 B; c2 M2 _7 G) \
/* */
+ l, l7 x" i( k2 u! y* [
/****************************************************************************/
; u' w# v0 |( \4 z% {
unsigned int ECAPRead(void)
) n. C3 o+ \4 U: D/ w) G
{
# E$ I2 N& @* g1 U3 m
unsigned int capvalue;
) w; G9 o* a# s5 W1 H
unsigned long frequency;
1 W# w. g- @, [; E$ j# e
* f# M% s: G9 N) Y
// Event1 中断标志
0 G# h7 n" A' S r! l8 i
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
- y& {" r( {9 ?% Z& ^
{
9 a$ M0 ]9 Y6 R7 o+ W; |' f6 H
// 取得捕获计数
/ R7 H' [6 L6 A/ L+ Q# ?" o
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
9 Z6 C. I8 [3 r; L1 A2 ?8 f; T
capvalue = ECAPResult.cap1;
5 w, F3 e% o( |. ?( e$ W
, d J' a- Q7 T4 z) M9 M5 B2 v- G
// CAPTRUE 模块 228M 时钟主频
1 o$ q* f- d4 H; t6 r
frequency = 228000000/capvalue;
" ~" F0 l0 K4 M3 J* _* q0 V
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
3 p: X2 T$ Y& c1 E6 Z
% B( ~) f" a- \/ S! H7 A
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% r+ ]$ @ _% V! Q1 W/ J* w
// IntEventClear(SYS_INT_ECAP2);
# o: w, Q# L3 l1 o1 P1 @
}
" I. \# l* F$ Q4 U- m& n) V
return frequency;
9 I% Q' _: a( I0 i) O3 ]% o! O" n9 q
}
+ f8 {: e: X& Y: _/ C
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
7 ], |/ l1 h% A( v- w! @2 U" q0 {
[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