嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 s' a4 g5 Q3 R7 \: }
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
; m( \5 |9 R' Y5 p$ d( F4 C
/* */
, V9 U$ Z6 Z. s& {8 s
/* 宏定义 */
5 c' V; D5 I! x! j/ R, i- r
/* */
$ C0 Q( A7 `" J- n0 ~$ z; X' _
/****************************************************************************/
5 B9 F4 ^& q9 T+ H9 v$ z
// 软件断点
" r6 L5 ^4 `, i6 U$ A4 g/ P) U" ]
#define SW_BREAKPOINT asm(" SWBP 0 ");
/ N% x+ Y ?/ o4 {' M
3 L' k& C; J! B' _
// 时钟分频
3 K0 }- N" ~; N) w/ Z; ?' k
#define CLOCK_DIV_VAL 228
$ U% a$ e( X i0 i/ w) h
5 B+ M% p" z5 q/ S7 C
/****************************************************************************/
- a, W" q3 x0 E+ u
/* */
# N& W* X' ~6 G
/* 全局变量 */
9 ?3 ^, v' o; y2 K: j
/* */
1 V, Y Y5 n9 S) y3 ]: o
/****************************************************************************/
' M( N+ A; z8 R# E; p
ECAPCONTEXT ECAPResult;
0 o& T. c+ W$ U
3 u" h! I+ ?3 m/ A- i: G
/****************************************************************************/
2 O' [; I b+ g( _6 I `5 Y
/* */
5 X! ^4 U1 P% @, s! r7 j
/* 函数声明 */
# {. }$ `) e# _8 y
/* */
8 M2 O$ m# K/ ^
/****************************************************************************/
( H# b. O% N, X: B
// 外设使能配置
% e7 `/ P$ z( b
void PSCInit(void);
( P$ D, _$ A3 G/ C# t# L* S
$ ~4 y' ]5 @0 P1 v( A
// GPIO 管脚复用配置
$ {0 k6 m1 }5 B
void GPIOBankPinMuxSet();
# ^6 i* p' L3 n! `% L
7 n: ]7 i2 s+ S7 v& o0 x: x [% P
// 产生波形
; {2 r3 X7 Y' n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 B* q7 y5 C8 g- B" T) _
void ChopperWaveform(void);
7 s$ N/ I8 n9 _" t' ^6 j1 D8 m
, n& O+ p1 n2 I9 }6 U: @
// ECAP初始化和读函数
# n6 g$ x1 Z$ m% w9 f1 f! X# H8 m
void ECAPInit(void);
+ F1 ~! M/ p; L9 }/ f+ f
unsigned int ECAPRead(void);
, y* z8 K, V! c5 K' b$ G" o+ ]# p
1 P0 ?& Q2 h" I7 C! h6 y! ]- k5 F: e
//ARM 中断初始化
$ s1 H" m n4 }6 L( L3 q
void InterruptInit(void);
' c. w0 i$ q+ m, Z' L& C
' J& l% h$ x8 o! j* r
// PWM 中断初始化
3 v, ]4 V: _7 ?$ H6 D0 P$ [
void PWMInterruptInit(void);
9 Y+ P& E1 d$ T
// 中断服务函数
; \& W) ~1 W. `( \: R' x. _5 y$ ~
// PWM 事件
. r u2 s+ V j0 j% @& Y
void PWMEventIsr(void);
( w, P* C; p. F
// PWM 错误控制事件
/ b4 Z' c! i/ N6 D% G* [7 \
void PWMTZIsr(void);
. n' ]& d5 F! P) U
0 m2 t, c6 }6 P, e
/****************************************************************************/
; E! h, F3 I$ l7 _4 \$ m7 c% o
/* */
# ?9 u) K5 E. H, E) M( w4 A; a
/* 主函数 */
$ s5 {; N% [1 U$ y9 e7 e
/* */
* l& z* j4 s$ c% |+ N* h* g
/****************************************************************************/
9 C8 G6 N/ E- w: m/ I/ s: M0 v T
int main(void)
0 }/ s5 E* s" H' U8 r- e
{
4 s |) v& W/ C+ K% M8 `
// 外设使能配置
# ]8 N8 ^# l. k$ t( N
PSCInit();
& ~6 _1 J0 R+ J2 N; r2 j1 h
( ]% [5 v z W' `, C ?' u: ]& l
// 初始化串口终端 使用串口2
1 X0 ]5 Q/ V) ]7 j4 ^8 i
UARTStdioInit();
$ f- R; x$ X" e% { K% k, O/ H
7 j4 o% q* w' l X: K
// GPIO 管脚复用配置
% _9 f+ R5 u+ h5 B
GPIOBankPinMuxSet();
3 X6 y! R- ?6 M. f8 w W
4 S) V, x9 p, p4 Q8 Q" V
// ARM 中断初始化
2 h$ i: P5 Y9 ~5 C" q" i6 |
InterruptInit();
# Q) M/ Z w" [ O- I1 L' w7 I
4 Y( L0 s; J" S4 e' e) J; F% H
// PWM 中断初始化
* X$ [+ }" y' e5 ~: r/ x. H
PWMInterruptInit();
1 m# N R5 a7 x$ h5 @
& x5 I5 u( R9 ?# q( t) l* V' d' `! u
unsigned char i;
7 I* N* H: B+ h( u6 N. e
unsigned int j;
$ @" Z& e! _; @. L. g/ I# `
( {" A) I. K0 i; A
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
8 D6 h6 G% g$ G
UARTPuts("------------------------------------------------------------\r\n", -1);
+ J2 ~% ^% J# p4 D4 C
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
) ]! L3 Q8 \- m/ z5 e
// 产生波形
7 o9 s' j9 \; g M# Z" t% {
PWM1ABasic(25000,50);
4 s t) P/ s$ ]) X; _$ h" ]: b6 d7 Q
0 q; I( z3 E; \
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
" i' g1 r9 p( l8 k: I
UARTPuts("------------------------------------------------------------\r\n", -1);
& E$ \* }2 c4 h+ ~
" A9 j( _0 t# q; \
- T- l9 \! z2 L, n8 [
) x$ ?3 [+ P( M5 M
UARTPuts("------------------------------------------------------------\r\n", -1);
8 w6 p; q4 J' M5 e) p3 k
UARTPuts(" C6748 ECAP Test\r\n", -1);
$ O% U6 v) `% f
// ECAP 捕获初始化
" k9 D+ x9 V$ H9 n4 {2 C
ECAPInit();
2 b1 E$ K+ `. o4 E; L- S! e) t, Q
UARTPuts("Initialize ECAP.......\r\n",-1);
/ l6 q3 u2 D! x( Q1 H" h7 f
for(i=0;i<5;i++)
: ?+ o$ B) W B: B4 I
{
: g5 U. r. V: W8 I( c* M' I7 V
for(j=0x00FFFFFF;j>0;j--); // 延时
) {1 r) a) R' p5 S2 R- F
ECAPRead();
# }7 x8 W# v+ b6 P" ]8 @
}
' C' Z% T0 Z' J5 u* J; X
UARTPuts("\r\n",-1);
3 n3 e, e9 a$ i9 d0 q& m
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
0 q9 m4 G9 S, u, P
UARTPuts("------------------------------------------------------------\r\n", -1);
/ m: K8 b0 |" {% d8 _8 t
! v b: n. i/ }. Y4 A5 o* ^$ t
// 主循环
9 p2 F4 h. ]% B
for(;;)
! @1 G6 ^0 Z9 m- D. @
{
8 D% g# c- }- A8 Z
( z+ n0 _& k0 t! H. @& b+ F
}
* D: S: u# w! z1 a) s L
}
* S7 P* `" n) ~
$ ~/ G9 C# {( k+ m# k9 E! f
/****************************************************************************/
) t" I, p6 q) \) ~2 g4 w9 @
/* */
/ j c/ ? u- p3 k6 F5 `
/* PSC 初始化 */
$ K' H' a0 B- B9 h; q6 B* l
/* */
; p5 p m$ B, J) z) F, H$ |
/****************************************************************************/
, N# B' | S7 U
void PSCInit(void)
+ J6 c/ z* y. J
{
; z3 K, G' S9 u' n9 {
// 使能 EHRPWM 和 ECAP 模块
, ]+ @, h0 Y" U) [4 Z6 s9 H
// 对相应外设模块的使能也可以在 BootLoader 中完成
/ o$ \) N/ Q: T; s, q* m4 l
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( a/ R& ?3 [4 o- \2 y, f' t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 u2 W. V I8 I% W4 i; C; u
}
1 X% `8 P* \5 Q
, K; A: j+ I9 P3 B5 Y% P
/****************************************************************************/
) H7 y/ d$ m! z! n4 p$ M0 J
/* */
g* r: }/ ?$ n# T2 W- E
/* GPIO 管脚复用配置 */
' s+ e; J3 `, a2 k4 S1 Q' b
/* */
+ n5 @8 V# C- d7 `! S6 D3 b- ~
/****************************************************************************/
% }1 _( u% a: w$ l7 S% V
void GPIOBankPinMuxSet(void)
4 Y# U- b$ [: S* l
{
* s: T w, }& ~4 H- U- V& b3 |
EHRPWM1PinMuxSetup();
. }3 M$ p8 \) x( D* x- _- {1 I
6 |$ H7 ^$ a* _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
, [7 Q, a) V8 x/ Z0 P( I& D: f1 }
// 作为捕获功能时管脚方向为输入
' T, z! T9 \* s# v( l' V* \
// 作为辅助脉宽调制时管脚方向为输出
- u* b4 o2 Q t" ~5 e
// ECAP2 / APWM2
7 O4 S$ s9 {$ c6 V
ECAPPinMuxSetup(2);
5 b$ O/ W& R5 I1 `/ w
5 m% U1 @9 G, F' j- l# O% A
// ECAP2 / APWM2方向设置为输入
! d& A! u: @7 S( X& `$ t
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: C- B X! M' x. [" X# W
}
1 N0 f U6 W% }) u
7 [ ^$ S; C$ @- k
/****************************************************************************/
5 B5 t7 g7 P+ V1 i2 g# h
/* */
) p/ p5 k0 s9 t! L
/* PWM 输出波形 */
$ C6 K' u0 f. \9 ^5 N
/* */
* ~; R5 ]' P9 ^" o! S
/****************************************************************************/
. l& Q# G+ i4 V5 G5 e1 ]2 ^
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% ^6 D2 Y e/ k, M) x+ o2 a
{
" C6 Q: {' ^2 ~
// 时间基准配置
( E% B/ m2 C4 O/ n8 M
// 时钟配置
2 b' |% N' n) E2 j! U. a/ v
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. `0 Z$ G# u' u6 c
7 |3 X9 F7 a/ q) d* Q, \2 o9 L
// 配置周期
4 G1 @2 h! ~) i. k4 {/ ]. [
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 ]) q8 }1 Y. t7 l, ^% X5 ^
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
8 T9 {# Y6 s7 i9 M9 {
" u+ A, J3 R( x. U7 ]; ?
// 禁用输入同步信号
* ?9 ?, o: m& ?3 B
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, H) G+ i F* ^+ Z
: [0 R) T0 ~& w& h# D' N
// 禁用输出同步信号
& t6 {; ^& f$ b9 _/ }4 H/ H
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 H( d; V" l$ c3 D8 G2 T
6 R+ t. W, t5 Z; l* k# E7 e& C* `
// 仿真(DEBUG)模式行为配置
7 U4 b# t: ^- o" @
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' ~. D& a0 a: U s2 F7 @" Y
* @: p: v. i9 @. e( M0 M5 Z
// 配置计数比较器子模块
4 G: O9 R8 b/ L. p
// 加载比较器 A 值
! e4 ? w* k% V4 {' p, G
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) r+ x8 Q1 ^1 X* H; I7 S \/ ?" X
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( F8 q3 {4 X& W. \' p
. E" q/ a) L' }& {7 _
// 加载比较器 B 值
# ^+ {* y* e }- N) ^$ ]4 P' N
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 Z" ?# T' u, n3 f9 I+ W; J/ m* I* D. ]% @
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, R" ?9 y( u- T6 p8 c
# M# P$ J" @( l. b
// 功能限定配置(输出引脚触发方式设定)
) Y i! e) W; i
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
6 p$ `: r* C9 @' V% L; @+ D: T
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: u Q7 E8 a8 \6 Z8 t% a, i
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
0 Y% A3 a! G& k8 }' n1 @8 a2 t+ O
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' ^) _5 @, p- U: k1 r+ q
" L3 i% |4 m3 J
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
0 A- L4 h, q" n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 x3 \& l3 y5 V6 q) L1 X
5 i/ y( `$ g7 P# C
// 禁用斩波子模块
5 y8 ~- P) s+ B. D
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 t- Y) P* r" W' G
0 Z, F; w, H, D
// 禁用错误控制事件
$ c, @" }6 V! ~- P1 s4 y! a- m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 K/ P3 ^$ b( O; V+ ?
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: y( b0 [4 h0 i$ X
0 {0 R; z- g6 q& Q' l
// 事件触发配置
( b# u! L# M5 ^+ a: u* M( z
// 每三次事件发生产生中断
1 L& d$ c$ i- w6 b
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' t9 ]4 b6 i8 f2 x4 r" \
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
$ _) w' b* L" N! S. b
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( t( V) m1 Y( D' a
// 使能中断
+ D( a2 J) q& J; f2 V! T
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ e! g3 {2 N- o4 L' Y
4 S! B8 l: o3 C+ ]
// 禁用高精度子模块
' u: x9 d7 A: C8 ` P! F8 D# L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ |' L: ` K9 m% P) `! r. o
* X: @) m0 Z3 V8 g- |, X4 |/ g
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: }8 j F. t# q# ]0 v3 r
}
5 c' g ^8 q5 L
9 s: s8 f+ O# t3 ^4 O9 u# o6 ?
void ChopperWaveform(void)
' ^1 V( @; z# C/ v! Q$ [& a
{
: M. f3 e1 h/ E7 h& D7 c# p/ B
// 50% 占空比
# b% T4 t2 d9 p: u/ U' K: c5 q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
W, e, ^( x4 O
// 4 分频
% z! i! v+ @1 q# z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 ?! |( {' q( R
// 单个脉冲宽度
0 L) S, V" H4 S+ l- I- z! E' Z
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
; T+ X. z6 B8 W
// 使能斩波子模块
, s B1 p6 H C5 s. ]
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. a6 e2 j9 a1 r7 Z0 ]% G1 ~
}
6 ?# r1 t$ o0 [. c
8 v$ Z, |% C% D8 y* p9 g6 {
/****************************************************************************/
; C9 ^% p7 l _1 D+ v N) A
/* */
0 ^$ H5 \* d, c' Q$ G
/* PWM 中断初始化 */
* G5 g S" x6 u
/* */
1 f7 ~$ _ O& ?' e4 e) l% R2 F& n
/****************************************************************************/
" m L: u2 T8 {+ q$ o, T
void PWMInterruptInit(void)
% F, ]$ P: S" n
{
- p7 e9 w9 r, C, k: N, D
// 注册中断服务函数
" z4 a3 f. B( n* m- N
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- \- _) Z8 t- ], ^
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- b3 h: J7 b7 t9 i
" ^2 g P5 O) ^; X% x4 p
// 映射中断
2 v n: W0 d5 x# C$ ^
IntChannelSet(SYS_INT_EHRPWM1, 2);
+ G; U% m7 t0 e* Q, V% Y
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 g( w8 V0 D+ r n3 N
( u! i9 N, E) B ^5 Y) |
// 使能中断
/ k6 k' F( m: d/ ]* `3 `
IntSystemEnable(SYS_INT_EHRPWM1);
" h c% H h: X! u5 N
IntSystemEnable(SYS_INT_EHRPWM1TZ);
& h7 P! a8 @( E/ B5 X6 J, c' S& H/ x
}
( I8 i) C; Z2 g3 k% g2 q
$ T# r$ [4 k, g. O& P- W }7 V) b
/****************************************************************************/
6 T* W2 K5 D7 O* D5 f& h
/* */
/ M1 s/ N9 o3 d" h7 V
/* ARM 中断初始化 */
& J ^, r& o! v' L/ `- V- F8 U% X* u
/* */
+ t! U* p+ P4 ~% j+ C3 V3 z2 v# T
/****************************************************************************/
5 [" i0 u" [6 k( h6 x5 l! {
void InterruptInit(void)
+ x, S1 ?) Y" n3 a+ p" v4 {+ b
{
1 Z9 V, R0 A6 h0 z, p( B: S% ^
// 初始化 ARM 中断控制器
) z) ?+ A& f3 o9 f/ H( U2 a4 s- }
IntAINTCInit();
+ ?/ m9 }5 c( P; f5 Q- ~8 s# T
, P6 W$ f- s0 p8 z7 V2 V
// 使能 IRQ(CPSR)
9 F9 T0 h, Z9 f. W+ _+ r6 S
IntMasterIRQEnable();
. C' Z' C6 L. E2 u: l
, j) U: O& P5 k y
// 使能中断(AINTC GER)
$ Q& {' T+ Z1 O& |6 r( E
IntGlobalEnable();
, ~# g6 y5 P$ R0 [2 Y
' j! p2 _9 Z# {0 r
// 使能中断(AINTC HIER)
, U5 x z( Q r& I) l
IntIRQEnable();
4 F; V' Z8 r/ Q6 | v+ r* [% L
}
' a% ~) r. h6 p l c1 |6 e/ k
- A, v4 }# `! K L
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" K h# r8 E5 h. t4 w
/* */
R) E; N1 U' b4 N; Y" O0 `2 U
/* 中断服务函数 */
" o6 ? |# K" g6 _" h) w( F0 V
/* */
& H+ U9 D( g9 n6 S# s+ Z% A2 E- O8 c
/****************************************************************************/
+ Q: N1 }8 a/ K( j8 A* A
void PWMEventIsr(void)
( J$ H p6 _+ ~: L K) D. ]; h
{
5 C y, q$ l: w v3 R/ c5 D; ~
IntSystemStatusClear(SYS_INT_EHRPWM1);
! K5 ~' b+ o: }2 N+ n+ H* }
6 `6 v w' x" Z3 E& }4 C2 s
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
+ @# z/ T# [" {5 o
}
6 X7 }* s$ {. \) b
) y: |) t5 a: O# D9 [' e' @
void PWMTZIsr(void)
7 E" v. }3 C5 \ e
{
$ N( p$ h4 R; k I% J" }
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
' R( H& i" f" q
3 P& o6 b+ H( e7 u- {3 I
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 j3 P' t) b1 `( u6 O
}
0 T2 }' T u7 }. r
2 [5 o5 H( n) h
/****************************************************************************/
], K5 Y* U$ d7 p
/* */
9 [$ k$ } N5 [0 [6 y
/* 初始化捕获模块 */
, T- T$ C9 @, r# Z$ Q
/* */
, C# H' t# @5 n" J7 Z
/****************************************************************************/
: `" T+ X5 } q- r l
void ECAPInit(void)
4 L6 c9 ~9 ~, e# X0 @/ T- U
{
3 f( A& g# t) r! g
/*-----设置 ECCTL1-----*/
3 H! G/ `# e+ W$ o8 N: b, h8 ]
// 使能CAP寄存器装载
$ N3 U* \2 t/ ]8 N$ s/ |) Z
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 C, d4 K+ |: r- r. V* q
// 设置预分频值.
: f4 \5 v* r5 X6 x# ~ J
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
" H% }% j9 S k, I# T
// 上升沿触发捕获事件
1 u8 y. W8 G% a) l2 g4 i
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
, p; e5 E9 ~" O8 i; A
// 输入捕获后重新装载计数器值.
' W: v w8 [- a5 T, |
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ J2 R2 U# m5 t
+ e/ ~* A1 I& f9 u$ _ J3 Z0 N
/*-----设置 ECCTL2-----*/
, F8 [3 D O( T' ]$ U
// 连续模式
& x! |4 |9 V1 Q% O' k |
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- _7 `3 x8 v: U2 G
// ECAP计数器TSCTR持续计数
P/ d9 I4 \- Z' O
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
' v( b& J$ Q3 [; V5 B! F
// 禁用同步输出和同步输入
: D2 p$ ^( |3 a L/ g0 x9 U' ?
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- a4 ]+ g% Y/ y3 }# f$ N g* v
// 配置 ECAP 2 为 CAPTURE 模式
8 @8 e& w, C+ d
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 N. s {8 L0 l3 O: v% d
( ^/ V" g6 t$ n' Z( o% X2 A
// 使能中断
* q% c+ B: \/ E( y
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 y( r+ @( I' y) U+ {
}
, D1 H% C! C# v* d
" d. M% [6 f3 E4 @* j3 E
/****************************************************************************/
7 o! X# p& B9 w) v1 F4 J
/* */
' D2 ?9 S9 E% J J# i% y# W! C: x2 z3 {
/* 取得捕获结果 */
2 q+ D5 ~* v% ] B, z
/* */
% X- Y( M% f9 W- g+ ~/ z+ R5 [
/****************************************************************************/
& S: k9 d! O/ f# x- @ Z
unsigned int ECAPRead(void)
2 U% l/ }2 J' G- i* w
{
5 J4 a- r* ?" E) C
unsigned int capvalue;
5 |7 k- `. Y- i$ s2 V0 [
unsigned long frequency;
4 k$ A$ P! g* j% l+ d
, {) u+ T% {' R$ Z& \
// Event1 中断标志
5 \; V( R+ r3 k9 i& ]# t2 v% A
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 p+ j r7 K) r x0 @: F
{
o: { E0 V1 @: Z: [7 [: Y4 k
// 取得捕获计数
9 r2 O) s+ s2 _$ w: j! `+ A
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. q4 R- J& `0 y6 N6 W* [ p
capvalue = ECAPResult.cap1;
3 n1 ?' ?& s0 |
. _& W1 {" @* i& P+ j! P+ h
// CAPTRUE 模块 228M 时钟主频
; e4 l, u; n; a6 r; ]8 ]3 h
frequency = 228000000/capvalue;
4 P! V: R1 T M* ^1 B
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ k: H) a5 V$ n6 m' C% I( Q
" z9 e( a J4 F. S: e2 @- R3 O
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
9 u8 w4 O& e. H7 x7 s5 k3 M
// IntEventClear(SYS_INT_ECAP2);
P) Z$ W1 }3 J
}
! d( K4 p" }2 l" a) P: k( l* U1 P
return frequency;
" R- `' X+ q0 J6 w! K9 K* z
}
# v7 v9 y; p% A2 X+ a$ T
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
6 u& w* k; M2 a# K; @
[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