嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
! U8 g! v$ W, f2 I
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
5 `1 {9 L, I. V# Z! [
/* */
6 P6 g8 R, I8 a; k
/* 宏定义 */
. } r6 W- ~2 x$ \+ }! ~1 F
/* */
9 D o9 D, e ~
/****************************************************************************/
, l$ u( X6 ~7 D5 |$ q
// 软件断点
/ }! p& n" L D9 m, L9 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
/ a: n; `. R! D7 b0 ?, H
) P, x' L; c5 N4 W) f
// 时钟分频
v* E8 V' b) b! ]$ n/ [1 D. P# }
#define CLOCK_DIV_VAL 228
+ p' y' z" O; _. K1 [6 ?
# q; Q( o& u- n# W
/****************************************************************************/
8 D* ^) V0 B; u' E( p3 C* C7 }
/* */
* M* O) _6 c g
/* 全局变量 */
/ I; A, R7 F! ~" S
/* */
0 w% N6 z5 [4 X I
/****************************************************************************/
" c5 ^* {' C! ]2 Q! }, {4 ]
ECAPCONTEXT ECAPResult;
7 }, V" {8 M4 }$ K- I0 r5 {. W9 O
k" Q l r- K& F8 K: X* e- C
/****************************************************************************/
, v+ U0 Q5 v3 G; A( b$ {+ y
/* */
! G1 T' }, M+ ~" Z
/* 函数声明 */
: X/ i J% `+ O( h1 X
/* */
Z& M4 K% z" q3 W
/****************************************************************************/
M+ \1 g ?5 J
// 外设使能配置
k6 P$ h+ Z# \$ `; W: Q
void PSCInit(void);
( F/ A- m: y+ a' b& v8 `
" }, f$ q3 p& e+ W4 z" x
// GPIO 管脚复用配置
N4 t1 o* N' E
void GPIOBankPinMuxSet();
5 _* J9 x$ j% L' c
5 `( w# m0 L% i
// 产生波形
8 z8 K$ k1 L) d0 @2 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 u. Y Q2 i8 X
void ChopperWaveform(void);
+ ?# @+ h& X7 ?; Y$ P
$ S# Q. x& a, o7 c' L1 Z
// ECAP初始化和读函数
( ?6 G# N' v# x0 m( V6 b% n
void ECAPInit(void);
0 T# U3 F8 b$ c. S, R) i
unsigned int ECAPRead(void);
3 j/ b6 o2 \ A% q: G( R
5 f5 b2 k; W( u# d
//ARM 中断初始化
f$ O2 ^& U8 H
void InterruptInit(void);
$ ~' ?( S( P3 ]0 X2 h. B$ H& m$ L
" ~* x5 z, F4 R" [
// PWM 中断初始化
3 U( ~) M" ~8 |% k
void PWMInterruptInit(void);
; A! \1 a+ U9 h# R
// 中断服务函数
4 N6 Q% D' ^# F- q3 e: z* a: J
// PWM 事件
# d5 q: Z! N* s1 A4 s8 T2 }
void PWMEventIsr(void);
# R! c$ q6 _! ^8 B8 P; h. a ^) K
// PWM 错误控制事件
& M+ j( ?5 g3 P4 U! e: @8 }
void PWMTZIsr(void);
& ~0 L' P. p% X9 u7 P' @
( h2 E6 @. S ?0 R' M8 Z8 d4 D
/****************************************************************************/
/ B& V: b$ R! d* T& r
/* */
u H& w3 w3 @8 T" \' Y
/* 主函数 */
1 {2 V; i6 q9 D6 z3 B( l
/* */
3 S2 C2 B3 }9 L* M2 T8 C, V4 i* k
/****************************************************************************/
) g$ Q: ]. h- ?- U5 x4 P3 p
int main(void)
; v% L1 G9 L+ b
{
) D f$ E# A9 ]9 ~- u7 ^/ Z% R5 _
// 外设使能配置
$ B9 _" {7 A/ h2 t; o
PSCInit();
6 B5 u( X# M& g* K5 g
. X+ h% M% Z$ g7 J2 R
// 初始化串口终端 使用串口2
8 j8 p1 t4 o5 L0 d6 ]
UARTStdioInit();
! w: s6 F4 a* i! h; |
2 ^) Y1 J( w1 y7 Z% f$ a; \2 {
// GPIO 管脚复用配置
. u0 `6 K* ]& q; W5 {; @/ K
GPIOBankPinMuxSet();
3 C2 {, R. C7 B6 f* _% ?2 C
$ r3 r! _4 B& o( n6 m2 \$ X7 y
// ARM 中断初始化
! \0 q0 [# Z- Q1 Y: R
InterruptInit();
6 i2 |% V& i; S& T% R
: |2 D+ l( |0 j6 w+ `/ w
// PWM 中断初始化
s, U0 d3 |6 g
PWMInterruptInit();
% `/ { m0 e1 r# Z% ?
, V- I5 Z* j8 C6 t' ~
unsigned char i;
3 }5 G6 C0 q. F ?$ M
unsigned int j;
: R# m/ g0 }6 O' c9 q$ Y3 G5 `
2 ?# w9 o; ~5 ], l- b( \
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 C, f9 ]2 R6 A+ _' M6 e9 ^8 R
UARTPuts("------------------------------------------------------------\r\n", -1);
& B2 H. N' j3 x2 M: a& x; M! h, S9 {
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 U* }' D$ V- n2 x" j
// 产生波形
9 i- Y, x; a2 G/ @5 {% Q& d
PWM1ABasic(25000,50);
8 L! z# T: n& u4 s; d* b, V' \
+ l4 l: K0 m( J( i
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 u4 X6 e+ a# f! g! R& b2 n4 i
UARTPuts("------------------------------------------------------------\r\n", -1);
: O! _5 i$ \& C1 Y4 z1 @
A0 \, A+ k$ m' F& G" t( u# u
$ A6 f; K/ ~8 j; q8 `' T
4 R; V7 A) K2 _
UARTPuts("------------------------------------------------------------\r\n", -1);
) Y! k: A2 O" @+ }0 N
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 T, } v; w0 `8 e$ g/ ~
// ECAP 捕获初始化
0 b: R" H! y- u- @
ECAPInit();
# j3 C: c& y# G* f8 T
UARTPuts("Initialize ECAP.......\r\n",-1);
4 J( ^- |# n6 Q3 B, p x; n
for(i=0;i<5;i++)
/ j# V% n: }% @
{
$ C) Z7 | f T- A. W
for(j=0x00FFFFFF;j>0;j--); // 延时
3 c R8 k5 q3 B2 n p; g
ECAPRead();
" t2 ^5 V9 |! Y
}
" H, s7 W3 ]& A& E# S
UARTPuts("\r\n",-1);
! h. W2 [+ H, Y3 V
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
# ~3 m |4 `- r1 \$ P: T. Z
UARTPuts("------------------------------------------------------------\r\n", -1);
4 `4 l, M5 ]9 h
: N+ s% z: |8 m/ v0 x' ?; M
// 主循环
1 j% q- H- O3 X: |% y$ o
for(;;)
: n: R+ j, \% D: a ?
{
- w1 K0 _, z: t4 R
% j9 J5 e; V) @- d; P1 a
}
) s# U: j4 q2 `+ }" o2 O
}
: g, c% ^: Z0 e' a8 w" b
+ Q4 @& B4 T+ K4 k, m
/****************************************************************************/
' n0 e4 H" H" O$ k% O1 Z
/* */
) L% i/ y2 `) s3 H& q' J
/* PSC 初始化 */
& u6 }9 b( x) a7 E+ y3 S F. y
/* */
$ l& D6 M- C4 D) |. l
/****************************************************************************/
# y5 ?3 W* y' H7 _1 t$ e
void PSCInit(void)
8 C4 t+ m( S9 u
{
. A, O) C$ `5 @7 E# A* _4 V2 X+ p- A0 E
// 使能 EHRPWM 和 ECAP 模块
/ ?- e( Q! v, p, m1 c
// 对相应外设模块的使能也可以在 BootLoader 中完成
! Y \4 _1 z7 b3 v+ I& i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 u. T: h: P7 y& ^0 R: y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 Q* m2 j0 q9 |# z3 `
}
1 ]6 L$ a; e5 A' i4 v! A' `2 j. o
, B7 n! N; \$ u1 e( z* U; O
/****************************************************************************/
3 W6 R: R; {1 c6 I2 w+ F* {" N! h
/* */
8 _5 G8 @" q2 k* K& A# ?
/* GPIO 管脚复用配置 */
! f. z% L6 a7 N% w
/* */
5 U. N, b' h0 R) \2 v! m: e
/****************************************************************************/
) `& m; T0 |" ^1 R" ?& G
void GPIOBankPinMuxSet(void)
2 ]+ l, z3 H4 g( p
{
k+ ?0 H* A* v- p4 [
EHRPWM1PinMuxSetup();
* @/ M; L: T# K+ \! e1 U
8 i+ g% }& U* ]
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
2 \7 A' D( S( U: ]' U
// 作为捕获功能时管脚方向为输入
2 i. N6 u: j/ m
// 作为辅助脉宽调制时管脚方向为输出
( z! `- }3 N, O
// ECAP2 / APWM2
; W7 [5 q/ d7 y3 N! o; F4 x1 f
ECAPPinMuxSetup(2);
! A( y+ b1 P, V" l4 L
! @0 \, w* ]7 R; G8 t# W2 v) \
// ECAP2 / APWM2方向设置为输入
* b8 H5 a* L3 S! I( Q4 u/ O
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 J9 n6 V$ B% d2 E- K- F" R1 s+ h
}
5 M& I& ?6 c3 y8 J
" F) r" B+ L% G, Y9 A+ C! o8 ~- Y8 G
/****************************************************************************/
. b# A1 {0 b! m8 F1 H- `$ X
/* */
8 R; ?2 V! J7 z! w6 Z
/* PWM 输出波形 */
1 S# i6 {& {0 l
/* */
$ I1 t# o7 N4 h9 R* d+ e: \
/****************************************************************************/
5 N& ]( s0 |. h9 s, Y) B! N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 C7 G& _% O5 C
{
- U: }" h% ~4 S) `, A" B3 R$ O
// 时间基准配置
5 b8 C, c2 }/ h4 J
// 时钟配置
- u7 ?. `! z4 M7 O. c+ K
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. \! T0 u5 d0 k8 `% X
) M \4 A+ |1 L
// 配置周期
3 S" a P% b: v
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- {4 N8 ~* ?; V/ ^6 w4 E: T3 ^
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
! u8 F/ ?2 l; J" B8 s! |1 g1 I0 \
" B, M3 \' z# h; J5 e4 Z& \! |
// 禁用输入同步信号
( R/ |, J- z9 t0 s' M9 d K
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ z; {$ s+ I8 U4 P- ]0 U* ]
W+ f1 S, Z1 M, a1 }
// 禁用输出同步信号
! _! M+ C! W- |8 Y4 m B: _
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 n! Z# o# G7 [' M6 O# Z
. x6 {) N* ` I8 w: Z& L
// 仿真(DEBUG)模式行为配置
% u* _/ L: Y1 {/ T' I- g7 A7 I& f& w
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! B; j* a) @( w) ^5 u% k% |
3 P4 e# j2 \& R4 {3 o, g
// 配置计数比较器子模块
# s/ y+ c- M% |4 G9 k4 j
// 加载比较器 A 值
0 \3 g) a" T# }. r8 k
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 e" {# v0 t% Q
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" k& X- P9 ~" Z' A3 o8 H& i
& E+ I/ c' a6 [1 d# X m
// 加载比较器 B 值
6 M" O/ d b8 ^6 y9 }3 y
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
0 ~6 [. Y( }- u! ]4 V& U+ p
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' F J' o! C; T, `0 H* n
2 ]5 @' B4 ^# ^- n% s0 ~
// 功能限定配置(输出引脚触发方式设定)
- H( l3 t9 a6 j3 K2 ~! J4 ^3 R
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% m+ d# z- H; v6 f. O
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 w3 `+ B' E- O) w$ ?
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" q- @" z$ Y; k) q' N- w! G: n
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 v r: l$ T- X, y
* i' d; `* c2 C8 |% B7 [- K
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 a& ]) p; x& z' e, ?9 o
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
3 [4 T' }0 z' I& v7 t: c& ^8 u
2 [( v" {9 r1 l! r+ r8 B
// 禁用斩波子模块
) t7 ^8 D$ }3 t
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; L9 Z! f% ^. F1 \
7 ?+ h, J ], s# K8 x1 q: c
// 禁用错误控制事件
" x! S& h( C% P$ O& N3 z: o
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 }7 d7 e2 q" i5 r$ `6 U9 E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ T1 E8 l' I: B
0 n) ~! Z5 {6 Q
// 事件触发配置
p2 [. o- F* X
// 每三次事件发生产生中断
6 F/ @* h9 P1 D$ k9 s& ], k
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
9 G7 w. f, h+ T2 A. C1 u/ }
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
C! F/ V/ Y8 r" B
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# V+ H. V1 v( u/ J7 ]0 g
// 使能中断
: c2 _ ~: E1 d2 U$ Q; a9 L8 x
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
: h% x0 k `% N; C: Q4 N* H
G3 U. d) I: N' W, B6 P
// 禁用高精度子模块
- w: |9 {' G4 g; W9 S
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
0 R7 t) i1 ?6 u* ^
" `1 r6 g2 O, Q4 h. _3 ?
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
, o) ]5 U( M, {+ T2 q* o' a
}
7 K3 f- l) x2 Z$ `) S6 g4 y6 X
. j6 h5 f1 ~% ?
void ChopperWaveform(void)
# D/ [' E8 b% H% N
{
/ N9 p9 ~, X1 h% J
// 50% 占空比
; s/ O! e! Y1 C# |+ p. \1 L( [' W" e
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ P* J; c. p" ^
// 4 分频
5 _# a0 ~: Z! o+ ^4 ^! I
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& e. [. U1 p6 o9 x5 M% W( A- T
// 单个脉冲宽度
( @3 r- D4 R, s5 d
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
+ ]# U8 Z: k- C( T9 `, j
// 使能斩波子模块
; k5 `1 D* Y' t' J$ t" [% r. U* Q
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
" S& t+ s( q' |& n2 R
}
/ w6 ^ n* _% p( x
! P) B( p6 s3 v. C$ u
/****************************************************************************/
9 G$ P1 h3 L0 Q1 O, A
/* */
2 H O- ~* [, I8 K
/* PWM 中断初始化 */
# c2 m4 i) T/ j% y. B
/* */
* L# Q, n" a5 u- f4 q5 t7 {: q2 Z; [% W
/****************************************************************************/
' l* \: p0 T2 w9 H) ^& ?7 f- x
void PWMInterruptInit(void)
/ f# a' ^, h: ~
{
* ~$ p0 \1 v3 u! ^; A( x9 T4 ^
// 注册中断服务函数
6 |. ? b4 `7 j* i' i' D3 [
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 _& t! V3 S1 m3 {# ?+ e8 |& T
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 i% a4 A4 e1 M) \/ m0 \8 U$ X$ N' t' E) j
# W) r' o% ^# ?9 B$ h2 a+ p
// 映射中断
7 p0 [: p; Y5 }. ]- G" D/ G
IntChannelSet(SYS_INT_EHRPWM1, 2);
9 J& o* S( o! T2 J4 G
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" r/ h) l; p/ m' E3 z0 ^+ _
6 r0 ~1 y2 P9 ?
// 使能中断
0 K% E# c2 R& B8 [
IntSystemEnable(SYS_INT_EHRPWM1);
( N9 Z# Q6 ^, u5 z( H" M. X" n
IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 Y" ^" e% R8 y7 h. v% {( ?( D# l
}
- O& ~1 `: o& `/ p) \- q
, `5 S) p& m/ |
/****************************************************************************/
6 e! l6 x* T2 @
/* */
" D& `* G5 A* c1 P: _
/* ARM 中断初始化 */
6 s/ O1 e% V& c( B6 ~5 C4 l# J
/* */
+ O/ a- J" E9 c7 d% q6 Y
/****************************************************************************/
, j6 K4 e0 n( B, A
void InterruptInit(void)
. I* Y- O( N7 I; A6 X$ t
{
& s) \% W# I2 L( G/ q, J: O
// 初始化 ARM 中断控制器
. T# [3 Y6 `' i! P/ b& v
IntAINTCInit();
g: C: z; [2 k) S+ R0 S" j0 T7 j
6 o M1 K" m4 G9 b- \" `
// 使能 IRQ(CPSR)
& p, j/ O9 n% F# ]/ o
IntMasterIRQEnable();
$ A/ N0 D/ z/ c# b- b) Q7 l2 ^5 d
8 [1 M" `" [8 e! }# c6 q
// 使能中断(AINTC GER)
! S8 b' c9 ^+ R q! u4 _
IntGlobalEnable();
) X& Q. V0 T5 y
5 s/ V0 w- @9 @! g6 V" @4 l
// 使能中断(AINTC HIER)
. m! S8 [% ^! s* J
IntIRQEnable();
( |) f! F; M0 X4 ?! w1 F( p
}
, w/ l% L8 N" x) f
) _. S; I4 F* ^$ A* x$ |
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
1 M0 m! i/ m- h
/* */
$ |( U" a/ k9 \/ }: `
/* 中断服务函数 */
% O! V' K1 x! \+ q
/* */
: S/ b+ f) |6 |$ X& v# K# ^8 R5 D6 J
/****************************************************************************/
- L H O! P8 e/ V9 V Z
void PWMEventIsr(void)
# k0 q* x; p7 G" I: ~ @
{
: x. {9 O# V/ c, g
IntSystemStatusClear(SYS_INT_EHRPWM1);
, f' L) S5 Q/ S) L6 c& o
: C. T; r$ A# j* D3 v8 M
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
8 }8 R% Y2 O/ V4 w$ R
}
0 F# U- d$ Y. q% t! i( F! p
( T: l. O* t8 v8 k) r$ X) U" O
void PWMTZIsr(void)
( w) L2 A6 y6 |4 [
{
+ h7 b7 ^4 y6 D8 {+ T7 @* M6 G5 k
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 M/ Z9 E0 ~& v
/ r! y( l) O$ Y9 p+ I+ g( ]! ?& f
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) m h: i" d( J5 h
}
! F4 d" w% @. ?0 w. Y6 @' F$ Q
' Y4 F8 X- L& g0 u3 r! b
/****************************************************************************/
& Q l& s+ y4 p
/* */
+ X. x; W; d, P
/* 初始化捕获模块 */
$ X$ G2 j3 s$ a) N+ ~ Y
/* */
! O9 J% U1 V" W( u7 q6 u
/****************************************************************************/
+ u% t; i1 M ], g
void ECAPInit(void)
! J4 F, ?. t1 J7 v% [
{
! u8 K* w" f, s( H- @
/*-----设置 ECCTL1-----*/
' X) z' {& P5 p& Y+ m
// 使能CAP寄存器装载
) R9 M9 g: S! v p
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. @8 C" {; k0 G, \( | H3 Y" ]
// 设置预分频值.
) R# j! L5 a5 w5 w! Z+ U5 ^$ ~/ q( u
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' j; z( b/ j- |( Q% x0 Q+ w
// 上升沿触发捕获事件
@7 B( j/ s4 y- J6 ^! `* w9 f2 T# w4 j) w
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" c& F5 D! j+ ]1 c1 P; p8 g$ J- z
// 输入捕获后重新装载计数器值.
1 F5 p0 R- V( d: f$ p3 d; u
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
, |3 I' Z2 G( M$ @+ \6 p
$ K2 P0 R5 r! D; L M5 X, h. Q
/*-----设置 ECCTL2-----*/
( m$ n8 u7 ? E' x0 ^* y3 ^
// 连续模式
; j8 |3 i; Z1 d* S" e5 T# _
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# b* H/ V! n W* W
// ECAP计数器TSCTR持续计数
" b+ d+ J3 o- M' p) T- I
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
1 t3 N2 k3 s8 h
// 禁用同步输出和同步输入
. @6 ^0 f, ?* l3 g6 ^8 z0 R/ [
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 i2 [% i% s3 F+ @. c
// 配置 ECAP 2 为 CAPTURE 模式
; ~& k/ G# q' d
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
2 Z5 p+ x$ m7 Y) C
! h! k3 b; w# \- i
// 使能中断
1 W1 H7 x$ b$ P' }* F; `3 c- H( P
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 c N! ^: X+ S# Q, x, p# [
}
% D- f% q2 f# G$ b* Z
1 }( k+ n" V- B
/****************************************************************************/
! g& F' d5 L b
/* */
' j) ^' r7 \1 y
/* 取得捕获结果 */
6 i$ N# {/ {& a/ Y4 O( E
/* */
* e9 W8 P# t0 r! _: r+ Q8 _! d
/****************************************************************************/
4 Z& ^* W2 J. `1 o9 S. W
unsigned int ECAPRead(void)
2 J4 ]$ x4 p# k- R* l1 k7 k+ X
{
V" p: Z0 H0 _( }1 b# y! t8 T. n
unsigned int capvalue;
9 b, w {% S4 H
unsigned long frequency;
& L; W: I3 N$ F1 e2 l+ P$ h4 L
2 P. @" m; ]! w
// Event1 中断标志
- b8 d7 }& Z& y4 w3 f3 p
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
U n: u4 S1 h" S2 W1 s( O$ l+ t
{
7 ]/ {. R) h, x' J% R6 |
// 取得捕获计数
. n0 g( Y9 v8 c/ g' e' Y+ i
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
# v; [# d! Z7 \1 N% Q7 a& ~
capvalue = ECAPResult.cap1;
5 ~. l+ g( k# j E9 B: `
$ E; ]% D+ ?: o, \: W! q, @
// CAPTRUE 模块 228M 时钟主频
5 A- `) I9 C) C# Z% H0 b
frequency = 228000000/capvalue;
* C, ~6 V: m7 y* z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
( r) j! v( g) A+ Y/ C
+ J6 `, r+ G$ _1 A6 ]
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
I0 ^. U$ l+ U$ _( H. K# r
// IntEventClear(SYS_INT_ECAP2);
* _& i& G$ Z7 l
}
6 E3 ^1 t2 c( ^( L J4 J
return frequency;
3 K+ i V: c3 S# ]4 O2 U# v
}
1 A: {4 R5 i; Z
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) J0 t3 E. l X% 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