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