嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
, G. Y5 a& I8 d8 \8 q$ ^
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
2 h7 P( f4 Y4 U1 Y \+ b: y
/* */
- e3 O5 j) j) Z6 F" K
/* 宏定义 */
5 A1 C) G4 Z% F3 ~
/* */
7 g& V) L# o; q/ ], _8 t2 _
/****************************************************************************/
/ J0 T. W% u6 C7 M5 s& F; V% ]/ W
// 软件断点
& b- I7 f& j B2 Y) V, M) y
#define SW_BREAKPOINT asm(" SWBP 0 ");
; c# Q( X9 S& x2 o. g8 L
+ F7 r: D/ }+ h3 f9 J, ?, [
// 时钟分频
4 E7 K r+ f+ @, C9 o
#define CLOCK_DIV_VAL 228
* [5 X7 U2 l8 ^
# i5 G5 D! ~ s
/****************************************************************************/
8 H+ V7 Z$ Q e$ N6 B
/* */
( V% S9 @& y3 r0 y
/* 全局变量 */
( H# G: o( w( R( w5 \& I
/* */
0 `! C4 S$ a; M
/****************************************************************************/
# B/ z! O, w( D: z# z5 V: I7 ~" G
ECAPCONTEXT ECAPResult;
- V, U: U! X+ U, w, G0 u
0 G. B8 a6 ?- {2 E' m
/****************************************************************************/
2 m+ D& x- a5 A( f% m s5 I6 n
/* */
. V9 ?/ w. v, i
/* 函数声明 */
0 o3 j9 K$ S' I3 z
/* */
# Y- ?' E2 n: T$ S
/****************************************************************************/
: c( y" C# I/ M2 B
// 外设使能配置
7 c v9 E. v8 h2 Z/ ]& ~
void PSCInit(void);
4 h7 B7 J" u* H+ ~
7 Y- Q: E" F" q( B+ q
// GPIO 管脚复用配置
( _7 R7 d8 R" J% p- E9 s
void GPIOBankPinMuxSet();
2 `* t4 c" o r6 T0 M( Q9 q
2 y& g9 Y3 T- W( o% S5 y. O
// 产生波形
( F' ~/ G5 q& N& g: x# x {9 H1 [
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
! m$ j/ A1 k" ?: M- M2 K" ~, L
void ChopperWaveform(void);
4 B4 ?0 l, `3 E; A
3 D- }/ y2 f% `
// ECAP初始化和读函数
" P! ~: s2 \, _& a$ S
void ECAPInit(void);
0 g: h& l, j" N- M/ k% p
unsigned int ECAPRead(void);
9 i. Z- v% t4 E' T) Z
. a6 o/ \- R. n& r7 b
//ARM 中断初始化
: `; A% J: l L* k+ {) J
void InterruptInit(void);
X. A m5 T, ~" Z, o
6 h0 k [3 Q! N
// PWM 中断初始化
5 S$ H5 Y4 y5 O$ j: C4 ]
void PWMInterruptInit(void);
: l& T6 i9 |/ Y; c9 g
// 中断服务函数
3 `+ l8 x4 ^& A3 [
// PWM 事件
) L, D7 c& c, H: |
void PWMEventIsr(void);
# U% e8 [, O# [ ~) |+ P
// PWM 错误控制事件
8 `4 ]% k$ a# _) @4 j; ^% F
void PWMTZIsr(void);
4 P6 O6 L# N+ F( o; Z
) s/ u( h5 w# @* d0 `& I( q
/****************************************************************************/
5 H' _$ c9 i, z& W% I
/* */
- r D. K8 t* n3 }6 V/ F4 z
/* 主函数 */
$ m# ~7 _! `9 |1 x; [$ S
/* */
5 K5 c8 h" v& j
/****************************************************************************/
5 e. n! }( h) f3 U
int main(void)
5 E. f% ]4 p) V7 e% E. }
{
' A$ ` ^/ e7 ?2 W" C# k! {* x: {
// 外设使能配置
, ~7 n/ Y/ A4 _ T8 E: N* t7 Z. [
PSCInit();
( M/ z h, I; u8 r x W
2 I, E9 m0 X1 i8 [2 V" j
// 初始化串口终端 使用串口2
! a+ Y' ^! J. A* k
UARTStdioInit();
6 I% Y2 Q' [+ Q: X5 q) O
+ I0 d+ _( s" D
// GPIO 管脚复用配置
- i" n2 v. ^( j+ d0 `, c
GPIOBankPinMuxSet();
" Z9 g- ?3 s g1 A* m# e
- Z( r9 w& b9 R- S0 U5 E7 m# `
// ARM 中断初始化
% I6 Q% |! F U
InterruptInit();
9 \ }% Y' o! V$ U- T
0 ?+ Y |9 C7 K. _
// PWM 中断初始化
2 T; L/ d3 B; R ]: j- Y
PWMInterruptInit();
/ z2 e9 z# Z0 b) k
0 l, ?* k% Q9 Z C) E+ w: x
unsigned char i;
+ M5 S2 D. ^0 U+ Y
unsigned int j;
4 K( g% _5 f' g6 P
2 W% T2 k8 P" y0 M' l% x
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ [( T: u0 S9 l/ R1 c. r1 U: l
UARTPuts("------------------------------------------------------------\r\n", -1);
: ?$ a, }" I" D' p+ ^
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ X7 P/ v4 W! s1 b9 P
// 产生波形
7 Y! R: O3 K& y4 B
PWM1ABasic(25000,50);
9 |4 [+ N/ d6 b0 g2 K' Z* f
& l! l5 v. }* @0 Z- F+ J% h, [
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 ]6 T" x, M$ O3 ~ v
UARTPuts("------------------------------------------------------------\r\n", -1);
4 r# A/ X |: m! ?/ _% v5 L, [ W
: {5 L4 K/ A: a. g8 y1 ]1 X
( s+ R& r% @1 A
( E# I: _7 M% x i0 |6 M
UARTPuts("------------------------------------------------------------\r\n", -1);
6 L6 y4 d/ K3 g1 l; m( l3 S( x
UARTPuts(" C6748 ECAP Test\r\n", -1);
1 j4 @- G* i& O( W& j% J' S
// ECAP 捕获初始化
7 V, B3 |/ B' T: F! f. A' o2 I
ECAPInit();
; v+ ^: m7 W9 C
UARTPuts("Initialize ECAP.......\r\n",-1);
3 @5 J8 G: Z H, U- p' s4 d
for(i=0;i<5;i++)
8 Z" f$ n6 J, a$ X) F( n
{
* d! c6 @& q2 F& `
for(j=0x00FFFFFF;j>0;j--); // 延时
4 l" L# X% ^ i J% \. L
ECAPRead();
. }, Z( t& l, h* `+ U
}
) H. \$ i- R( W9 y
UARTPuts("\r\n",-1);
" V, m. p ~0 S* P* R( Z0 c
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" E4 F* s/ X$ W6 T
UARTPuts("------------------------------------------------------------\r\n", -1);
9 E3 {9 o0 E& g. B- n( r
, N" O6 T2 k5 [
// 主循环
4 J5 f9 S% C2 ?4 y
for(;;)
* I- M- }4 ~5 K1 i/ R- T. P W
{
. j5 n+ u1 ? D( ^, P
/ E( |1 a8 u& A
}
( q; b" H/ t# s! ~
}
' j- V7 w( z: S+ b& m& m
+ W9 a& l6 E. a0 J6 C( J. [
/****************************************************************************/
5 _: y; z: q' q" a: N
/* */
1 _- S+ {) j' N' m" T: ?5 H( U
/* PSC 初始化 */
, k1 w r& j0 M. K
/* */
1 x# S- U1 _+ l3 z& d' a0 f1 ]
/****************************************************************************/
+ _$ Q1 c; \; _& I! M& n
void PSCInit(void)
; U7 b3 F/ [! l0 I, n* Y/ j
{
+ E; N( N: L4 o. V+ @
// 使能 EHRPWM 和 ECAP 模块
' p/ C! M4 Y5 T% Z$ g2 O* `% A, p
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 H4 Y4 Y ^ k& ?" L" I1 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, [- C4 O$ D# a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& R' j& D/ U7 }* d; `
}
r d8 S+ S* e/ k, G
# X! F a$ K2 p' p; U
/****************************************************************************/
4 I# I2 G) }2 f0 F
/* */
/ O1 i6 `2 H" O* G+ h# x3 z2 A
/* GPIO 管脚复用配置 */
. C* V( |* V0 m& H) M! F- ?
/* */
6 `) s* y! F# T4 D: Q
/****************************************************************************/
% s7 i7 E9 E, m7 A4 W3 {, I
void GPIOBankPinMuxSet(void)
% Q0 t; h: V' Q: }4 M
{
9 [2 c6 e- W9 k# n- P4 `
EHRPWM1PinMuxSetup();
. h8 r. {$ J \# Z D' D9 A& e
3 A9 x# y" A6 B7 L/ B' P! s* s$ q
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( @- M, o' z- I& d6 D) S8 h0 g7 p
// 作为捕获功能时管脚方向为输入
- @1 \5 B" V( t2 B0 J; I' B
// 作为辅助脉宽调制时管脚方向为输出
% I( G) {/ w6 Y4 ]; ?4 `/ ]
// ECAP2 / APWM2
^4 A! K+ Z5 t, b* T9 P& A- E
ECAPPinMuxSetup(2);
3 X0 i" |8 }4 |% S6 G: X* Q
3 ~. D$ o/ z! t' E8 `- P
// ECAP2 / APWM2方向设置为输入
& W2 `3 V! y4 k8 j( y( j! }3 s( F$ s! A
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
+ f$ w, F; S) `9 U- A
}
3 ^/ p0 d( o& ]8 B
% D' N' I0 q( }9 j6 P& b% r
/****************************************************************************/
( |% q5 O* T' G4 T, R) e8 X" a3 B
/* */
3 c% \, l. ^- }. @" {- U; i5 o
/* PWM 输出波形 */
0 S& \* ?* E7 z7 u) e
/* */
& P1 D% L9 b( i. `
/****************************************************************************/
8 h9 p% I$ U! A" B+ ^+ ]5 ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" o6 `2 y8 Z0 ^) K8 p' E+ v
{
5 j5 L2 D3 ?* C7 q, q2 f9 Y7 W9 E
// 时间基准配置
, {5 _, K9 w$ I5 ]" K
// 时钟配置
* n% q4 U, k0 X: z* f! b* J
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 n. w7 j/ L& M. I
3 ^" a/ ?$ X9 s, Y6 z
// 配置周期
& ]/ p, ?8 |$ h, D. e. B8 E; X
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 p1 Q9 [5 y$ r# U4 ?+ C* u& m
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- T7 j9 ?8 j9 C
^$ K! h3 Q# u/ s2 j# z2 p( n, c
// 禁用输入同步信号
4 V3 d# P& J% X U7 |$ Q# u) W; t# f
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 P& @& C* C9 I! s5 S
9 ?4 I8 i- v" T% u' i6 L
// 禁用输出同步信号
& d/ f% M! A$ ]: v3 e! y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# C( e4 `& w0 J! P! Y, Z& u
' j4 n# X" L9 H# n2 n3 t
// 仿真(DEBUG)模式行为配置
7 d! d: W. t2 P; _: T
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, L7 |1 b/ n! Q5 _2 _% ?; z
. f$ v& M$ b9 e) I
// 配置计数比较器子模块
" l* T ?, @9 E
// 加载比较器 A 值
* b2 C+ j# m& Y+ l1 P' L/ q, L
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" o0 B5 l/ j' B+ J
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
E+ H6 d* R! d5 P Y. D
K c4 V0 z ?
// 加载比较器 B 值
) T" J$ l" k3 l4 I3 @, W3 y: L! c
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
) H/ I0 ~. r2 [2 Q: T! | F2 S
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( V, \. I' V! {" i# q- h; o
9 ?, \/ ~. \3 Z m+ D
// 功能限定配置(输出引脚触发方式设定)
% k4 g% b7 P% a0 r9 H ~, m* M/ ^0 b; n
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' ? v' {$ E9 _) B* s+ K; W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ x) t4 L% b4 x/ K6 U6 b6 O
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
4 y( A1 _; n3 {- m/ U9 F ~
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; C4 Q0 P( \/ L N
- A! A$ H8 V* `+ E2 {0 K4 X
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
- }$ p% H0 e0 Y1 Q8 b. h
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
5 @+ Y i! H( |% z( ~
4 o- a9 r* N/ a% E( K
// 禁用斩波子模块
! ?2 T, e, b; o8 v4 C: D* u1 f4 J
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 J: K5 A o- n9 `7 y
2 n* Z; ?0 ]( j, ~6 S
// 禁用错误控制事件
9 x8 G* R# a7 z! H8 K6 X, }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 v0 t2 d' x1 u. f4 J$ f
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 A2 J( Q) N+ u! ^: q
' u" Y4 E1 |6 g) L/ k
// 事件触发配置
. q' s/ |; ]2 C, j; p& _* [5 U
// 每三次事件发生产生中断
5 d' {% e2 R W7 y2 s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# Q% s" u2 H2 j3 l* f% _1 k6 Y
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 [- j9 y4 V. J3 n/ X v
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; \! m! t3 J ^, i1 E* p0 c
// 使能中断
. y3 I: h# o& F. y c% q, l3 `6 E$ @
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
n3 c) H: f; v) R* i2 r& |
" _- H: Y% K' }% A# @! U+ r
// 禁用高精度子模块
q: B; ]' i" L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% o0 O$ @/ I' X
% p5 _( }8 x. |( ^
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& I% k( b% a" `* _ B
}
) f O0 Y0 \) }4 q' V
/ X' I3 x4 [7 _- j" G& v
void ChopperWaveform(void)
. _, S3 e% Z' S$ _' k2 m
{
4 D* b9 u, E( G8 F9 n* x: h
// 50% 占空比
2 C$ Q5 G. y& B% U
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
: c" G. r2 |% j
// 4 分频
3 n. Y# D: C3 Z0 y; Q7 a% `' i! z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ O: g- b" i. t" B( H: t3 [
// 单个脉冲宽度
& K1 H& E& L% A. F8 i& B1 l5 [% ?; L
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. i, a( L, M% W G/ i6 O( j7 I3 k
// 使能斩波子模块
* K& O( }3 B. J- O: C
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. B U. z8 @5 R1 C V0 S
}
0 B9 B! e( o5 @ U/ z
. D0 t1 ^( `; N# e G6 t
/****************************************************************************/
e% r1 B3 R' ^ t7 o
/* */
; h. T9 z1 I) k
/* PWM 中断初始化 */
1 p, Q4 K i" v% P% E6 P
/* */
- v: s1 t: b. q$ y( t% Q C; K
/****************************************************************************/
! V% x- W5 e; P" D3 {
void PWMInterruptInit(void)
5 V7 v6 G, ]$ _; \9 X- }
{
L7 F! g: z$ j/ q! W2 f/ Z5 L$ F5 ]
// 注册中断服务函数
6 x7 E' @$ I" I7 Z# q$ ~8 k
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: f' E% R8 U x9 N# \
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
9 S; ]; U% b* ^6 W) }
+ E$ Y% i0 l3 F4 p1 L8 x* t
// 映射中断
( y" {3 R( ~2 t8 |6 E
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ J. Q1 |" t: D* Y/ E& t9 Z! G
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; W- \! U4 _* O( f5 w- }
! x: k: ?( B' W7 F* t
// 使能中断
# f" Z& v. M E+ R, p
IntSystemEnable(SYS_INT_EHRPWM1);
& G" c( Q( D: @# }, B, B
IntSystemEnable(SYS_INT_EHRPWM1TZ);
. w# A2 O: V3 V. E2 t
}
, N. x5 S9 U6 o% k) d
) n6 ~4 r* F# V3 B6 p
/****************************************************************************/
) W! p5 e* b+ a. U3 a3 s' w* t( K3 \
/* */
3 X* M- G5 Z2 n9 |
/* ARM 中断初始化 */
# q6 t- t. p- l: e% h
/* */
/ ~$ [4 z0 S$ }- q. Z
/****************************************************************************/
9 o3 ~' \8 Q" d1 {
void InterruptInit(void)
, s( P3 O% j6 M) A! M( q( c
{
! F- H4 @& g6 W5 K
// 初始化 ARM 中断控制器
5 ^8 m5 ~* l6 i9 C) j" a5 C
IntAINTCInit();
8 L- ?" Q% a$ r: h! ^! f$ D
3 f3 T3 w, x0 O1 s2 _& t" i3 |
// 使能 IRQ(CPSR)
* I \1 d; w- l9 F# j& V3 G( q
IntMasterIRQEnable();
7 c6 X* _" t' }4 p5 `4 N
) J- |4 v! Y) L! W$ M
// 使能中断(AINTC GER)
- [# k1 {$ v, u9 w; }7 s1 T: X
IntGlobalEnable();
- c2 k" q+ x' Y0 Y3 w/ Q2 J
, `& u% X7 V1 o- s3 c8 J
// 使能中断(AINTC HIER)
: ^- i/ F# c" E) b! D) |2 }& i5 A
IntIRQEnable();
% W6 _% c& v, \
}
% m( g* T9 ^' ^$ ]8 {. a
' q. B; \6 P9 M3 T
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
: }2 x' \8 I/ A5 u2 R; C+ l
/* */
% {8 \* I$ }# O5 ^5 v
/* 中断服务函数 */
! Y0 O2 p$ M7 L8 d3 d0 n
/* */
' d) M6 Y' Q4 J* Z# X
/****************************************************************************/
5 p$ A/ M: Z8 ~( V, z6 w% I- L S
void PWMEventIsr(void)
1 {7 {2 N0 n4 a6 d
{
8 t! u% ^7 Q: b! f7 A" [8 c
IntSystemStatusClear(SYS_INT_EHRPWM1);
s4 G8 p0 f$ c6 e" ?
' B# L0 r, v4 u) Q$ O
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
; v2 ~1 e. @5 C5 V6 U7 L8 v
}
# p& l$ k, K z6 X! Z
7 m& X* _; c+ t: C8 w$ v
void PWMTZIsr(void)
# Y! i) {$ |' P* ?
{
9 j7 J; e+ R7 c; M
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 F. u. r" [# @4 q6 v3 E" k
! v* V) a2 F8 z9 F
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& o5 x0 S8 c2 Y
}
$ o M' R4 b$ P( _* Q5 f
1 s7 _- q1 m! y/ j9 O7 {+ J* E
/****************************************************************************/
; Z6 ?0 Q" f6 {) l! L- `
/* */
* d% f& x1 G" Z1 a9 \2 F4 U
/* 初始化捕获模块 */
3 d. z! J% ]3 [; y4 d
/* */
' H/ J6 T2 }! T- Y# f2 r2 E T
/****************************************************************************/
9 N! p- E W$ W5 {! |
void ECAPInit(void)
6 n3 O, E# d$ M& M
{
" b1 o9 ? t2 \5 \" K$ L
/*-----设置 ECCTL1-----*/
( L8 x0 a) B& \ a
// 使能CAP寄存器装载
$ s( ?; R* o$ d# l% o
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ n0 T; f1 ?4 I; w1 q/ D& h
// 设置预分频值.
1 b. A7 l/ w; i% Q
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. f# j8 v- _; F
// 上升沿触发捕获事件
$ z+ h8 y- Q( F: k1 X6 Y: w
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
- E: b; ^3 A, b- f7 K
// 输入捕获后重新装载计数器值.
- \' Z, p# a% Z: @4 p( y/ }
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 h+ I* I$ L3 ]$ V- t+ ^
- q5 Y7 {' F8 N& N% ~3 v
/*-----设置 ECCTL2-----*/
: \$ j9 K. ]2 q$ k) x" A
// 连续模式
3 k8 I+ E3 a* g1 ]; ~* S$ f
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
5 }# H" ~& B0 T0 s
// ECAP计数器TSCTR持续计数
2 _) z; z9 E( J8 I
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& o3 v4 P1 N3 L! T# T5 K+ S& _' n
// 禁用同步输出和同步输入
7 Z+ J' } k- i, R8 V) D
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 e7 R. v8 K' j( W- B, }
// 配置 ECAP 2 为 CAPTURE 模式
5 O* G7 K9 h2 T
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ h0 L1 ]( R" Q+ ] D# T) M. l# W
, l, H% C: F( @' U
// 使能中断
7 q. m' f! R. V9 X" X
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
: |8 `4 C" ^& X+ {- l
}
( h+ y; q2 x( e( z1 ?
3 Y8 u9 p: G% F! Z8 k
/****************************************************************************/
4 `7 j5 e$ w. N5 X
/* */
+ H7 B( n3 ]- s/ S, g9 i" [
/* 取得捕获结果 */
: K. ~& ]) L* s3 X7 v/ v6 M( ~' S/ X/ ]
/* */
) u+ j# T9 T; f9 S( G4 R! s
/****************************************************************************/
6 T" }$ i3 C: ?( E+ k$ C% p
unsigned int ECAPRead(void)
8 ]' x9 J3 P/ O7 u6 n7 I. L
{
8 b( Q) h9 |1 M# p
unsigned int capvalue;
' e& c4 k" e( h# r
unsigned long frequency;
/ i' |7 O: K3 o/ L& Y( r
2 Q: g( E9 N4 v& ?1 p' L9 J* P
// Event1 中断标志
' L" U- o2 |8 M& N$ \0 R9 s; J! a! {( x; l
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
1 Q `" N W( i2 j" G3 R
{
. s! A4 V+ R+ l, p3 }
// 取得捕获计数
! e: z5 i m+ u6 l
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 A* C, N# _, P: ?/ o
capvalue = ECAPResult.cap1;
/ a1 E" V1 R% @7 p( p
* n, H. Q9 a# V3 v
// CAPTRUE 模块 228M 时钟主频
, \+ C- V7 D" ^
frequency = 228000000/capvalue;
% c* t- p: a' T- k& b
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; r6 v% L2 b* u( c
; r! V; _& u' N
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
: Q/ D! @ f$ j' k! d
// IntEventClear(SYS_INT_ECAP2);
! G, i1 G) C7 S: |/ D( l
}
& t0 Z" w- k& k$ T. L/ ~. i9 ~
return frequency;
9 D# `( y! S8 {# b; S9 O: P
}
& W/ R8 K2 [: V9 ?' A/ C
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 ]$ ?" C* F1 Z5 T& A- D/ ~( `
[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