嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
7 B8 ?# l8 H* Y1 t0 s
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
$ M" P1 W! @' q; [$ B; ~
/* */
- d8 A8 T3 C$ X2 q( L
/* 宏定义 */
6 |3 _# z2 ]$ u" g
/* */
7 t z; M z1 l6 e0 B5 J6 `
/****************************************************************************/
/ ]" x( Y7 f" I& r! j7 r3 [; H/ A$ L" H
// 软件断点
! v+ R0 ~/ u/ M6 w4 d% a
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 n' r1 B F9 v5 {, _
4 u5 O+ @$ ~$ G1 Z5 d0 J
// 时钟分频
: ~; q; H9 b# v4 @! {9 u, ?
#define CLOCK_DIV_VAL 228
" W, y! @) K8 g$ T1 b8 o! V& I7 ^: y5 X
# M: l: Y/ f" \ ]( i
/****************************************************************************/
7 f; c# Q, N1 G0 s+ y; u
/* */
' N6 p2 [3 o3 e( U5 B- C/ n
/* 全局变量 */
3 f/ f/ ^" T9 Z7 R, ^% u
/* */
- r, V* `$ a0 ~
/****************************************************************************/
, N Z( w( Q* |4 ]8 Y) ^
ECAPCONTEXT ECAPResult;
" r- n# c/ D# Q, [, y
0 C1 I+ h4 ]; }, M2 N6 F
/****************************************************************************/
$ P/ e# h$ p# C8 q$ m
/* */
2 ~7 C* F; }# k f$ r. r* T8 l
/* 函数声明 */
& L7 E" O8 V; m% J r
/* */
2 P9 H+ J" U6 k/ \7 q; L% k4 ]0 `8 N
/****************************************************************************/
3 R5 O6 {2 g- Y: N! G$ y' a
// 外设使能配置
. I) e- ]8 U! a' u& p
void PSCInit(void);
; `. W6 h. G" j# X/ v
/ c# u+ P+ V" _0 ?9 k, ~
// GPIO 管脚复用配置
" z# p% L0 J" h9 o4 x
void GPIOBankPinMuxSet();
5 q! c$ J; v# Y: B1 t
0 Y# C7 v: M/ L# }0 J) I
// 产生波形
$ Z4 b' C c# p
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ L) `- e3 Q5 x% m& N8 L6 J
void ChopperWaveform(void);
& J8 c# g/ q3 V- J& ]3 R* A
* r6 M% A1 w9 ` i! U
// ECAP初始化和读函数
1 E& i; @) o4 T3 t. N4 |4 h3 p$ N
void ECAPInit(void);
# ` u3 z3 M9 w* G, p, p
unsigned int ECAPRead(void);
/ s- M$ F9 X1 m/ {; i; L0 s4 K) d9 l
6 o& i% ?9 J& b, C
//ARM 中断初始化
/ p0 O5 M8 ~& s# o: n9 z
void InterruptInit(void);
4 s' a( P3 C* M, a* e& c- j
2 i1 W/ _4 k; X7 ~3 Z8 j
// PWM 中断初始化
7 q K8 z; ]/ O* [; f+ J k' a
void PWMInterruptInit(void);
4 U% e# a8 f5 p `+ P1 K& q
// 中断服务函数
% [, K% ]- C5 C1 X7 d
// PWM 事件
- W) b6 `( w/ H* N5 o
void PWMEventIsr(void);
" T# n% w. [8 S# k" x
// PWM 错误控制事件
* h5 P& \- D% e0 ~) ]
void PWMTZIsr(void);
: e6 D3 {. Y# `. V0 h: B- r5 ^
* r; W8 T# d" M, c2 j& X Y% y
/****************************************************************************/
: z! |- U6 W! }
/* */
. C# v" Q2 C3 `1 Z/ l8 h
/* 主函数 */
9 _2 ?8 T; c6 x. g
/* */
( J2 v7 U& S& q+ z, G9 u6 _+ T
/****************************************************************************/
; Q: \ C, {! i- v9 F
int main(void)
# ~: u/ I6 X& U8 M! d
{
: P0 U. B$ f4 [6 J
// 外设使能配置
3 W: \5 B+ j) W& o+ {8 x, y
PSCInit();
$ c4 G" c s3 o2 G
9 H' f7 s m! t, t9 H) i% ^+ [
// 初始化串口终端 使用串口2
6 O/ @) `' i* B% D$ y# f9 S
UARTStdioInit();
- b/ S8 J1 o$ Y7 y( M2 }
% }- @. N* |! m1 o7 F4 r2 q; T
// GPIO 管脚复用配置
/ y, W% ?9 w. w! O3 |. ?. m8 j
GPIOBankPinMuxSet();
9 K U# A- S3 }% c' B$ G+ _
7 u; V2 w6 J4 y n6 i' i
// ARM 中断初始化
2 c3 P+ J& h4 N: W6 H. C
InterruptInit();
4 N7 ~/ `/ g# O3 {2 h
, ~. _2 C$ e; A/ G
// PWM 中断初始化
# {0 J- N+ }) X/ m4 L
PWMInterruptInit();
9 z2 U- a9 _; J6 g. Z0 C
: B1 S; r o+ b: R, \! w
unsigned char i;
( M8 r6 d# [ W! W6 z# A
unsigned int j;
4 v: [6 |% k, [. [1 o
3 H) V* G( ]9 @8 b9 u
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 `$ O8 s+ B: n4 x
UARTPuts("------------------------------------------------------------\r\n", -1);
2 D b1 i8 ~+ E
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
7 Z$ Z; V% m+ C: C7 ~& j
// 产生波形
6 s, U# G( }% N& ]# u! ^' E1 X
PWM1ABasic(25000,50);
3 l+ G9 S+ G: i/ P& O/ \. ]
& R) |/ U, s( R
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
; o8 l) t" O( l
UARTPuts("------------------------------------------------------------\r\n", -1);
9 f4 @' u" `) p
) O8 Z/ B7 z! ~/ |3 z, r# ^$ w, C
9 J9 `& S' Z2 a
3 G! C) N, G2 `, Z3 t7 ^
UARTPuts("------------------------------------------------------------\r\n", -1);
% ]! s$ \7 F5 P F' h2 S
UARTPuts(" C6748 ECAP Test\r\n", -1);
/ W) |& B. C# t
// ECAP 捕获初始化
! w; P; L0 h$ s. [& u
ECAPInit();
: J/ M& T) O9 \' w: m
UARTPuts("Initialize ECAP.......\r\n",-1);
+ O" Z% q# I3 O1 {: j
for(i=0;i<5;i++)
( V- `0 X" Z2 l1 [. v8 D& T' w
{
) t# n6 U7 k2 c# w# M
for(j=0x00FFFFFF;j>0;j--); // 延时
0 v F: v2 b! l9 r3 B1 G
ECAPRead();
) y: q: Y4 X0 b7 S, y
}
`0 A: }" p) [
UARTPuts("\r\n",-1);
1 K5 Y$ ^3 F( |0 ]) K
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: o) j8 b- t' J# p9 o
UARTPuts("------------------------------------------------------------\r\n", -1);
- D# }- o5 t/ G
/ F0 x4 l) a+ D' E0 s1 L6 j1 G1 ?
// 主循环
) p8 x# `& r4 _8 P4 z
for(;;)
- N+ b& {8 d# w: a4 e
{
2 j& `1 s6 |. [/ }
/ G% p# {' W7 `* u2 R$ `6 v% ]! w
}
4 f6 @% C$ x3 w+ \
}
# v4 M$ G/ L5 D% }* e+ u/ h
- [3 u9 G l: a1 {7 |
/****************************************************************************/
0 |4 q8 f: Z6 K- E
/* */
$ y$ D7 q f" \ ^& ~; B* D+ H
/* PSC 初始化 */
6 y5 s$ ^ W! ?9 c
/* */
4 t4 O8 z' B+ {, g8 b
/****************************************************************************/
- W, q+ ]2 \$ c) f }" O) H; a
void PSCInit(void)
+ e- E+ B3 R4 c/ l2 U- I2 b
{
: q1 j* f( u( B, J; V# z
// 使能 EHRPWM 和 ECAP 模块
+ U' j' e/ k8 \& R
// 对相应外设模块的使能也可以在 BootLoader 中完成
* U! u* t% v& h4 {% x' n, R
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 N7 A6 v- i% K7 \6 O( j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& G- Z3 s7 n7 @5 O" l
}
' G: ^9 X( p4 Q7 O
W- {6 S; n \! J1 F6 N: o9 L, e9 I
/****************************************************************************/
2 g2 ^. _ W2 y* o
/* */
) F* n9 w0 u0 f
/* GPIO 管脚复用配置 */
/ R# [& n# x9 D N* I3 f$ B" j
/* */
, B0 Y6 _+ Q8 @- R: Z8 Z7 n
/****************************************************************************/
( ~8 d9 T/ G9 z/ c: b
void GPIOBankPinMuxSet(void)
3 E f& i' X+ ]; o
{
$ e+ T" x9 q3 w/ }- ~
EHRPWM1PinMuxSetup();
$ n6 O: Y, e# J, p) Y
. g1 D/ i7 { a
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; z( A; p: Z( p3 |
// 作为捕获功能时管脚方向为输入
& I- a% Y/ J# g3 H$ K
// 作为辅助脉宽调制时管脚方向为输出
y7 `, _+ I/ O, b% X: G5 }
// ECAP2 / APWM2
( L h% |$ X2 P5 Q/ B
ECAPPinMuxSetup(2);
- n T& W* L! q- l. n! m
1 |1 o" ~3 x, r3 U. B
// ECAP2 / APWM2方向设置为输入
# \4 _% h+ J% ]0 h1 n7 s
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. R% R- p* k- z% @( J D6 G
}
- k J5 ~1 y) z4 b
u, @9 P* m& |
/****************************************************************************/
* F! @# K7 {2 P
/* */
! G( l1 e M. ~8 H% \- }" e
/* PWM 输出波形 */
3 {0 j5 Y1 i5 W4 D z7 b6 ^
/* */
" b* s! R* o/ z" b5 z' ^: j
/****************************************************************************/
2 x( O' x6 e. u" W/ K4 I7 _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
, Q0 K/ a$ ^0 I' [$ Z. b9 ~3 a* R
{
/ j6 _, _; J& ?/ ~8 {
// 时间基准配置
( i' t; F' d: T5 d7 X4 k
// 时钟配置
1 s3 J9 f4 D, |' m) g& b1 r
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
) Y* n5 c, v+ F' g/ c& S( [
* g1 {. k0 t7 j0 G* F6 k- y
// 配置周期
$ Y1 z; A) }& R: s
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- E% ]* l2 C9 ]5 r
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) {! R) l) m, C! F( ^2 p' F
% S+ A$ U- ^1 K7 t. \+ R' Q
// 禁用输入同步信号
( l; g$ Q: p, N, _- l Z% |2 v
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# p) @7 w* M/ H' q- I7 h
. J) B( N" D1 A+ {
// 禁用输出同步信号
# Y6 E; z+ J, R; }& H9 B! \- c9 T
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
' ~* e0 u6 T* a7 R
?/ h, s- c0 A5 t- Q9 r6 l# p
// 仿真(DEBUG)模式行为配置
; H) c- R$ P, T/ j. D) `' w$ D6 m# [
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# W! {* |) \3 a6 ~* }& W4 @
5 ?0 M4 v9 V" f5 r
// 配置计数比较器子模块
/ B/ t/ s" z! h0 L+ M$ ?% ^4 `1 l
// 加载比较器 A 值
' K- f9 K5 \3 t0 W1 B J
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" v- P( _! S- z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% R4 b# [+ h9 u( S+ `2 p
8 A! S+ W+ `9 F3 G
// 加载比较器 B 值
9 h; {+ x# N! H% c1 B- c) X
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 N# ]3 c( c1 C( y, M& v$ q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) B7 g$ \) u1 v! u Q5 H
6 i5 `5 j" o! [6 X
// 功能限定配置(输出引脚触发方式设定)
& t9 S4 `0 i9 k( e* ?% R
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
6 `. I/ ~' ~; ?6 |' j( |
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ n+ e9 R! E% b' g/ s
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
# K+ i# B6 {# m
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 }0 x! S% |8 m$ o
* }3 B4 k, Y/ T# \
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
0 x" K1 H1 n2 z' }0 w
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
+ G, ]6 h. j% T0 z
7 k2 r( c! _2 [6 A0 K
// 禁用斩波子模块
% j2 r: @& h/ ~% J
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: R. f% Z+ V4 m6 u
8 L ]6 }8 D( d) v" X
// 禁用错误控制事件
2 {1 n" C( T/ V3 |+ Z- W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 x1 n! p7 C, g& R# \6 ~, i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 f' D: d/ ?% P" k5 U
/ P/ u: u) H& D* [- L
// 事件触发配置
& W, D& R8 u5 `# ]. `, D% T$ O* c- W
// 每三次事件发生产生中断
0 {; m" ~0 G% w& R9 s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( c7 @& j) R( ~6 x6 c
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. a2 s4 ~4 p" E+ t o
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ X( Q1 y" g* i7 a# L8 [4 W
// 使能中断
' {8 u: e# m, J+ P' ?( S
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 A3 d+ \ {9 c0 D5 D' C
0 `% m& l- }) p. e' j
// 禁用高精度子模块
1 b: E6 A3 u; ?) |1 A
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
_/ J/ S! d! Y
, n7 }6 k) b7 H; I8 @; _. B
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
p- _6 l$ n' x) [& g
}
# { ~9 N# X- V% M
# I% U, i" \8 r. K) v/ [& z1 x- R
void ChopperWaveform(void)
9 \" T8 H2 y! n0 V; ^
{
/ |4 y# q2 x4 {' ~) c
// 50% 占空比
- e, ^8 l4 r9 ^6 @& l3 R
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& O. B6 a u6 J$ Q2 C9 @
// 4 分频
+ d& U/ { D, |& q% C9 S
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
7 q7 w% I5 |6 e! D: K0 o* o
// 单个脉冲宽度
n& f# j& I' u4 g" @, B7 w1 R: S
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
c+ j8 P. b2 g
// 使能斩波子模块
4 G+ D' L. ~$ W3 Z* `
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# ]9 q: v2 f5 W6 ]
}
- o+ z- ~ [: |- A9 N- S; s: c
) \6 }8 h; l5 i+ D
/****************************************************************************/
& K' {1 U" ~# k+ c3 V. q/ O
/* */
, h4 S0 e" |: {+ T1 E
/* PWM 中断初始化 */
0 t l4 x. R1 u5 w* S. W
/* */
$ b: r% X" p9 S p7 Q& a8 m' {% H
/****************************************************************************/
: [$ j2 f2 M1 V* h+ j5 P4 o0 t( j
void PWMInterruptInit(void)
1 C& ]2 ^* s+ T" {; | B( `) l
{
9 A* A, ]8 V# d) a/ \3 L
// 注册中断服务函数
6 P( D$ S9 G9 {' w4 X
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 U0 F4 {, @' W8 w& x* k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 N$ }6 ]/ I) T+ C+ }7 p
. l9 `) n5 L+ t2 [ i
// 映射中断
- H, H5 u: t" \: d# e8 j0 o
IntChannelSet(SYS_INT_EHRPWM1, 2);
; C1 \5 T) z9 c j: b
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 n7 c6 f7 G( C* s. }% c
8 s/ n+ ]0 k) d5 o. X
// 使能中断
2 C2 f# c3 s8 [8 r8 u/ S
IntSystemEnable(SYS_INT_EHRPWM1);
! n" m9 O7 I1 K% K
IntSystemEnable(SYS_INT_EHRPWM1TZ);
+ Q$ g! u, `9 Z
}
2 U$ y4 E; b( D* Y, ~! A
1 k- i4 a. d! K% K0 \
/****************************************************************************/
( ^/ X S1 Q+ U7 o, {( s% Y
/* */
: v4 F& S D, ^+ l7 o, e
/* ARM 中断初始化 */
* P* V9 r; p# Q7 K, r
/* */
- g j& }/ I; m
/****************************************************************************/
0 x( f* e5 e$ G3 M2 c( L) Q3 G4 r) E4 h
void InterruptInit(void)
8 T$ E6 |. s: h- d- z
{
' x% H5 K! l4 t# ~" P
// 初始化 ARM 中断控制器
. z9 W# D2 v# \, ]& Q, r
IntAINTCInit();
' |8 I: K/ T3 T/ {9 j
2 @% Z5 I! y6 m9 R2 o0 T+ Z
// 使能 IRQ(CPSR)
1 ~ u7 ]3 m2 D$ r6 m
IntMasterIRQEnable();
) E6 h8 e7 z5 p9 a' g; @
' _' ?5 u" W; ?- b5 V5 \6 d
// 使能中断(AINTC GER)
. s$ X6 `1 y% i; y) ]2 H8 a
IntGlobalEnable();
' g1 y* ] E( N: G6 V( Z
* j0 I; f7 n, S T8 n# u
// 使能中断(AINTC HIER)
- ^# [9 ?% ?6 k
IntIRQEnable();
2 {' l2 X7 ~6 X* o9 | Z
}
% o2 P5 N9 t" e7 e+ x2 G
7 C: d, V% W9 y s! ?8 f) \
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
+ q7 a3 a& H# t* y
/* */
5 B2 E. Z* g; v8 y A! ^
/* 中断服务函数 */
( p c4 S+ t5 k- i+ h2 R |
/* */
' h1 T7 c, v5 \2 I# {# y. R
/****************************************************************************/
: K) E0 L8 J- B0 t8 C; C1 _
void PWMEventIsr(void)
7 b$ M, w4 i) d8 [/ i
{
$ a* z J1 n2 n$ W7 V
IntSystemStatusClear(SYS_INT_EHRPWM1);
- p# h2 g1 _. l/ k2 u8 W
: M9 s" Q; L. H p$ {; F
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& W4 c2 C0 e/ p2 Q* P& k
}
9 W/ l& {4 Y; V2 _5 o* A \1 u
$ w$ h* l) B1 h) f1 X ^
void PWMTZIsr(void)
1 S0 X6 W. s0 M5 V% F8 d; _- p
{
7 K- ~7 H+ Q( Q- f7 L6 S# U
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
, P6 j; ]" w; V2 k
6 y* S. F- f/ @, t; T
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 M0 c* ^% d% e3 h( J
}
) M$ R* j. W. s0 v+ B
7 @. a) P: X5 x5 G0 @2 V
/****************************************************************************/
( U5 d3 |) ^3 _7 [+ X
/* */
$ H0 }. p* v$ k8 e
/* 初始化捕获模块 */
: o, D% R* Q& W- X8 C5 u
/* */
3 {* A* L' u P. A6 w& u5 D9 t4 \
/****************************************************************************/
, z9 Q1 q6 ?9 y
void ECAPInit(void)
& n# G4 _4 z' k+ k3 p
{
) c' `; q2 }5 S9 y
/*-----设置 ECCTL1-----*/
* X3 _* k. s2 Y& `! Q8 e; Z1 X
// 使能CAP寄存器装载
6 r9 z/ s9 Z `# S/ K+ F, j
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
" u6 t0 k+ u+ g# t. ^( }
// 设置预分频值.
1 r. V2 U8 E m6 ~1 p! }
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 b5 i# U1 q- J, u) l2 j
// 上升沿触发捕获事件
( ?8 n* S1 c% n8 ^2 F9 _
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 ^$ \$ ]% Q9 T; T5 A% A
// 输入捕获后重新装载计数器值.
! h- B' `5 t4 m
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
. z) L" H, y$ n" F
8 W- k$ b) R' _* z- H1 w
/*-----设置 ECCTL2-----*/
7 f$ i* p( [, X( d. v o
// 连续模式
" U- t! ?% W9 S/ p! G! ~
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
8 c S7 P. q7 C9 Q2 n' P4 p
// ECAP计数器TSCTR持续计数
' ]7 m) ^3 o6 ^! \
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 v" z& o* x/ ?) N1 i4 h; Z
// 禁用同步输出和同步输入
/ [. v H. k o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
) Z8 n2 x; V& a) o1 M1 x; n
// 配置 ECAP 2 为 CAPTURE 模式
: T: ?9 G9 `0 u8 u2 y, e' ^/ ~
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 F2 A' C8 b: h0 B( E2 \ A
* W. h3 h& N* e5 y
// 使能中断
' R2 t5 l w: p3 |0 p' w# L4 `* V8 s
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ M: G2 t" z8 i* V8 t. J
}
5 `: c% b. b) ^- m* k* q) |$ a0 I: [
" U/ n+ z: k4 v9 {
/****************************************************************************/
. O6 E5 w& g, e& q* s- s
/* */
5 M3 G, x, J* U# N. j: J$ i
/* 取得捕获结果 */
- R) |8 `+ N W. I
/* */
7 [* R0 G# @; c$ ?' [! h
/****************************************************************************/
, J5 `* W9 m1 r! a$ a
unsigned int ECAPRead(void)
7 C6 v0 P' a$ q
{
& s* G& C: i! y1 N! d" _
unsigned int capvalue;
+ s; x' D: ~# g( G: _
unsigned long frequency;
8 n/ G1 p8 A. ?# ?1 y( h
$ s( s. P9 U. W1 N/ D
// Event1 中断标志
C& g' ?. t6 H, p
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
" c1 n# O0 ]6 M: ]
{
& Q$ p) u b1 v6 d& }
// 取得捕获计数
$ ^9 |8 _$ J' N# P) g: y" y
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
o$ q" l/ e* _# u( I) o8 z5 D
capvalue = ECAPResult.cap1;
) D3 x/ M% U: l; w2 r. K6 m0 d8 O
0 K2 E3 \ ^ Z; k6 O
// CAPTRUE 模块 228M 时钟主频
$ v' G2 O% l b6 ~. o
frequency = 228000000/capvalue;
d# M5 [' h, `# |) l. K1 S p
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
( V% N) f1 t/ q$ {3 L* O
9 |* x& n# n) Q
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% v5 f# [+ ~# m+ p0 z! y
// IntEventClear(SYS_INT_ECAP2);
$ R6 P3 |/ p. ~/ x
}
- N& P$ B7 H. }+ s( v
return frequency;
% U+ H2 x2 T- @; P2 w3 W
}
: V; h6 V v" ~# @: d% Z8 z& R, z
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
3 F ]+ ~) D) J i) l
[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