嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
+ T% u; j! s7 O2 L9 x
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
- [: l U! P& }
/* */
' ?# l5 H' x7 e. W6 V! E m) h* u
/* 宏定义 */
5 c3 a- W/ O* X }3 z' d6 J* J8 U) q
/* */
7 @% u. c' e( b
/****************************************************************************/
1 U0 p6 O$ Z0 K
// 软件断点
5 ^- l$ e/ v: C# b
#define SW_BREAKPOINT asm(" SWBP 0 ");
2 j' ~ C. _) Z/ \3 E3 N2 ^
0 |* D! k, T7 F( X; `, A! S7 q
// 时钟分频
- E+ J. O/ o- \+ q& z7 ~
#define CLOCK_DIV_VAL 228
2 l! r( g! p: D
& U5 d5 D3 s( i3 `8 a3 ?
/****************************************************************************/
% D, M' y. }' d- u
/* */
5 l( W6 ^. P3 O' q8 }' M7 y" A
/* 全局变量 */
: T2 r7 A5 w8 O6 G
/* */
6 j) n3 H1 Z4 w* J7 ^
/****************************************************************************/
/ z9 M- l( t X0 v
ECAPCONTEXT ECAPResult;
) E, c# u( y: \% R) d: I7 c
) y" P' A4 z: W- S+ P" B/ L
/****************************************************************************/
7 T$ a7 J- T$ L# z, r; }2 p
/* */
: q3 A' k1 b& }( e$ b
/* 函数声明 */
X8 N5 @+ M/ r7 c
/* */
9 E5 i Y7 Z; ?4 G
/****************************************************************************/
5 n# M& R# n1 W d* t+ f, r# k _& Z
// 外设使能配置
, u# _4 z/ v @/ i
void PSCInit(void);
. f, P' [! E8 b; _
4 X. x2 P8 j2 {+ {/ @2 Q6 F
// GPIO 管脚复用配置
: Y. }3 |4 Y. c S( V$ ^
void GPIOBankPinMuxSet();
) z" o' }) L- q
7 S9 b, S; c! K( i2 d9 d$ p
// 产生波形
3 u5 o% {5 a- T Q% x% c$ I6 o8 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
0 o0 g2 r+ A) b% v4 a" b" f
void ChopperWaveform(void);
# j$ r* v# V% c! r3 C
/ a6 v. d1 u1 O4 x0 ~% [
// ECAP初始化和读函数
; x0 [4 N( l8 x* U6 @+ e
void ECAPInit(void);
. Z+ k! ]8 w& C7 \
unsigned int ECAPRead(void);
# ?4 A6 C* u- G9 d# q
# |" ?' f/ g) y& i1 t: M
//ARM 中断初始化
' g& W! c E* n
void InterruptInit(void);
0 |. w2 M9 n; ^* b4 m3 G$ p
. R. o/ @* `/ `' u
// PWM 中断初始化
; y# g6 Y: {/ t1 o/ _- B. }: w6 S
void PWMInterruptInit(void);
' y" E. B- I4 P7 |5 H* G
// 中断服务函数
' p2 l( s2 `7 U3 p* z
// PWM 事件
; _% O7 D6 U. n: \: v$ D
void PWMEventIsr(void);
8 R. ~5 s/ N2 r' ?. I
// PWM 错误控制事件
+ k `$ k; X; Q
void PWMTZIsr(void);
3 `9 z2 S( [- @) W; t
; C/ |9 C( S: ]( b( H+ d2 }
/****************************************************************************/
: O7 _0 l* H( l$ M, J( v; R0 T" ?# E
/* */
5 d; \! |( c/ w$ c% v0 {
/* 主函数 */
6 A" M7 @4 F) J/ q! b2 f- b
/* */
, ^ j3 U" H8 k: }* j5 j
/****************************************************************************/
8 s# k0 |/ p% B4 a" f- B
int main(void)
; Z! n" q/ G1 H5 ^ _: L7 N& Z
{
( u7 t. e; [4 S& q
// 外设使能配置
, M) c2 v" Y- l7 g/ |+ e+ j
PSCInit();
! \# g; d' I4 X7 K
5 R. P$ }$ G; x! e" A, e/ Q5 E
// 初始化串口终端 使用串口2
0 v1 v( U( A# a
UARTStdioInit();
h9 A, L0 z) ?# V5 L! F5 X; L
$ t: O" q: r8 z! @+ y+ j
// GPIO 管脚复用配置
5 b; ?% w2 c2 A; L
GPIOBankPinMuxSet();
8 N# V- D, }. o: ^; a _. S5 O
9 b5 I. S. C( D5 u. B
// ARM 中断初始化
2 O/ L, M9 q( l. r C7 n
InterruptInit();
/ \! _. r% ~" n+ }# M9 |- P
! A' z1 ^2 _& l7 h7 Y' R
// PWM 中断初始化
6 O( o( F; `* j' `
PWMInterruptInit();
' @3 g$ l, Y4 @8 E9 {
/ N1 J! P c" G" y( h) X# t
unsigned char i;
6 F3 o0 S8 K: V+ H
unsigned int j;
% U% s& x! F" _5 K$ V
1 c1 E4 R* x9 Z! v( i
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ V$ K4 |" K, Y2 @6 ?
UARTPuts("------------------------------------------------------------\r\n", -1);
, U% f* D y, D+ I7 u5 I) J
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
, L& ^0 t; A$ V8 b
// 产生波形
1 d2 W3 T5 h0 L! E# f
PWM1ABasic(25000,50);
3 e6 j. g9 E& \6 }" c3 ^; ?* ]
) V4 k, v7 |4 W
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
+ j4 K/ [( ?% L4 d
UARTPuts("------------------------------------------------------------\r\n", -1);
/ k' A& K9 ]7 k' O# j1 m
! y" x x2 R5 ]0 S& S4 f
" z- \5 F! N3 l' x0 S+ X) }
5 ], D" k; z- }. W& H. K) X
UARTPuts("------------------------------------------------------------\r\n", -1);
# [& H, M! h& h: Y
UARTPuts(" C6748 ECAP Test\r\n", -1);
# L5 x( p4 ?# ~1 O7 o
// ECAP 捕获初始化
* x& p! U! d( G# K3 l
ECAPInit();
1 h3 S$ _' t, @7 {. v
UARTPuts("Initialize ECAP.......\r\n",-1);
7 d0 X2 T$ Z+ g+ E5 r. p# r
for(i=0;i<5;i++)
; u/ _5 ~, y/ q0 T( n, }( p& F8 D
{
3 | B# X( g# a) N4 H: {
for(j=0x00FFFFFF;j>0;j--); // 延时
5 H) Z d4 N! \: F! |7 M2 W
ECAPRead();
1 g& t* v& z2 C# E- Y0 o4 t$ h
}
" u2 Q2 [' y# V5 ~
UARTPuts("\r\n",-1);
b4 i. j4 l3 T' i/ v$ h0 Z
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 L9 K6 V6 \' ]! A3 O
UARTPuts("------------------------------------------------------------\r\n", -1);
" J. C' e0 j, c$ i# I& O W) d- a! \
' ], J) H. l" ]3 r% A
// 主循环
+ [6 j# `# z. M) g% e& u- P% q
for(;;)
9 k0 b' J4 m' a) E: d' i
{
" `2 f4 C9 F& s1 V
9 O7 m" @3 l) S: Y1 z6 t5 v
}
$ p# e& B2 e' r! U
}
$ \, \0 S* X, ]. K# R& ?: C5 I9 G7 b$ `2 x
/ y/ X( e: C5 `# d; W9 n3 c/ p7 ?& s
/****************************************************************************/
$ m3 e' ~0 N0 X+ C
/* */
4 _0 k0 q. f Q0 I1 Q* c5 d* M
/* PSC 初始化 */
& a2 d* ^# j+ I9 [ a/ d4 d
/* */
( D" `9 T1 x6 }% q: F
/****************************************************************************/
& g+ q6 H) f; ~6 }, D
void PSCInit(void)
' d+ b `7 u/ e6 n( h
{
. u% ]! I b2 L
// 使能 EHRPWM 和 ECAP 模块
+ Q9 W1 d; O3 M: I' @% ^
// 对相应外设模块的使能也可以在 BootLoader 中完成
' P2 @& K4 K& s+ V" Q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# T: `/ X, }6 F, [/ ]9 n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" K U9 k& X w' s1 l+ T, P6 S
}
: e5 S" A; h+ i
6 }( w; L: J, D5 n! I
/****************************************************************************/
9 C5 q7 I0 z7 M$ h
/* */
" A5 F! i k: \$ i4 h9 G
/* GPIO 管脚复用配置 */
0 a+ Y( i, t% z
/* */
) T# Y& m+ E4 @" m; ?( I% k& ?1 U. _
/****************************************************************************/
3 W! U2 t4 ]9 [' l$ K
void GPIOBankPinMuxSet(void)
4 x) o. e. c2 g* C
{
) J2 o* a4 J$ l
EHRPWM1PinMuxSetup();
# C+ X( h. K2 t/ f) Z: @
* J: _; m+ ^7 _4 g
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- Z. `( J8 u& T2 y! L; t* h% W a
// 作为捕获功能时管脚方向为输入
1 c0 W1 b6 }6 _) X8 Y% P
// 作为辅助脉宽调制时管脚方向为输出
* C" T$ \& j3 E; y" l9 q5 X, X S8 D
// ECAP2 / APWM2
; w2 P J$ a% _
ECAPPinMuxSetup(2);
! z* G& {9 h2 B: T) i3 J
0 W% U0 g, _$ y9 Y7 D8 b
// ECAP2 / APWM2方向设置为输入
0 L2 B8 v# c1 q" A1 t% |
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
" C( ?' B! B% z# e/ Z, ?1 C
}
+ d6 _( X0 x$ R
! j' t0 o4 T% s6 ]! u1 c9 ~( Z
/****************************************************************************/
" j! H+ w% x8 t/ z. k1 u* f& h
/* */
/ q/ U! E$ Q* s- U( L
/* PWM 输出波形 */
% x8 T& h y! s
/* */
: r2 X" i9 u0 H, ]
/****************************************************************************/
- Z- k' f# y* R! P6 J1 n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 {# U! m1 C+ L! x. ^ E/ f
{
$ x5 Y0 h3 @8 N
// 时间基准配置
/ Q. r6 d6 Y# z# c
// 时钟配置
$ Q4 @$ I% v8 V
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 d' c( c9 N, Y* L/ i
, h: |2 ~5 x! D; L: ]5 @
// 配置周期
, F4 V: |/ u, ?' p2 s
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% P; {; Q, a @4 g$ \4 G* ^: u0 ]
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 i# h3 R B( ?* a. l
) m* E4 Y0 b- S1 u: J& P
// 禁用输入同步信号
. ?: q( s `% Q& B& D
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 [7 r, \, q/ U' l% M" P W; l2 T
: {) [7 ~, V9 J z2 _
// 禁用输出同步信号
2 ]5 z5 R" z( _: l1 [
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" e2 d, b0 N- m) H2 K
; f% q* ~. K( b+ N+ F6 E, r, ]! ]
// 仿真(DEBUG)模式行为配置
- n4 J0 X8 P& E* I
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 D% F/ e X" e
& i: U; s O3 @2 e K6 x* u: k
// 配置计数比较器子模块
: p' i# F" C& Z
// 加载比较器 A 值
|( e. d1 v0 U
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 d( r) }. F) W, k/ e
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& q. M1 Q* O9 H8 D( f/ a, D
. S! s6 U F& c8 v* N. S! {
// 加载比较器 B 值
" |2 S& b" [; ]/ P4 J7 U _
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. |- A% j( z2 I9 D
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 C% v' S6 e$ }1 |# u
; M3 ?6 @) J* [
// 功能限定配置(输出引脚触发方式设定)
% n' b4 {0 b3 c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* D) H. j3 C6 V: `5 k, O
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 W C' L' {" I- G0 p% N
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
8 x6 u/ N8 s9 J8 T% G+ l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
1 ]4 [& X5 O/ B# s* R0 [% R
8 z. r/ b9 w& i
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; g, Y1 T% K( U4 X
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* {3 Q7 T! i {( ]0 W/ c% n
4 A, y" {5 l- l# S; [
// 禁用斩波子模块
, r2 x' l, h$ Y6 ^
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: h G! J" v+ l! Q
! ]1 I" ^" S4 t J
// 禁用错误控制事件
! [9 ?+ e0 J* B7 A+ R V' d
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ _. O+ |. [ e* A6 _- i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ l% j/ x7 `% Y C+ O
* }; M) i4 U# c/ W& Z' c7 M3 ]& t9 v
// 事件触发配置
! L: e3 n2 |/ V) l0 y- J
// 每三次事件发生产生中断
% K; ]! G6 t6 e" \
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 Q# @* K1 V; I5 {& x# G
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 H, a9 c. X) v1 |9 ]- ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# K6 U4 o( B( c* E" g$ E
// 使能中断
0 ^ s3 D! `# ]2 D$ @# Y
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- P* y; s5 z- L% s* K: {# \
# C" r7 a6 W$ E# L
// 禁用高精度子模块
7 R7 b4 N5 T( a2 G0 N# E0 [
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
3 ^+ r: Y* G: m6 l7 ?8 `. P# z# _
4 t m: {2 s. }2 F) {) N/ H9 u1 n
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
`6 y3 Y8 P) C9 K
}
1 u2 ^% b$ ^+ [- o
* }- P9 K9 l: l9 [
void ChopperWaveform(void)
2 Z% Q( s9 G1 ]& [2 o! H
{
& I$ r" n Y# L: g7 X
// 50% 占空比
/ _+ o7 S0 D5 T$ d9 B; |6 p
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
% \9 ^, x, Z0 S0 x, F
// 4 分频
& W, \7 j% }$ D6 ]5 M- O
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; }/ L# J) Z8 i, P E3 [, T) b' i* _
// 单个脉冲宽度
, J( e0 @, t6 H% U+ K9 }
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. D. `4 |9 c5 I1 G- B! p" h
// 使能斩波子模块
1 |0 ^% o- X" ^) l+ p6 Q
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. _2 S4 b3 T, _
}
1 q# M; s5 L$ }" Q
- T _9 Y2 z+ o: `% V }. G" \$ |3 Z/ H
/****************************************************************************/
2 l1 m/ e% F3 g6 V( V O5 [( C
/* */
. ^: [9 z. x2 e# G; K
/* PWM 中断初始化 */
0 q" i5 @* y; U3 P9 ~: I2 l
/* */
3 o" F+ P+ p* I) r9 m# i' e0 G& J
/****************************************************************************/
0 h1 H" a0 H/ \7 p. [: s8 p* I
void PWMInterruptInit(void)
: _4 w& A/ k* [4 V5 o w7 ]
{
1 c2 b; w7 X5 y& Z% D! [; Z! F8 E
// 注册中断服务函数
3 @9 o6 f3 B/ S0 x! k) y% J
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
# o, {2 O# P; o4 t7 c# W1 ~6 G( G
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
, E: L. g c" q0 Z7 v
8 s" h! K3 k- a' |6 L5 t7 q
// 映射中断
" y1 @# R( _& V2 M- n. p# p8 U
IntChannelSet(SYS_INT_EHRPWM1, 2);
) I: S! \0 m2 D( }9 o* q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
5 \) D/ ~+ Y: `$ `' o& ?7 Q
* w3 l/ [" U8 D/ ^) o a
// 使能中断
* ^/ m& O' C+ A
IntSystemEnable(SYS_INT_EHRPWM1);
8 r" K2 D/ O" y8 E* a, Y- [* g
IntSystemEnable(SYS_INT_EHRPWM1TZ);
* I! i5 a% ^& n( T1 \, }. {
}
8 Z, y2 i4 {7 q( W8 F
, ]3 I5 q5 A( n1 E, n4 e
/****************************************************************************/
, K K p" c- O
/* */
# ^* C% Y5 C3 w3 Z" B) u
/* ARM 中断初始化 */
4 z& y' w# s& Z
/* */
7 c$ O0 |& _% `5 r2 G5 D; ?% `4 M
/****************************************************************************/
! L: P: N/ m3 I) \# Z( j( G( ?
void InterruptInit(void)
- g% A- Q2 P* |% n; Z7 H8 Z8 U. z `
{
& j: u5 x3 W m4 i/ T& g
// 初始化 ARM 中断控制器
) n0 s8 c' p* X0 t6 w
IntAINTCInit();
* w& j: k' V/ W, N! k" ?% w7 j% a
$ C# V6 f) p. P5 B3 a: \
// 使能 IRQ(CPSR)
) v8 ^! v ~/ v: n9 g+ O
IntMasterIRQEnable();
! u+ [0 {7 R( P9 v a% y
1 a% r7 Z7 t+ h: ?
// 使能中断(AINTC GER)
* M6 X3 y; t) I& p9 @( ^5 g, B8 b
IntGlobalEnable();
4 t0 X5 F$ q) C, J X3 S. \6 {2 l
2 n. s/ ]" ?7 M* Y( A& r
// 使能中断(AINTC HIER)
# r! Q- ^) {5 O/ Z& M
IntIRQEnable();
; J4 ?6 F! M, m+ Q% |
}
$ {& ` l* o8 p; v( D+ W
9 m( g, [/ m+ O" _
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
M% k% H0 C( U4 _# {! H# \
/* */
7 l1 R0 w# H( c( g6 z4 M
/* 中断服务函数 */
! d, S( C) e; p; _/ Y6 J0 u3 q6 k
/* */
9 d5 ]' f5 Z1 N, M! N: \; k
/****************************************************************************/
4 T) G3 `" f& R0 I4 I6 z
void PWMEventIsr(void)
5 ~' r8 b! S" K) S# @) R
{
- T* }2 _0 p% p3 y( E7 x
IntSystemStatusClear(SYS_INT_EHRPWM1);
6 c+ n7 z' C& \5 h+ T6 a
3 _" w* }- z8 `
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ h% D, I/ l3 J V/ j1 q7 F5 @
}
9 A0 ^8 k7 T2 m8 N+ a; I
) A" a& }2 w$ }- k( Y3 ?9 N) c
void PWMTZIsr(void)
8 V1 z: u" U, Z4 T D2 F8 ?
{
3 t* T5 p4 o$ _2 N2 ~+ Q
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 H$ [% i' E1 D5 Q' U; [* h
$ O+ Y7 {. C1 L: L& ]/ @
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 W% R- i) Q4 H! `- G i& C
}
3 |0 }1 H7 [( E& I; Q- I# Y
/ v9 _9 I& x, {7 O0 p
/****************************************************************************/
- D* A6 [& L- }: ~ u& W. ?$ L3 ?& G
/* */
' D; c( t6 W, e- c2 V K
/* 初始化捕获模块 */
0 {% d q! b6 i8 Y. t$ B
/* */
0 y5 Y5 U4 w, ]0 B, f
/****************************************************************************/
) x1 a! ~6 r0 m" v# D* I+ i
void ECAPInit(void)
6 U* K) {+ {( v* K+ y
{
: n, C) k- l( V$ q$ j9 I
/*-----设置 ECCTL1-----*/
8 s& @4 w, o3 A$ }" r7 Y! ^$ D; n8 |
// 使能CAP寄存器装载
8 P/ V0 k4 I9 L
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# n) v7 }5 P& C5 L
// 设置预分频值.
( x9 W3 A4 e T5 D: T+ E
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; P* {$ D2 f( v
// 上升沿触发捕获事件
2 z" C% H/ S$ r
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 c; C7 n1 e# [( Y
// 输入捕获后重新装载计数器值.
% A% O+ I: w; E" u& F
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 _! ]! K1 V5 w4 ?) e
4 \/ l: `* q! E! P& _1 o
/*-----设置 ECCTL2-----*/
2 B" A9 G* a; S9 N
// 连续模式
2 @$ k! I( B( c E& L
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* m6 k3 X( n( H% E8 Y3 D- `3 ?8 R
// ECAP计数器TSCTR持续计数
$ _5 x9 ^- f6 C# Y$ M
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
$ ^; l2 g- P( S" }0 ^
// 禁用同步输出和同步输入
! x' W) E" Y7 S5 I
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: Z% ^* p( A. ^4 X1 [
// 配置 ECAP 2 为 CAPTURE 模式
% a4 ?/ _$ f7 D* ] @" \
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 W. ?/ M: M* B3 v; y
9 d0 g. |4 V5 [7 C3 `5 u9 z% U
// 使能中断
) C2 C4 h" W+ A0 T
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 f% |$ ^) w9 z3 }/ l3 Z
}
% m% {9 u1 x6 z* Q
2 ?% l+ c1 W' |$ E B, G
/****************************************************************************/
( z( I8 h5 M; D+ C$ r
/* */
4 a6 ^2 K2 ] \. h, D" e/ n- y
/* 取得捕获结果 */
: a, j- E0 I2 U, V5 s+ R( _
/* */
5 S& M- ~7 @# Y. V
/****************************************************************************/
* s9 f. I4 a( [
unsigned int ECAPRead(void)
0 h( v# d" M2 O/ r4 [
{
: p. K* u' s, I$ M5 s
unsigned int capvalue;
. W: Y1 ~/ ]5 _9 E _
unsigned long frequency;
; p5 |/ X7 |2 x( v; X ~
! s* C1 r- G8 \9 c% w
// Event1 中断标志
/ M+ X' \6 l- Y0 W8 d* c' [" _
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
$ L: [2 L' W2 I7 y4 q/ X6 p: |
{
! c5 c! L! o/ G
// 取得捕获计数
5 g* C& H, C* e; B) t! s% N% h
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
3 Q, e! Q6 `, d# j6 T0 T
capvalue = ECAPResult.cap1;
$ n: g, C4 P9 ?
7 P0 }3 s9 C! m( z _
// CAPTRUE 模块 228M 时钟主频
/ }9 W$ l# }* q% {
frequency = 228000000/capvalue;
( k2 b' h9 R- }! w8 Z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 Y9 x) P; L* R# t5 L
. w6 h8 i$ c4 B& A0 z( [
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
# c* X' \; C, \3 o* [# G4 I
// IntEventClear(SYS_INT_ECAP2);
7 Q/ b0 k0 z$ D
}
/ q, R. \7 I$ Q& {
return frequency;
& N3 Y+ n6 |1 H( ^; u; x2 B) W. R
}
# x6 F+ W/ Q6 u" p- W
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, C f% e& G; q1 @3 G
[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