嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ a# ^( D) [' ?1 ~5 i# {- k0 @
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
# @. h @# f& @$ g
/* */
6 |+ I; h" F7 h" Y" O
/* 宏定义 */
( C2 P5 k9 F7 z) E' V
/* */
9 r# @6 d! ~' Q8 U
/****************************************************************************/
: W) ?0 f% v% x
// 软件断点
' g; k i$ Z$ s8 E. s% X' V) H
#define SW_BREAKPOINT asm(" SWBP 0 ");
- R+ F8 K: y% |9 G5 w
7 `) k3 @1 `2 J* W
// 时钟分频
7 @' n' t/ f5 Q9 s4 a/ V5 N
#define CLOCK_DIV_VAL 228
: W; u- g8 C1 R/ p- r* A7 q u# f
) w8 ]7 J8 r* a9 q
/****************************************************************************/
9 f# s, J; L7 _8 J2 B# @
/* */
) ?& v k0 f, \
/* 全局变量 */
. n, o/ Y" E! S+ K/ u: C5 y7 {) O/ f
/* */
$ L5 X4 `& h) T ^. s* Y
/****************************************************************************/
D9 a4 G" g* J( {! D
ECAPCONTEXT ECAPResult;
4 t: y; ~6 ?/ h) H7 R
) Y" a3 Y: Y/ I6 M6 m# `" ^
/****************************************************************************/
, D8 F0 R5 }* Q, F
/* */
+ V' l8 r# s% [: M8 X/ k
/* 函数声明 */
* E# P) E5 M. M" i& k1 {- `
/* */
7 f" `1 x1 h1 g' ^- {! z+ G
/****************************************************************************/
. J2 Z3 \* G3 o6 b
// 外设使能配置
1 M/ G+ k- q* T/ ?- [/ @" C
void PSCInit(void);
* R+ q* _6 [; t8 }- r; |. V: w
0 i- p8 ^% y1 C& S; i
// GPIO 管脚复用配置
# n8 P2 ]( |, j, J* d9 z1 l4 C
void GPIOBankPinMuxSet();
. \) w8 ~8 k) I `2 q3 Q X; I
8 H, b, s- d! l2 h- o
// 产生波形
3 k. |! t* K1 t4 d; [$ O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# Y2 L4 q3 Z. U8 A; ~
void ChopperWaveform(void);
! o1 Z0 n& B& \( ?8 C1 A
% b( p# B$ b4 L) j
// ECAP初始化和读函数
! R3 W4 {: B1 V4 A! R
void ECAPInit(void);
3 n n2 q3 ]4 d/ B+ {: ~
unsigned int ECAPRead(void);
- s! T! `, V; y5 [& V; ~
! Q! V+ x3 _' s$ W& O
//ARM 中断初始化
4 B+ c3 `6 I9 O- Q, o
void InterruptInit(void);
m! f/ N9 F" T. f- _5 m
' o! V8 e% x( H( Q- f. `9 G
// PWM 中断初始化
8 E* q* N- t7 w$ B3 ^# m% u
void PWMInterruptInit(void);
+ n7 ~. y3 y' N1 {& P
// 中断服务函数
/ R6 X6 j4 l, q/ Q; \8 ~9 S/ T
// PWM 事件
# }$ g. C u4 A6 O! f) y
void PWMEventIsr(void);
1 h; |" g: d: b" {
// PWM 错误控制事件
' f2 G w& v/ ~6 j7 l' ~( J
void PWMTZIsr(void);
& w# d. {) @0 N* K9 e" ~
8 @+ E# l f, J# o% h% r) P
/****************************************************************************/
7 D8 ^- f- f5 C
/* */
+ ^( K- _' t: e1 }8 m" A
/* 主函数 */
# F" n; c2 I. ?* F9 q, ?& ^5 X
/* */
- M& H8 M* t2 e7 p
/****************************************************************************/
9 C) l0 t) B4 O& q# Q
int main(void)
9 o+ u9 [7 ]" {1 ]: L. e: }
{
7 V" P6 d3 z/ N1 Z; V( D
// 外设使能配置
9 W9 i3 [& X( t8 j9 x D) N
PSCInit();
2 ^ f1 Q1 U8 v8 `# T1 A
7 |8 \5 O4 C y
// 初始化串口终端 使用串口2
/ b( o' g) T4 U/ `5 W
UARTStdioInit();
1 {/ W" Q1 T6 M" q* ?1 g6 I) V% w* y
2 e% G' O5 C4 K) A
// GPIO 管脚复用配置
0 Z1 c4 c' r# L9 S" e
GPIOBankPinMuxSet();
( ~6 H) a7 k4 M% X
+ d9 h* O; J0 m: A" V
// ARM 中断初始化
7 E+ F2 C" {0 `: j' h& Z6 q) y( k' F
InterruptInit();
7 K+ r9 ~5 A0 B* t, U Z6 U
+ B* D# g. r' }6 w! ^% s
// PWM 中断初始化
/ p1 }* F# c% T7 Y3 Y
PWMInterruptInit();
' y7 U6 j6 ^# A) l: V2 A+ E0 h0 b+ P! z
9 H \- u6 ], S3 |
unsigned char i;
/ j* j3 y$ C9 V. g* f4 q
unsigned int j;
" {; z) y' i# \. c3 N
2 k+ l @; _- S& D
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 T5 G& ]# ?5 s
UARTPuts("------------------------------------------------------------\r\n", -1);
! U* b6 y' N% Z# f& u* C/ E4 C4 k
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! e5 R& U7 o- i. @2 L6 M
// 产生波形
" j/ j' r" d& b1 T0 T
PWM1ABasic(25000,50);
- ]# C* b* Y5 Z' u
1 m) t/ G# u& S* Z" H
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 V/ f7 Y3 L2 u6 K
UARTPuts("------------------------------------------------------------\r\n", -1);
* v! t! x( m7 ~ ~
, j+ o1 h: Z: d/ B3 r" m
! o3 F- x8 Y3 H# e) w" @
* X h/ ]7 p" q) R! y
UARTPuts("------------------------------------------------------------\r\n", -1);
0 Q$ l6 t5 d8 l( a! w9 {
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 h6 e3 S, u# ]! d! ?' R0 G0 F
// ECAP 捕获初始化
& g6 ]1 |4 O* b
ECAPInit();
$ Z9 s4 o+ ^1 r( @- L( h
UARTPuts("Initialize ECAP.......\r\n",-1);
8 B6 x- L' c) g, r( U) g4 y
for(i=0;i<5;i++)
7 l# c: V0 G5 N
{
7 Q! r9 j5 {9 t# m8 R0 g( z- e: K3 E
for(j=0x00FFFFFF;j>0;j--); // 延时
/ ?+ I+ S+ v0 l' H' L" ]: k- s3 i
ECAPRead();
5 K0 z8 C! E- ?5 g& P7 w0 X
}
" V) O: ]( Y6 e
UARTPuts("\r\n",-1);
4 A; @2 }& ~, t+ I0 {7 w, b
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: |( n" K/ c; D# I. T) E% c! `
UARTPuts("------------------------------------------------------------\r\n", -1);
3 t: l. b: [2 ?9 M( H) G
& A9 e1 p6 S* O, l
// 主循环
U! j# l1 a( f0 o7 n- V/ D
for(;;)
% O, A% b- ?' ~, F
{
8 S& @) Y/ }6 i, A8 ]9 g' g
, q# I# ?4 t6 H: Y& H
}
: ^% {( r5 T7 O U1 \
}
7 T! U; H$ }* i
& b/ u- G/ c$ m$ d. c" p3 t1 P
/****************************************************************************/
0 ~) b% _) V& H& E. I! q* R6 B
/* */
+ p$ |& j1 z/ i5 M6 ^$ ~: S: ?
/* PSC 初始化 */
; L @* Z2 Z- z x9 A! J$ _+ A5 y: d# ^4 a
/* */
: F9 b: [- x4 O5 L* b, I
/****************************************************************************/
: w$ W2 \$ O: R- ^
void PSCInit(void)
" A& ~8 _' L# o+ |& j
{
; l9 G' u7 r! S; E. J8 v( [
// 使能 EHRPWM 和 ECAP 模块
! J" }$ m3 o5 m' ]% P, g! G
// 对相应外设模块的使能也可以在 BootLoader 中完成
, ^8 C: }% p! U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' w- H: i2 H4 M- w1 {2 W1 m' H! M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" H+ ?4 F; S& l0 r4 C
}
8 }% U! E0 R4 `
' x% O4 c% L. J( k* N, y, C8 K
/****************************************************************************/
: P* h2 c( ^$ p
/* */
! B1 j3 `0 p! c) Q: T2 Y E
/* GPIO 管脚复用配置 */
3 ]+ |; _. ?" {/ A; p( T
/* */
( K4 C: T! V" b0 [5 z
/****************************************************************************/
- z* v5 S: c( G
void GPIOBankPinMuxSet(void)
$ X' j0 I A2 p# ]5 R3 [8 w
{
8 _+ _8 G- ?& d4 F' Y
EHRPWM1PinMuxSetup();
`' c5 S, e8 P/ t, v
( i6 y6 e# ^" ~8 ~5 C4 g/ S
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- ]1 z" L8 J+ p
// 作为捕获功能时管脚方向为输入
7 y: i( X. h6 ^! B. K
// 作为辅助脉宽调制时管脚方向为输出
, B4 |1 H3 B0 h* Q3 C. Q5 U3 }
// ECAP2 / APWM2
6 B: }2 C0 h: _% v* W" j4 V' x
ECAPPinMuxSetup(2);
0 y8 D! b& b0 _9 Y( U) f' E, k
% i" Q: X/ q+ h# G/ u9 K, `
// ECAP2 / APWM2方向设置为输入
: \- [+ r3 [! w6 H
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! z" C9 S( j+ o/ H# ^6 {0 U
}
1 R, C1 Y' c ~2 l0 y1 u" Y6 Q( Q7 n' ?
/ i7 P8 g8 Z* }# C4 v
/****************************************************************************/
+ Y8 a1 Z$ N1 \5 J( ]
/* */
! N8 B+ ?6 T4 I5 ]3 t9 ~
/* PWM 输出波形 */
8 H( f- X' Z+ s
/* */
3 a% L/ g' Y3 r. {7 t8 U
/****************************************************************************/
; N: q0 B. F, Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% ` i D9 k6 m( ?: A8 E' X7 a/ v
{
, E. W4 V0 v1 v, @; }9 g
// 时间基准配置
+ k; u0 S7 k4 ]+ S7 ^ L# P a
// 时钟配置
6 {) }1 {8 K; t: W( W
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 w. `8 `0 }7 \! T$ j: w
& e6 j& ^) p8 ^; n) i: u
// 配置周期
! j! x. J+ B5 K; \% L9 K& C
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 m9 z7 O, e7 K, c( [4 O7 ]& z
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ l! l5 b$ O. p: |! h0 q$ ~
* I) |! @, Q+ a- j
// 禁用输入同步信号
9 w) R& f8 z% }# y) o/ G( L
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
0 x1 J' b3 A( ~, ^9 e+ f5 b& T
8 i8 \. P. s6 N0 H
// 禁用输出同步信号
4 p: m7 a6 L7 A" G3 U
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
}& z3 e5 S0 u7 @, f! s
- O2 f N) C; Z! m
// 仿真(DEBUG)模式行为配置
1 T# K2 C! C- z) v8 F
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
' {4 L# @5 D/ U6 y$ n8 z
8 O6 W8 X" s/ e, H7 r& n
// 配置计数比较器子模块
5 F n! q5 O: I# J
// 加载比较器 A 值
3 O4 Y: b! ^' B0 o/ Y1 l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; O9 H, x. U4 K1 Z8 B& r+ C& h
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! W7 i; P, g: J1 J
* V$ l8 G# S7 R
// 加载比较器 B 值
+ I- w( h9 g# C: @6 A
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" `! G0 c3 z7 n
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 ?; k2 L2 V/ D: c) X
* |5 L9 O4 \$ }
// 功能限定配置(输出引脚触发方式设定)
. I/ e# f) @- @3 `& a) J% p
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" T! c: k. h" U" v; _0 |
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 k3 C+ {! I+ n: e5 `: T
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
4 q& H+ g) G7 R7 o
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: k. H$ J+ Z$ D2 Z- {
* ~" `$ S5 d1 \# v% `$ G
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
( I' B& r8 R6 U1 \5 J3 _- u; G8 J
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ l; C+ E7 @: o; _
- g0 c2 B% _1 x4 d# j6 M1 R
// 禁用斩波子模块
0 _; c4 I* H* M/ w
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 l. Q- u p6 Z& C% u8 c
9 R2 U6 Q6 E' T8 F4 Y3 u# y
// 禁用错误控制事件
, D0 T' f/ \+ B- I. F8 l/ ^2 @- g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! c$ n4 X! B8 C$ J% b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
C C$ |( _* ?
% t0 g+ y' E; q4 {+ n$ j
// 事件触发配置
9 ]0 W( B. i! v) Q
// 每三次事件发生产生中断
: y+ e! x6 _+ M# @/ l- d8 j8 x
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. { t, P6 U; ^& Z; `
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 a- v7 L1 ~2 K! R
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 Y+ o `2 _7 z6 U) G' _' y7 }
// 使能中断
' |( ?5 u) | k- Z: Z
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" a8 l5 `: B; G$ B4 `1 J% V
" k2 p/ ~# ?% |3 n. b# \& |
// 禁用高精度子模块
7 M; h1 R) f7 h& s9 C, d0 x9 |
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- E9 T( c% @$ J: e) @
. [% L- b! u; u6 ~. @- N4 l. }
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 {. Y- R' l) y0 G# U: M
}
+ F8 \% y# Z/ J
7 t+ ?4 l9 P; W6 A: s* a7 A' X
void ChopperWaveform(void)
( r9 J; d' a$ t) _$ K
{
5 J; e' C7 R6 ^
// 50% 占空比
+ N, Z" ?( t; q B" y
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. M( r+ g4 r; z" s, g) s
// 4 分频
0 q- n [) U% N+ h/ U
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; S( ]5 q# q5 U& X% \3 N
// 单个脉冲宽度
6 O8 u9 \) Q9 e3 A4 d9 V' w
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, a+ V% a1 e$ D" d; v$ X! N
// 使能斩波子模块
+ Z# V+ n" C; u& \0 V/ e5 v
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 s+ p1 v5 w8 t
}
& e! k# C# v, a# c }" u
2 I& {6 Q; [% Z! c i+ Q3 \1 |+ {. G
/****************************************************************************/
) [0 `, A% N* G6 ?+ o7 N! c# N1 L5 z
/* */
' N' R; f9 e: q! _
/* PWM 中断初始化 */
; i: n/ f) x! Z4 H
/* */
- \( y. f0 Y1 F4 f$ _
/****************************************************************************/
. S# g' |' r# ]
void PWMInterruptInit(void)
" n/ V" A9 t2 H
{
3 m# B, S/ m/ D0 Z. g
// 注册中断服务函数
! o; z0 p6 I+ d+ k; q2 Q1 E# P
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( c6 B7 K+ @" K+ \2 D* r$ P# `' v
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 u1 ^4 C& }5 t7 Q: x$ S c/ P
" h3 ?* Q, e0 h! k& e- \
// 映射中断
; D% c, r9 @ |) \+ r; ~
IntChannelSet(SYS_INT_EHRPWM1, 2);
: u. b' l, {, @, x5 ~; r3 |+ ]- i
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; a" A' W" W& S1 q
; p2 K. }5 k; ]" y- H S
// 使能中断
# k2 Z& Z3 n! x
IntSystemEnable(SYS_INT_EHRPWM1);
; b; Q, d# K8 r* n8 j4 ~! o2 S5 M
IntSystemEnable(SYS_INT_EHRPWM1TZ);
* ~* K/ M, f. V8 I/ v
}
6 o0 |$ f0 ]& H; L# R/ z7 U, _& ^/ h: L
2 O. m u3 l" _- L
/****************************************************************************/
$ w2 x+ D' }6 E1 u/ ]0 s: p6 w
/* */
, D) @; d; w0 A
/* ARM 中断初始化 */
/ |0 v! p3 i2 C$ n, n- @
/* */
* \ S! H7 d4 E' q; H
/****************************************************************************/
9 k. A4 N* V$ X7 f2 `
void InterruptInit(void)
9 f4 j* ~3 r r: ? E; R
{
0 H" n& N5 C4 `% S
// 初始化 ARM 中断控制器
. n/ ~ {. J" c- R. b
IntAINTCInit();
0 ~! @" P- ~0 q
' }. e. c9 l9 b5 Q$ W% L# {
// 使能 IRQ(CPSR)
0 N# z" r& c0 i! k$ M( k. r C/ A: @
IntMasterIRQEnable();
* H) c" Z5 }& M% D: ~
- k7 ~1 |- U! |' E/ a1 O) u5 l
// 使能中断(AINTC GER)
% ~% J7 R P0 L5 v s: J; s
IntGlobalEnable();
! Z' p$ L6 B7 V
' W1 }; k' j; r C
// 使能中断(AINTC HIER)
' N W9 L( B. a! F2 H1 d
IntIRQEnable();
4 {: b1 N: ~) Q& p, R* r
}
8 ?- [4 h K6 o
! Z- _$ L- ^1 o5 G. c9 r
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
1 E: \& {( Q: {, n4 b% x
/* */
1 E. x2 R; a, e2 B( o9 |8 Z; n2 X
/* 中断服务函数 */
1 ^5 q8 k3 p4 L! t
/* */
2 Y* U! z- J: E" t7 [" n3 u
/****************************************************************************/
# K& f' }! U" N) {2 A" c
void PWMEventIsr(void)
0 u( R( r1 p7 I1 i
{
; h6 F" v) e4 m8 }
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 p( L8 P+ ]: M4 X% q* {. E8 D4 v* H
, A# O3 ?1 d" q* D# K
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& ~' ^! g' n/ O% Q5 ]5 T5 t" Q2 H. O; N
}
* f. f, m) Y7 \! ~( D$ _! N$ m y
6 D3 I; k3 Y( r8 m$ Z7 e
void PWMTZIsr(void)
! f: r8 n& G0 K4 f9 _6 X' m- j5 J
{
3 Q% G" ^7 p- z# S. A6 ]" V; D& F* a
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
2 E4 @8 {. k' z: D3 o4 m
- {& |% n9 H% z, `$ M% b
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! ^0 t. L( }& t1 A8 m& P
}
( E2 O/ b/ `: y' t. T1 c& m
! ^3 \( r$ G+ b
/****************************************************************************/
9 I7 \/ J8 ?8 e: I- j4 `
/* */
# ~. f" R# h* ?/ ?3 U) a
/* 初始化捕获模块 */
. y3 Y# V. M* J, s& H: l
/* */
" p$ l. n, h+ b2 [% s( \
/****************************************************************************/
/ {! I% e ~' _0 ] n, p2 z
void ECAPInit(void)
5 f* u$ e- V1 \
{
& c6 i7 u2 Q( r$ d+ ]7 u
/*-----设置 ECCTL1-----*/
$ R0 |4 b& A. Q& E
// 使能CAP寄存器装载
: f/ L `/ _5 U) ?% y
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
5 c* K+ Z. t ~4 G. U! _( ^
// 设置预分频值.
* y2 Y" N5 }$ { r# m" f
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ \$ F' U8 @1 y1 @
// 上升沿触发捕获事件
/ E' \, q. @: p2 u X
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
~+ l2 d/ j8 `+ @* {1 M9 i+ Z) ^$ E( W1 L
// 输入捕获后重新装载计数器值.
) e' e" ^- u3 F% f1 I
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
; m& o0 f1 c! Y8 s( c ]
2 B- u/ ^5 L$ ], @3 a* t: |
/*-----设置 ECCTL2-----*/
, m+ x- h( T/ u2 N/ j
// 连续模式
' R4 v# S' W9 o1 \
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
/ J5 W K% I, j0 ]
// ECAP计数器TSCTR持续计数
9 I) a, x8 |; I1 a* U6 s
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
5 }3 U) R& U \1 k, H' H- H
// 禁用同步输出和同步输入
. K% ]; ^7 G! w, |5 y* C. U, m
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 S2 I. y- `" n* I/ U: m6 D
// 配置 ECAP 2 为 CAPTURE 模式
1 B* n8 ~/ z! E5 p& l
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* O4 H1 P1 b) a2 {6 }( B
6 e1 d5 q2 L4 e
// 使能中断
1 P) x1 F0 A2 R F
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 K) [ q! j! Q5 ^' k
}
8 ?4 @1 ~6 B6 h4 O% Q# q0 @
7 N" m& C2 M1 B
/****************************************************************************/
$ { F' U/ H |1 i
/* */
p* W- y6 z- \+ V" S
/* 取得捕获结果 */
" Y% }! `' O, y# m0 Y9 S
/* */
_9 Z# Q8 l4 \0 R# \; j' J' y4 E
/****************************************************************************/
2 R2 q- m' o1 K( L) y' O# }
unsigned int ECAPRead(void)
- X& p$ l, y0 B. o, r5 Z( [" ]0 M
{
D0 @- b$ e( A1 W# }: m' s) W$ ]
unsigned int capvalue;
% Y6 } H- c; w3 u% E0 M
unsigned long frequency;
1 v" V6 j3 M; ^* `
. m9 a8 s, x7 m6 _+ W) d% X2 j
// Event1 中断标志
$ l& Y; a) w/ S1 p" `& r
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
3 m5 n5 [5 p( w5 d! o, R$ p
{
& B2 d3 ^) F) v9 h3 t8 w
// 取得捕获计数
; O9 v. K o5 O9 W: g, f e
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 s) g5 c. A+ E0 L! V6 U' i$ @
capvalue = ECAPResult.cap1;
- x. \0 P/ q+ F% m m
& ]- \0 D3 C' T+ V7 T) A
// CAPTRUE 模块 228M 时钟主频
' x# }0 X# x9 g9 l. A4 P/ @& X$ h
frequency = 228000000/capvalue;
, s4 q% D$ O1 Y r
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
- m8 U; y7 a4 @2 T
+ ^6 ~. e7 v5 N, K
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ S' K$ j; l2 Z6 z/ J5 c
// IntEventClear(SYS_INT_ECAP2);
* H1 _3 D' J; s8 o9 [1 [
}
- f6 Q( e" N M4 J2 ~/ y
return frequency;
! b' t, u8 R6 W& U. k( f( O
}
7 F9 ]/ W5 x7 {, @/ H2 C% O
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 u$ O6 w' s/ ~
[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