嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 W, d# z0 h1 i E0 N% A. H2 V2 K6 q
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
4 V- s2 g- a; Z3 v5 C
/* */
& v7 b `( i/ d7 S
/* 宏定义 */
) K0 \5 L1 d1 d. B6 W/ `2 A
/* */
5 |- k3 @% F5 |$ \6 U# M5 Z& V
/****************************************************************************/
9 y2 g {4 A: @1 g
// 软件断点
) J } v1 }9 @" K
#define SW_BREAKPOINT asm(" SWBP 0 ");
# b& r- j# c- P
6 ~* q" g- w0 c
// 时钟分频
' L5 \0 r6 m8 q& G) [2 T
#define CLOCK_DIV_VAL 228
' p6 Q6 a) L5 C/ S8 ~; G9 Z
( P: D% O5 Z0 ^: Y) D6 e/ ]
/****************************************************************************/
4 f% V+ m y( x. ^1 p! J
/* */
, U! l( o6 U/ g; V
/* 全局变量 */
% Y& P* w: J: ]6 F) y
/* */
0 T6 J, x) v6 [) G5 t+ D
/****************************************************************************/
# E9 K/ k; s, r) i% J
ECAPCONTEXT ECAPResult;
$ F/ P+ s; F' J1 K% Y! C# b
+ ?0 G3 i: X, q. c7 A' k6 F
/****************************************************************************/
# Q& `6 F& x3 `* W/ G
/* */
* O8 d: f1 \- n
/* 函数声明 */
* y3 d% O) U4 G4 X2 }
/* */
9 R1 r. D1 Y3 v1 G: W5 d" e% \
/****************************************************************************/
8 T# U/ Z5 {6 U5 g+ n
// 外设使能配置
( M' T( J+ h0 j r* O1 N
void PSCInit(void);
6 P% {. u: q3 m4 t7 M
" ? `# K( u, c R& e9 _% v8 b. s
// GPIO 管脚复用配置
; t/ Y+ h9 f: C
void GPIOBankPinMuxSet();
+ ~# m- M8 U( a x4 ^5 a& r# [
$ [* m# I2 Q2 ~
// 产生波形
6 v7 [' j8 q7 j7 L. s( v6 d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 l7 {& i3 D- d3 w( ], ?7 ]
void ChopperWaveform(void);
+ s, Y9 D& }- X0 w2 S
. s5 Z* z# I/ v( `& _! X* A( k
// ECAP初始化和读函数
3 B* V& \* }: T- H) C
void ECAPInit(void);
( K8 j! r% x* R3 U5 A" I* V. @
unsigned int ECAPRead(void);
$ s7 L4 f9 T. Y+ J% j
; M8 g1 z+ f- B% B* M1 z& K% H0 V8 ` }
//ARM 中断初始化
6 w% G) ^" o8 f& Q" B
void InterruptInit(void);
* g9 e2 S) Q5 J# y/ d& [( C+ b
4 E6 b- {0 U6 V5 [' e
// PWM 中断初始化
2 o' c! b/ S" q3 b- j( x
void PWMInterruptInit(void);
# I3 |0 y& T- I, W6 O% |( p, C
// 中断服务函数
0 R, K$ z9 ^; y' Y% s# ^! C
// PWM 事件
5 i' B* r, e4 k
void PWMEventIsr(void);
# R+ _0 H6 ] ?% e
// PWM 错误控制事件
M6 y9 U3 @ M3 t
void PWMTZIsr(void);
* `' r3 e2 e5 |$ {( C: B, `7 r
1 {. B& b! i; g$ D: k
/****************************************************************************/
' r5 q) G; f2 X
/* */
/ w% K" N9 b) V. W5 I! T; \; E$ v
/* 主函数 */
" h6 k$ x" V# d0 Y
/* */
( Z" c( N0 N5 o. H0 g& U( g
/****************************************************************************/
. n6 p8 F& d# {% D1 f
int main(void)
0 v% [1 T+ R- |% P* V4 S
{
t2 [& K- D1 k, X
// 外设使能配置
# k! u( E2 _* q) l6 L! {8 R
PSCInit();
- }5 w; |7 Q: _& L% A& H8 R6 w
* A0 o9 O; @. m: C
// 初始化串口终端 使用串口2
+ X- G, q0 r, O/ U6 p0 ^
UARTStdioInit();
$ t+ P# E9 |2 Y5 C% X5 w
# L' x: r% t/ e# Q
// GPIO 管脚复用配置
3 y9 A, e' E4 E3 x+ O: G
GPIOBankPinMuxSet();
8 Q* K* p7 a, u, E7 `
8 { Q! u, j. c
// ARM 中断初始化
7 z- `& _0 Y( I2 g( P
InterruptInit();
( h& ?, X) i# ?4 k! v" Z; z& f
# P& y% k! J! U k: i- e
// PWM 中断初始化
( y$ h: [6 w6 C. D# R# w$ j& P
PWMInterruptInit();
9 q3 u3 [& q3 k$ }/ e
" ]* x5 B" r2 ]1 o- \
unsigned char i;
% S& F" @' j; T, B- x# l
unsigned int j;
% |5 O9 v7 a$ [3 ~2 u }8 V
A$ X9 {8 F% g7 [+ W" ^2 V
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 L* R# [- Z& n- R( ]9 _4 N0 }
UARTPuts("------------------------------------------------------------\r\n", -1);
: d# t- v, t: h+ ]! q1 x# Z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ {+ h( S% v( |) y0 L4 i' W
// 产生波形
3 w: J# l1 f$ |- ^. }
PWM1ABasic(25000,50);
8 ?( j8 q$ Q4 f% T) P& H$ e
( Z- M; m2 I: U$ q: k4 m/ o# I! W
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 m3 g A* y* J' L
UARTPuts("------------------------------------------------------------\r\n", -1);
8 u( I2 D! u- u- {
4 V" F6 ]. \% p4 v# u$ c% H! }
) f0 ~+ q% Y2 |
}# P# B4 h6 A
UARTPuts("------------------------------------------------------------\r\n", -1);
' W! [1 }- ?, A( X. ^5 a `
UARTPuts(" C6748 ECAP Test\r\n", -1);
J4 @6 k& ]! S$ b
// ECAP 捕获初始化
( | e3 m y% D: N; d
ECAPInit();
( s# j+ ^2 T2 c8 h2 ] j
UARTPuts("Initialize ECAP.......\r\n",-1);
" F! h6 p) H; q2 l4 z( r3 I2 y
for(i=0;i<5;i++)
3 c8 V! V5 x5 t- S
{
/ u3 W2 e4 i4 J6 x" r
for(j=0x00FFFFFF;j>0;j--); // 延时
- r3 g' j. ^" B; Z& }. u" \: c4 e h
ECAPRead();
! [. }5 v+ r6 G4 P
}
; N6 F' d' c8 P! s) @
UARTPuts("\r\n",-1);
% B' r$ g- F% t
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
3 Y0 {7 w0 K9 M2 Y- f) F
UARTPuts("------------------------------------------------------------\r\n", -1);
) I4 A; E5 J& ~% U9 {2 N2 [8 h
! ~0 o/ L1 K9 U3 k7 v. W$ M
// 主循环
3 v: H& O V! m: g
for(;;)
y. f- p9 l, Y8 H4 {0 U
{
. G! L; L' t2 L" C9 b- l* K, ?
: y& e5 }' c7 e0 H
}
/ d" U- E' x y6 b' ?
}
2 s* \8 f9 ?1 y. e# Z
0 c5 E% i5 [) |8 B- e* D
/****************************************************************************/
! u) h) g, Q. K7 I4 k
/* */
( X0 _# t/ [" d4 M, i
/* PSC 初始化 */
" [& g, x7 A. J3 Q! J1 f( F
/* */
4 P5 f( [! A. N2 I* E, ~
/****************************************************************************/
8 c! w" h; Z, D0 f6 K
void PSCInit(void)
% ~2 v' s- {4 f e. l, \. ]8 N
{
% C1 ^3 |7 O' T/ h# K% t' p2 ?
// 使能 EHRPWM 和 ECAP 模块
/ b/ K& E7 J2 J3 t( V, v
// 对相应外设模块的使能也可以在 BootLoader 中完成
x8 q1 I( A3 H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' S6 U, E8 i( |; I% G& }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 U+ b$ n1 B3 M
}
9 L# _: a: y2 z
1 B: W& x0 B# V6 k h7 Q
/****************************************************************************/
, F5 }( x0 Q% O# f1 ^1 B
/* */
# L- g9 S7 c( O& I% n2 e
/* GPIO 管脚复用配置 */
8 {/ y) {9 X- m' Q3 X; P/ F
/* */
) ^! X0 T! F$ {2 H( p: k
/****************************************************************************/
1 R+ b- x$ a# q9 v; f9 D" \4 A0 o9 D
void GPIOBankPinMuxSet(void)
! D+ I W/ P+ S) d+ y# s, G, W# [
{
) o0 B% X4 l' p' N
EHRPWM1PinMuxSetup();
2 G7 u: A1 Q0 U. L
2 I+ w2 V) Y9 Z) E! C' R
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 ?$ n% u' y) U- C+ \; [ f
// 作为捕获功能时管脚方向为输入
" U% n8 r1 B, Q1 ~! @8 }
// 作为辅助脉宽调制时管脚方向为输出
0 T6 m" h" S a# T ?& e
// ECAP2 / APWM2
5 d7 E3 Z' a. d5 ~
ECAPPinMuxSetup(2);
! W8 i; y$ Z0 u# |3 @ Q2 h9 V+ h
( C4 X2 h7 C9 Q8 ?3 c2 s% x* D
// ECAP2 / APWM2方向设置为输入
/ R0 W; a& W0 b+ D: {2 K- O
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
q6 p2 M& B( @! D, |1 T7 O! O6 P
}
- j- ]# J) D$ \5 g: |* K& Y8 F
P6 D6 U8 o5 [! l" k" }
/****************************************************************************/
9 n. o" ]8 J7 v7 ?" n8 b+ v
/* */
0 ^0 {& r+ D6 _0 a5 B
/* PWM 输出波形 */
: h7 D' v: [' Q: N& Z: ~/ {1 G
/* */
4 |8 Q ^) c5 p( n+ x3 i
/****************************************************************************/
. q2 l9 Y9 L# ` _: H, j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 u B' f" H8 a
{
( h/ C! F/ z3 ~/ ~. r
// 时间基准配置
) b4 x: S* K7 l7 S1 _! E
// 时钟配置
/ M6 g+ O+ h" }/ e8 s4 a, k7 U
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
7 |& H* k% a0 R5 N" p3 }7 J- d4 {* ^6 n1 G
# Z1 s. D. A6 ]! y' l7 i
// 配置周期
& D7 h# \6 o! P. K' N
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& L2 B# F2 [+ L9 V
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
& B- s3 J% x2 l/ R3 `
! B2 b8 m; m, m
// 禁用输入同步信号
% t: n2 s$ g7 u+ G* Q" `: M
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
5 U2 ^0 J2 g z/ d1 s- t2 L, J
& S3 O- t. O$ w y8 G0 X. \( P; L
// 禁用输出同步信号
& w |2 S! o% U, I& t& L2 a' c
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" N3 U, I6 c' v" Z, W' Y* I5 z0 R/ @
/ I/ @# O0 s4 s8 @: k) R# W
// 仿真(DEBUG)模式行为配置
# H2 [- v+ W( r; z: R1 z
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
3 R Y! ?; A- _, }
+ x/ ~* L2 j+ z9 @. w
// 配置计数比较器子模块
; m% p7 n' D3 O+ f+ W& N0 c
// 加载比较器 A 值
, q5 E- f* r9 {$ f& X
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ q/ e' T8 I5 [, _8 e) G& n/ j
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. w2 e% h: ~+ C1 Q: H; ?
$ o; c y9 h% Q' _
// 加载比较器 B 值
9 h; n/ A9 r! z& z5 o( z3 F, P
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; z/ j" g. k. K# _/ L7 Z
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
j4 b& ~5 |( X
]9 z: o2 p& \& Q. t) `) d
// 功能限定配置(输出引脚触发方式设定)
( b' X; Y$ {8 Y2 W6 a, l! T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 d! @# \& V: @* f( C
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 f0 Y: |" N4 t* c0 L
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
C( T' F! v0 W
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
% P- B4 W; q$ _& S9 w# T
" g# P Y: A6 `8 {6 C% H+ ^
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ a; w( J$ w7 r: A. ]
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
5 M; }- i! O# ]; l4 i0 {2 {" |
+ S5 V" W$ h8 f$ n# N8 R4 W d
// 禁用斩波子模块
* t5 s# l; ~4 s4 [7 Z2 x0 |% y/ Q2 u' |
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: E U! ~' c" ~5 L; p
# N, Q( k. V( Q7 \* {/ I8 ^- t
// 禁用错误控制事件
' m3 m7 Y: J) J0 U% b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ c R: K6 L" b. v$ Q- T" e
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
% |1 y8 Z5 ^2 b0 H4 d
) e7 s1 \5 q9 V4 D+ k4 Z) H
// 事件触发配置
- b1 A( F5 F( }6 f! U
// 每三次事件发生产生中断
+ k* r+ X& j |$ O$ V
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
7 ~8 ?4 Q; e+ ~
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. Y, @7 G% H! {6 E& d
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 O/ o( O, V, K! w+ _( K; u
// 使能中断
5 N- X U' T# v% C$ @" H. `# e& w
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
1 Z, U7 S/ P! B8 `* |3 q
9 \0 L$ _" d7 a
// 禁用高精度子模块
5 W E3 U2 {# U c( k1 @* P
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 x( ?* s( v- C( T
* k" ]" B% H Q6 ^) \% L* E
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! K8 ?& U4 Q) y1 z1 b
}
; |! m4 `3 q1 ~5 [/ M" P
9 Z( O, V9 k- w- U& p
void ChopperWaveform(void)
2 V1 ?) }( O; ^- p* g" \7 t1 W
{
* t! V8 H9 d; I+ ^) w( |9 x$ J2 E
// 50% 占空比
0 t6 J- O* y8 B% V m
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" `# q9 B8 _' ~1 f p
// 4 分频
" \% c+ \' q+ `$ G% a+ I8 F6 E
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, x9 P6 ^. p/ i. F @1 C! e
// 单个脉冲宽度
9 ?7 H6 ]1 D! C& a; {
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
) _4 i4 C/ S5 A( m7 U# l$ `* J. l
// 使能斩波子模块
* U/ d' u; y/ f
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 \. y7 Q. g& h, e1 ^
}
! P5 z) H$ [( g6 N
4 q8 [/ A9 k, e: P/ n
/****************************************************************************/
3 i; I/ C# d+ Y$ y& n
/* */
; [# x- P) {1 B7 Z% y# \
/* PWM 中断初始化 */
3 b: {' P# H$ p6 T" C6 D0 ?
/* */
0 V, e4 `1 E5 B- ]0 I! v
/****************************************************************************/
1 i* @, C- q+ [3 `& E" n
void PWMInterruptInit(void)
' A% ~+ [, z+ F0 P, F- c! f( \
{
- w$ j, d1 q7 F: S f9 j
// 注册中断服务函数
" a/ S& y; y( x' y
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 }6 P! W: C2 ? I. r7 X# k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 z5 D3 H {& h, ?
1 X$ ]) \+ g# a2 L* a3 q4 Z
// 映射中断
v# R! {$ Y# q% ]
IntChannelSet(SYS_INT_EHRPWM1, 2);
- R7 o) K, D( L- ?4 f3 p, W) }
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- d1 t9 c) E7 [ `' m' ?
; f8 [4 P9 l% i
// 使能中断
- T% m. }3 \3 W; |* z$ P. V
IntSystemEnable(SYS_INT_EHRPWM1);
9 |$ a0 T1 n$ f; v2 R `2 K
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; \4 `. \; J2 [& _
}
5 N$ A' z/ s0 @* Y% ~' |0 j+ V* N
' o) z: d0 p g" w2 [( t' X! X
/****************************************************************************/
9 w' s" } i0 y& k" l- L2 a
/* */
/ C4 t2 k# P, b
/* ARM 中断初始化 */
7 I( v, i* S2 W" m* P6 k
/* */
F- F, V, o! M8 \
/****************************************************************************/
3 |% L6 g; v: @
void InterruptInit(void)
" v5 Z5 ?. }: R5 ]
{
* n) I9 O6 n% l: X" n
// 初始化 ARM 中断控制器
: A- _/ G# Q% t+ H
IntAINTCInit();
, J9 T9 r7 t) \' k
" [" c! f- P- F- j1 {! `7 O
// 使能 IRQ(CPSR)
5 |" H7 A( |3 R% C0 ?0 d
IntMasterIRQEnable();
% z7 _7 o; ?( V7 i0 Y# W3 n+ i. |# c
! X/ ?& |/ ], m. q
// 使能中断(AINTC GER)
# }" \- W: y5 g
IntGlobalEnable();
* h8 V w* _1 Q* t A
- X3 ]! f! e: i! f
// 使能中断(AINTC HIER)
g O" x+ {/ l) A
IntIRQEnable();
$ w" U M; q/ o3 O) j. V% g( ^
}
$ d: c- h+ |; B3 \
) l; \# h8 ^( y4 V6 R! q) P
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
- ^& p7 Q8 D. k
/* */
' S* ]- Q3 J+ E( z) I
/* 中断服务函数 */
( m- R/ A% b0 k3 m
/* */
& v. J8 C U$ I7 J6 W+ [
/****************************************************************************/
6 W1 g) E4 T# w4 D2 }
void PWMEventIsr(void)
# ]) ~: t3 |2 h- D. t
{
/ k3 z" m/ P- L/ w6 u
IntSystemStatusClear(SYS_INT_EHRPWM1);
. V( e5 `2 W6 h
; ^9 F8 u. |, q" p- Y$ r, d
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
) e, `- O& ?1 \3 Z
}
5 U" y0 `" x2 {3 `$ k' a
+ @) r1 ^# h5 O/ A+ G
void PWMTZIsr(void)
, q# x1 F/ Y, j- X O- o1 [( c
{
5 O* B; v0 ~' q2 F
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
( U4 @* x) e5 M. ~% r N
4 L& X1 l) L+ d
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' |( \4 }$ Q( a
}
4 h8 g& Q: z( \4 `
3 y& D; v% L5 M! I f: v% ~' s
/****************************************************************************/
* y9 Q2 q, x) z+ b* s: k
/* */
' T2 u, P' |, m$ b9 T8 Q! x6 l
/* 初始化捕获模块 */
) k3 K4 Z' a2 l, e# T W" j
/* */
1 c5 ~8 e7 V9 G
/****************************************************************************/
4 ` {" ?) r; ^4 b
void ECAPInit(void)
- i+ B3 x" Z, O; w2 N2 b& J$ I
{
" Y2 i7 Z3 |( e
/*-----设置 ECCTL1-----*/
1 [7 U/ a7 J/ o, J
// 使能CAP寄存器装载
1 m5 m. P+ S; I1 m( ], h! d N6 l
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
, I; }" {2 |! z2 _: \1 ?8 b
// 设置预分频值.
+ L Y) K5 }, B. _. J7 U
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
! w" v+ a0 Z# w; q; d6 M$ T
// 上升沿触发捕获事件
5 i* K; y8 \/ ?5 m+ t E& Q6 Y
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
# b; c# {$ ~4 M$ k9 ~" K
// 输入捕获后重新装载计数器值.
3 C; j' ~2 F& E" s, f4 E
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
P5 a& ?0 |) n$ @, S: v
' g7 e& v8 j. X q
/*-----设置 ECCTL2-----*/
) [7 s9 b) d5 S; d" V5 P( O1 L
// 连续模式
v8 q. s0 ]2 A' \! b( Z
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
6 P0 M/ j/ s1 \6 O; ~9 [! C0 \
// ECAP计数器TSCTR持续计数
% Z! y9 x! O6 Q+ d
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: g# ? D/ K0 X, J4 u
// 禁用同步输出和同步输入
4 h9 H' @& [; G2 t
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, o2 ~/ l" U& \: ?
// 配置 ECAP 2 为 CAPTURE 模式
. [4 T8 Z* T: g- y
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
: C7 S6 v3 f. p1 x
% [+ ]7 Q2 s4 [" R) T
// 使能中断
( b7 I) n- V8 j$ g. Z+ h
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
a" z" L% J% F; o3 f* ^3 D5 V
}
7 S8 n! ]8 H6 t- c. t' S7 e+ C
8 \$ n" G/ V. Y0 _% J" G$ C: s7 L
/****************************************************************************/
) ]2 e1 F3 }2 K1 f/ t, @# n- B
/* */
$ O1 n7 ]% y6 T/ n) h
/* 取得捕获结果 */
+ Z+ L& N; Y0 G! G$ z, [3 M" G
/* */
1 M. r, J2 b6 G: i% O- n
/****************************************************************************/
& g+ u) ^2 W, r+ q6 r
unsigned int ECAPRead(void)
: D' k' X3 |( G( Q
{
) D. @- }: Z. L. i0 c9 s, e
unsigned int capvalue;
# q) [: S4 P' v; p2 @/ J
unsigned long frequency;
+ @2 b% f& G2 j$ ?0 Y$ |( M
, c$ c& i' N4 W& P) R9 R) l
// Event1 中断标志
7 s3 m0 r' q. z
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
' n2 G, j8 v) t: F j9 C
{
. n4 Q1 l' H/ N1 v: K$ O
// 取得捕获计数
" z) }/ m2 a T1 @
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 W3 a+ c7 q* B+ x
capvalue = ECAPResult.cap1;
7 B6 H+ r& q' c J0 V% `
5 q& v, c% Q3 l! k$ \& D, }
// CAPTRUE 模块 228M 时钟主频
% s2 r2 f4 }- x1 q9 o* g
frequency = 228000000/capvalue;
1 y- v7 h. K5 b6 D9 Y
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: O1 i( r) z* q+ h A0 e7 Z
a7 F3 E, a8 |) {) E6 j; x$ k5 }9 _
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 b+ Q2 `( V1 `# l) a9 s
// IntEventClear(SYS_INT_ECAP2);
! v$ L/ i- S: C
}
% h/ c3 e) l a7 f# b. L
return frequency;
- P: D8 @$ q* t' e/ @
}
# ~. u! A2 u- p6 i2 D# ?1 p
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
2 j0 ] @; S( f' v- `" J# B+ ~
[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