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