嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
5 B; @0 T/ _$ ~
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ d& [, W$ P% u8 V# \% N! j
/* */
" B! A5 J; I6 Z8 [, h( d* @. B3 ^$ T
/* 宏定义 */
$ \4 Z! r! O7 u7 t7 q, _. l
/* */
8 [- ?6 C: o! N. N+ B( m( D
/****************************************************************************/
; B) S' m1 d5 q4 T0 @& B: c% |
// 软件断点
2 n2 s2 d! B7 V: f/ `: U1 D0 s
#define SW_BREAKPOINT asm(" SWBP 0 ");
# V4 ^4 |: U# Y8 L! T: r( q# T1 @4 M
9 s. e: |3 f$ ?/ t+ p
// 时钟分频
+ p% H/ p+ z- L) r+ ~# V
#define CLOCK_DIV_VAL 228
4 V7 R* ~6 e* s& r! g5 K
7 j4 A" q; F* N! k# k
/****************************************************************************/
; o8 w) _4 k5 ~: a" N( {: `+ P0 r
/* */
% u0 @; _0 w, ?: F1 M4 T+ ?
/* 全局变量 */
4 Y/ F2 {9 o* v/ t, R" V" G+ I
/* */
$ Y3 k9 G% N; q/ z S# R: @: p) k
/****************************************************************************/
5 o+ w" V0 [3 r! M
ECAPCONTEXT ECAPResult;
# C) A* |" p0 F/ s! [5 z+ W7 K
" y+ @$ X6 {6 O& K2 b
/****************************************************************************/
, Y7 X. b( U3 _' E
/* */
) d" B `& E0 C* G9 {3 Y3 I5 K
/* 函数声明 */
. ?/ D% E; w% ^# U
/* */
. J2 a, {! X! h0 B+ h7 ~
/****************************************************************************/
; ], Y/ e e0 W6 V9 E) H7 ]
// 外设使能配置
7 W3 l: { Y% Q# V& T0 O- z
void PSCInit(void);
8 {: _# r5 F) c/ U n% x
/ @: ]5 k7 ~8 `- n) B
// GPIO 管脚复用配置
! T8 |* [+ V& [: F# [
void GPIOBankPinMuxSet();
: h4 R2 M' I( O V' f
8 y0 R7 m' x0 [* u i
// 产生波形
. }, L% S1 r1 _/ r, Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 Y4 B% m1 x# B4 H6 ]3 K: L$ s
void ChopperWaveform(void);
6 D7 g8 R, s! w0 R0 F
: t# J l. O9 B; M. B
// ECAP初始化和读函数
3 @7 P f3 R& a" t! g2 k
void ECAPInit(void);
: M ?( B& }8 y% o2 E, K w* S
unsigned int ECAPRead(void);
3 n$ @: e+ p2 L' P' B
1 y" S6 e0 A- |7 T5 ^- t! }. @
//ARM 中断初始化
z7 ~+ B) P9 e. i& {; W
void InterruptInit(void);
{/ \1 g# r) X2 U
: g& [* h1 S3 @ q
// PWM 中断初始化
8 z% w6 B% o7 h9 B$ G e e- i
void PWMInterruptInit(void);
# \+ v- n0 n* ]
// 中断服务函数
( }* ?) ?8 k% J3 _: x1 U
// PWM 事件
" E1 T% s* ~ z. J7 K
void PWMEventIsr(void);
- v4 G: E& s1 }1 |
// PWM 错误控制事件
1 C! I6 h6 `4 `0 M5 Y: P' l4 s( V
void PWMTZIsr(void);
+ x6 k5 {; F# S C4 V) P; Q# ~
" L# k' J! o( M
/****************************************************************************/
+ V) @9 u4 u1 O
/* */
3 G5 R7 f( s/ [$ {9 c; q& d7 n& K
/* 主函数 */
1 g2 S' R7 D( y% `6 m
/* */
' p9 D: r2 Q( \: R/ j; e# y7 f
/****************************************************************************/
+ n6 \5 L2 I) c7 O
int main(void)
+ D0 s5 i( t9 R+ {* C
{
, W% u5 d' W/ Z- U
// 外设使能配置
$ g6 c1 E. K% v4 |. L
PSCInit();
# s# T: L& K- g/ l
2 k/ D. u7 S8 ?/ d M6 V
// 初始化串口终端 使用串口2
3 }7 U6 a" B+ N
UARTStdioInit();
; {. ]% @. B$ |. e: i; g
( W+ \0 P, t& }8 ~- w
// GPIO 管脚复用配置
; I5 Y: b0 F. m% W# N4 @3 w
GPIOBankPinMuxSet();
: g# k, r) C. J4 X1 A
% i/ i; i& S3 t9 m
// ARM 中断初始化
+ V& ]: E" t* a: i' ~
InterruptInit();
0 _, Z: } @$ J2 U2 A4 M0 A$ c& a J
0 v" {* C9 F0 V5 K/ K
// PWM 中断初始化
3 V8 U* R& W d; u' e
PWMInterruptInit();
9 e) ^' D* w# ~/ x
& t: f( |( E' b! |$ w. v
unsigned char i;
$ y% b8 a* v$ `+ j8 Z) M) G
unsigned int j;
* m& d9 {) `% c* q+ E" G% A- J
% X1 K6 |0 i) H! l5 C0 ]# B0 m- x
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. T' M! s5 H( ]
UARTPuts("------------------------------------------------------------\r\n", -1);
4 N$ X2 @* Q: y: E
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 J2 ?( r4 W5 `/ M
// 产生波形
( E. `0 j1 U0 ?$ a# j
PWM1ABasic(25000,50);
8 x; g- k7 d2 G) s; r2 k' t2 D
* c; v4 f) j* J8 X* J5 \" g
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 |& S% W4 E1 @( g
UARTPuts("------------------------------------------------------------\r\n", -1);
9 Z# R! F) u$ Y( J1 B2 `+ t
0 P. r- ]# @, E. o% ^2 {
* c4 ^/ a$ d' F3 E: U8 u
3 B2 a3 o6 } O2 z3 `' S6 q
UARTPuts("------------------------------------------------------------\r\n", -1);
9 g2 E4 w' L$ ^, H2 b
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 f* M* {5 @- _/ p' l5 M
// ECAP 捕获初始化
/ O d* T- z) E* X* @* y4 \4 ?' O
ECAPInit();
& ~, o* }, W# u! `" r3 U
UARTPuts("Initialize ECAP.......\r\n",-1);
; H% I: g& U& `# G9 U; A" |
for(i=0;i<5;i++)
j, ?0 n: m: o7 D5 X7 _
{
3 n/ Y6 Q" t; Y1 M- }2 Y# C0 _
for(j=0x00FFFFFF;j>0;j--); // 延时
: F$ x0 p6 z* @$ v" q9 ^7 ~8 N
ECAPRead();
- q/ }8 G% d5 K. ?9 T: ^
}
' W0 ]* y, x5 g( Z, A
UARTPuts("\r\n",-1);
( Z# P% j" U% G- C$ S: j* X% n; j
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
, h1 x9 s1 c8 ~# G
UARTPuts("------------------------------------------------------------\r\n", -1);
, S( u$ G' U% M5 b0 P" p
2 x! Q2 i; x! ^( d7 N& d3 F# i
// 主循环
4 [. @% I" O7 w
for(;;)
2 A* s# Z; H" _8 l
{
" q6 L& n7 s4 t C$ |$ Q0 i0 ^5 E
7 r$ {/ G- L% w8 T
}
' j d1 p/ t7 m0 J! T" L/ y1 P
}
9 m5 } T5 P. ~. m, k) b, K5 ?% Z/ s# q* {
- U" [- w" `- |
/****************************************************************************/
% T! K( P5 }7 X3 q2 C+ ~* n
/* */
& H$ g. K: l+ e. x
/* PSC 初始化 */
/ a9 f& K; f% J5 w# C7 n9 `8 c
/* */
. m. H: m3 l& @0 l& p
/****************************************************************************/
% g4 Z1 \! J1 L, D9 a, A& o+ V- K
void PSCInit(void)
6 h9 w' e! M l8 r
{
! D0 X ?: U. [: h5 Y% M
// 使能 EHRPWM 和 ECAP 模块
[' C0 e, ~# v1 c
// 对相应外设模块的使能也可以在 BootLoader 中完成
! q. H! E. y- t$ a* L( V0 G% K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
J% y+ O+ C" _: S9 M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ F6 W( L, a5 w- k+ G6 c
}
+ m- p0 Q- p( X9 y* U Y5 s
0 n7 q* b- ]% Q1 @$ N
/****************************************************************************/
0 @2 @) s, r; d% A# V0 ~
/* */
# r# ]7 n4 ~0 C: Z5 m
/* GPIO 管脚复用配置 */
. W# C0 h, s: d
/* */
- w1 Y7 H$ T' T0 E8 X) c3 K: l
/****************************************************************************/
8 r7 R, T1 v$ X2 ?7 x& p6 Y
void GPIOBankPinMuxSet(void)
$ ]8 \! x$ D8 a) f2 J, q! y0 L
{
' o! P. M" c3 J Z9 t* V4 z
EHRPWM1PinMuxSetup();
' E) ^7 H7 N! T% J% K
) N" I* o1 Q! {2 r' I
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 ?5 w2 Y" t# L2 i: p
// 作为捕获功能时管脚方向为输入
/ }- ^# l: x- s6 b. m
// 作为辅助脉宽调制时管脚方向为输出
' S# `2 X( e1 o6 S9 i! B
// ECAP2 / APWM2
1 _$ g# B1 c9 U, _$ z1 ]
ECAPPinMuxSetup(2);
$ O, c5 A& D) q5 j- L) j3 e
7 H* B* O" `! u9 G, l; P
// ECAP2 / APWM2方向设置为输入
3 u) q. D( X5 W* m6 t
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) K8 b5 b+ l* y7 O: S
}
- q' P- ^+ W0 k* E, K! J
4 G" g u& q8 j' w' a8 d9 j
/****************************************************************************/
/ l" A9 e- ~. ]9 S7 s- [
/* */
* _/ `5 L( c; P. F3 ]* w
/* PWM 输出波形 */
- R9 B' C7 A) r# e* R% x2 d3 f
/* */
, h5 t, A. e) a- J0 G+ v
/****************************************************************************/
& W0 t4 I' `1 o0 o
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; g! j: d$ ^3 S& _" k; ]
{
1 {7 }2 ^% x# R% h( M
// 时间基准配置
& m& ^, r. _) u% W# P3 K. a7 @ @* @( b% B5 y
// 时钟配置
; B- J# { \! U4 k+ H* Q7 ^
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; v% T: ]/ R& {' c# }* @& T
2 R* @- j* @2 j2 i1 h
// 配置周期
- h: B0 G+ o! @6 w' [+ b* }
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( i/ N+ c& F5 n, \& C. x2 ]
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% n* @4 Z; o$ w5 {" N
& r; _9 q5 {3 y5 W$ q% A. K, v! \6 {
// 禁用输入同步信号
2 q8 C# [/ @, p, B6 t
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; S6 T! y1 f) v) X. p3 @
$ U7 x: C& M+ G" h: b6 _
// 禁用输出同步信号
& b& A- C0 R4 |- A8 d
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, z/ J O g" ^8 K' b8 T7 A, j
" Z+ p* |& V- D$ B
// 仿真(DEBUG)模式行为配置
: O( ^- x: z* i( ~
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 t+ V7 x: l" {% H
- m/ W- B$ `$ ?) `
// 配置计数比较器子模块
2 ~; p* @# _- K- r; S2 K
// 加载比较器 A 值
$ ]" |( m1 S# P2 w! I8 [5 N5 r
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
3 ? C8 t" t3 Z/ [4 ^. R
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 E1 A. E1 M- W* A9 M
& k* h9 l! n( u! `1 B
// 加载比较器 B 值
% o* B! c+ R# f5 h1 _
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; u: c( h0 S$ ?0 V2 y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( z& F- F. p0 K8 j- Y
d. C8 Z2 H6 y% J# ^& J
// 功能限定配置(输出引脚触发方式设定)
9 J4 o3 g; r/ v( I
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. p1 D9 Q* `" ^$ r
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# i6 {+ H6 v9 Y: \
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. `4 b$ y9 [1 ]3 s6 Q* N2 @
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
! a" z0 z, p& x1 [
% \0 x( Y* y& l* r+ {
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
$ a* _' v: l! ?# ?5 g+ M+ x5 a3 k
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ [' G. c: G2 R+ z
# r" J% J1 N O/ V* D. ]5 V8 o
// 禁用斩波子模块
1 B) N8 X9 u- W8 [! y& f* k6 [' E- T
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- y6 l6 B5 l2 e9 F
5 Y# r O' M* [) `
// 禁用错误控制事件
7 u# L5 ?/ g. ?! n9 s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 @0 V6 S& \# h" _3 ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) _$ d7 i5 R4 W
- D; O2 V( X# ^9 B& ]0 V3 t
// 事件触发配置
2 \2 v4 C, l9 ]$ r4 [
// 每三次事件发生产生中断
# S5 w/ N1 T1 f
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
* n6 L' K0 G0 r
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
W3 c& u) G+ I% H9 T1 e G1 J
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ v+ ?/ M) P5 O& m$ x
// 使能中断
+ r2 O! p# h+ y, q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 Q# a& @: T% Q8 s6 a& [
! y0 o# l7 \% d5 i0 s& n8 L
// 禁用高精度子模块
* O% `8 i5 Q& h* h: M
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 E$ a, o s4 O8 k4 W
, ^' X6 ^4 h) r* h$ c2 I+ R- ^
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ e% }( Z. _, h V# \1 a- d% f" o
}
. y4 @2 r8 r" P+ H% w- J
3 M! w3 N M- V" p0 ?9 v
void ChopperWaveform(void)
/ M; B0 F5 C8 \% s' `, m( b, U
{
# G: a; ?0 x$ l6 \" d# I# m
// 50% 占空比
) I, I4 N7 V2 l0 J
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
9 c4 y) }. C5 S6 s6 z+ b- Z5 q v) A$ ^
// 4 分频
& H# y3 }5 N+ d9 T
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ e3 g4 }( @' Z2 d2 @/ \9 h& V7 ?
// 单个脉冲宽度
- {: s* b! w( H, ^& V3 r* E- V
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# E9 n* n6 \2 i' K7 X ]; p
// 使能斩波子模块
8 R; `& f4 G. D7 G* W: J! y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. ~5 W; Q; S7 H& \3 i3 M! K
}
! q3 ^& l6 k% R( k0 k
; ~* r9 x3 Q9 _! c$ b' k
/****************************************************************************/
( O! ?1 |* z( a2 h9 U9 J5 f; r
/* */
* B9 v6 D: |1 H! J+ H3 G2 H
/* PWM 中断初始化 */
; T6 i% j( m/ T2 Y1 @2 B
/* */
: O8 V5 @& Z& B* M' f( ^' S
/****************************************************************************/
7 K I7 }% J/ K l
void PWMInterruptInit(void)
! i. P* G) E6 f" r
{
* T$ ^- e& p& ~0 S
// 注册中断服务函数
, c" T' Q% S& ~! Q( V4 ~
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 c" K$ v3 E0 O, q$ H
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 d0 j$ y M# \3 ~/ i5 y: f
) ^* J3 \) ]1 d. l
// 映射中断
2 `9 n3 e* A1 d4 |/ p
IntChannelSet(SYS_INT_EHRPWM1, 2);
+ ]1 b5 u2 f+ D C3 l3 Z' X4 S
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 C* q8 t; i& ]' E9 G. \0 }
% R* B& G2 W# Q) `8 O0 s
// 使能中断
) S1 E9 c2 v# ]& M/ J# q+ T/ H( X( x
IntSystemEnable(SYS_INT_EHRPWM1);
2 i+ R1 H; t) B" M& h5 }* T G
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; d3 R- k, ^9 S2 V( w' z5 w! w$ X
}
Z, t1 T$ r8 O
9 t1 j1 E8 ] M. F. k; O6 F6 {; V1 u
/****************************************************************************/
* H( _" P( s! ?5 a% T3 N/ @7 u
/* */
; B$ z1 v* R" D" ~. E" @/ |" z
/* ARM 中断初始化 */
8 E9 O8 ]9 g; Z" E
/* */
+ S. {) w4 W' L" b
/****************************************************************************/
/ J& h* n- i2 [) Y5 f w
void InterruptInit(void)
- l: A. q/ e& e( k
{
* j: f- g, b6 Y+ U. n4 [
// 初始化 ARM 中断控制器
* _* I: n6 z0 T6 x1 Q6 P) P5 N
IntAINTCInit();
1 \# B J, R2 @4 c. z
# E( y! W& P/ p8 A) c) t+ r
// 使能 IRQ(CPSR)
p( L, B, \0 l3 |4 A) d" L- { S
IntMasterIRQEnable();
" u, o/ v- D+ h0 D% E0 n
1 j* P% O/ j% V% Z1 }2 }
// 使能中断(AINTC GER)
- A% x8 S1 j9 d: Z# A
IntGlobalEnable();
7 j* e* n( Y# V$ a/ y
' \: E; }0 g6 N9 d% @2 ~
// 使能中断(AINTC HIER)
) J" K B0 F( Z% L
IntIRQEnable();
8 D8 \; @# ]4 ~2 U9 g9 k
}
! w/ \/ d3 m! j' d6 w
$ n6 h2 L' d9 e
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
+ n; i1 g+ ^9 k4 U( K. [
/* */
( {. w: P4 S( {& `5 W
/* 中断服务函数 */
q; k9 I( S6 @
/* */
, i$ D$ r8 ^" a% B0 I
/****************************************************************************/
: J+ z: ^. J4 R( o( t; X
void PWMEventIsr(void)
, F' m; e" h2 Q' u
{
5 |# V& p! T( N! ^% b7 ?
IntSystemStatusClear(SYS_INT_EHRPWM1);
; W' e1 b. K- D3 Y. ] N& v7 E
# O: v! h: @( g' s
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 W0 j; O3 L o
}
8 h1 h) I* ^) f% l" H6 h% D, j
& i3 o" l+ s- S6 e& I/ k7 T8 r
void PWMTZIsr(void)
% z L" c# T+ `9 \) G0 }5 I
{
- h1 B+ S% R4 }4 v2 \. c
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 Q( R" c4 k* B3 |' Q! M
1 D9 |) K0 j( h7 ~* [) ?, [
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
* R/ d. ?& b# K+ P4 g3 h
}
) z( {6 Z% ?& K A3 N
* h. Z" q6 ]4 u) y
/****************************************************************************/
1 m' n. [4 I* ?8 B8 L! \
/* */
/ J; W* s$ r9 }/ a5 C
/* 初始化捕获模块 */
$ V( f+ @( G4 C& Z5 [3 z* _
/* */
/ ?/ ~5 K2 p* O1 m0 U
/****************************************************************************/
- W0 c8 w3 U/ z' N) U4 |
void ECAPInit(void)
$ G. l3 `. e( E, ?2 V, c
{
6 y5 ^. t8 F' ~8 }
/*-----设置 ECCTL1-----*/
* Q9 F* S! r" Q5 X; d8 m
// 使能CAP寄存器装载
6 ?8 l- w$ t% x% l1 y' y7 U v- @
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( [/ K" x% s8 F2 E
// 设置预分频值.
" k; q* n, t! M0 X! T
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ T9 E- ]( m7 |* S. z, i: s- A
// 上升沿触发捕获事件
0 F- f9 Q3 U, H! v0 m1 w6 q [
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" f3 h" K* G$ D- b6 E$ Z
// 输入捕获后重新装载计数器值.
2 S. `9 @. a) p# ] D) x
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
8 J: R4 A8 O( [' D% q
( Z! u. g+ v/ ?- N2 Q
/*-----设置 ECCTL2-----*/
: I" M5 F) h- C: k9 b% V
// 连续模式
2 ]7 z- l! D8 n/ U2 i
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
. a- b/ F9 c$ S: _& i" f
// ECAP计数器TSCTR持续计数
6 J, C p! b/ g7 w, |" n
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
- Z0 A3 h% h ?) N( `
// 禁用同步输出和同步输入
" g4 q8 g/ Y9 E, {0 D
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
; W; r8 h1 ]0 b/ T0 q& k6 M9 `( D/ f# r) K
// 配置 ECAP 2 为 CAPTURE 模式
7 E# Y+ y& s) Q# ]& a
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 {7 N; J; C0 Q8 P
# {& X; f' Z- K" F* @; K- Z% Q" Z& d
// 使能中断
) e4 k) Z6 \$ X7 R# C( p# A X
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
* Z6 t9 P1 Y( N2 M+ |' N
}
. M" T* o* L* t( S ^
# Y% `0 J1 V8 ~, @1 E2 C: C* j
/****************************************************************************/
& l6 `& I7 o. A; `) t( @
/* */
g& j( `6 T) f
/* 取得捕获结果 */
3 g$ _2 f) B0 L7 H: F* v
/* */
2 M0 S ^7 @4 A _* a+ Q0 j" a; Y
/****************************************************************************/
- l4 c) s; l+ a' {
unsigned int ECAPRead(void)
6 m& |' B8 l7 J6 I
{
' ]8 S" `2 h! P# L7 j" J
unsigned int capvalue;
# ]5 P) C( i# G- `) L
unsigned long frequency;
4 N5 n$ h; b5 ^, |
7 U- U# l$ x! {- F
// Event1 中断标志
" |2 X) ^3 i8 l, u; ?4 H
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" J9 Y2 Q l& s$ |& s& d9 o+ h
{
6 r2 \ o U8 c l8 J
// 取得捕获计数
% e, \$ D$ A2 _% Z
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 a% Y4 W% g i" g& U3 {
capvalue = ECAPResult.cap1;
" z1 d4 `! Z x' z1 ]9 M/ J
; z2 Y0 }: A+ L3 Q" V3 e
// CAPTRUE 模块 228M 时钟主频
, @ g4 e3 u' g1 x9 O& T" ]$ i% v
frequency = 228000000/capvalue;
# Y% W0 j( r- h: m, J
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; {8 }/ i) j0 U# K8 k
" B! ?! f4 K& h1 N# E7 Z7 k- k
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 G' P7 J X' l% i) l$ X
// IntEventClear(SYS_INT_ECAP2);
' K- H, [. t* w7 Q: r, K, D
}
) h3 c# |+ J2 ?1 p) ^, q
return frequency;
5 Q2 U% o6 t7 T1 D& q f( Q
}
$ f0 g1 M6 W1 N, s
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* `- P) t* O% `6 q M
[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