嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
0 Y: Z ~1 J7 N* j
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
* }, u6 p, m1 d' ?
/* */
3 O m; f# ^7 D' Q; E* K
/* 宏定义 */
( \9 d* ^9 T, }7 }* ~% T0 b
/* */
# H { E6 {: ~7 i- ~0 X4 D
/****************************************************************************/
# N! G, y- F3 k" P+ s, Q
// 软件断点
$ Q: t) N/ Q& p+ m6 f/ X9 i+ o7 C
#define SW_BREAKPOINT asm(" SWBP 0 ");
8 p- ]1 S8 E: z n" |
' h6 n; `2 H) ]3 J. H& ?7 h
// 时钟分频
0 n! S: G& H4 K" `9 @
#define CLOCK_DIV_VAL 228
; K: ^7 @- ^* X2 ?5 Y4 P5 ?0 L) @
9 N2 C# [* n- j1 R# v
/****************************************************************************/
. R! C: `9 b* l' H1 z
/* */
6 Q; c" V9 v( r& h; {7 w- }6 t# v
/* 全局变量 */
. @/ R6 ~1 z0 e
/* */
" j' c6 U3 l4 M' c2 ?
/****************************************************************************/
" } w4 A& K1 Q _/ ]
ECAPCONTEXT ECAPResult;
: b6 W# H, m7 _
6 [0 T# {3 ?* b' W
/****************************************************************************/
, {. W6 ?" ]2 i2 d
/* */
/ R9 E& u$ L' L T- f6 u
/* 函数声明 */
2 r7 d/ U7 H1 Y- T/ M: W! u" R
/* */
: a3 I' b9 d7 |. n3 A9 y' \; b% ]4 r% e% x
/****************************************************************************/
7 g& D- V. I0 `( i/ K
// 外设使能配置
2 a" N6 @& ]2 v9 _
void PSCInit(void);
. x8 |" G; e/ n
4 g) K: A- V$ s# L8 r! k
// GPIO 管脚复用配置
7 Y! a! S: [& n
void GPIOBankPinMuxSet();
, j! F5 t. O. g0 A, |
% n, Z# s/ S- n6 N6 `1 e& }
// 产生波形
# M0 V0 E% B, O$ E" U
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ K; P* E8 y2 @) Z
void ChopperWaveform(void);
3 N; j$ K4 Y0 W1 i4 D8 Y% t5 z
5 Q' X# @- B+ b
// ECAP初始化和读函数
2 ]/ {4 y9 S. g' k; r6 }+ v0 n
void ECAPInit(void);
: D% y; ?: {5 c0 \+ a2 f) [3 Z
unsigned int ECAPRead(void);
X/ i$ y0 ?( U5 U4 w& R
, I" Z' ^9 q- B* V; ?# f9 z x
//ARM 中断初始化
* D* u: u/ b: I% ]7 N
void InterruptInit(void);
( U7 O. ~5 E+ }0 t- B' G
: g, ~9 n. m# c) J0 l
// PWM 中断初始化
% U$ c* K/ M5 o4 x5 U' l$ U
void PWMInterruptInit(void);
% i U, Q0 l. k4 s9 v
// 中断服务函数
% ]6 ^* l, h+ X: h
// PWM 事件
* U3 s$ c8 D6 T! _3 n
void PWMEventIsr(void);
; I( X0 p" W% n: R' v
// PWM 错误控制事件
1 R6 c3 y: |8 g3 `
void PWMTZIsr(void);
0 q* Z; E3 l( J, d
|1 `7 D/ |; a0 W3 m: r( Q
/****************************************************************************/
1 Q& ]: f6 g' \9 p4 w- }2 e0 ?" G
/* */
( V2 X4 |+ Z! ^1 M6 e0 _
/* 主函数 */
: F2 x4 a5 x5 ?8 ]/ K& \
/* */
\/ |% J4 d4 ]2 W$ ?& X8 R
/****************************************************************************/
4 N9 g4 S9 p* ]! }+ _
int main(void)
" p8 ]" i$ Q9 F0 U, P
{
$ M% A. P" p; z [2 ^+ `
// 外设使能配置
6 T# J. [7 q @
PSCInit();
- x6 I9 Q. c( }* Z( \, x2 \! L3 @
, h% T9 c3 U+ T5 a. v
// 初始化串口终端 使用串口2
# L( B. R& Z% o: E3 m
UARTStdioInit();
6 n6 g; |; I* |7 _3 l' l
- k. @7 {& ~0 G7 I. N- E$ B" E
// GPIO 管脚复用配置
0 n# U- F$ H1 z6 b4 Q1 c
GPIOBankPinMuxSet();
( S$ M5 p, i' D! ?# ~$ M7 _
& W; S# N2 V7 t( q; X
// ARM 中断初始化
7 p }& C3 K' T' N8 e# v
InterruptInit();
" Z2 C+ x5 F s2 T0 V- y
4 K' M5 Y# I: {
// PWM 中断初始化
; P* F7 n' R: J! ]5 K
PWMInterruptInit();
' S9 P6 b H/ Q0 M
7 B2 q3 |5 \$ ]& u6 S2 ?' l( K
unsigned char i;
* @) n! ~8 \7 i. ^. k& u% @
unsigned int j;
. ^* P" q3 | K, o1 [' U
! I# a" x: R4 i! D) l) m8 P2 q$ S
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. Z. ?' j7 V# v8 k: r2 Z/ T6 U
UARTPuts("------------------------------------------------------------\r\n", -1);
2 ]3 ~3 I8 G& V, W4 N" ~
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
' }$ l" s4 ]) ~% v! {6 k, l) Y [
// 产生波形
! S* G9 ]4 S1 {! j! _/ i
PWM1ABasic(25000,50);
- x) W/ x: T# y
. n+ y; V& d+ z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
; `5 {7 L2 N* o1 x" q. s
UARTPuts("------------------------------------------------------------\r\n", -1);
; q0 ]6 s3 \. _0 F5 t: p
8 v3 G4 N1 Z0 Z
6 D( z! d: V0 Q
+ {$ }4 L% c6 U" ^8 O+ i
UARTPuts("------------------------------------------------------------\r\n", -1);
$ Q& ?4 Y% X) C q# `) A! L7 K
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 Y; \% w4 H$ Q. i5 q9 }/ P
// ECAP 捕获初始化
1 C& x4 \9 @( ]" C) U5 c' U
ECAPInit();
6 \# ~0 `* C2 _; Q& ^
UARTPuts("Initialize ECAP.......\r\n",-1);
9 u3 c" ?, D* Y8 b4 K: Z5 ^+ [7 X! N
for(i=0;i<5;i++)
4 F- R; g! B, F* y) z2 X$ p+ |
{
; P9 K5 S$ c$ N4 l, \2 m' Z
for(j=0x00FFFFFF;j>0;j--); // 延时
0 _' q7 R) T, o* x. z
ECAPRead();
& z& H- m( a8 } O' G/ B( U; j
}
4 [# c1 T! X1 T8 _: S7 I
UARTPuts("\r\n",-1);
8 b' L' w& r) L. i
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
+ I' I- |6 x6 |+ {1 L
UARTPuts("------------------------------------------------------------\r\n", -1);
- ], S4 A) n b; S
; o: J6 u6 B# \" \+ r( s3 d
// 主循环
7 D- a7 x$ i' d1 n
for(;;)
& T' ~ ?9 N& p8 a2 U6 S i8 Q
{
& d- ~4 b2 {- ?7 B# V5 D
1 P n8 L+ i. V" K+ L
}
: L+ U' G7 X3 d& d
}
( C2 d- W' S ]8 O, ^4 _/ L- i
1 b k+ `/ C6 `" v( v: ^
/****************************************************************************/
/ @1 i% a* Z' B4 E. M1 v0 z p% v
/* */
8 I2 x9 o5 \6 [6 s3 E; q
/* PSC 初始化 */
% o2 Y& T$ n9 a: Q; z+ @. A* M
/* */
6 V; m- I0 Q s% F3 x2 A) s8 x$ b* [
/****************************************************************************/
7 ?8 d1 K( g. r) z+ n) g& x
void PSCInit(void)
% A) b+ O! K; P3 j) Q
{
" O* R- J; B9 S* E; h
// 使能 EHRPWM 和 ECAP 模块
# k- A. w, E3 m
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 P5 q% u+ ?9 s, O& ~" e( S+ A4 z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
A8 [" t8 M/ a0 j: k0 {1 i2 ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- {+ |4 p9 `. [. c& ?
}
_8 G" }9 ^7 D
; J4 |) j* z. [' Q/ |# z
/****************************************************************************/
3 r* G3 W" X ]8 w
/* */
% m* X; w; }+ ^* Z
/* GPIO 管脚复用配置 */
- K0 a8 O/ `7 x6 p2 O5 U
/* */
0 f3 y9 I- m/ @4 y2 V- p' O
/****************************************************************************/
& _8 V! I+ u8 N! N
void GPIOBankPinMuxSet(void)
% n0 ^8 M) Q* _7 o7 L
{
7 u3 G- c0 z' R1 a) d# \/ j) j
EHRPWM1PinMuxSetup();
% _5 [2 V% F0 r3 k! |- n
$ d) u! s9 b* u" t, |% K+ w- t
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' q8 k+ T8 u3 ?' T \
// 作为捕获功能时管脚方向为输入
" \$ s% g0 X2 \5 _
// 作为辅助脉宽调制时管脚方向为输出
7 E2 W2 K: l* n
// ECAP2 / APWM2
6 m6 e! k' m. S- \4 U4 d; x
ECAPPinMuxSetup(2);
1 d9 H* U0 X6 J# L, M2 o3 B: p
1 E& m- T& a, m' A% J% }* z9 N
// ECAP2 / APWM2方向设置为输入
7 Y+ e4 p# G( S- O/ Q8 t
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. t" {; p, h) g% S9 O2 W3 l/ J
}
a/ _, `* `% I! R- v$ H; y
* I8 Z9 g8 {- s3 @5 j: r5 H& a
/****************************************************************************/
3 K- P) |2 l4 J8 j, H8 E
/* */
7 g1 n5 V2 W4 H: d+ [: o: C
/* PWM 输出波形 */
( {6 v. U; i' W! m1 k/ Q1 F
/* */
, E9 a* z4 j% u& v) T) O
/****************************************************************************/
1 H8 U. R! I6 B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) w7 M1 J; e$ D8 C: b
{
. W* @- b% k# ?* q1 ]- d
// 时间基准配置
( N5 C) `/ R' @9 M8 y8 W
// 时钟配置
) R3 K6 W* P4 ~/ X% C$ ]# j1 e% P9 @4 M
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' y; J/ |0 o0 N0 I" i7 t6 S8 g% Y0 o
1 M/ i, }) ?0 Q6 A
// 配置周期
' t6 {. C+ M# O# L
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 Q2 O; c7 R2 y L6 E$ E7 P
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# o( {9 L' p7 V
9 d0 r1 L* d7 m3 W" x1 L
// 禁用输入同步信号
4 e) B; B4 h& j' ?6 R5 t/ L
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
5 _0 G0 [1 ^- X9 [6 \( U+ v
( o9 K& Y) s, E6 F
// 禁用输出同步信号
; I U b1 c" I1 b9 u9 l7 v
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
& L9 B) ?6 V: {, P2 e
3 G; P; j. y6 a' z1 X8 o4 ?4 _
// 仿真(DEBUG)模式行为配置
5 l& X7 C! a! T, Q+ f1 c) \9 X
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" }5 [$ q) p1 i2 _
2 T: P+ C; O) X$ }2 P s$ f* b
// 配置计数比较器子模块
! b4 @! g* s) W0 d2 C2 c7 A
// 加载比较器 A 值
1 H: \0 j0 H6 \
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) D/ l; `& y4 Q1 k, x* r0 @
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! A' _0 x; y8 j2 ?
! q+ X! r$ I# {$ ~6 a
// 加载比较器 B 值
# W0 `( d7 U; G* @; I' K
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
$ ^' |% c: x) u& Z; N
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 W3 |( |) @' [8 l1 `' u
, _7 d4 m, N# F9 [% _
// 功能限定配置(输出引脚触发方式设定)
; q- Q2 _5 B, w6 C# C1 j5 i
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
2 e9 m* M: z! X6 k2 }) o$ y! E$ v' d
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! X2 q+ l5 j# c Z2 p) B. E
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. f' R7 f+ y. D/ P
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 ?, ]% M# z9 o, O/ Q1 _% Q
3 P7 o+ C- G+ _4 \0 o! i
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
# U$ x7 n; ~6 X" [3 N3 ?; v' F
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 z6 I' J& R$ z0 f
' ~/ w: `0 N4 v2 Q5 i
// 禁用斩波子模块
& m$ u$ m: o( p/ F! S
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 `: O" g' { c0 Q8 u1 [3 a! }3 v( R
& }% x2 v' X! E) L! M: ~
// 禁用错误控制事件
. @3 L3 `% f: E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
# h; Z; T! V+ A" q, { O- R5 u0 L
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, j) s5 \! p3 [0 N+ ]; I
- q/ z* p$ o- m1 N9 I; F
// 事件触发配置
6 c6 K+ f |1 a7 J% B* S2 L% t
// 每三次事件发生产生中断
- e. ]/ u, j6 J4 T: A) s
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 Y x# V) m% U: _
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% [* A0 S5 ?: S5 C9 t
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 z+ I+ Y6 U9 y: c# o. g% l4 f0 o1 K
// 使能中断
4 |! L, K7 {# ^
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, d2 ~- X( L- g" K! @
9 ?0 @, i* k/ b4 V/ o
// 禁用高精度子模块
. S3 ?8 U; D+ b% H4 e
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 l9 i: {( z3 ?4 ]7 x" k4 t- X
7 ?! |* d- u' ]3 }, ^6 f6 Q; d) x( Z
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# f0 z% T; G4 p2 d
}
& ]$ A+ T% l. G6 W
& _2 N8 F6 ~: i1 o1 X
void ChopperWaveform(void)
* a; j) w4 h- d' R; ~
{
5 M; M' o, f6 u, H$ T& x" |6 ^$ k
// 50% 占空比
$ @8 R) K0 W5 V+ S% i
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
2 C2 R6 ?! a. d/ X, M4 ]
// 4 分频
" e1 k" E+ L9 ]* N
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 ~4 {. c C* J' r+ j
// 单个脉冲宽度
1 w5 Y h9 j6 ^( D1 a) a
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
' M$ X9 [6 ]4 y% f$ g
// 使能斩波子模块
3 K% e. u, d% ]& @- `5 j
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ v/ |1 i) Z- \; W8 m! h/ a2 L
}
) T6 Y! E) Y2 v+ C! F j
( z- E. N4 `0 X
/****************************************************************************/
v# K J! i, r) j" x* b# r6 s- k
/* */
% U9 r2 w6 K' H+ J8 N
/* PWM 中断初始化 */
+ `( a; ]3 I/ q) y
/* */
3 R, [4 C r3 J0 e1 ]/ o
/****************************************************************************/
' N4 ^: t( m L/ s8 G/ a
void PWMInterruptInit(void)
) {8 |( r4 k& i
{
) q. T2 q9 U2 s8 j+ D- z
// 注册中断服务函数
: m8 ^) A2 w8 K' x
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 M8 h. t1 _3 V9 m- u% ]; |
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
: V! z! |" k% ~) t0 I
[) p4 ^5 I$ z6 l: F- Y2 x$ _
// 映射中断
1 y. o- |- q( s, b7 b/ A
IntChannelSet(SYS_INT_EHRPWM1, 2);
0 T1 b" I2 z7 C- E/ d( N5 G
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
5 y% K) ~% l, C* j6 ]2 W6 A5 l
2 ~1 T$ H- D3 x4 x5 m
// 使能中断
$ Q3 |- o w$ v, q* y
IntSystemEnable(SYS_INT_EHRPWM1);
. U: A1 I* k' d% D U% M4 f
IntSystemEnable(SYS_INT_EHRPWM1TZ);
! j/ X7 l+ ?; P1 a8 g3 |" `1 {4 f) Q( \
}
0 s" ?& t% {& t$ L0 D- L8 n r
; G) Y8 j9 p+ U3 k* E
/****************************************************************************/
+ p) W2 b, o% a
/* */
8 T4 V7 B& s( J2 I
/* ARM 中断初始化 */
V0 _! r% u- _8 a+ X3 k2 y+ q
/* */
9 L. H$ `' m+ m, G+ _
/****************************************************************************/
2 ^2 O9 H( p1 v7 g
void InterruptInit(void)
3 T6 Z- B# T4 d; ]% z) H% q& Y
{
. U8 E( K! h7 M9 y: z$ A: R
// 初始化 ARM 中断控制器
3 }% O6 G# u7 a& h' S
IntAINTCInit();
7 p: [3 [) d g3 F8 V/ _$ Y+ \
4 b7 V0 z1 [+ v' h' i/ w
// 使能 IRQ(CPSR)
+ P- B, L8 d1 W5 H5 T
IntMasterIRQEnable();
0 P* C/ l7 w0 O L/ R0 `6 M! s
5 }6 u4 D4 ]; E
// 使能中断(AINTC GER)
# E [) N2 m3 T4 y/ ]
IntGlobalEnable();
; c) Q& e- ^) ?) C' i
% Q* E" i; u' A! d. b. E" h
// 使能中断(AINTC HIER)
$ R- Q! ~8 v c8 N0 e1 L# t
IntIRQEnable();
2 Y1 x% }& C/ ]. w/ P
}
: |0 o- D4 b6 Z6 r! q
3 ^1 d: p! T, g. H9 T4 G
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
' ~7 J) Q5 `8 Y
/* */
" l1 [, b8 g! m* [2 ?, V
/* 中断服务函数 */
1 {% b" F, X) H4 H# M
/* */
8 {! f4 |7 v& I
/****************************************************************************/
2 W3 }% }! l# s( k& t' R
void PWMEventIsr(void)
+ o7 b- f& @4 e8 F. F: M
{
& j1 \! T, c; F7 T; B$ R4 X- J
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 f$ R, B% I+ H
* Y3 x9 P# I. {- f
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
* g# R8 e/ ^; ?% y. e
}
+ Y" F L4 c2 S' \2 U+ T o
. l+ A. @3 @7 F- W; x& h9 p. V
void PWMTZIsr(void)
8 w: C. ] y' Y& l
{
* P4 F# a: y7 T8 A' e
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& _, m. _: d6 e: ]" u" Y% _" v. a
, g( o% B* U* q9 _
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# H f5 X F$ m& d6 D, W6 c
}
( }+ j" ^2 P, J( t# ?; t7 `
6 Q+ _8 j3 u5 `
/****************************************************************************/
9 d! f7 |; H- O: w. `
/* */
5 n( p+ |5 j$ n7 Q. l1 T7 | ~3 c
/* 初始化捕获模块 */
4 S7 N9 _% m8 {
/* */
0 b% U2 }6 q \: g, h/ u$ _
/****************************************************************************/
& D7 T5 Z' M+ W) Q9 T0 f1 L
void ECAPInit(void)
" m: ?! @+ h ]3 X
{
; O/ N) b" U5 G
/*-----设置 ECCTL1-----*/
" e: j1 l& H; C _6 c' p
// 使能CAP寄存器装载
0 K7 ]. t p* Z3 G* S$ h' ?
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( J, v Q$ `+ [$ |8 H& M% T8 k; e. [
// 设置预分频值.
( Z {6 c! r+ S; p
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
4 P. C; T: T' [1 }7 P8 v' u
// 上升沿触发捕获事件
' p+ }$ Z% A$ e7 K- v4 ] F, @
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
4 ]$ L; U i* S) Z
// 输入捕获后重新装载计数器值.
" \# V- f1 q6 v9 r# t7 o) R
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
. p' j: l. M1 W
$ @' `5 P' @: n; P m9 a3 S
/*-----设置 ECCTL2-----*/
: E ]3 p9 C. I* o5 G) U2 ~
// 连续模式
! ?1 s! h, }) r
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 R2 u0 o8 W1 M* _7 [+ _0 X F
// ECAP计数器TSCTR持续计数
9 Q3 t# K/ X9 @$ t
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
4 d, \' N! @ s; l# R
// 禁用同步输出和同步输入
7 _1 r0 v5 Q/ v
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
7 B" D$ l( v, N+ N
// 配置 ECAP 2 为 CAPTURE 模式
Z% \4 o! b. @5 [$ `6 i
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 N* \7 n- t% o" [. j
4 y) }6 ^+ k- ~# F+ s
// 使能中断
' _* E. U& T9 F5 j
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
1 G4 q2 M- z+ C& H
}
8 p" y9 Z$ ~" b
5 l1 f# T# P* D( I
/****************************************************************************/
6 i: c; ]# L, B. r
/* */
. Z7 q. n0 V q t6 k' s! N
/* 取得捕获结果 */
* n6 Q- i& s/ b! ^- w0 e0 Z% }+ @
/* */
/ v" e9 l6 Y( J) r8 W
/****************************************************************************/
+ {; ~- j& W& E
unsigned int ECAPRead(void)
. D' v5 C5 T! C: }. A
{
, ]7 u3 i6 i" a- Y
unsigned int capvalue;
7 I. R# M* q( m9 a! Q4 {
unsigned long frequency;
+ S9 s4 h9 c% \' t4 W% R
1 m/ S, l# E5 V7 ^% s
// Event1 中断标志
% [$ O1 q {8 U
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 q8 x! j: g3 y) J* J
{
5 p7 }+ t. x! Y
// 取得捕获计数
+ a$ B. o4 d" B
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ u. F% F- V2 m& g h# M1 u
capvalue = ECAPResult.cap1;
( `1 ?$ d0 S4 `& c* i4 j
- ~ P5 a/ f; l* Q
// CAPTRUE 模块 228M 时钟主频
6 m& {( C2 }3 U8 Q+ N
frequency = 228000000/capvalue;
- C1 M* ` X2 o# k! k
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 T& H* W4 c8 A8 c+ u. C: s
+ |$ l% r+ z5 |
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
& p T& f. B# F8 I; c* |
// IntEventClear(SYS_INT_ECAP2);
0 @* A: Z' |9 o& s5 E
}
- D. H# o1 Z* _9 `+ G4 c
return frequency;
; x/ A c; [1 _
}
( D) s. D3 J/ A; P) G6 G
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
7 H* _! J/ 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