嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& w2 P2 k1 @+ _% x7 Z0 } Q( r
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
) t r+ p, d, Q2 y, t: w z, t
/* */
$ Q# y! w7 u6 {$ F7 |: v. K
/* 宏定义 */
7 y7 m: f( c" o7 `0 V' [
/* */
' t& h2 ~3 s6 W: U% q& N1 M
/****************************************************************************/
6 d# q; V+ v- p: ]- x( t% U8 O
// 软件断点
, V, F7 j8 l' f" }- y
#define SW_BREAKPOINT asm(" SWBP 0 ");
% G% F( S& R( v! O
) F6 I" A7 ]& b& z! Z
// 时钟分频
5 Z& n7 N! x6 H0 |- M! s% H
#define CLOCK_DIV_VAL 228
, ~& B8 N# x( k9 ~
! R7 v8 ^/ e/ f% ~. U; Q+ v7 M! U
/****************************************************************************/
5 \3 ?% t+ v1 Q7 y
/* */
3 e, `8 _! J# A/ A1 V0 c/ q" ]
/* 全局变量 */
5 C2 E& g2 d0 a' k
/* */
2 Q2 g5 A/ C& p8 ~/ T! d( s9 n
/****************************************************************************/
: r8 M1 ^& V$ t! x3 z5 X. T
ECAPCONTEXT ECAPResult;
0 G6 B6 \" W: S/ ? K
% p, N% s& G% J. E( ?8 u' D
/****************************************************************************/
q; C4 m* @* C2 I4 v: Y& a
/* */
9 a/ B! S1 E" t6 R
/* 函数声明 */
/ Y; o; w1 }9 ?
/* */
- ?- t8 I) K) P% {
/****************************************************************************/
5 a6 e$ M2 [3 N
// 外设使能配置
2 V x( S5 J4 i
void PSCInit(void);
- R5 F; g9 d9 e8 y! }# i
5 m* S( C" G4 b7 s4 B: `
// GPIO 管脚复用配置
4 s9 c1 [' f6 V% T# B: m2 U
void GPIOBankPinMuxSet();
4 M1 p. V' q: I/ s) a
7 O2 _& E I' D' n' C6 L3 L4 y
// 产生波形
5 U0 Q9 {$ _4 x, [# C1 P! X' {
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 g: x% Q$ S' y' T- Y
void ChopperWaveform(void);
; ?& y$ L" `+ P# Z: v
5 I+ l$ ^. u0 s$ V+ D6 {
// ECAP初始化和读函数
, X8 T( d$ D1 \
void ECAPInit(void);
6 b! ]5 S& t) z4 Y7 f# z
unsigned int ECAPRead(void);
9 u% b3 Y- R6 ]9 B; f
4 ]+ C# v: f: B/ |) q9 X! G7 s
//ARM 中断初始化
: b: P! r$ `1 }$ k" g K
void InterruptInit(void);
. A. ^4 K' ]8 I( D: b F
, z+ k' P! u" D' }% g$ k% Z, S
// PWM 中断初始化
, N" R, J5 r: J( D4 H& Y
void PWMInterruptInit(void);
) L* A; ]' _ W& b1 E1 V) H/ R
// 中断服务函数
* n- {, L9 F; ^5 h
// PWM 事件
2 w. A; s* V" R+ |- _- S' |. U
void PWMEventIsr(void);
, C% s# D1 [- Y* q; f7 |
// PWM 错误控制事件
$ l& @5 O# A* j: {/ P
void PWMTZIsr(void);
2 a- m) i7 h6 y" ]! T m( w
# [# u" |2 z( X' }2 c7 n1 K( }
/****************************************************************************/
# [! C9 E3 S2 D
/* */
# Y1 _, }+ _8 `
/* 主函数 */
" h6 y9 B4 L; Y
/* */
3 s( O2 G; D' C3 r9 y
/****************************************************************************/
1 c0 W% C2 j M. u
int main(void)
& z( d+ r/ w0 s
{
, f+ R% B3 f* S! H
// 外设使能配置
- a: ^) D% U* `
PSCInit();
& {$ ]# K7 z5 L7 q8 e& v: ]
1 K) H# p+ v7 w
// 初始化串口终端 使用串口2
7 x0 W" g2 ~9 {+ ^0 a9 D. {
UARTStdioInit();
9 f0 V7 J4 ^" S3 b
+ c8 j% K* A3 r1 @2 ~6 @) ~7 C
// GPIO 管脚复用配置
2 q' U" _) M# P$ ~" t
GPIOBankPinMuxSet();
3 i9 Z M& ^" V% }, I" T* T
- m0 B0 ?% I! H) ?+ |7 t
// ARM 中断初始化
: ^% i& E9 c- N2 I# h3 b) C* A, Z0 V
InterruptInit();
# A# L6 y3 x$ x- K" \9 B' r: Z% R
1 R' K0 w+ W9 H
// PWM 中断初始化
# U2 t2 `! h) b1 O/ A
PWMInterruptInit();
5 `: G4 J2 { ?
5 b! K. g% ?; A% _4 s
unsigned char i;
7 A# g( O$ Q6 r U8 y8 G& U3 p0 z
unsigned int j;
5 _3 ~5 z0 y+ h) r3 R
5 B" ?- a; t. D/ }- E% k4 L
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
% g. U: c! h( a7 l/ I* A! E3 }
UARTPuts("------------------------------------------------------------\r\n", -1);
3 @7 O k9 w3 F6 I7 U) [
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ c* Z4 r! D( Y: L0 R6 O$ Y% }3 ~
// 产生波形
6 ^8 U8 ~1 Y& G* F3 D
PWM1ABasic(25000,50);
; E3 S1 A8 X; y7 `4 ^
' `7 l3 \% h4 d7 u6 {% t! U
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 _6 |* \3 G9 H6 \+ b
UARTPuts("------------------------------------------------------------\r\n", -1);
, {: I0 p+ T0 U) O" j
2 \* S2 I; r& v% A
4 F6 j( y- x/ x2 P4 x3 {2 B
2 W1 a9 i! i3 b& y/ F' j( Y' d" C
UARTPuts("------------------------------------------------------------\r\n", -1);
2 k* L! K4 m r% w: A
UARTPuts(" C6748 ECAP Test\r\n", -1);
" a8 d+ Y/ m# V
// ECAP 捕获初始化
1 M) q0 F$ e3 A6 r$ E0 B$ l
ECAPInit();
* K4 W) q& N* u
UARTPuts("Initialize ECAP.......\r\n",-1);
0 c$ B3 g0 x3 y8 A P0 X
for(i=0;i<5;i++)
$ i( @$ S5 K1 k; ]% s9 q, T
{
& Y% V! u7 T$ [1 o$ R6 m+ ?
for(j=0x00FFFFFF;j>0;j--); // 延时
& u2 J- ]& s4 z4 Q8 R
ECAPRead();
8 e) V8 e# E) {, V V' J
}
& W; g2 g1 Y& }$ d: [2 v+ j
UARTPuts("\r\n",-1);
; M; T$ s4 t, f" Q+ c
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: f& Q: J4 ]/ @7 s$ o+ e$ o
UARTPuts("------------------------------------------------------------\r\n", -1);
9 \& j+ I; R1 b# a
4 w& X3 D2 W1 P6 ^" d3 X, A
// 主循环
/ ^/ ?" k; m) a5 c6 j& q3 E7 R! c+ V m
for(;;)
8 w0 [5 D3 Q6 i7 g+ i" R9 n+ o
{
6 k2 D0 B3 j! R$ _$ d" x9 x
( ?, T# m$ G, u$ m
}
: A9 B0 k" N3 ]) y P/ Q/ h
}
7 _2 u5 |$ w( m9 M5 f! ]
3 ~8 u0 S3 t3 f! [+ l
/****************************************************************************/
; h8 U. t0 r7 }/ z1 ^1 ~
/* */
$ Q$ S3 A, g: i; O) |( d# x
/* PSC 初始化 */
) Q; E+ i! V+ y. V
/* */
" B0 Q) K1 e: r! _$ N
/****************************************************************************/
4 F y8 A3 s# F4 g
void PSCInit(void)
9 [- F6 x% g1 E+ B% i
{
& }: ?/ q( p9 `; a' A+ _
// 使能 EHRPWM 和 ECAP 模块
h* O) N$ E6 j0 S/ Z
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 k3 U* [% _; {- t; }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: z) G8 \. P) W3 B0 v; V1 V. z8 }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" {2 g+ E: Z# i3 l8 D5 }9 ? H8 n
}
( A! X+ N& ~! h9 S0 Z% W% d6 h
3 F0 ^4 a9 N2 @, r( @* B
/****************************************************************************/
: }0 @* K& f" f+ r7 G
/* */
& E- {/ S( p% s# V1 I; m' s
/* GPIO 管脚复用配置 */
" V$ S6 {- n3 s( R, d" S3 W& t* F
/* */
$ M1 U) a4 J) ^% `5 E3 B& A) g
/****************************************************************************/
7 ^8 E% h) f+ `/ u+ H
void GPIOBankPinMuxSet(void)
4 d3 Y% z7 v8 `& [& F/ f0 ]
{
: A" Z! w2 G7 {/ F
EHRPWM1PinMuxSetup();
* e% Q. E4 e$ _* P8 L9 X2 I V- }" z
! Y7 `/ K& B, L1 P" ]
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, q7 y7 J( P& E! v7 {7 R$ z( H1 C
// 作为捕获功能时管脚方向为输入
0 G5 X! E9 t' D2 j- g# y' J( ?
// 作为辅助脉宽调制时管脚方向为输出
# y; m( d0 h+ M: d- H" H
// ECAP2 / APWM2
& ]& D; M. b3 t ]( ]
ECAPPinMuxSetup(2);
0 c" `6 r, z0 H
. R* t3 y8 l/ H5 T: P& C) w$ H
// ECAP2 / APWM2方向设置为输入
. h; `+ @: J2 x5 }/ U* e+ s
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
1 K2 `; F* y$ B% a& X
}
8 ~4 _* d+ Y: q: ^. ?% k' ?/ ]
$ T% Q [( P6 Q
/****************************************************************************/
, \$ Y% h9 P% S; z
/* */
- |! w0 O) X9 h; O4 Y
/* PWM 输出波形 */
5 c) O6 X$ L6 H! E& D
/* */
, g8 o: i3 d6 E9 H, i8 s! [+ u8 i+ O
/****************************************************************************/
# \2 Z8 h. ` o" | `
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
7 k( |: R7 N5 U9 M+ ?. b
{
3 ~5 K3 |/ S3 `$ j3 f4 @. d2 N
// 时间基准配置
" D2 E. A! W& W$ h p6 d7 G
// 时钟配置
; V1 k: E- u1 q' k& T% i
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ s; N/ }; `4 C& R7 P7 a
9 ^6 Y% a) A& Q. Z7 F
// 配置周期
, M$ `& x5 ^; X$ D- f
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! v- P" b* \7 j& b
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
( G1 g& S$ t% G/ R E) E
" b9 Z9 _( t9 I3 k' m6 `9 p
// 禁用输入同步信号
* |/ E8 f+ o3 y. U$ J7 u
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
5 r& D% s3 g2 b6 g8 Y/ l7 ~6 N
/ s, [/ }. j! X9 S+ O+ p
// 禁用输出同步信号
/ \* J+ i, h. x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 H: f4 M, e2 W3 u- _$ W
! t8 u& h) E) q1 v' v2 Q6 h C
// 仿真(DEBUG)模式行为配置
4 E* b6 z5 D8 q( S: `0 S" J
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( U# t5 S' o+ A! F( e9 s% z
3 Y7 d2 ~, f K. V
// 配置计数比较器子模块
1 A& B' d6 y) K3 J& S
// 加载比较器 A 值
O* x9 o& R9 x- D0 S8 |2 P
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% E) n4 M$ N7 i
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 x- a1 M2 o+ _; u5 i/ ~9 R* q
+ R) g# o# }9 D' |4 X# e3 P' r, @, a
// 加载比较器 B 值
% q" R% H6 m& q) C1 l
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
* b; B" Y5 W- M( l, x! v# t; C
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ P+ C9 b: P8 K3 _8 c N4 ~# F
4 ]4 E7 A3 G4 A% g/ i
// 功能限定配置(输出引脚触发方式设定)
' y: V) y" s1 }* O
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 v' F5 T7 c& T9 s0 j5 K7 k
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 m0 q- Y. i3 q( q0 X- v( U7 T _
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
# C3 t& l, f- Q. M! M4 i/ i! [
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; s3 z/ R6 h( u
, v( ^; L/ U+ M# p
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: o. S3 S# d/ B- ^4 Q2 d9 j, I
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' s# o- a0 P- ]+ t: Q* `* G! w; F: E
' O- W( a# g* X( c+ k* l) P2 Q
// 禁用斩波子模块
! K! k8 g: j' D7 f& }
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) D5 G& `$ w" M" e' T
" `$ L7 ]$ p3 {) p' Q
// 禁用错误控制事件
" f5 k) u8 h- j j3 h
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& r& G: i& f$ p6 ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ p. s1 X( D! g; J
?, q. M3 C- k5 Y, O- L
// 事件触发配置
$ {) o" f+ J- R3 d0 c+ f; \
// 每三次事件发生产生中断
% h7 d w7 H$ Z' ~2 V9 W6 S& {- p
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ u: ?; d7 @( h) V, C
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
" Z1 _! t% Q3 Q8 W7 L, o$ k7 K
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ q( c2 j% K* {
// 使能中断
2 J% r0 G1 l! S6 S& H
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ G" ^' M5 _- d( g
- s9 e3 Z& I, h. X. C: ~0 Y
// 禁用高精度子模块
% z( m m% c2 W }, u: O2 E4 p$ ?) e
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- f, a- E' z2 E0 n; [' n- j
' v y2 u- }4 e& i& {
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# L# J" [ f: e- w, m% ~$ V$ l
}
% N4 o: a6 S5 Z& R
1 y+ C% I+ S$ f* H$ \
void ChopperWaveform(void)
3 C0 |! Q7 x8 J8 ^! V+ P/ i
{
8 y# y, t$ v$ n3 j/ P
// 50% 占空比
+ q& e/ H& u! E$ q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" {- A' a" I3 ^) k0 c% W
// 4 分频
: @2 l1 V: @5 V! a8 }
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 t) M% |* a/ K, Z8 C) ~
// 单个脉冲宽度
5 f" i) l5 ^: [* {
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 ?/ D, u: w1 ?
// 使能斩波子模块
3 ?, [6 k$ C z: P
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 d. |$ L& R* }9 q, G
}
! ^- W5 m% F( D1 N$ v, P# f
' D) x) [# Y- \& c
/****************************************************************************/
4 E% R9 x6 ^5 y ^
/* */
' U* `6 w8 P( k3 ]5 H w% ^
/* PWM 中断初始化 */
# _5 n- [, n2 b
/* */
G6 Y j3 ~: R( y" t
/****************************************************************************/
$ g! r0 C: K: n" u! A3 T X. T
void PWMInterruptInit(void)
1 E4 N1 j% z3 h( U( L- P# H; |! Z( _
{
0 s( f9 ?3 ]3 i$ L- N% V
// 注册中断服务函数
' r; P; f( |$ Z) c
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: w8 m6 Z! J1 d4 |0 C
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 R; @& Q& i+ G) R' B, V
* V9 O& M: O) h3 ?
// 映射中断
) k7 k C; g+ ~* q3 y: S) H0 M; j
IntChannelSet(SYS_INT_EHRPWM1, 2);
) f( [$ a2 T" |
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; g) ]$ T0 _5 {2 Q2 D# ], I% X( ?
! @8 r9 p" a& N% h5 ]1 W% `
// 使能中断
4 ?( \! S6 G+ h3 _' X
IntSystemEnable(SYS_INT_EHRPWM1);
* @1 G4 f1 I$ M6 V, e& ], T
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 w1 T, ~- _5 \ `! [5 `
}
4 B1 x: i+ H; x( y7 R3 a- s5 t
9 Z3 q5 ^, m% e0 O3 g. I6 ~1 n6 D
/****************************************************************************/
$ e& @% F6 O6 ]( \
/* */
/ p9 Q& l: e$ f3 |& p
/* ARM 中断初始化 */
7 E6 y+ y7 S4 I, `! Y- ~; C
/* */
% j9 r; m7 x) o$ w2 y
/****************************************************************************/
6 ?" P# { S# g i/ t! b
void InterruptInit(void)
9 ]! e% {. a3 G' z( x, _1 ^7 A' r
{
. u' v% R7 W. o# n! I5 b6 S
// 初始化 ARM 中断控制器
0 f! |$ Z/ }! e
IntAINTCInit();
: J7 J0 G; G2 T3 G
" P4 a( u- W: C3 B* W+ b5 x
// 使能 IRQ(CPSR)
- H6 W% e9 j$ s# _/ ~; ~
IntMasterIRQEnable();
& i0 W5 `, W6 Z
0 M, f2 c9 Y, P+ T1 B$ ^
// 使能中断(AINTC GER)
- L! M; }* }$ g, B* D. U3 v
IntGlobalEnable();
: c* j5 F2 j$ s) i$ {( p
. y+ @* m! c) U; L1 |, F0 u
// 使能中断(AINTC HIER)
1 s' q i* Z! d5 Y/ }
IntIRQEnable();
9 _' z: m* y. ~% v7 H) G
}
H1 @" Q5 L, t$ v
# C) `* ~; Q9 ~$ o. ?
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 h0 V0 T1 P4 f( h2 A
/* */
( _2 Y, s, j( c0 S7 K
/* 中断服务函数 */
1 l6 ]$ r# K5 f* s; M
/* */
" w. l5 {' s: B( p3 w# c' C0 U: j/ v
/****************************************************************************/
4 Z0 k" Y. v5 A5 A$ d
void PWMEventIsr(void)
7 x2 p" Y' W3 l
{
3 {1 @7 J) s" [" J
IntSystemStatusClear(SYS_INT_EHRPWM1);
. J4 [8 ~/ s: C
) G8 x, w9 I# c* U0 M4 i5 b
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
# z& q( ]/ z$ q1 V4 s( x6 P
}
4 ~7 G5 @* L% ^# o0 a
7 l( r! v) M* l# z. m- ^7 X/ i
void PWMTZIsr(void)
, ]5 |9 E( h& p9 V+ F
{
* F+ L* N" P2 H5 E! O: m b" u
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
" i6 N/ ]) ~5 Q8 d; i2 f3 B
# z# o2 f) m r7 a4 r8 Y9 ]0 d
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! t/ D. v7 H& B" U: g- s5 F. N
}
" W/ E: X1 m( {" d# O
( }$ o. ^" k6 e6 X
/****************************************************************************/
/ L1 C$ u1 u# B4 T" F6 r
/* */
9 d' t6 p- V1 `9 w6 e# C1 o, {
/* 初始化捕获模块 */
c$ e0 V7 s1 M" n/ B
/* */
3 A8 ^6 |) o5 n! ^( C
/****************************************************************************/
$ Q! A# Q; a, w
void ECAPInit(void)
" ?1 `& P, r# U& ~2 z7 f/ j: `2 u- y
{
0 m" a% I; Z/ h' l
/*-----设置 ECCTL1-----*/
% O# r& z( T* t" N/ F
// 使能CAP寄存器装载
+ z, b/ z) `2 H; T% p. F- O
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 l* ^1 H8 \5 ?1 r# e3 R5 f' F
// 设置预分频值.
} v/ M) k- e6 q3 m
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ V( ~3 Z2 U: r- C; m; v7 ]2 {
// 上升沿触发捕获事件
, h# _3 ]9 v% l7 S1 K
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* p7 a o6 ]- ?) ?
// 输入捕获后重新装载计数器值.
' b) \7 o( r3 H9 A( D
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
( V$ s/ j) g1 z% q0 u
, R+ L' B* N' q' D" \2 s4 Q6 O7 ~
/*-----设置 ECCTL2-----*/
, y: U/ P% b. z4 b
// 连续模式
; d8 K# D1 ~5 w6 ]4 U8 o
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
2 A; H+ K' i& A$ N
// ECAP计数器TSCTR持续计数
) `3 l( G! M* S+ P1 N3 N6 C. g
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& K, v) i7 f' @3 A
// 禁用同步输出和同步输入
9 e& @2 K8 d. H" m. }# k
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
. p9 d5 e( U: N/ K) J
// 配置 ECAP 2 为 CAPTURE 模式
7 L3 ]9 z! s w1 |- D: B! t( {1 ^0 W
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
1 p7 c! T" u0 q N% J# U* }, k f
. v9 G/ F/ u9 S$ r2 [
// 使能中断
- z. d; E- j. Q0 w3 U, Z* G
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
7 Z/ [0 Y1 Y# a9 V
}
" o4 q ]1 |, M1 y
2 {/ P; e2 `* X. N
/****************************************************************************/
; k2 {6 P* Q/ m t- v" _6 ~+ K
/* */
# \) Y7 Z. h% G4 X
/* 取得捕获结果 */
( \$ s2 A8 N$ {5 J# I6 ^1 ^- P9 P
/* */
* T0 m( o( X: r
/****************************************************************************/
7 f; k$ I# d9 W Y4 i! `1 K! g
unsigned int ECAPRead(void)
; Z$ ~- I) B9 d S1 G1 E7 d
{
' Z0 L* u% g* O! v3 u2 H! v
unsigned int capvalue;
0 c; L1 D" f; I# o/ j. G) k6 j# t I
unsigned long frequency;
& v/ c) H9 x8 s3 W
- o/ |; t# u/ ~1 b7 D
// Event1 中断标志
" ~% O$ j: J8 y& q
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
# D) s, h4 R& C+ t$ g- h
{
2 B! j, k2 f' c: ~( b) I
// 取得捕获计数
+ K" G) a T! `; l9 G1 f8 x
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
# a+ e) b+ {" O4 l5 B
capvalue = ECAPResult.cap1;
5 k4 Z' m. e5 {0 w& J
) h n9 A) j. |4 h- [
// CAPTRUE 模块 228M 时钟主频
9 `4 N5 \ L8 u. O9 t
frequency = 228000000/capvalue;
, `- p' ?3 R! u' o4 p' G
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
% w2 B& U8 u& p! I: N3 p' c9 [/ S. Z
0 G: H/ n3 g/ h1 Y7 K" `3 |2 B
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) @. x- h W" s+ X6 h
// IntEventClear(SYS_INT_ECAP2);
- Q: Z) `8 ]! [
}
# l0 s1 ]& Y+ F1 t
return frequency;
& [' `3 f; u# {6 O, W
}
]+ t: m* l0 K% J$ r% F8 S u
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
& X: X8 m! j2 S( D. S
[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