嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
9 l, |3 d+ l4 J9 h6 Q( Z/ f: j; s
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
' C0 n5 p; @) C. J5 g
/* */
* _5 ?/ k7 M6 Y% J) y% f/ Y+ U
/* 宏定义 */
3 V- S3 h" B. @! v) g% [
/* */
1 N9 a' ]2 ]: I
/****************************************************************************/
: i; K8 g+ a c$ F6 k# R( R9 F2 L
// 软件断点
$ ^2 m8 r. _4 d; d: m
#define SW_BREAKPOINT asm(" SWBP 0 ");
' s# S( G, W* U5 b9 b; q$ X
- [2 Y1 P* C/ z, V$ }
// 时钟分频
m `6 Q( o5 I* `) `2 w3 L/ |
#define CLOCK_DIV_VAL 228
y, c \1 o+ t3 c# n- i' Y
( M |' ^, c9 ?
/****************************************************************************/
2 Y) H- g5 W+ v' _ ~- z5 `
/* */
m( j: [$ H- G; B/ h0 b
/* 全局变量 */
/ J2 V3 }( ^. t6 w# X
/* */
+ U+ s' F) S* v. ^# _+ @. y1 B( b
/****************************************************************************/
' u( z& s; N5 G5 V* _6 O, K6 C0 P
ECAPCONTEXT ECAPResult;
+ r$ h% ~ x. K- N3 F; n& v
4 @/ e/ p$ E7 N D t
/****************************************************************************/
1 f0 |" @- h5 T9 J h3 B( @
/* */
" I) ]0 C$ l; W9 s8 `$ M
/* 函数声明 */
4 I+ l! D$ W8 G
/* */
9 \( @, J9 \3 F. W
/****************************************************************************/
) Y5 ]8 S, J' g$ k; R$ g
// 外设使能配置
4 a8 c3 e% Q- b. l
void PSCInit(void);
9 \; H: c9 S( @3 i% v I, ]/ g
) e: _+ Q8 R/ u' p. N
// GPIO 管脚复用配置
" P1 c5 v1 B4 a* \) Q
void GPIOBankPinMuxSet();
8 E E" B h. d3 z: N$ O' w. x
8 x+ B/ J- j3 s5 t2 F: E' Z
// 产生波形
* X( U: B8 J+ _" X* p4 q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 R/ I$ [' o( d, j1 Q/ P7 M
void ChopperWaveform(void);
% e% {, \) h, b. Q- Y1 Y: f g& ]
* X1 x! S7 M6 {0 f# t7 X0 F
// ECAP初始化和读函数
7 N8 M! X5 Z! h/ f
void ECAPInit(void);
( C* R2 |' h9 F
unsigned int ECAPRead(void);
3 C y) N% b. ^1 u U. r
) ^# H) o5 K8 f: y
//ARM 中断初始化
. d6 b# [( Q. |4 ~3 x
void InterruptInit(void);
" L8 [6 \& X$ m$ {" L$ ~( ^
$ w7 W6 O- k2 f0 p; ?
// PWM 中断初始化
( ]) u- D' t/ W }; t. @, B6 n
void PWMInterruptInit(void);
* ~' x# M- B* j" G, o0 T+ {& B
// 中断服务函数
+ _9 R- ~( C8 r" Z2 g) e& @
// PWM 事件
. m4 y8 c5 ~4 ]7 r0 w& g1 l; j
void PWMEventIsr(void);
5 M3 k+ Q. J8 w! R, T
// PWM 错误控制事件
$ N/ I: J2 j" g6 E
void PWMTZIsr(void);
* B1 {0 J. c* L$ i! |
, m/ X2 ]( X/ n
/****************************************************************************/
, E0 m1 A. P( r) O5 q% Q% R( D
/* */
# L7 Y' |( d( }& A3 m: J
/* 主函数 */
2 g- W8 X1 d5 ^! J
/* */
0 j8 [0 a7 v4 q1 ?* y
/****************************************************************************/
" N& Z- H8 ^2 @* b) b9 n+ e" m# ~
int main(void)
: v; m& S) e; s e$ [. |% Q
{
" `$ k8 F8 H! o: A% D/ k8 l, D, M7 N4 H
// 外设使能配置
D# x' ~6 }$ |4 i; h4 l8 N3 V
PSCInit();
9 ~1 i3 V8 o" s1 O& H
4 @2 ]+ [2 A+ |
// 初始化串口终端 使用串口2
* o; E( A/ g- g: @& b; v4 m
UARTStdioInit();
" p% A Y, R7 R4 D- E0 r
5 _1 t3 V- `0 J6 W
// GPIO 管脚复用配置
! {8 H9 t7 W5 V
GPIOBankPinMuxSet();
8 g6 G: C3 m c9 S* N m2 o
8 F& s+ p: ^# `7 u% p& X
// ARM 中断初始化
1 g. D: D6 M: ?
InterruptInit();
8 _9 k' Z1 c! I% v$ {
8 d$ H1 U# A3 o: P
// PWM 中断初始化
5 b2 S& o7 P4 _7 q7 U
PWMInterruptInit();
/ O6 S0 i6 j2 v8 O0 j
4 Z' c( e( g4 F/ }! y# s) R3 e# H8 K
unsigned char i;
( @1 H) i6 d$ P0 O0 w
unsigned int j;
2 K7 v# K3 U7 I+ U8 }+ e
& e& O+ i L' C
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
s- U" x% P+ w+ \* O: S$ x' {# {
UARTPuts("------------------------------------------------------------\r\n", -1);
* l1 k' J, E8 W0 a) F
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 X& l) ^/ U& E5 A" G
// 产生波形
v3 L4 ~. ?+ F: H$ R( s1 s* J: ?* r4 m
PWM1ABasic(25000,50);
- s% J( C, I" e3 s5 }
% i4 @" k, M8 v
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
, I5 s. v* E& U* ~# O/ G
UARTPuts("------------------------------------------------------------\r\n", -1);
& o) q9 J! K6 d1 v. P0 l
, l C! _6 W+ \' v
0 I2 Y T# r" R- G& }2 ]
- K! ]: T- S" G( S- [8 D+ }% `
UARTPuts("------------------------------------------------------------\r\n", -1);
- t" w8 O6 ^% D9 m+ Z1 b6 Y0 S- j+ W
UARTPuts(" C6748 ECAP Test\r\n", -1);
. m0 J3 h: g5 M, Y2 T
// ECAP 捕获初始化
& l7 W8 L, z$ C$ x8 j
ECAPInit();
1 s2 M- O0 x2 g* b. t+ f, J
UARTPuts("Initialize ECAP.......\r\n",-1);
7 D5 K4 Z8 d' |4 C! A9 _
for(i=0;i<5;i++)
7 b7 G S% v& l
{
6 x- Z6 N9 ]" j9 a3 P) }
for(j=0x00FFFFFF;j>0;j--); // 延时
, U0 a I1 [; r
ECAPRead();
1 S+ |; @: O- M" k2 b
}
: m/ H0 w0 m) s' v* x) ~9 E) P" W
UARTPuts("\r\n",-1);
- j @& p5 O- \" D
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
% W; L. M2 ?9 c: |5 O8 h- `
UARTPuts("------------------------------------------------------------\r\n", -1);
. v$ Z9 B3 i1 {/ d- W, b) m# f
1 ~5 x i# H- f. w+ h8 x) ^+ M3 U
// 主循环
$ {' x8 @& `+ `
for(;;)
; q5 c% ?. S/ J+ N
{
, j3 Z7 B9 ]4 Q' c- t
& R, o9 g) v4 x/ }0 W4 D9 J9 O
}
" g" K# o' g- j
}
/ e& n, T% U2 h+ m, z) B; J$ T3 @# u
) ?. n& r {4 o( e
/****************************************************************************/
( e- A3 D# |, z: P+ E, i
/* */
% h4 }; \# M0 O) i# i+ m8 a; V
/* PSC 初始化 */
0 D# A+ c5 a, W
/* */
' |' s2 q) Z5 S% p- M
/****************************************************************************/
1 m7 D7 G1 f7 {: w& e
void PSCInit(void)
2 d) I; q+ h. L! b+ t
{
2 H/ b- x5 h) K f
// 使能 EHRPWM 和 ECAP 模块
9 W. Y8 Y+ Z4 A( v" Q- b# J7 _) m
// 对相应外设模块的使能也可以在 BootLoader 中完成
, [7 m0 E1 t, F5 y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 O! G7 E. u. Z8 B- `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% o% |! L, ]9 }" T
}
5 |( P' K8 v: H
4 P, P; h: C5 p+ \
/****************************************************************************/
& L4 x( z. T- R9 z8 J: I! l8 n* y
/* */
. n$ I, X3 s9 H- Z$ c ?4 h
/* GPIO 管脚复用配置 */
" v/ c* H% o# q9 ?4 j* t1 A/ U
/* */
4 m6 ^3 w& X: ]: p( M
/****************************************************************************/
( {1 H' I! R! t/ E
void GPIOBankPinMuxSet(void)
& p/ Q E2 s: \& q+ ~
{
( M' H G3 m0 L! F
EHRPWM1PinMuxSetup();
. ?$ C- O, U2 N$ y) v
F+ f9 T2 m+ |3 _2 R* I* D
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
. r( x4 @3 U( d+ _- V: a
// 作为捕获功能时管脚方向为输入
( r8 U$ E* {! i
// 作为辅助脉宽调制时管脚方向为输出
: M. `' l! m w8 q/ b+ R+ G; ]3 `
// ECAP2 / APWM2
- u' C, `9 B( O7 r' n
ECAPPinMuxSetup(2);
. a( @2 N. G* Y d
( P- D5 P% E2 p4 r8 s
// ECAP2 / APWM2方向设置为输入
! I$ ^" B1 }/ b4 a' o* a a
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) W7 E! }( c. T+ d, V7 s; o9 S- r
}
9 E' `* ]& _4 z
. W" k$ u) z+ y& X2 O+ R, Z
/****************************************************************************/
1 |. s" l. o2 K8 d8 D. W( }, K5 b# x( `
/* */
9 P. ~6 |2 G; i& t. }9 P9 H! ^
/* PWM 输出波形 */
9 Z+ G, Z' R+ Q1 [; \% w
/* */
: z0 k9 T7 a7 ~- a* r. ^1 K) l' D
/****************************************************************************/
! }& n2 H6 `3 {4 N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 ]# h" T" i4 B: _+ n
{
8 m6 q7 j; D6 P) E" J- R0 p$ \
// 时间基准配置
* b, I* Y7 O, `9 g- L: o3 x* c. K
// 时钟配置
# ~6 h0 Z! C7 m8 q
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
0 V# q ~# H# }7 V+ \6 w! H
3 y& E8 G E) f3 |
// 配置周期
0 q' z1 S7 W: d" q9 i. z! _5 e( k
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
) R {) y8 L) B/ V3 D
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, p% @. R5 ?, u) V$ K, ?* ^
1 q( @3 W$ u% e: y. n# k5 @
// 禁用输入同步信号
2 g8 `: i9 A' V9 J* ?# J
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
9 v0 }/ X4 r' S/ [/ x1 z
/ n/ y ?5 K# X9 Q0 l& b
// 禁用输出同步信号
1 I- x E+ M- ~) h: c2 c0 i. ?
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
: b8 J% F/ k0 o2 N( |2 W
# N9 r* T9 v. D% w8 b8 R+ C
// 仿真(DEBUG)模式行为配置
: X7 H. Y+ V4 D' `+ l9 B
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, s: [5 N# _: U% j) \; B8 _( f6 ~
n6 f2 q; g, O1 J: u$ M! T% a& B
// 配置计数比较器子模块
9 }& H# a v- ~
// 加载比较器 A 值
7 I6 R: t1 O8 {7 {# M
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) m2 I |9 S5 y3 I/ V# @% |- W
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 z" z4 ]2 l, P$ c
$ \' J* i' v- O' g
// 加载比较器 B 值
5 s0 j+ u: M7 h" d$ _. q4 B
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 b. w1 B ^8 ~! E" W; q4 h
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 Y" {' Q5 E6 e; m0 c8 n5 I
x9 _' [7 J) K; e. U2 ^9 \% |) v9 b. ~
// 功能限定配置(输出引脚触发方式设定)
) u$ Q# G1 Y# z6 }3 [5 z$ Q
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
2 ~* @" X5 e! d8 w. p* d
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: n9 [1 {2 f4 C/ M3 U. L* e; ?/ ?
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 I) k. `+ K7 \) y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 b/ t, I3 P& c- ^, r/ o J5 d: }( h
& f7 l" R% H8 K0 l4 x7 h
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
% G% k( j( P! V5 N& t/ S7 }, t
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' S5 i7 W' i3 |1 u
: _. ]* b* d1 I# ?# b; V0 I
// 禁用斩波子模块
! F; O9 A' M5 _; B8 S6 l
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- a% h$ B1 L, n# s. R
% F. B; I4 W/ `$ L! O1 I% j ~
// 禁用错误控制事件
: ]6 P) ^4 f" ^' `$ s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 p0 P4 Q+ W) R7 x- k- _6 r
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
% \0 J8 M( {, `4 V! h( U2 {
' g/ ~& a/ A# U9 y1 y3 i
// 事件触发配置
4 Q6 l7 w7 _* F
// 每三次事件发生产生中断
; B# |7 h/ q" k' k0 [( M
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 q" X5 \9 G2 e% y' T
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 `( [9 e2 \. f: k1 z! f
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 Y) `7 r S3 R0 O2 U
// 使能中断
* z0 C: Y7 r l) c5 |' [
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% I% }) z/ c: H# L* E/ C, k- l, }
# m. D! L5 A! V. Z' ~
// 禁用高精度子模块
- Q5 F) d/ B+ b, @7 a# p! d% `
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
E2 [) u2 S' \; S& A! f% P+ V
% W1 X$ a/ d( \4 Q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 x/ j- y$ u4 N r- q
}
3 A$ W' f1 }# g8 W" N C7 I7 i
$ \+ l2 j! l% ]2 M
void ChopperWaveform(void)
" s2 \' S Y4 [' N
{
5 p; m) w/ U0 B w3 x; n
// 50% 占空比
3 \: O& B. }8 A) t# ^8 \) ]- I" Q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ q7 g. y4 m) m1 q
// 4 分频
) m8 ?1 @! j, z. z: b: ?. j
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 R1 P, E* u& y, k$ F
// 单个脉冲宽度
5 V* R4 p9 o" |
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 v/ P$ D M! \
// 使能斩波子模块
' G9 n% R* Q# b# A, ~
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 ~, b* W% O, g. Q' ^+ }
}
4 D8 Y: [% l3 ^2 m6 m, R
y& b* k2 _+ L* |
/****************************************************************************/
' R$ h) O/ l$ J" I
/* */
4 s9 _8 W- G- K# z! R5 ]3 b# [
/* PWM 中断初始化 */
8 A# ?" l& m% L/ p
/* */
6 G0 X% {. `; V6 @
/****************************************************************************/
4 y5 X* `5 Q k+ ~! A
void PWMInterruptInit(void)
3 j9 H- P* g6 \' ]
{
( ~4 q, C8 a$ U2 a/ D
// 注册中断服务函数
; `3 m; g: V* v! c- }9 s( T
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 F2 K/ ?% |8 }( t9 X- Y z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
) d1 {! G) S s- A
& V6 t) l7 u S- @% F1 v6 e; K' L
// 映射中断
/ E1 ~2 `7 |7 \0 l* K) V
IntChannelSet(SYS_INT_EHRPWM1, 2);
% ?& v+ P: Z+ ~/ v
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" r% r. [% E1 v) ?6 ?5 `) q& d/ a7 |
4 j7 I o2 o+ m7 y0 b7 ?2 I
// 使能中断
3 h8 z) C( t/ v+ Z1 w3 Y, @, u% g! G( T
IntSystemEnable(SYS_INT_EHRPWM1);
' Y& n( ~! k* n
IntSystemEnable(SYS_INT_EHRPWM1TZ);
( ~1 W7 A2 c& a: K
}
# O0 Z' d7 e- t6 {7 o! ?2 {; l
9 L, F( [( o( W/ V
/****************************************************************************/
6 F& `( x/ m' _
/* */
' v8 S4 d7 u; n* M& p. z6 G$ o& I
/* ARM 中断初始化 */
- B' F5 ]' F3 t) S; X3 Y
/* */
+ N/ ?) j1 i9 m) {
/****************************************************************************/
; ~+ Z, c% q, f' a6 ?# d t+ k
void InterruptInit(void)
2 ^9 Q1 d+ d' }8 W i
{
( J" z" \: g! L* y
// 初始化 ARM 中断控制器
a1 |, F9 k) c, ?$ f2 f0 p- H
IntAINTCInit();
. x) j/ ]% G, ~) u' V
; g4 B4 K6 p1 W: H
// 使能 IRQ(CPSR)
\4 _" _8 N; Y, e* h7 _& g
IntMasterIRQEnable();
# L* S- c% E& n( K0 K" r* ^, N
: Y! E% r; H$ V6 O6 }/ g) K
// 使能中断(AINTC GER)
$ Y1 [: `# V5 F2 C" o( M
IntGlobalEnable();
8 O1 f' a# x' T; C1 u
$ u( |% \& o4 R b
// 使能中断(AINTC HIER)
7 T5 N# B4 P/ O: s8 v& {( ~
IntIRQEnable();
+ }% z+ R8 s% F
}
9 s3 v8 Z4 P# V
3 P; G1 C8 Q0 h3 q$ h
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
3 E7 a: ^/ A4 _: l4 F
/* */
) a! {5 y" U; t3 V0 B6 j+ ^
/* 中断服务函数 */
6 B4 T# g" z& \1 ~) u+ |" ]: _8 F5 M
/* */
% L- b1 E7 T f$ h4 ?7 G) ?
/****************************************************************************/
8 n- y5 O5 m% i* m
void PWMEventIsr(void)
1 y. \. r8 y1 M# q/ V5 ?! _
{
5 k* @/ \% L, ?% s
IntSystemStatusClear(SYS_INT_EHRPWM1);
) T$ b+ R, _9 [" w
* [, e8 O3 @5 u4 N; u* C9 \0 I- I
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 }2 O5 T- j) w* t' h
}
5 z( k" H5 v' q& H8 |0 k
2 i3 J; s1 E8 ?- @6 E
void PWMTZIsr(void)
8 x) k; v3 d8 Q; V' y) s
{
2 s# A7 n! T, q
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% ~" G7 r$ z# I3 Z9 I# x
5 A+ R$ K, ~, X: D3 w3 `
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
+ D$ @: ]) s/ T/ t$ V
}
( d# ]% ~ y" F" F- u
3 C( |: O1 r( ~/ x+ p _& ?
/****************************************************************************/
$ n2 u- B; S2 Y* @
/* */
, j1 y# g& s' W5 j5 R W* k3 p+ P
/* 初始化捕获模块 */
6 M' G) I2 Y) }, i. P
/* */
8 X4 A- s8 v" b1 g+ i) G6 o
/****************************************************************************/
0 i8 q4 R. E+ j/ G* C, t% _
void ECAPInit(void)
4 A9 Y' M* M4 s! ?
{
' b- T. U3 i1 ]$ Q7 i5 V1 Z1 x) C
/*-----设置 ECCTL1-----*/
% G) p! T2 {: [
// 使能CAP寄存器装载
3 A; E) f6 f. w; Q& L9 {8 F% O
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: {( `' O* ?. T9 Z5 S- f
// 设置预分频值.
~9 {! x; p+ Y6 f z
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
R6 P/ m7 f6 j3 G. w
// 上升沿触发捕获事件
; \$ g/ ^% s( u) v" A9 M( x
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
6 n5 b; p5 O" s0 H
// 输入捕获后重新装载计数器值.
% G$ p# {+ v" e0 _6 O# U$ b
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
& V O6 |! x: H, W2 v8 w
$ n) O8 G1 u# ^% J* h/ P
/*-----设置 ECCTL2-----*/
2 [9 a5 K- Q6 c/ E
// 连续模式
! E/ _$ J6 R( _3 @% M( \
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
; Q S. u0 n: A3 b V% Y b7 k
// ECAP计数器TSCTR持续计数
9 G# j4 m# v) i# f) l- X& n) U
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! d/ b: S4 p* @ i9 P
// 禁用同步输出和同步输入
6 G& o8 s0 }# y! ]
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
1 C( ~4 _0 s9 T E; T7 v
// 配置 ECAP 2 为 CAPTURE 模式
7 f7 i" a, {: I' U
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& H; X: v/ A3 { E
6 F2 P% t3 W% v9 A A
// 使能中断
( |8 g; J) c, l( I
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; p ]7 m3 N; |: |0 b7 o
}
$ g3 k K' Q+ y2 [! ?" q7 e
' f" R2 S- {0 N1 N4 F- ?2 u
/****************************************************************************/
* S& ^+ r5 J$ A( Q, }, b) J$ U8 K. x
/* */
. X+ _* ~3 X4 J( F# [& o0 d9 ]$ q
/* 取得捕获结果 */
1 r! ]0 o7 _$ P4 D0 U, Z4 ~
/* */
$ B' c) _" g( b+ `: h9 q- I* t$ Y
/****************************************************************************/
+ u- h. F8 [ h% Y" H1 ]9 H& |
unsigned int ECAPRead(void)
2 [% i4 a7 Z4 L" ]% N8 B9 w& O
{
1 p) w! x# t0 q+ u
unsigned int capvalue;
{: b/ I) u% t; h( M( }! }
unsigned long frequency;
; u* a2 a% C0 I% R, v* v
0 n! I' P; f3 B( E3 B; `/ h/ H" l# O
// Event1 中断标志
' n! L2 b, J. ]# t/ `
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. O( T8 Q: n$ W5 f6 f* g5 U
{
4 r4 b! Z. H* O) Q8 U
// 取得捕获计数
* P1 W5 G9 f v2 {' [
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- A' K: ?$ }2 m) G& t: Q% j9 N
capvalue = ECAPResult.cap1;
( C3 L) F5 O- ^ ^9 t
1 u. E: R! y+ r6 G9 V
// CAPTRUE 模块 228M 时钟主频
9 p' w7 [. A3 d/ j! O8 i
frequency = 228000000/capvalue;
" h3 H9 R0 K, t
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 L6 u5 a5 r& Z1 \" ?
* q5 D$ J% w% x# z+ g
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) `6 Q6 @' e& I7 z9 D
// IntEventClear(SYS_INT_ECAP2);
) f: c( Y8 v" k" k0 V
}
3 o+ R$ a* p, m- k: R0 u# t* G
return frequency;
0 q9 @, g/ y1 L- B2 [
}
% l$ t% H' b" r" x$ t
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
P1 b5 J9 t# M `, i" j
[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