嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 c) F- Y ^. B% l3 G
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
Z1 Q3 D4 b1 O! E. d7 J" E# J
/* */
) |1 o- ^. Z7 u6 E, V8 O) b
/* 宏定义 */
8 Q; w6 U- @5 E
/* */
5 l2 l' e7 e1 C: ?& r+ A
/****************************************************************************/
- T; c; U9 |6 m0 `
// 软件断点
" y( h# w, G( n) T
#define SW_BREAKPOINT asm(" SWBP 0 ");
, P" e* ~9 |% p/ y. z
- ]) L0 x' R0 |; x( E
// 时钟分频
3 f6 \, _ f$ L$ i/ K+ y
#define CLOCK_DIV_VAL 228
' W1 y$ U4 d9 d" f; X$ E7 q, W( x
( o& N; n; e% q
/****************************************************************************/
& _3 @( S4 j. i
/* */
5 s. {! X5 G& N- l. d
/* 全局变量 */
8 O& X" M4 N, k6 \
/* */
% j2 _) R* r0 s9 S
/****************************************************************************/
5 I+ J. G/ g. ` x0 V& {. J
ECAPCONTEXT ECAPResult;
- P. Q! ^ Y8 W4 u& e1 M R
" v5 |! x/ `; M+ O& Z
/****************************************************************************/
" M+ q2 c) n* x" f
/* */
$ L+ i; W7 g1 Y& `3 w8 `7 P) d# S
/* 函数声明 */
$ ~. |/ S: k2 w6 l
/* */
. e/ ~) a0 }9 q+ ]
/****************************************************************************/
* Q% L: e$ |7 t$ [( S/ K
// 外设使能配置
: X" G7 U4 L/ Y% U
void PSCInit(void);
% S2 @* \. p: u
, Q6 G9 N) ?+ ^( c; e/ R+ s
// GPIO 管脚复用配置
1 z- M/ m7 ^1 }& e- W, G
void GPIOBankPinMuxSet();
# c) _# `5 k& q
# N2 {: y; W. N+ e, P
// 产生波形
" L9 p- k3 g$ x, y7 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
( _# `) H; a+ y& q0 Z9 F3 s+ G
void ChopperWaveform(void);
) Z( C4 h3 Q0 E, q( V
5 m: H2 p, P3 q* s( o& h' c
// ECAP初始化和读函数
0 A% e- |9 z1 }' _
void ECAPInit(void);
% d9 u! v" j$ S% j6 _! ?% n) O) u
unsigned int ECAPRead(void);
% j( N' t5 Y6 b
3 |0 V: |9 T P$ }6 y' C" }% c; C( Z2 ?
//ARM 中断初始化
1 w% O( \* T% n8 b8 W& @
void InterruptInit(void);
' B* n1 q& u$ [8 P
9 \7 j/ E6 J" X, B9 V
// PWM 中断初始化
/ ^! n. x l; O/ y/ m& I% L
void PWMInterruptInit(void);
5 s4 n g" U( w8 D2 m, T- F
// 中断服务函数
, j, O( R3 @8 k$ l' Z; k& c+ w) t1 m
// PWM 事件
& N6 h1 ^! |" v! D: Q6 c" ?4 z
void PWMEventIsr(void);
* z' ?1 l# t& r" m( X) V0 X3 q
// PWM 错误控制事件
" p! ^% o C* l# z' i M5 K. U; h) d4 y
void PWMTZIsr(void);
M1 q2 ]4 @' a' `, m* U9 k
7 u' R+ H- \ ?2 @: _6 B6 w0 `" c
/****************************************************************************/
" J$ `0 X! }5 Y$ S
/* */
0 G3 c7 |) d! a" Q) E* d+ l; B
/* 主函数 */
: }/ K( f/ V" J
/* */
" Q& g4 A! w7 N0 _
/****************************************************************************/
& y6 T/ C& B: n
int main(void)
/ l5 I8 |! P8 {( G
{
5 Y+ @0 h( b# _0 ?# `- \/ M
// 外设使能配置
, O" D0 | x6 o
PSCInit();
/ q9 p4 J" x, x( b' C6 r5 M
2 O) d7 O! v1 B+ r" z2 b. _7 z
// 初始化串口终端 使用串口2
1 n0 Q: ?: F- r U
UARTStdioInit();
# t5 r, O! h& ~
& U7 ~( H* R2 _
// GPIO 管脚复用配置
0 }! L' M' z, D" }& u
GPIOBankPinMuxSet();
6 o5 c5 [, X! R/ _
# S7 c6 n& ~& b _- ~0 @3 @
// ARM 中断初始化
2 w( [( o: V# H
InterruptInit();
1 f" V8 f0 u: Z0 k8 k
4 O! F. L) s; R1 E$ R4 A
// PWM 中断初始化
( D7 G, s6 b2 b
PWMInterruptInit();
% v+ m, k x1 E+ K9 R% u: _5 {1 y
9 B8 l# q* C4 q7 l" B# T
unsigned char i;
. O) @% _4 o3 u8 v2 b1 e
unsigned int j;
9 y a1 X, P3 R4 U" D% T
3 \9 ?7 _/ i+ p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" H. K& g* T$ Y' l+ h. O6 i% X
UARTPuts("------------------------------------------------------------\r\n", -1);
+ V) ~0 M: _- c
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& T F+ K6 f1 X& C. l: T
// 产生波形
) k& y" D/ y, P4 S* k ]; ^
PWM1ABasic(25000,50);
# f( M/ Z" b8 o1 b' z
$ T& |5 x+ Y% d+ |
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
1 ~! Z2 j+ D$ O
UARTPuts("------------------------------------------------------------\r\n", -1);
9 D3 X0 s9 d& k2 w
, [$ j4 \# r5 R4 [0 _, z4 i8 a
/ Z6 T3 P% B5 Z! Q* b# H/ S
* ^& o0 k- v6 @( _0 v- K
UARTPuts("------------------------------------------------------------\r\n", -1);
- O5 R: K" T2 k
UARTPuts(" C6748 ECAP Test\r\n", -1);
, L/ p2 k8 Y7 @9 h, K* Y0 h) h
// ECAP 捕获初始化
" ?4 n. `9 k# [+ k
ECAPInit();
4 T. b: Q( s M0 @: K
UARTPuts("Initialize ECAP.......\r\n",-1);
2 l6 k ]# [ \
for(i=0;i<5;i++)
1 \0 W2 O4 M9 ~2 g) |( {
{
' a+ B1 r: K* Q/ _ O
for(j=0x00FFFFFF;j>0;j--); // 延时
, T: C+ B; k" T1 O
ECAPRead();
3 `- ]- e" n$ v; ^
}
0 d/ X- D: c/ Z% j. ]+ ]6 l3 _
UARTPuts("\r\n",-1);
1 t2 X1 B- |9 |: h
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
1 Q; i7 I( E" G8 _
UARTPuts("------------------------------------------------------------\r\n", -1);
P6 Z, k3 ]. r2 E0 j
# i1 B! r8 E6 z
// 主循环
- S# O! j; {- A) b. m
for(;;)
( h0 W. {% }( A7 \5 F' i
{
1 G }8 [. N" K# ?
' e4 @3 @+ I8 }
}
' k* i) N8 t5 `( F$ l+ o2 T
}
1 n3 n; X% q$ @/ ^
8 w# P7 F3 e4 |* l. s
/****************************************************************************/
, D! x9 {6 f' l8 Z J
/* */
; A* O8 d7 p6 {7 O+ N/ v4 m* e2 L0 @
/* PSC 初始化 */
! ~* f" ? H; r: }6 A
/* */
1 y( u9 ^ ]0 G" k+ d8 c5 Y
/****************************************************************************/
6 U4 e* [2 P3 |) Q
void PSCInit(void)
2 ?8 E: _% P$ J
{
! O3 _+ l# l7 l* S
// 使能 EHRPWM 和 ECAP 模块
2 K2 d* j" ^2 P0 y9 h" m1 Z# Z
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ B9 T0 R' A, P. W9 R- }3 b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! M: r( @3 v% B" O9 q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" f' x: a1 l) G! M8 C
}
! s5 n/ m) N- P
& e0 x& z% D& Y) u# [$ C0 p& A, ^
/****************************************************************************/
0 f$ |7 w5 e( X* ?
/* */
_; E1 s- K! `0 r5 o* {# t
/* GPIO 管脚复用配置 */
7 P2 E0 S1 l5 A7 A* B
/* */
5 T" [/ f, p5 b+ h8 Y+ I; T3 I( Q
/****************************************************************************/
$ I7 I, s$ k7 k1 @8 p. U
void GPIOBankPinMuxSet(void)
8 |$ M6 a+ W! K2 ]
{
8 m1 E* T# V& h6 Z% n
EHRPWM1PinMuxSetup();
4 X4 c% `" d& `. I0 I
6 C3 u* C% q( X! ]3 \ n7 n
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
. f+ m7 O4 M2 Z7 ^* d
// 作为捕获功能时管脚方向为输入
2 K! d" Y& e, s6 F3 X% f' G1 B
// 作为辅助脉宽调制时管脚方向为输出
& m, a' ^/ D( ^5 l
// ECAP2 / APWM2
1 h( x: t$ E. _( G
ECAPPinMuxSetup(2);
G+ ]6 p% a) e9 a8 R, g- L
) Y# Y0 W; s) X- a0 _3 @6 _
// ECAP2 / APWM2方向设置为输入
7 N" r( [1 c; e, {; W
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
9 [" |2 `7 D; \8 B9 x4 a6 }) z
}
! [: {& q5 w r
2 z1 ?0 I* C) y! |' N" L% {
/****************************************************************************/
/ {- h3 R) @+ Z7 J5 e L0 [ D, o
/* */
! s. C- ?* C( h L3 X5 e9 ]
/* PWM 输出波形 */
! ]# {% c# p% C8 } s/ K
/* */
, i/ h$ I2 }/ d2 V
/****************************************************************************/
$ m& r8 q1 O. q, @' ]3 H. M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- T8 ]0 |1 U* `0 H6 Y/ D
{
4 X+ @- G" T4 ]9 d. {( ?
// 时间基准配置
% J9 B: c3 l0 o1 }
// 时钟配置
* c1 O3 G6 ^$ `9 M" \
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
+ x" o# s0 R; }. Z: E1 y- p
# D& q- R p( {& c
// 配置周期
. J5 h8 O- Z% k$ K( x- L
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* m. i$ i4 F7 J) T5 ] F! l0 y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 L; H" m+ A9 N
( e0 G) }8 C) d/ A: C: O& B
// 禁用输入同步信号
. O1 F" y2 |0 u% r& [! h
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" @/ B8 P7 \+ ~* {8 l+ }& b
n5 |7 {' c, F- e# A4 W- e
// 禁用输出同步信号
7 e3 X" \3 r. ]" i
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ o6 G" `" f$ P% A" ~0 S
" Z: \3 F2 A' ~# u/ u
// 仿真(DEBUG)模式行为配置
0 g. t% I5 A: g6 C L# u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- y L% ?% t9 n5 n0 a" Z" {; a) `
# q$ A* j$ ^6 p
// 配置计数比较器子模块
& i( T8 P' {) y ^
// 加载比较器 A 值
; H, [7 v& a) M0 [) L( q5 G
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( ?- I2 V0 O% r) L& v1 T
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 W9 B" H8 M2 k; X) s# |1 L
6 |) D/ ?2 r. U8 Y/ Y3 N- q
// 加载比较器 B 值
2 C2 ?; p) \8 [6 T1 Z% z" V3 U
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: }# G: q" D* a& t
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( p. z- e- v8 j, _" I+ I) j5 a
: s8 k& P3 G" {+ A
// 功能限定配置(输出引脚触发方式设定)
4 E3 m2 z, Y" C N; D% Z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
( ?" h3 R, k, f' A Q
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. h: U8 ^; d3 Q# V, ?9 r! `
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* Q: B$ a0 [% T1 F( o$ ?' l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' X2 a2 z* Q! ^( N, c
% V% o* W! L. h( ~% y
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
. a" S9 e; u2 G5 {2 Q6 p. m- ~
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
% w1 K2 G9 G/ E7 j ?& N: [( X: z
/ g( f3 P9 y, Z8 n
// 禁用斩波子模块
; o4 C3 g* L$ ^* P, W
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
3 k1 T! g! o1 b7 C# G
+ I$ A1 \0 y2 G4 m* e# n2 C
// 禁用错误控制事件
6 v) e6 Y6 B% _ e* I
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' k. b. z1 C1 i; O+ D" l9 n
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& |' b% n6 i* U
7 H% e$ C6 _6 k2 K$ W
// 事件触发配置
% _$ P! v/ Y/ o/ [
// 每三次事件发生产生中断
$ n$ O/ H# l! K1 k
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
" Y2 z8 o! |& @/ u
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- y& }0 H1 ~9 |6 ~
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 O$ f4 R8 ?5 s1 x# s- `& y1 H
// 使能中断
o1 E7 e- H( c
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( A$ B2 C7 u) |! o* }# ]7 |
/ X: ~) g) ^) V+ {5 B6 e$ a
// 禁用高精度子模块
0 q& G# Y3 v; T3 b6 U
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& c4 S. U* F+ q$ p. g
1 U% J/ _" E6 ~, T: m# X
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
9 N$ ^: \9 S$ D s, R1 w2 J4 T) @
}
% E J) X" ?8 n2 c# u8 m$ W: d9 {
1 y7 U* x6 x) f' l( n7 F; W! O
void ChopperWaveform(void)
|: J( W& X Y$ e& M* g
{
: b j6 `4 i" y, i1 F ?( }
// 50% 占空比
8 l- t/ t4 v, O0 ]) O
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ {( S3 K' G8 b* ~
// 4 分频
& H7 _; z# M: N9 o* s1 p" K
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" d! D% z. N( B$ m- v" |/ T$ l5 K
// 单个脉冲宽度
' t& v$ w1 o" E9 g1 M( T7 T
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
* F5 X* e. r) `; p9 d% A6 v
// 使能斩波子模块
! T, W+ F3 Y; i. X. c U
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 t. P! m g0 S; ?3 k p+ d
}
; \8 \- [( [% C) z
: z: q5 N& s# v# b$ ]
/****************************************************************************/
3 ?7 f3 Z, F2 p' |' _
/* */
8 i# b: E; J& H1 @$ l( \
/* PWM 中断初始化 */
; M. e6 J4 h, I3 g: c. v8 d
/* */
) u; y: t$ H3 _8 B( z- ]
/****************************************************************************/
D7 W/ H) y9 f3 g. A$ a2 _- `3 d
void PWMInterruptInit(void)
0 ?6 R5 Z1 F4 H ]- I$ I# ~
{
& c5 i) ~' |; |6 ?2 @5 B
// 注册中断服务函数
; w# U4 X) u8 q9 K& u. D' Y
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 l! X1 n: S/ \$ G$ V+ ?( I
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 {4 t9 K, p; i$ c# }; o
- H& S& S# e$ z" }/ `" J" n
// 映射中断
% y3 L, ~, Z6 G8 n- P' K2 n, z
IntChannelSet(SYS_INT_EHRPWM1, 2);
! K1 Y$ a! x% A" n8 v9 j
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 [3 N( F& ~( I. y
0 s; I( i8 H, n& C" l7 b" G5 b0 s
// 使能中断
, T, C2 J5 E& r5 o+ M3 V( ?8 [( l& V- s
IntSystemEnable(SYS_INT_EHRPWM1);
6 ]# e& |- J& b! {$ @# e
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 T6 |- {, _/ u2 L: G7 }
}
: Q5 e$ f" A2 ?. a8 P
6 C; D4 q/ T! U$ X ^8 [
/****************************************************************************/
t8 w! u# ?8 @ j C L" N
/* */
4 z) _0 u5 j1 ~# i; D2 n
/* ARM 中断初始化 */
% e$ O; E; O& @2 H/ V( U" x
/* */
1 A P% S" b" F' v
/****************************************************************************/
_7 _; z7 s, W2 o" i+ T F$ G: J
void InterruptInit(void)
0 R" e( Y! E4 T R: h
{
% e; w/ _1 l7 Q* t1 y
// 初始化 ARM 中断控制器
8 l+ q8 M% p g
IntAINTCInit();
% y* s! f, Y: p6 e
: K- ^9 X, ^- z0 _0 ?0 h; m! z! Y
// 使能 IRQ(CPSR)
, G+ ]! }6 p9 J8 o
IntMasterIRQEnable();
6 C% P4 Q# w1 U* x. v3 O# |/ M
" |& ] t& |* D$ h# M
// 使能中断(AINTC GER)
3 ~1 G/ [8 d: j3 g
IntGlobalEnable();
/ y2 U* m) f& z$ S
% n! V3 W4 {: B0 I
// 使能中断(AINTC HIER)
; ` s7 v0 w) }+ E& @( n
IntIRQEnable();
& a9 V- R- n( c' L4 A5 P
}
$ j4 |* ]/ N# m* Q5 [1 g" y9 b
) W: y1 L5 O1 J' C
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
/ C( `# r$ m8 T& B# O# k# n
/* */
( C' P1 c0 Z( f; g1 B, }
/* 中断服务函数 */
# M |( y( x# G$ h' C) a
/* */
/ Q) J% u( X0 [( E, c/ R
/****************************************************************************/
0 U- k; K1 Z: n: G! t: g( h
void PWMEventIsr(void)
3 h9 X6 v9 R, w- ~& ]) P6 Y; {
{
& v2 g5 }: ]- J) j! t! B% q
IntSystemStatusClear(SYS_INT_EHRPWM1);
/ B" K9 q4 O: L! _
% Z# g. n- z* G; l# X% d, j
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- c" Z& x- _; I# O3 o. F) P
}
! @, i6 s3 G, C% l3 L6 u* k
" h% t6 v! O1 w2 r- O8 g
void PWMTZIsr(void)
7 ]! j3 s& w* E6 e
{
6 J: X! O/ T, ~$ D2 I
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
W9 x+ ^7 o8 e; W
% \! `; y- Z+ R' B" G7 Y: V
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
3 v% w+ t& R" r/ w4 I1 r* e1 W
}
# h; e: ^5 p: k7 z
6 o$ y+ B( J$ C& J$ H
/****************************************************************************/
9 `1 f3 Q7 j6 s/ w9 ?* |
/* */
$ `! t b H2 ~
/* 初始化捕获模块 */
, M4 @1 V7 ~' h5 e" ]% @2 d
/* */
0 H7 R; Z6 k5 K) m
/****************************************************************************/
2 k& B! s1 b1 I! k
void ECAPInit(void)
" d$ x) @4 ?# W& H# U2 x& [0 M
{
' f+ t, U+ M, g) a" J2 p ^" i
/*-----设置 ECCTL1-----*/
" l0 T! g0 |8 w# \1 @
// 使能CAP寄存器装载
4 }' x+ q/ f; W0 [" N
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 H8 u) `7 U6 ?5 Y
// 设置预分频值.
( Q1 @' q' e5 a. c6 @9 {& M5 j' ^
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. ?2 c& C9 [2 x3 |5 B
// 上升沿触发捕获事件
/ h! j& m! r# @0 i" T
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 ]) W' z. H% O' A
// 输入捕获后重新装载计数器值.
* u8 p" g+ P- c
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
& x7 z8 i& |( w
1 m9 l& i* D5 q+ k. Q# O E
/*-----设置 ECCTL2-----*/
, }. }" O( {6 E) f- P/ p' T, Q
// 连续模式
: A7 P6 O8 h; R( G6 }3 t3 ~
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
. j8 c3 x/ v6 e: N$ R
// ECAP计数器TSCTR持续计数
/ Y4 y7 R% G! l: i# {- K
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
% q4 K- V+ C3 G. b! d" W
// 禁用同步输出和同步输入
. _1 l3 h9 p+ [8 x
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& m( u& n3 k: o, {
// 配置 ECAP 2 为 CAPTURE 模式
+ a( q( t# w. i' \
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ {! x# b5 a, V8 R7 B, C- M
9 ?6 j5 M1 }) `7 C3 D9 B2 l3 v6 R
// 使能中断
" E7 c& ~& }/ H* y/ D* J a
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, @0 j. Y q6 g. b% U
}
, ~- j4 h3 R3 N/ j9 P% H; X/ t6 m
1 W! @4 e* q" y/ Z; K6 S
/****************************************************************************/
: C \' W7 P6 M5 V
/* */
5 e9 U! {3 Z) f; U4 l+ Y7 E8 a0 s
/* 取得捕获结果 */
6 r7 C+ P/ K" d! I4 H5 M+ E
/* */
7 w/ B& ~) p) v+ s4 S# U& w' n+ q+ R
/****************************************************************************/
8 D0 {' w6 k- _: {' e2 O% C
unsigned int ECAPRead(void)
) u; r) G! M- L5 N( c% @! F6 i* W
{
1 T; T: K4 [( N0 h
unsigned int capvalue;
) @; v% J. J; S3 y9 {
unsigned long frequency;
. J& q2 ], f" F2 `9 S& n
+ s, a, i2 C3 Y1 J# E% A
// Event1 中断标志
2 I0 P/ W% [7 M8 A9 N3 u
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
3 w" C7 Y, }/ T
{
5 `" I- H9 i# j7 c& s4 J: z
// 取得捕获计数
. o$ ~4 x9 q0 ~
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
3 G; o o5 y' ~, V9 X' d5 `
capvalue = ECAPResult.cap1;
4 V, T, g& b; ?8 {( N2 h$ S9 E+ B
" m4 V3 R0 g' l4 z
// CAPTRUE 模块 228M 时钟主频
( o7 k5 ?% t. X) v9 b7 y N, D$ @
frequency = 228000000/capvalue;
' `: C8 l. m4 v
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
4 c/ E. v/ N2 D# h% i' B j
' I- |- { ]% M/ N0 V% H* d
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: i8 n6 R8 v* { ~. b6 j" E$ }8 p
// IntEventClear(SYS_INT_ECAP2);
+ R; M# S$ W0 n2 }* U
}
E/ @2 ~1 Y7 F
return frequency;
" t a) S1 C+ x% c# p
}
' g( e7 O: g' l' V7 y% f
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% [; [. \. A3 x9 K" M9 H5 ~
[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