嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 S) b; j0 @6 z
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
% F$ H3 G9 d7 r! `" w$ U
/* */
- K' K9 A6 A& w: a# W2 b6 w; y
/* 宏定义 */
6 w( G2 [1 U+ ~$ h- [
/* */
1 k4 {. |5 y% }
/****************************************************************************/
6 E& }& U/ d. H2 G
// 软件断点
! d, F. @* ^9 k# R5 p* J. h
#define SW_BREAKPOINT asm(" SWBP 0 ");
* O% s# B) \9 N7 V5 Y3 S7 _
" g+ I+ R4 Q u
// 时钟分频
: q' v0 a+ F' W, p% }8 R' F
#define CLOCK_DIV_VAL 228
2 w/ w0 [& G- L0 T
: A: W1 W3 ?1 I* a% G: \6 j
/****************************************************************************/
2 p! ]/ [$ L, O3 k+ v" f, k- m
/* */
9 r- o3 q1 p1 g+ r" g$ |2 h
/* 全局变量 */
/ }; t2 o1 l+ D% G5 w' ^
/* */
9 u) m5 Z% X) _# |) |' h# O
/****************************************************************************/
7 e( o" Y- O$ } E: A$ r
ECAPCONTEXT ECAPResult;
' b- t- X- M; E- j: b9 I
7 n! B! F9 B) o, e
/****************************************************************************/
9 n B1 N+ I; m4 ]
/* */
3 L# {. q* o# l, E$ \. y
/* 函数声明 */
/ n5 t; k' `/ `, Z5 X- I! ], q
/* */
4 C$ c. h" H. a& d* W
/****************************************************************************/
8 T" q2 n* p6 Q7 j! A, Q
// 外设使能配置
* p5 [2 ^2 m' H8 s. _
void PSCInit(void);
- a) W, n j/ L( }
) ?/ U9 ^9 T5 n3 b4 P0 Y5 h
// GPIO 管脚复用配置
3 }) E6 q( V: ], X
void GPIOBankPinMuxSet();
" u) V% L4 D' S* t6 _+ S' \/ z
O- |8 T3 M" u6 E, c- B
// 产生波形
3 o* L; h+ N& Z3 u
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; m0 |4 x+ E. u
void ChopperWaveform(void);
& |" b/ |! {7 ?7 z+ _& A# Q
; |$ ~. Z/ P" _: @; Y7 }
// ECAP初始化和读函数
* a9 n1 w) T1 |4 K
void ECAPInit(void);
+ p9 M1 M: e( ?4 p- _
unsigned int ECAPRead(void);
- b1 P" `) t. d+ R, b. j
9 t( D# E: l( D/ x4 u
//ARM 中断初始化
& B X! Q/ n" @. Z5 x9 ?
void InterruptInit(void);
% q! y1 ]- C6 ~
9 x m! G! ^% w0 a4 K8 H4 K
// PWM 中断初始化
7 B' }3 R" {- m- {' \
void PWMInterruptInit(void);
2 z# m6 x/ d# e$ t( r
// 中断服务函数
! R, R/ A( [) G2 u: }( y6 l
// PWM 事件
8 G: ^: d' W" v) l J
void PWMEventIsr(void);
8 j0 s; U+ J/ n- y" R2 a
// PWM 错误控制事件
2 L2 q+ a; Q" y; v( G% O
void PWMTZIsr(void);
& K- t' e r% [4 A/ m' T: B
! B4 t. _+ x( z( M, @
/****************************************************************************/
' @7 [5 L. B3 ~! _
/* */
: M2 ]. o! D8 n3 F, m
/* 主函数 */
7 T( _1 j" `5 D
/* */
& T! U. u! T7 T) P
/****************************************************************************/
! l1 ^4 n" N" z) D2 K* h
int main(void)
- |8 U1 ^$ y4 z9 n8 B0 l8 ?7 i
{
1 m# c6 D( W8 U( v$ ]4 @; j/ a
// 外设使能配置
3 \9 |2 o$ [# Q) S9 S% Q
PSCInit();
% C+ v3 K6 c8 a* y% M; ?. I5 x/ Q
# G8 l0 }2 T. B8 `
// 初始化串口终端 使用串口2
$ I+ G; s' z5 X5 H, M, g4 l& a+ v
UARTStdioInit();
* H R7 ^- M. r
1 `1 G# o6 X' X
// GPIO 管脚复用配置
! X" h7 U/ ~; {- H M: _
GPIOBankPinMuxSet();
# N& E* }. A ]/ `3 V
- J( R O( R* d
// ARM 中断初始化
5 B7 v) m3 x8 j6 ?. }( {
InterruptInit();
8 u+ H% Y, A2 q% e, }
4 c' v1 i5 R) ?: D
// PWM 中断初始化
9 [1 {/ Q, F( e3 e( L
PWMInterruptInit();
7 B2 U- B8 O2 }1 \3 E* ?7 K5 H' @
% u0 E" B# H& o, j
unsigned char i;
- a5 r" h6 P3 l) I
unsigned int j;
. q6 B$ X: y# W6 w
" e- G' [; G+ a5 z3 f0 A1 E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; W! ?! e3 t" x- z. e( C( I0 A
UARTPuts("------------------------------------------------------------\r\n", -1);
: u6 I3 v$ b: [1 F8 w
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ B" q; P" J" {
// 产生波形
0 j9 S- b8 T4 X3 C4 y2 w
PWM1ABasic(25000,50);
4 N& \7 A8 B, m J2 s% Z
$ ?# _9 q. g) v4 \" H5 L# x4 n
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 Q7 j* `9 u- n9 [
UARTPuts("------------------------------------------------------------\r\n", -1);
4 S7 I4 z$ J; B/ f3 `
2 D4 c) q7 X9 a4 w; Z$ |% C9 k
7 j( f: R6 G: E; _
- X2 c* m( h8 b( P( i* q5 ^7 v: x
UARTPuts("------------------------------------------------------------\r\n", -1);
, _/ b/ _' D# Q5 q
UARTPuts(" C6748 ECAP Test\r\n", -1);
- o, t, w; U' z
// ECAP 捕获初始化
. c2 \! \7 f& l6 E/ { B: D
ECAPInit();
6 }+ D- t8 b2 B6 F Y
UARTPuts("Initialize ECAP.......\r\n",-1);
9 ~0 w9 P) r/ D: B! z
for(i=0;i<5;i++)
# ^8 t. i' n0 ~0 a5 W7 V& m
{
% G0 Q! V4 U; t* d3 d
for(j=0x00FFFFFF;j>0;j--); // 延时
5 v( w+ p# H; }# f1 n# m9 H
ECAPRead();
! _; j2 R- U0 p/ M& q$ a
}
! T* N# Y" j H
UARTPuts("\r\n",-1);
0 A9 N# @4 o% L/ Z+ Y3 Z) ^
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
3 _6 J, \* R0 ^7 W5 |. b
UARTPuts("------------------------------------------------------------\r\n", -1);
- `5 x# [6 Z$ T: ^) F( H
6 k" F0 F) B$ r0 G* e! ^
// 主循环
" o/ F5 g& y0 J7 a; \1 y
for(;;)
" v9 A+ K8 i9 {/ B9 Z% @$ U: X
{
% X# W$ b. P6 K" d- S
: H& @% W4 j. e4 t5 I0 {
}
2 L+ E' J4 j+ c8 m
}
k( _% [1 a) c9 R+ t* N8 p# Y
& x2 Z V3 v, D/ {* j7 U
/****************************************************************************/
& H5 }7 Z9 x& ]9 y' @) ^
/* */
5 R4 f4 P0 B9 B2 S( }9 W
/* PSC 初始化 */
% |& ?; e- m- J2 V$ U& |( W$ H/ N7 H
/* */
/ F6 a" v: I( R. _* Q5 s
/****************************************************************************/
; Z' ?+ [# t8 x" N
void PSCInit(void)
5 V2 u+ i+ ~* e3 L$ ~9 ~
{
& u2 T J: `; C9 }' G
// 使能 EHRPWM 和 ECAP 模块
; M* a) ~$ E$ q
// 对相应外设模块的使能也可以在 BootLoader 中完成
1 P. w& V# b0 N; U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- _. J7 ?* B- k* r. v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 R0 q& |4 I2 i O2 O1 A
}
: z# T- K# j1 _, ^
6 h% o/ y7 r. A2 k3 j4 F5 e% c
/****************************************************************************/
7 ?6 a. f! |: \ f0 a1 X/ l
/* */
3 S% m. C1 @& F# A( u$ T
/* GPIO 管脚复用配置 */
# m* y+ J+ y) w- I1 @ U) P
/* */
% {+ K. \' ~' [9 ^# A: a7 z
/****************************************************************************/
4 t: a$ w: H8 R$ Z# b
void GPIOBankPinMuxSet(void)
3 S8 ^- M) [; Z* O" c. w6 L
{
; J# I: F9 \2 X. m* _# E5 P
EHRPWM1PinMuxSetup();
: Z% ]$ I( Z2 i
Y" f3 D V& q j: J. u9 H) p, v
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 D X4 | n- g/ u
// 作为捕获功能时管脚方向为输入
5 P+ B# {) e* y2 L% {
// 作为辅助脉宽调制时管脚方向为输出
M0 u, W% I0 H5 R
// ECAP2 / APWM2
+ l5 @0 c. n5 M' q: e
ECAPPinMuxSetup(2);
; c0 n3 u& ]: A) e* c6 P7 f* b% e
0 B2 x, d/ b6 Z/ G8 ^4 S0 q
// ECAP2 / APWM2方向设置为输入
% f! N2 S( m" z; t% {- C
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 a0 P# ]# }+ o6 x2 R+ m
}
6 I. l* H2 f1 N1 A. D
" y+ d( V& b; b2 Y( e
/****************************************************************************/
+ k" r; u( F+ R) f' e1 W
/* */
/ \/ K% A2 C6 {/ `$ Q0 r2 A
/* PWM 输出波形 */
% `& t" K2 [4 L; v( d# Z. w
/* */
B. X# y! c9 g" l% }7 j4 l" {
/****************************************************************************/
4 A1 Q, i6 P/ b2 Y/ A* e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; t" v# W) B& w8 Y. S6 @
{
: [; m8 b! h; ~" j$ \& e9 M
// 时间基准配置
6 c5 \9 c% _! [$ ?: V
// 时钟配置
/ O& H& h6 ~9 m9 P% s. p
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
% R) J, c4 L/ ~. r1 O3 T4 B9 h
! t8 @6 N' l" R" t6 _" u) m
// 配置周期
1 X9 u' ~& `7 t' j
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 n6 @( m& l: v& \, s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# c% ^. m6 d# l" v3 r4 c2 B; Y9 u
8 s% t3 w- o9 D3 v3 I
// 禁用输入同步信号
' O3 ^' K! U& p3 a# h( N6 \0 ]) ]
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# g9 e9 ~# X; N8 M
( I, n, N& R/ ~( X' u! F9 N
// 禁用输出同步信号
4 H1 N7 }2 O# _" Z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, U2 j ~2 d4 m( M( A% A8 c
! d/ j7 z+ }- r2 |5 F
// 仿真(DEBUG)模式行为配置
% z1 t9 k7 |9 D# o* A2 o
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' F- x, t" j- H' Z5 M3 `
! m5 i% n1 F# \$ I0 Z
// 配置计数比较器子模块
( I o! W# W( y* V
// 加载比较器 A 值
* v: [, g) p( \/ U
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 Y1 ]$ c/ v" y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 Y, b" {2 A: p5 r% p7 U7 R0 z
% f/ J' j d' c7 f4 {. E
// 加载比较器 B 值
6 x/ ~! L( m9 n
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& w% i5 Y% A0 b+ Z% ^
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ [ ]# n2 }2 W. M
' A9 ], S( u- h9 [* m
// 功能限定配置(输出引脚触发方式设定)
% p: t/ D* q+ r4 c) X% ~3 J
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, t; y" ^3 |, I, |
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 f. ?# L% F, B# ^
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
' _7 Y- F) h! c/ q) r+ Z; b; G
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
) L& H) l( C: n3 f0 j( r3 ]1 @
2 T; u8 B9 m6 ]$ B
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
, r0 z& @( l, d+ l5 M# K
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 h! d7 x8 Z5 @& q( R
& v. c, C# x& |# P" x9 ^6 R
// 禁用斩波子模块
5 m. [/ M! r5 R/ |+ }
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! C5 T H2 r* L# _- [, Z5 a
; X/ B* e# x+ \- J" H9 u, Q
// 禁用错误控制事件
[- }3 I9 ]! @' Q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
4 }0 Y0 S4 R8 F$ q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ `0 u' v# m8 A( b* w$ ^
) j7 a# z4 C2 a2 G8 [8 `9 n" ^3 G, L
// 事件触发配置
7 E! e, D$ k( ~- H2 v" q
// 每三次事件发生产生中断
( y; q j0 d) g6 }: z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) a+ A! c n; b8 o
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- E! h3 e# K. h7 j+ S
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( c6 t! u6 k5 l! y' L
// 使能中断
8 h& A, m( v0 ^5 K( J9 e
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 Y2 z$ l- y- a+ q( R1 g8 b0 Y8 K
+ }' ~) [1 }/ j' B3 F
// 禁用高精度子模块
, ]/ \: j1 I3 n2 v- z g4 h3 M
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. Y$ q/ u: M; j
0 s* p z5 x$ H7 E4 n& |/ l/ D' G8 |
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* U' q: e. |3 }6 }% w- Z% o8 x
}
! C8 U3 N3 a8 J& P1 X1 x3 K
3 C& z$ K. ?. }
void ChopperWaveform(void)
" O4 n4 g, v6 C" P/ r
{
) H# u. X. S: c
// 50% 占空比
, u2 D7 p; J8 y( e# v g) ?! K* `
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* } M/ k2 B7 V. G K. H
// 4 分频
0 ]4 m5 Z9 }9 Y+ G6 h$ l
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
y/ f/ _+ s! h' H0 s" z# V) _6 F
// 单个脉冲宽度
5 ] ?. f1 _4 @+ W" ^
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
8 E" t! y& O+ V- D0 d$ a
// 使能斩波子模块
; D0 L Z, E+ T8 h+ I5 x
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
* v( j% v# N6 r! e7 y% g+ y
}
; g2 x* _! J4 M+ e1 N$ D. Z
/ d8 t. p6 x8 V7 A. a; ?7 G) i! \
/****************************************************************************/
# h, Q1 o1 n/ U9 k5 K N$ X& ]" H
/* */
4 p) R, x# K4 ?! t) E/ c
/* PWM 中断初始化 */
- X/ i( W5 d; O7 P0 z/ M
/* */
7 P1 f* k* U% I
/****************************************************************************/
+ I1 F" {( {; M4 _
void PWMInterruptInit(void)
+ q- s: _& e$ W V/ ^
{
+ z6 W0 z& U# A; r, | L( e* H7 ^4 C
// 注册中断服务函数
6 N/ y: V2 Z7 P; S0 d
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
t. A4 y# M& k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 J# V8 N: ?7 b
" J6 \$ i% C- z( L. E* r6 d1 W) E
// 映射中断
2 s8 j1 X8 G* ^4 w
IntChannelSet(SYS_INT_EHRPWM1, 2);
. o; I3 _# _7 E ?1 J* v1 Z
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) Y, r% z9 C% J
: i2 I! Q# a* w3 G
// 使能中断
% _" f) W. f7 I; b* @0 a
IntSystemEnable(SYS_INT_EHRPWM1);
$ J& `" a. f4 L. A- i3 H+ [
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 I. B D1 b+ e, R/ E
}
+ V9 }6 w/ a5 C3 {! m! u
+ }+ {. T& s" c8 b
/****************************************************************************/
. x3 q" k9 l7 K5 s8 d7 G
/* */
1 {: d: z7 C0 [- q, u
/* ARM 中断初始化 */
- U! r' M+ g$ |
/* */
+ [) x7 K. W: B1 f6 T; a
/****************************************************************************/
9 Y# t7 j' e: n1 ?* N! [
void InterruptInit(void)
0 K# N& S7 `; O r0 `2 U
{
3 C$ k* Q& P% p, ~4 B! L
// 初始化 ARM 中断控制器
7 _# A0 B/ }& O! G5 H7 Z
IntAINTCInit();
6 L4 Y, E! J2 l+ c
- r% \. K2 L& F
// 使能 IRQ(CPSR)
2 Z- D% z! s- ~
IntMasterIRQEnable();
0 @6 D% K3 ]3 R6 k* K& y
9 F- i! W# E2 t0 w6 d9 y
// 使能中断(AINTC GER)
$ |. K1 E2 P- l, l" C; N4 x
IntGlobalEnable();
2 m% [$ ?5 u8 D: h
0 a3 c$ S& A9 S7 B
// 使能中断(AINTC HIER)
) G% h& S- W1 m% f* N
IntIRQEnable();
" m) L2 g8 f- b+ f+ e! P
}
+ l+ h" C% y/ @- `, ^' h
) [. p2 S4 Q- j+ N
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
/ j# q9 v1 k4 @. |; b% x; D' A2 R
/* */
/ l: v# v; n% ` n7 _$ l
/* 中断服务函数 */
1 J! P% t- e2 } H
/* */
" C7 U7 n H9 K! r( J: x g6 q
/****************************************************************************/
4 K) ]" G& V9 U' R+ V
void PWMEventIsr(void)
+ m/ O- q0 S9 S, H
{
3 O! K5 z0 ^- c' L8 o. }% K
IntSystemStatusClear(SYS_INT_EHRPWM1);
3 V# `- \1 Y- N- b9 W7 h& ?# }' ^
, d. m5 j; w3 g% n1 ]9 H2 o
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 q9 g( d$ A: W* _% L! L
}
/ U6 ?# p* a6 ?6 u
4 e z; |* R* J& x- ?& g: M+ }
void PWMTZIsr(void)
- \7 I2 q7 M6 L: n6 E6 m5 g
{
% c8 j7 I) h( x7 a3 H8 H
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
D { a6 o. R
, n* I2 T2 o8 `4 X8 i
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
5 o7 w. {! V/ P3 ?8 l
}
! G% ^/ C: f+ v" F
: {' z; F' Y$ k- C( ]) h1 F$ H
/****************************************************************************/
1 C @- H* f) O9 `& q
/* */
$ x* i/ [6 ]9 J. U& ?/ O; \+ h
/* 初始化捕获模块 */
( X4 Y- B8 n |" Z) i* Y% ?( q
/* */
: w' B! P# i0 _( f
/****************************************************************************/
( w/ Q6 g, j/ F. h1 C! V# B! n
void ECAPInit(void)
# T F# O0 _. O* g5 G
{
/ g9 U" q9 G2 \; `) W
/*-----设置 ECCTL1-----*/
w- J. H! Y" \" S: Z! S0 M! K
// 使能CAP寄存器装载
; O5 r' [- D$ v( ? }
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
5 n4 m. S/ ], F! E
// 设置预分频值.
0 [+ ?& j) _; @+ |' E3 B
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. P! |# x7 x- f* {
// 上升沿触发捕获事件
3 g! n7 ]" S! y }" F6 d
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* n! X8 t# s+ X# \/ G# X% B
// 输入捕获后重新装载计数器值.
5 u0 ~% e( H1 Q5 A: } f6 w
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
' J% y% p0 m1 U+ q
5 s" ], U+ R+ X2 b
/*-----设置 ECCTL2-----*/
) G" f8 H; Y+ @. n5 V0 t
// 连续模式
. p& m0 a) ]# ]5 j3 a7 ]2 i' g+ s7 n
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 b+ x* v! }3 t5 ]
// ECAP计数器TSCTR持续计数
1 k5 o$ d0 C$ E2 n, _# A- F
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 Q" ^5 R6 t! C0 D3 }
// 禁用同步输出和同步输入
9 Q+ }* Q. c- h
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
% O4 F) X8 B3 W1 z. X/ j
// 配置 ECAP 2 为 CAPTURE 模式
( [( A* h, A. G5 r
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
. z& [: d* T) v2 O
& O2 B* v* D) F0 `
// 使能中断
7 M( T( g9 y% w8 N
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 J9 r% L) C! V* `3 e9 E" p! `4 y3 H
}
' ~; ~% P5 M0 y( V! C. W
- P& `% H- w9 F2 C( M" u: V/ u' _7 n
/****************************************************************************/
4 r2 M r% \; A( l1 t+ V% z, p- D5 c
/* */
8 n) V& U0 N( K p8 a& B! P
/* 取得捕获结果 */
( f4 L! K$ B; g1 W+ N4 R
/* */
. S9 s7 d9 w2 E* D
/****************************************************************************/
% z7 F" N% {0 P1 T0 z/ `+ J9 K7 m
unsigned int ECAPRead(void)
) f7 Y# Q5 R# I, c
{
5 K" T- }* S+ I0 `; K8 v1 s
unsigned int capvalue;
- z) p/ Y# X$ @- x* \/ Z
unsigned long frequency;
9 X- ]5 G) V+ J' a. r1 y; M/ Z/ W
# ^5 g! _ a; U7 K- s
// Event1 中断标志
3 y$ K/ `4 @5 Q: X1 _' ?- {0 D9 h
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 q# c2 I+ a$ w
{
) x* R4 b5 _- O
// 取得捕获计数
% y4 X/ p) Z+ n: A
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% u6 n* y: u% Z$ Y
capvalue = ECAPResult.cap1;
% e5 E) [" L$ ]5 t" \
/ L, B* X3 x3 M2 R
// CAPTRUE 模块 228M 时钟主频
0 d3 `9 ^1 \# D t
frequency = 228000000/capvalue;
0 J+ X0 p: e2 V# L, E
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; T- h) l) j: X% R3 \$ M5 l z" f" W
' o1 z( G- m1 C- }3 k0 }8 a
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
2 L. B H9 r2 v+ i; Y
// IntEventClear(SYS_INT_ECAP2);
( {* @" Q7 _3 M l: u; d
}
! f4 G& ~$ Z' q8 y& K. L7 Y5 d
return frequency;
! r; Z. L" q" j M7 [: X0 V
}
8 L+ @; l" M) N
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ [4 L) w% _# D( q
[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