嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
3 M7 R: f) `+ O2 T, T) Z- Z
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
$ g2 D+ ~ [: i
/* */
/ u6 `& I! y: M
/* 宏定义 */
' J" d1 `: D& n
/* */
8 Y: r4 |5 J8 Q" y' q% M5 [
/****************************************************************************/
( z5 g. A4 P, B( c$ w9 [
// 软件断点
* p7 D" g5 J5 d9 K4 N, z
#define SW_BREAKPOINT asm(" SWBP 0 ");
4 ~7 j4 b' m8 s/ A# Y n$ H
% g8 l& R" A0 q; q+ |# r" M
// 时钟分频
5 B) ~, `2 d) S. m: ~2 j
#define CLOCK_DIV_VAL 228
( x; ~: ]0 y; C* M
8 E3 x7 d) \( H- F
/****************************************************************************/
+ i. m2 V2 I% ^$ K- H/ G1 g
/* */
) `3 @7 p7 `! j' l0 e
/* 全局变量 */
; N% n' p; ?0 o+ T& _1 L
/* */
% }: Y: P0 J T9 \" v% k
/****************************************************************************/
# w: m0 I# ]3 C: i
ECAPCONTEXT ECAPResult;
+ v) u3 U. P- Q0 m
$ D2 |0 d. r: S4 Z6 P
/****************************************************************************/
9 w6 F5 s7 j& `0 V; B
/* */
+ b+ h* N# m" K7 j
/* 函数声明 */
( Q" A' L: g: M' m0 P, A* |9 N
/* */
6 w9 j9 I3 A% c. }4 z6 v
/****************************************************************************/
* Z" t) m- @; K& T) `
// 外设使能配置
' t2 k. f) o6 x1 _
void PSCInit(void);
* e) @5 w9 ^6 [8 I6 j% O9 K3 f
* ?* L7 a9 ^5 ]5 l! p
// GPIO 管脚复用配置
' J5 |9 b7 M( u' y6 d
void GPIOBankPinMuxSet();
/ C) D4 C+ [, ^0 \
# ?. `1 ^4 P4 Y' N: V4 t
// 产生波形
1 _( N% D. c3 C. x# D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
" R0 z* Q" S# f0 F9 O
void ChopperWaveform(void);
( m8 v2 c i$ d, C& o' G! d: H
6 E O) m3 D- D4 ]
// ECAP初始化和读函数
% } |, I1 Z7 q
void ECAPInit(void);
" @& B8 T5 G m/ Y: ^5 p5 S+ q
unsigned int ECAPRead(void);
5 _2 t1 t8 P2 w N! M* P
5 ^! ]' H: ? B
//ARM 中断初始化
0 F; }2 p! K& }: a5 e, R% \( z6 ^
void InterruptInit(void);
! ]8 s6 o1 c/ e [" ?
3 z8 H! E; ?. }) }5 n) F$ W
// PWM 中断初始化
& S( I1 y8 N7 [. }" i0 C
void PWMInterruptInit(void);
& y8 V5 ~" a9 c0 t
// 中断服务函数
3 T$ {. o) i! q+ G. o2 D4 ]' X! h
// PWM 事件
# r7 X+ {# o2 U3 z! i2 }
void PWMEventIsr(void);
4 m+ m* v$ h& u. i) f4 v: ~
// PWM 错误控制事件
3 D& O! Q2 s. o: T3 l; v) g
void PWMTZIsr(void);
$ Y6 C- `2 X* H: D- ^6 k
2 Y+ C6 d2 J L+ _
/****************************************************************************/
1 }- r+ {1 \8 k" v: W% Q" T0 |
/* */
( X) T4 N5 u- y/ P* m5 D
/* 主函数 */
0 A3 N+ B) m+ u. d: |" L" _. M/ J
/* */
3 {: b! a- _* V
/****************************************************************************/
' ^( H) b& ]2 t+ B' X. G% g. X
int main(void)
( z1 J" }5 \( T' W7 k
{
8 N7 P- o+ P4 M! X; N o
// 外设使能配置
: x- o. T1 F- M, A* I0 _4 B0 c
PSCInit();
% O" w2 W! {+ o$ W3 z
" }& D! v7 z/ }. y; A9 T: t% V
// 初始化串口终端 使用串口2
& u2 a9 d$ Z4 r6 J
UARTStdioInit();
6 b$ X- w! [; V
6 F( x+ q, ^; r8 }3 S" G* b; [" c
// GPIO 管脚复用配置
2 t! V. A7 d8 P
GPIOBankPinMuxSet();
4 \6 y9 f- [# g: D3 |
: z% I) W4 T9 o% U& E! k
// ARM 中断初始化
I( Y: R/ Q. W6 p
InterruptInit();
* d8 L- b$ E9 P' m% H
! y( Y0 h$ I: D( C7 `$ f
// PWM 中断初始化
1 M) e- X- z4 q
PWMInterruptInit();
; P& f$ o# {. G( r6 h7 g) ?
% m3 G1 `5 D) b* g! ^+ h' w
unsigned char i;
6 I, C8 ~7 k3 A+ [ G7 \3 N" S+ E
unsigned int j;
# i6 B) l, V/ P; }
& c' x, }( l1 x. C: j8 t$ F
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 Y5 k# A: T' w" g6 K
UARTPuts("------------------------------------------------------------\r\n", -1);
% [ o# ]( [7 x4 {4 G, `- y2 u
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
: T7 U! k+ C! V. B! c' z$ N0 a; ~" C
// 产生波形
& i! F7 V& ^2 e9 @8 p! P
PWM1ABasic(25000,50);
; Y( z' b- g: m% W
& y6 j( l G! h6 F! _
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& l5 a( B* h! @* T- c4 e. l7 k# E
UARTPuts("------------------------------------------------------------\r\n", -1);
% W+ a2 ?2 D& E, L2 h
) \7 u5 o5 z \& C& Q/ N4 {# j) I
2 V; |4 `4 c, @: [% e4 q7 S
1 q: A. w2 W: g* U8 |) e
UARTPuts("------------------------------------------------------------\r\n", -1);
) z9 l' J0 k$ u& Q6 [: S7 i
UARTPuts(" C6748 ECAP Test\r\n", -1);
9 |) F- m% R9 C1 F, O
// ECAP 捕获初始化
! J. B% `: ]1 p/ A8 |" q. e
ECAPInit();
0 ]1 }% K1 b1 Y& h2 K" ]
UARTPuts("Initialize ECAP.......\r\n",-1);
2 P4 r' T+ h Y3 ?7 x0 [
for(i=0;i<5;i++)
; G" Z2 ]) r" s) d$ c
{
5 k9 S5 f8 l5 X3 p% ~$ c
for(j=0x00FFFFFF;j>0;j--); // 延时
7 R: ?, I1 E2 F( q( L1 G7 ~- a {
ECAPRead();
0 Q) F) G& } n5 O- X% ^6 x& b( Q- l
}
3 e3 l- X! I0 ~! x
UARTPuts("\r\n",-1);
% J( @9 u: `8 Z# b2 _; R
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; D1 M6 b. V/ M* R2 C6 W8 l7 z
UARTPuts("------------------------------------------------------------\r\n", -1);
# a t s4 E( [
4 ?+ o, k8 c2 R- b T$ \
// 主循环
- Q1 _* v8 ~' r' C& u
for(;;)
# [( _0 ^" o9 Q; l9 K
{
. t0 r/ U* r- I$ n2 k9 z1 Z& O
2 }5 S+ O" |0 i6 z' t
}
A$ a5 W9 b; x, C8 m7 d9 s
}
7 O4 `/ ^, Q- t3 P1 d6 A4 d
/ n% y9 `- {9 g8 F4 N& P* j
/****************************************************************************/
6 A @9 a( Q' G' J b0 E# N6 X
/* */
* B: W$ ~0 H. E+ r8 R# d
/* PSC 初始化 */
* I1 u5 a9 T3 S1 r# M- f
/* */
/ h* B" d: s4 ~. p6 \
/****************************************************************************/
2 o, T. F3 V8 V2 g
void PSCInit(void)
- V7 T6 W0 K8 s* J
{
% t: T% H. \1 s4 }3 D: q' z
// 使能 EHRPWM 和 ECAP 模块
; n G1 c: L5 ~; L* D3 q
// 对相应外设模块的使能也可以在 BootLoader 中完成
% _* d) ~/ C! [) g3 U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* {# c6 X) m% b* \' V4 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* D/ ~; {1 k4 O8 [5 H/ M
}
* C! c' ]5 B/ c1 I
) O! ~6 n7 x: i: {1 N; V1 u2 U
/****************************************************************************/
, q7 s. N, a! S; Z+ L2 ~$ b* U
/* */
* W+ o* U( r" q2 o3 j; ?, S
/* GPIO 管脚复用配置 */
- E8 }/ }9 ?; F0 @
/* */
0 h9 S) w' C, k
/****************************************************************************/
1 j2 P( s' s9 v: {* v) H" V
void GPIOBankPinMuxSet(void)
8 }, R, S" z9 b( |% ~7 J
{
3 R. b2 E/ [( a1 {& ~
EHRPWM1PinMuxSetup();
' A4 p x4 G* k1 x: m$ R5 g
6 `) d7 t, C: x: T
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- V3 A: s% t* s! K* D
// 作为捕获功能时管脚方向为输入
" F% \7 a% v4 s
// 作为辅助脉宽调制时管脚方向为输出
^' n" f; m- r
// ECAP2 / APWM2
& w2 ~; ^; t1 \$ G% `
ECAPPinMuxSetup(2);
# n7 [1 u) Y" \) y
3 L; G$ o1 ^. _9 M7 C @$ R7 v! b
// ECAP2 / APWM2方向设置为输入
. e; g- }' L6 P& w4 S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
- G- `6 }: y, z7 w, M) S
}
% Z' t, `; i8 M8 Q6 n C
( V; {8 |8 e0 J/ c( m) ^
/****************************************************************************/
" q' i# e% J( ^2 I/ t1 y
/* */
0 d7 p2 g# ?' O# D# l- a1 V% R
/* PWM 输出波形 */
' t( [- }) e& T" o T. H2 C
/* */
6 X: I1 t- r( y$ h, i: ^
/****************************************************************************/
m6 x Q6 t, T% Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
f1 g9 G/ V# U3 s+ n# n
{
) F8 Q8 h' K2 C/ J" r9 F
// 时间基准配置
" @5 k1 w6 V( l9 ]
// 时钟配置
# c% i' `- [; m' T2 n
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 y1 c4 h( _! v4 L& }
: G* I: X! E2 }' C: R! T
// 配置周期
$ ]7 K7 C) ^& E% R. A
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 |6 w# ^. }7 j# x* v+ W9 d7 y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: l* p& x# a% R2 o# F. ~6 j' m
9 `0 P+ [ H# A! l" q" a" a
// 禁用输入同步信号
, W' A/ h' }7 N4 I3 |1 d
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
0 K7 D4 H+ u( c# D5 r7 _% d
* f) U( G: B S! V( W1 D+ d
// 禁用输出同步信号
$ m; `& I* d6 l
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* k4 B7 v) B7 } N4 L3 M
' q2 M" K) V2 |$ b; ] R# \
// 仿真(DEBUG)模式行为配置
" U7 f) M1 q7 q2 R
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 i6 L# ~( t; |
; ]: b$ Y; i: f5 d3 b( O* H0 `
// 配置计数比较器子模块
E: u+ N5 O8 D/ Y
// 加载比较器 A 值
3 E. c* B$ ~7 g9 j& g
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
, f6 P0 u! Y' @1 k) { u' {1 O" k8 L/ l
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) r/ z4 k+ P$ ^0 U4 K4 E2 G
- F3 N/ ? ^5 q9 s* Y0 u5 m
// 加载比较器 B 值
0 g p1 H3 q' o
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
3 s6 }: u' h1 ~6 v6 U* O1 P
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" ?) l% W: s% g- w; y$ L
( p& [/ V( m7 s# |& ?
// 功能限定配置(输出引脚触发方式设定)
) ?8 ^/ o0 F; g* N$ g
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
+ r, \/ w. L1 k) P3 I$ w# m, ^
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
2 r& i0 M. F. L8 z; p% B
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 ~: D% g6 P1 R8 S
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& ]; }6 g( n. y: \$ Y* \% @5 ^; ~, K
8 p% S' {1 A3 {
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
+ K% F5 `! \7 s8 G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 A$ q: t9 \9 e
* f: {1 e7 l$ |9 W* a) L
// 禁用斩波子模块
9 J* s I2 y2 s0 L# ?! @+ B
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
4 ]5 L- S6 D. m% W9 K& W
& E. C& Z/ o/ N E$ Z* f
// 禁用错误控制事件
. k2 {5 f: m& Q% ?! f
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 g& d! L- e. Q' R# l
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- |6 H! h2 w( |/ H) ]+ S0 q8 C
/ T' C1 U* L# N8 I" q# x
// 事件触发配置
2 I7 K! K4 i }- d0 w4 i: S h) G' q
// 每三次事件发生产生中断
8 j! C& A8 E8 V, i1 L
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
! M/ r, D$ R& M
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
7 k; V% M' M( A. H* ^8 e+ w9 g, w
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 `8 z7 Q( l: ~4 n7 p1 t& o
// 使能中断
) L& Z8 A$ Q. J" i/ t
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 O' S W& g' E' \' S
7 i7 ?" o; n" C! {7 @; r' s
// 禁用高精度子模块
2 l) X3 P0 D9 T j5 R
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" Q5 F0 T! u# J i/ F) W
3 V- i( \2 c0 B/ L7 I) [% }
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* [( h2 i2 v, M) z
}
! M4 h0 K1 G, C5 a
; K' ]/ t+ t( l
void ChopperWaveform(void)
) r1 o" I, ?; q e: Q3 [
{
( Q7 H: S% W+ c- } S& {
// 50% 占空比
( M e; y7 o; B" ?' n3 w
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 D3 m% p$ ]7 O1 |
// 4 分频
2 Y' q4 B2 U5 r# G% }# P+ y" H, u
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! B# X+ D% z! n+ L' O. Q! Z
// 单个脉冲宽度
0 h+ a/ l4 ?! c7 p
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
T5 c' T- _ \6 w
// 使能斩波子模块
* X* b: J8 E+ Z: E% j$ a
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
- H/ f, x, J; Y/ i8 \& n! @3 N
}
* T$ q( F: x: S# Z+ ~+ T2 Y
, I Y1 m7 ^$ x R7 ~
/****************************************************************************/
, Y* A4 O' W- j$ @! c: l/ F$ f8 U
/* */
o$ A/ \2 d* ] V. u0 A# C I+ Y; n
/* PWM 中断初始化 */
( V$ }( R# V) w
/* */
1 H8 c1 Y$ \# w4 J
/****************************************************************************/
7 X$ z8 P% e5 a/ w
void PWMInterruptInit(void)
6 E3 h" N5 q* Q h$ N: O
{
0 v* L' e8 `# e; F$ U
// 注册中断服务函数
, N% i! P, B+ H/ B9 q0 m/ C$ r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
k5 Z' b# C! s" ^, W2 Z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ x. v- K2 g0 x; m
& T5 i2 ?* }1 X, v: e& d1 \% V
// 映射中断
5 Q5 y* g. E7 ~9 u' s/ b' Q. m
IntChannelSet(SYS_INT_EHRPWM1, 2);
# m7 j9 r" |9 x1 U6 N: h
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ m2 l' d& ?5 Q( Z# h
6 x6 X9 D7 _, D4 R
// 使能中断
4 d6 D1 K7 y& t' s1 P0 |6 b
IntSystemEnable(SYS_INT_EHRPWM1);
1 D0 T1 h5 Z5 R7 E: x3 z
IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 W9 X e- i( e R
}
$ J7 H3 Q- v k/ ~
j- ]. N$ o$ {4 R% X0 h0 D
/****************************************************************************/
( K P" p- l( R4 M+ }
/* */
! y- N: ]# p- q4 R( v, J
/* ARM 中断初始化 */
7 t4 |4 }/ b( U0 H7 G' j4 f
/* */
' y; }$ O0 N2 p$ T8 M
/****************************************************************************/
- B& V! s$ d* a4 t
void InterruptInit(void)
& _. s y& |) b7 w+ m: @0 b
{
# m' X2 d& |% _8 T! [
// 初始化 ARM 中断控制器
$ q- n6 R/ r! Q* O/ q
IntAINTCInit();
* e: q2 W4 c4 W' t# e7 c% [
) f! Y$ v2 K' G, B7 N* q
// 使能 IRQ(CPSR)
% }$ x7 {1 |5 G5 f l, ~& [* N' J: N
IntMasterIRQEnable();
3 \ L, t8 f9 a& T
# R* a3 j9 x& U" x5 q9 l$ V
// 使能中断(AINTC GER)
: I: t" }7 }1 A7 m
IntGlobalEnable();
* }3 x ?" e, Q6 {( o
+ g4 l% b3 a |# D; R
// 使能中断(AINTC HIER)
& S l% q0 j& h
IntIRQEnable();
0 P0 M5 G9 \8 q7 |( F2 |8 [
}
F' D6 c+ W% M B! W
J; ? ]2 D+ P8 i
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
( L! R! D! }! k% E3 `( R* e
/* */
3 {. o! H& f, ~# }1 z
/* 中断服务函数 */
. | p I# l4 l T
/* */
& z% Z6 ^" j7 h$ {
/****************************************************************************/
. G K, `7 o: v' k% q
void PWMEventIsr(void)
( U+ B5 \/ G+ I) J6 t! ^7 \+ X
{
" W, {( [( T, a* e) w- f
IntSystemStatusClear(SYS_INT_EHRPWM1);
$ @$ M( w9 C: j* F8 O$ I" Y( q
& \) s# Q$ R' u) m( G! W& b
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
% s" d. w' y4 S& Y6 R
}
0 n# {$ P/ ~) H" U( h7 L
2 P8 t' H4 V" d8 @' d7 ?% M
void PWMTZIsr(void)
( d2 E. \: k3 \
{
$ S, n: Q! ^/ X3 [9 A s
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
! S) l& I7 Y: Z3 Q4 p9 o1 B( _
+ q4 h# ^( l( Z- ?1 F! Y
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
: D U9 I# b y4 q/ U
}
# z; ?# h5 m2 x* b1 B
! g* w, C% S+ Z& G' |7 W
/****************************************************************************/
* Q& e2 I% w) ~( y
/* */
2 S' h! t- X- Y" U
/* 初始化捕获模块 */
* ]2 G0 X0 G" R- J
/* */
; Q" |7 O0 n/ E& F6 c4 O
/****************************************************************************/
K/ l# A* ~1 O! `
void ECAPInit(void)
- }! q8 _6 N* q) p4 F; [2 V
{
& e6 A2 ], H# g- ] o2 F1 B5 t
/*-----设置 ECCTL1-----*/
2 A$ D) u: N7 d# c0 D
// 使能CAP寄存器装载
; S w# Q8 {& @3 F% n8 ^0 R
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
% S( ^: S6 X& ~
// 设置预分频值.
; {: h( {4 d$ H, W
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
& ? g, H# R# L- F1 l3 d: H8 z7 s
// 上升沿触发捕获事件
( T! E# \/ c J
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
% b% |, k7 t: R" n, J2 v
// 输入捕获后重新装载计数器值.
& X$ J% c9 c" q. Y
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ Q# i" L: d# |/ r b% a
* f5 `# Y B% ^5 y1 P
/*-----设置 ECCTL2-----*/
* Y4 }6 L3 R8 T% J
// 连续模式
2 X g% I0 l) u
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
S6 N, f* v! @3 C$ D
// ECAP计数器TSCTR持续计数
: {6 [% Z8 A3 s+ b* q
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 Z' c+ C) a, W, M4 {
// 禁用同步输出和同步输入
- h. v( M+ q, ]' }: O. a9 }& q& r6 i9 b7 d
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
8 S: o k7 d% q/ O e* E. E
// 配置 ECAP 2 为 CAPTURE 模式
# e' h# f, b- `; K
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# `5 P4 h0 P( Y- d$ Q% [
* r5 V! G" E( K- S% x9 B0 s( c
// 使能中断
& a7 M: s7 Y6 a: W3 U& ^: G
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 P9 [/ G) x$ q& c( F; J% s
}
! s$ @3 ?" ?/ D7 ], b1 b, |
( _% J7 h1 w6 `0 `
/****************************************************************************/
. t0 V0 J4 V L F. f
/* */
* A: Y' w9 I3 f1 u* K. v9 z
/* 取得捕获结果 */
i8 e& p9 S J( o, _ X
/* */
) S* J, ]' h# p Z3 H! j1 @
/****************************************************************************/
: ?% j0 |$ o7 ?$ k! M. U8 c" \+ S
unsigned int ECAPRead(void)
/ r9 c: f+ s% t/ Z2 i2 A
{
% K! l z* [+ N0 j O# \$ m% I
unsigned int capvalue;
5 m: o" |9 H+ I- v; I3 V6 W% e2 L
unsigned long frequency;
b4 V4 \ L0 P' A! U
( H5 l$ g8 M4 Z) Y3 I
// Event1 中断标志
9 j) B9 i+ z6 ^! b; W6 Z
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
2 u1 u m1 L* ^/ X' [ F
{
0 Y1 t& |- W! [
// 取得捕获计数
/ M* e2 t' e* M9 R
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( A2 \% ], s) Y8 R5 y0 |
capvalue = ECAPResult.cap1;
+ T7 j1 D% {( `8 z/ ?4 d7 E
$ C, c9 V, _: }% j
// CAPTRUE 模块 228M 时钟主频
" Q, [8 o( O7 y) a1 B
frequency = 228000000/capvalue;
' ^$ w0 ~) u4 S
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
" I- M; R; Y b# ?& X# ]3 J: ]5 u
7 B; }9 R. C# O" M/ J6 a
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
6 `$ G1 p0 H5 {9 W
// IntEventClear(SYS_INT_ECAP2);
' t2 N& c) p4 V& k6 Y& f' Y. M( \
}
+ d7 [' B" S1 {% n
return frequency;
/ e/ d6 r8 l. S, `) B- |5 _) y
}
# M1 L6 |* b4 i! o7 _- h- I( {
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% V0 j! \1 k+ I0 l' l( {6 R N0 w
[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