嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& w; L3 B% I+ A6 t, v" s
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ K9 h; G3 Z7 G. K- ~6 Q
/* */
6 F. i- A( R' ~* o1 m1 @ {: Y
/* 宏定义 */
" i \5 w) S6 l( P3 Z; b5 F
/* */
, b( C, q# ]5 |- [2 O0 W
/****************************************************************************/
~$ [4 F- ]7 {$ `4 r" s
// 软件断点
, p; e9 @2 b& }. G( I, ~
#define SW_BREAKPOINT asm(" SWBP 0 ");
6 R* {& K1 v* M, L, B/ Q( s
/ Z# o- l/ i" I5 |
// 时钟分频
/ ^, K3 r% b b
#define CLOCK_DIV_VAL 228
$ h& y( S3 B1 P! Z% y' @
: Q' I1 b- z3 v. _" \" R% V
/****************************************************************************/
& _: W6 J9 Q8 {! l. @; Z
/* */
. ~ R/ J" `- z& J" f1 ~2 r5 G
/* 全局变量 */
- i$ ]* b- ~' }2 o
/* */
8 S) }; P" r4 Z$ T2 S) R0 O
/****************************************************************************/
' A! a: O% a f; Y. n1 T
ECAPCONTEXT ECAPResult;
2 S" P* K; e0 v R
3 H/ x4 i6 r8 O0 S) J( M' r# t
/****************************************************************************/
( J9 E$ f3 Q: i3 k- U8 m3 w
/* */
; j: n8 s$ _& U: h
/* 函数声明 */
) a; t) b6 h2 g* C# a
/* */
3 `9 i& V b. y$ w& x/ M; j5 s
/****************************************************************************/
2 k0 V; o F0 J" T' v' D$ t
// 外设使能配置
! H3 P5 O1 Z x+ g! ?& B
void PSCInit(void);
7 w+ [" g- e. P. N' m
; m' l9 z* }9 }* x& f7 r8 q+ }/ B
// GPIO 管脚复用配置
7 I X7 m" t" N- o- K. B! C6 i, [
void GPIOBankPinMuxSet();
3 l X2 H/ X' n. T# Y6 Z8 q
4 f/ P+ o2 u* J2 F. g' N
// 产生波形
5 q, B* A d+ w% E
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# o2 _* [# N9 s7 s- w3 R$ k( Q# u5 u
void ChopperWaveform(void);
: c% k/ x8 h8 z
3 @6 o# f2 c X+ s4 R! Q! ~6 j
// ECAP初始化和读函数
& W- g( F# I5 o P
void ECAPInit(void);
7 X# _& Q, U0 d: \# K6 F
unsigned int ECAPRead(void);
" @5 N0 C+ J e/ S t! z, N4 x$ n4 n
% D/ A' _+ w" g- O/ x X
//ARM 中断初始化
; P7 U# o, m; B8 ?4 d) h' E( X
void InterruptInit(void);
" b. S& S3 j. `4 T9 e3 Y; B
( _$ w+ m U0 X3 S2 s$ C
// PWM 中断初始化
/ b# m y! H7 T% j
void PWMInterruptInit(void);
7 f# Y- x' `) m' S7 S
// 中断服务函数
2 R1 A& d, J& X5 }; U
// PWM 事件
9 s/ Y1 H: B; s* _$ @/ y
void PWMEventIsr(void);
0 c5 h1 n( x# O7 ^5 z. c
// PWM 错误控制事件
* b9 O* _+ W# K& e6 z6 t1 w+ K! Z- k
void PWMTZIsr(void);
. V5 W4 n$ O& d0 c" i$ Z
; V* C+ s. s: h% s: Q! w0 h
/****************************************************************************/
, T, {6 K5 p* s6 C# l k
/* */
) J; q" l( z# E8 D8 _+ f( N
/* 主函数 */
x2 F/ x' X" m. D2 z$ ?. W4 \7 x" K
/* */
# O+ N% G0 u. S: |% C) P L4 J
/****************************************************************************/
! h& g4 Y1 x1 r7 A
int main(void)
- L O+ M$ [/ C& q! y9 `, k
{
: @: u& q1 A2 m, b: @3 q7 Q5 x* R) ^3 n1 {
// 外设使能配置
% b( L( y, t/ O9 _; R
PSCInit();
f( A1 @4 Q$ {" i" f5 K
& o! y# r7 @" b8 y; d& S* |/ U1 c
// 初始化串口终端 使用串口2
~! D' n( Z7 B" }
UARTStdioInit();
: a5 a+ S/ S- k3 G0 ]& \* G0 l
) w! y* M4 U" Z1 R) j3 q
// GPIO 管脚复用配置
; d+ d& W; Z/ [/ b3 W- M
GPIOBankPinMuxSet();
& b0 N6 \3 S4 Q- J
0 O$ Z) Z+ W) X. f9 w! _
// ARM 中断初始化
% n0 s: x ^( }: T& \ v
InterruptInit();
& S+ h: y. ?( ?! x# e. d
: o( d# K1 K9 M, ]
// PWM 中断初始化
+ R% U$ K( I4 d1 z; h* ]
PWMInterruptInit();
( D' M3 }& U8 y r" C7 Z
7 o `; S4 C1 o# Q
unsigned char i;
0 J6 S. F# X" h! u# E9 N3 L7 a
unsigned int j;
, I. I% x5 h. i4 s
* [6 l8 G; {- ~. f( S
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
- {3 C# X+ t, B( U
UARTPuts("------------------------------------------------------------\r\n", -1);
8 q; _/ Y" n, E
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
* u& F1 Y, U8 z9 |
// 产生波形
% U% ~$ V; S g) `8 r7 V2 x' l
PWM1ABasic(25000,50);
6 J7 r4 b4 m2 m" X; p0 x# q2 O
" N# |7 _/ Y: { }7 `& z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
: Q: m% i8 l0 d# r
UARTPuts("------------------------------------------------------------\r\n", -1);
# q* t* d% C# B
* W0 v6 B* q7 r4 Y0 t& H* M% Y+ B0 O3 e
1 U: A7 T r8 q5 F# O: ~
$ G X6 S3 Y) h) a
UARTPuts("------------------------------------------------------------\r\n", -1);
" O. ~: e1 N$ e1 ?$ m5 `6 S
UARTPuts(" C6748 ECAP Test\r\n", -1);
: V! |: B& N j3 @
// ECAP 捕获初始化
9 D n. m7 k+ q$ @$ C) C( P
ECAPInit();
$ u$ x6 m) G, H% g; p
UARTPuts("Initialize ECAP.......\r\n",-1);
( M* F# V- q* x
for(i=0;i<5;i++)
1 [3 c' p( b U# w
{
& X: |" X9 s1 x6 J H
for(j=0x00FFFFFF;j>0;j--); // 延时
+ g+ O- S! Z1 ~6 ?
ECAPRead();
& k1 |) A1 W" x2 l8 n: O ^& w0 B
}
0 F5 k) a# K/ ~' m, n! K) i: I
UARTPuts("\r\n",-1);
8 ~0 C! ?6 N( f9 `" j9 B# b
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
* N8 W( O- y: ^6 y+ h( _: W, P
UARTPuts("------------------------------------------------------------\r\n", -1);
4 Q2 I0 _( U+ g* w0 b8 @
# Z* @* i1 z9 [" P" Z5 K/ x; Y5 [! E3 y
// 主循环
* ]: o4 C$ }6 R% ~" A5 J. ?0 P
for(;;)
( z9 C6 @" |1 x
{
2 j( n \) f4 Z4 R/ d3 U
6 _5 q8 z1 ?. A! q4 s( B
}
% W9 u/ k5 f8 x% Z/ s' d; s
}
) b `! ]& Q7 J( B" e0 N
$ }2 k' D" o; q9 l# s
/****************************************************************************/
% \% d( k& D0 _/ u$ o, d
/* */
# T* K& e# k( h M9 F
/* PSC 初始化 */
5 Y, R: ?$ |7 p! a9 D8 X
/* */
H/ t) w) b, M, P9 _4 k8 V+ S7 C
/****************************************************************************/
0 f8 Z* z2 a" r' V9 a) |- ~- `7 g
void PSCInit(void)
1 i1 m* I, D, [" Y, q
{
w) I7 B# L+ e( o
// 使能 EHRPWM 和 ECAP 模块
! w) u" r. s/ z' N3 j. M
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 L+ h4 \" k6 _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' t' W7 R4 E) \) p4 z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# L A3 E- e5 E5 v4 e4 I% ?! C, s9 J
}
y6 D( x( p, H D; N" g
% q7 C+ E' b& X1 }: E( ]
/****************************************************************************/
) E' p( K4 m7 j9 M4 y: F
/* */
& Q+ m3 ^; d$ u( q$ P1 f
/* GPIO 管脚复用配置 */
# }$ G8 J9 V) p9 [
/* */
# ?2 G& o0 L' u: {+ }
/****************************************************************************/
9 |: j8 Z" ?6 a* l/ m/ x( i
void GPIOBankPinMuxSet(void)
' G2 ^' f' v4 g2 ?/ r1 m3 H
{
6 ?( J# _. [/ p
EHRPWM1PinMuxSetup();
+ M- b4 a" \. Q3 Z
1 b9 Q; i9 }4 C) [7 ?4 t
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% `5 a1 B# a, G8 [ L
// 作为捕获功能时管脚方向为输入
* U2 @9 k" G7 ^% W. T( X, A6 n3 Z3 n6 \
// 作为辅助脉宽调制时管脚方向为输出
: E( `9 k2 O; a, y
// ECAP2 / APWM2
& f k7 A: A+ ?5 K- l
ECAPPinMuxSetup(2);
8 G9 ~5 ~ {7 o. T* E- P+ }
) R5 B" F( Q; R: T
// ECAP2 / APWM2方向设置为输入
( g' p2 E# U& A+ v8 I4 F
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. H# z( m8 u) i
}
8 U t( D' K8 q r
* p! S! @% t# B+ a0 c
/****************************************************************************/
7 _4 r7 O& Y. k! x4 L3 v6 \
/* */
7 J+ _* F- @7 B: N1 u; V
/* PWM 输出波形 */
* x! d9 W: F+ f6 ~! @4 [
/* */
* l. z6 C+ l6 H2 I- N7 ]
/****************************************************************************/
3 V u+ J6 B% x. v q* U1 I
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( [2 L& j+ @3 A
{
[8 b9 u6 {2 o+ i
// 时间基准配置
M6 f- b# \ Q+ h
// 时钟配置
$ z0 y. x' R% x5 u6 R: t
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( M3 l" e( k5 W
! l& g% ^6 a7 G' C& y8 X7 ?: Q/ r
// 配置周期
$ r9 u5 v8 J2 x" D; k
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
2 Z2 s+ [0 q+ G/ C' Q9 s, [
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' m5 A( ?/ p9 S4 P
* V' Z6 y" b9 k
// 禁用输入同步信号
! T W# c# Q7 H% R e* j: `
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ X) M8 e5 Y" ^* K+ H% G
4 d( I/ s# R2 o m) ?9 E
// 禁用输出同步信号
t1 }& D; {9 |1 y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ q2 K0 T7 W+ U1 T: P6 U
) u5 ^! G: W3 a$ |
// 仿真(DEBUG)模式行为配置
3 p6 D% X) Y. a2 X6 O
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 l6 h% f; ^) d8 d7 s4 M0 E
$ a! K+ ^4 r0 B
// 配置计数比较器子模块
6 i0 d! ]" r. i4 e
// 加载比较器 A 值
/ N$ l# H: h2 P) m, I
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 Z& E* m! u7 q! A6 }
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 Q& w \: ?+ E% |: y6 u0 W
4 x" q. [: ^" v+ k3 N5 h) R
// 加载比较器 B 值
- K" \0 Z" @8 \) R9 u+ k
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
) D6 J5 m6 j# U( E5 l6 y) d
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: m% M J2 C7 c( {! A' _
2 e5 I, p% ^" }
// 功能限定配置(输出引脚触发方式设定)
! i! @. Z* `9 D" q/ a3 t- j
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. V; D" c% ~! j$ z* `' r0 L6 Q: t
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ F/ L+ @7 y* H5 h u. Z8 V
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* t- p, q* L# J9 d8 J$ a
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ P- h. ] r; }# b: {
( s c! l- Q* t# b$ }3 g* K5 w" Q
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
' f/ Z9 W$ _: d8 ]7 Z z
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" I2 s1 h- _# Q
* z2 g0 k' v6 X7 E5 v
// 禁用斩波子模块
, V* S( G* [/ C6 b
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 v- N7 j1 g% g6 H. O! p2 m) Z
" u# d" J& M' S9 C( H/ k
// 禁用错误控制事件
6 K9 B. @1 y! A; u; s' ]+ ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
( \' U2 @9 o$ L7 D
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 G% c" G5 \$ z2 H( x. D4 w
9 k2 n0 b9 F# W% P
// 事件触发配置
3 F% U& O& r. W, e& c
// 每三次事件发生产生中断
1 v8 w% s/ {, z$ Y8 b( Z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ C& K& m6 Z; N( Q& F2 \
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 @9 J1 B3 ^7 {" T
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 f$ S( s ^% \: N& n& w; C
// 使能中断
+ \; T M( T0 K& ^
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, J4 M% X9 e+ J2 c, X
4 g1 g/ y9 t! ^0 n- D! [2 |
// 禁用高精度子模块
" w0 r( g) q E! V
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- V9 z* `8 u) U6 y# N/ A% ^
( T( c N; e! N8 ~
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 t" [; ~% @7 g% I
}
: ]& O6 _9 ]7 O" J) @
! a0 V- D; A7 W/ s# t2 u0 N6 j
void ChopperWaveform(void)
1 O! M5 i- {% M- [1 r* k% y& p d
{
; D# P1 M# X8 K+ Z( B X9 S3 ]
// 50% 占空比
6 H& P: B6 \# T: u/ r
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. s7 P4 O. @# a
// 4 分频
9 I$ ]7 @) U5 @
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; |& Q( P7 d/ T$ m' H
// 单个脉冲宽度
9 X+ _( U4 d) H X3 h1 [! D1 C& T" ?
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% j* L( p8 O; ~$ H, q
// 使能斩波子模块
: E. g, Y% j% v* B! L6 u# P
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ ~- l+ ^! h) j' i+ d( e' C
}
& a+ |3 O& S$ ]" a8 e: C! R" r
( y+ }7 w [* b* ?, {5 m: h
/****************************************************************************/
& Q% I- j }. t: G
/* */
6 N" l+ v/ _# B5 F" d
/* PWM 中断初始化 */
& {" F9 G7 y2 U
/* */
! P2 R& D6 A) o2 @+ E
/****************************************************************************/
8 B7 I& Z( F- L% i0 |7 `- r$ y
void PWMInterruptInit(void)
9 V# G) A5 p4 Z1 o" U" V
{
0 M3 @7 S$ c: }8 `7 Z
// 注册中断服务函数
5 Q5 |$ t0 f$ q: g8 r4 H( C- N
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; u. L) ?; o2 S* z u1 b* S
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
( L7 G# T/ U+ Y- E" N9 D/ N
: W/ e, Y+ K1 q4 e0 y# L
// 映射中断
- e# e- P. [8 \' K& G
IntChannelSet(SYS_INT_EHRPWM1, 2);
- u$ d5 h6 o8 R% @% z0 s
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 [& M3 l6 g4 s
3 l& O) v! o- E3 _) d
// 使能中断
4 h4 N/ l2 o! K, y
IntSystemEnable(SYS_INT_EHRPWM1);
! `1 _% A$ ? j3 o3 S# K# W" r3 c! u
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 b4 q/ i% Y4 {. V
}
. ]& P5 e1 d2 W% T# f
8 o" D; {! ^/ ]3 ^+ U! o5 \
/****************************************************************************/
) {; N) J* \: }
/* */
4 n% q4 l0 G: ]1 n' j* K
/* ARM 中断初始化 */
% W5 o- \; F: W% p) c
/* */
/ ^* N- r( X0 H& G7 \3 x+ c. w' w
/****************************************************************************/
! ?4 B; X; ~$ n
void InterruptInit(void)
?5 l4 o6 U+ V# ?6 w
{
: l, l' k( Y; I3 ]
// 初始化 ARM 中断控制器
, k# z5 j: y% I& V8 [
IntAINTCInit();
9 r5 H9 \8 X9 v/ s/ s
* D5 A7 l; ^1 ]9 G" [& O
// 使能 IRQ(CPSR)
) ~3 S" [' e: B
IntMasterIRQEnable();
6 j" o2 c+ J. ~# V, d: K9 [+ A
) k) G5 V h) P
// 使能中断(AINTC GER)
6 t8 b3 M# t8 F4 U9 t5 A5 U
IntGlobalEnable();
$ n: P0 N7 Z( [: l% I3 F' @
+ q( M* |6 G) M
// 使能中断(AINTC HIER)
( |0 R Q! y) T- \( i
IntIRQEnable();
8 G) U, o! \' O% p. q9 V y3 {
}
1 b6 `+ Q" c+ t( r z$ z3 z
% O% q9 A. D, _2 N4 y; _9 V
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
1 m/ F1 T' ? q4 ?% L
/* */
0 {( j" m6 J$ B
/* 中断服务函数 */
+ F, y2 x3 |9 f0 o( h
/* */
7 Z/ \+ }+ l4 m- V$ O! M; `& O
/****************************************************************************/
/ X) h8 D# F* J& e
void PWMEventIsr(void)
8 `- u; p) \* ^/ p: T+ @, G
{
, x$ d+ u" a: ]5 A# {7 i' O! k0 b
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 h* `8 l; e( g' u1 U! }9 ^
# M3 O, b7 ]6 J
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" _8 c7 z. l% X! o6 C% Y
}
! b1 ]( `$ D; N. B
9 [ F3 { F5 c* J
void PWMTZIsr(void)
) c2 p. q U0 N" ?9 d: ]
{
. q, S& T3 A- Z0 z% D5 ?+ V
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" U% Q) F2 ]( z4 E# M( L5 V: P
# B& h6 \# R* I3 \
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
% ]3 \& k" j+ m' }
}
" u! f- V" s9 x( b- z; a5 G
* [4 s! x9 d: ]9 A. x, k
/****************************************************************************/
) `" f6 Z5 T( m. v/ d H: L
/* */
/ ~& m' w0 h4 k8 Y
/* 初始化捕获模块 */
; k5 N) c+ w, R* C# m
/* */
8 K0 b7 Y3 V: z% J: i1 c
/****************************************************************************/
# x9 A: c2 d1 N, v
void ECAPInit(void)
2 J8 R, o2 A5 ^; g" q7 e
{
- ^7 A: B P! W
/*-----设置 ECCTL1-----*/
H4 _4 u7 t! {& [
// 使能CAP寄存器装载
8 z. C0 r, X, g
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 Q4 f7 h4 y1 t
// 设置预分频值.
4 f6 g r- [5 O" H! O' |# G
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' U2 r8 y) R& T2 n
// 上升沿触发捕获事件
& d- S$ r6 A1 I) B0 x" K5 o j ~& J
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
( X% ~4 o* S4 T4 |* y
// 输入捕获后重新装载计数器值.
+ Y6 z4 ~1 a% O( E
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 ^- V$ L% a/ @' X
; K% P! j3 _; x( y- E
/*-----设置 ECCTL2-----*/
/ G2 ^- e c2 N; |
// 连续模式
8 O6 M& B! e6 E0 T( d' G
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 L( x. |1 G* z: @4 s3 \
// ECAP计数器TSCTR持续计数
8 G( i# K8 L$ w( ~
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 |/ Q2 V( ?, N4 t# p$ M6 X% e
// 禁用同步输出和同步输入
9 M' h' A. E. E
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( L( i c$ D. j8 f; o. S
// 配置 ECAP 2 为 CAPTURE 模式
+ m/ R% C/ |+ E
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# w: o* ?! D: F5 k0 D& o8 P4 d
5 D5 A/ [' s4 c! \3 I2 S* `
// 使能中断
/ c. @: ^/ e- @0 T4 Z* O% c7 j; Q
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; |4 h2 D" s( w/ G* c
}
. X* ^. O& V+ c( A7 E' R
0 T0 A: U8 u8 P/ f
/****************************************************************************/
4 W$ Y& y }# U, D
/* */
. e! C7 i0 t0 E3 C( C3 }
/* 取得捕获结果 */
9 N0 q% w2 N4 z# r3 L" O
/* */
8 y ]3 i* P" I5 ^
/****************************************************************************/
! n, y" M" S1 {. | H3 C" P, Y- E/ P
unsigned int ECAPRead(void)
7 s( q5 x- f/ Z6 _5 e. I1 q
{
; q% ?/ r& k$ G: Z/ V7 E5 B
unsigned int capvalue;
$ |8 x6 i! l3 O% l7 K: Y! T3 J# I
unsigned long frequency;
9 r, d* |5 k$ y5 E. t# z W
! c* J* S) P3 J
// Event1 中断标志
4 \! {+ N! d8 _+ n
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" ]7 `( s& ~6 f4 s
{
0 ]. r! Y+ W7 m+ d; v, k; D
// 取得捕获计数
$ ~# }! ~9 D( R8 P4 Y
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. J6 l7 L! q( C$ w" J) a
capvalue = ECAPResult.cap1;
& S6 |- u+ |$ O1 J3 K
0 @) r& d4 k$ `" p: t
// CAPTRUE 模块 228M 时钟主频
3 r; ^8 q3 G; I. W
frequency = 228000000/capvalue;
, C" m8 W1 A. J& [$ {6 k
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. A; n1 _( z% V/ g/ ]- r+ ^: X5 c
6 X t! l5 F3 y! K1 {9 h
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: K1 T) N/ |5 b3 `' b
// IntEventClear(SYS_INT_ECAP2);
# b& U7 K4 `; b$ I+ b- g K
}
1 l8 _8 r4 O" l5 L4 R2 A
return frequency;
8 b/ C, j, f$ q: s! \# R1 r' v
}
# k# T e# W C) q+ j
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
8 \2 g3 O7 P5 Z5 y6 v* s9 o8 N/ B
[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