嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& {/ H% n8 V f! ]4 _
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ F3 b" L: G8 t* F* h
/* */
! z# `/ y0 a& d4 J. e
/* 宏定义 */
" P! ^2 ?5 y& D7 K
/* */
- }+ [6 ^; p r7 o, i8 Z
/****************************************************************************/
" M7 ?3 P L$ f
// 软件断点
' w) P& _/ `9 |( _0 g5 m1 P2 `4 b
#define SW_BREAKPOINT asm(" SWBP 0 ");
. g. T% w* l6 N) L L8 o! N
. w/ T: S2 } A
// 时钟分频
( s( {& k/ ?: B
#define CLOCK_DIV_VAL 228
/ v" w4 U6 p2 Y; B: k" i
1 O( e# ^8 i$ Q) S: i0 l4 @
/****************************************************************************/
# D$ ~ a# }- o3 P! P! R
/* */
) v8 r3 q8 H( i. g& r4 L5 Z
/* 全局变量 */
) @$ m( o7 k0 n- t0 D+ q& m1 l; r7 v
/* */
8 o# c5 d# y Z/ o' \
/****************************************************************************/
+ ]. D( v) Y# Z3 g/ b
ECAPCONTEXT ECAPResult;
1 Z' t" ]( j4 r- S
8 @; B5 K' k$ o4 f! C# R: v
/****************************************************************************/
4 k, \- _' Q/ y7 A: s* l
/* */
$ J3 P! p9 L0 q! }
/* 函数声明 */
! _# N T7 Z3 V, V: q7 p
/* */
6 A3 d- q: g% C3 \" o
/****************************************************************************/
2 T% t% v$ d9 e+ u* F2 R
// 外设使能配置
Y; |+ l# r% e J' Z' t& f
void PSCInit(void);
4 d4 { T+ b1 b q8 m; d. C# f
& W% T# K1 L' [! L& c# R
// GPIO 管脚复用配置
+ p3 F4 X+ }7 e8 ]) }' X, X3 d; t
void GPIOBankPinMuxSet();
$ a0 \: r" F; _4 [2 m' D; m
0 A5 B! _( I- E1 L' U
// 产生波形
9 g) P* N; q" F0 {! \ M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 s% g1 C/ ]4 X' P O' ^
void ChopperWaveform(void);
. w8 S }& g2 N u% j
1 z) F* a4 m$ A+ c# Y6 F
// ECAP初始化和读函数
( d' B; n& w! p) Y+ _
void ECAPInit(void);
! \ }& }3 ]! Q* p J k7 [
unsigned int ECAPRead(void);
E2 x0 E& s' ?
( A$ `2 e3 x: L) ]
//ARM 中断初始化
% X# {5 M; t8 R& p/ `
void InterruptInit(void);
; r6 L% b7 p6 _
0 X) B+ V, I3 _
// PWM 中断初始化
4 {2 ?1 u2 K: d6 x
void PWMInterruptInit(void);
~# x i4 H7 z8 S! `$ ~
// 中断服务函数
1 O9 L4 p1 V5 X; S9 ]
// PWM 事件
% r( Q8 [& _$ }4 T/ c% y! z) F
void PWMEventIsr(void);
) O! y: _( X$ [3 S
// PWM 错误控制事件
) f( C0 @4 s) U: S1 [
void PWMTZIsr(void);
9 W7 r: V, k" d! y* ?* z
! \. S& F4 N {3 r% t% N
/****************************************************************************/
) k. @# Z* l! V% V! l2 A1 e( P
/* */
; X. b7 Q/ j# C% l/ t
/* 主函数 */
+ P( q' Y9 K a0 M6 o# N0 [2 i
/* */
, r" r( a3 \4 v, W
/****************************************************************************/
# z: G4 P: f4 \. S f" y" z# v" q
int main(void)
, s. D+ r6 A. B
{
, F2 ?; Q6 ?8 t
// 外设使能配置
9 O3 Z1 G- n/ T
PSCInit();
0 M6 U, y# s1 d% |
9 Q0 ~4 H7 F, Y: ~
// 初始化串口终端 使用串口2
9 T7 [! w8 b2 |& C9 H4 P6 U) W
UARTStdioInit();
2 o s5 g# [$ F' P. `" z, ^
. |$ | | j ]+ M5 K
// GPIO 管脚复用配置
5 L# {+ m( n, `& G
GPIOBankPinMuxSet();
, q ]4 J6 L$ y' Y
' ~1 g8 P5 ?" K/ X3 u
// ARM 中断初始化
1 ]9 t. P% H, a) V4 Q* Z+ N8 L
InterruptInit();
6 W( P, q$ U3 d+ B' E. }
8 R( e0 v1 S8 o2 M! M
// PWM 中断初始化
/ I% s& D4 ]) K, J
PWMInterruptInit();
% c% Y+ A/ V$ u0 {. Q$ L7 m
# a7 [; P$ j$ Q4 o
unsigned char i;
6 F1 `. X" I$ M5 z, u0 E
unsigned int j;
* z$ s) G/ N, V0 _" F
# H9 W* y# O% @9 `* F8 ^& D2 _
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' A6 D/ A8 a7 l6 ]
UARTPuts("------------------------------------------------------------\r\n", -1);
# m* C4 f& q- `7 {
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% q+ m8 Z& p3 p5 G" t
// 产生波形
/ v `* ?" s" `; T/ P
PWM1ABasic(25000,50);
4 k: Y) t4 q9 s/ u9 Q
* o. C8 ~1 s: }. z4 W& R- k
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 q( Z Q" S5 D/ O% F: x( Y9 }" x
UARTPuts("------------------------------------------------------------\r\n", -1);
' S& z u1 G; u1 A% D {" W' l, [( {# O
, J( ?: S( z8 E
. o3 a5 P( n1 j
5 f, b, }# K" g# `
UARTPuts("------------------------------------------------------------\r\n", -1);
$ B& z! _" j" i" v% u* o
UARTPuts(" C6748 ECAP Test\r\n", -1);
- ^6 w" t4 X( t3 G1 c6 u
// ECAP 捕获初始化
, X0 E- {8 W+ K3 T3 |6 H; N
ECAPInit();
8 |$ A: e, q. b4 }0 P8 }; n) A
UARTPuts("Initialize ECAP.......\r\n",-1);
: A- D/ K l" H0 g+ i( ?) C: O
for(i=0;i<5;i++)
$ z$ i( |7 I# f2 a; ]- o; T* ?$ ?
{
) j: R9 N2 z! j/ Z- x& l" X
for(j=0x00FFFFFF;j>0;j--); // 延时
* C5 N6 J/ @ `& x, k
ECAPRead();
) @$ ^0 X% I+ k; E
}
$ w! ]1 D# g. C0 c& K
UARTPuts("\r\n",-1);
/ }+ ~- H6 }$ t
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
2 P1 O" ?* N& n
UARTPuts("------------------------------------------------------------\r\n", -1);
; a7 n) C- f0 Y4 y3 f# B
% b( c1 U/ J9 [4 u7 T5 p; c
// 主循环
$ @% K+ |5 b6 F; `4 S+ ]
for(;;)
- X7 C% K4 x" a2 D1 u+ M: ~
{
( H' c" y6 _7 @1 f, ~
: \) C& \- ~" t( P$ @ P2 t
}
6 [7 S; v1 T+ d) I1 ?/ S, x" g1 I0 A
}
" j& D5 d4 k1 c+ e6 o+ n# S
- r b% Q9 X* L* |( o
/****************************************************************************/
0 C \& Y+ ]4 Z1 D Q
/* */
: z' S- A! x9 a. S, F9 x$ m
/* PSC 初始化 */
7 v! ], k5 h* \& m, L
/* */
: S2 p9 y5 N* J& r0 M& ]* n
/****************************************************************************/
" \1 S+ P, C* L
void PSCInit(void)
( Z U) o& j5 x. \; Y( t
{
& s! I+ h2 s: H8 m* @, k& u
// 使能 EHRPWM 和 ECAP 模块
) O7 {6 V, x+ o: S2 X
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ R2 j6 ]1 Z( }) R3 F b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 d/ ^$ \# L$ S: |/ F1 {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- h6 E+ A8 I) k
}
! Z3 h% A9 T( x8 I( D+ O6 Z
& r' k: H1 H& v/ U# j( }, A
/****************************************************************************/
# b' f0 y4 W% Z$ |8 U2 O- [4 h
/* */
6 Z+ H! C- {8 f2 f$ L4 \* W
/* GPIO 管脚复用配置 */
( b8 @- z2 f; l, f
/* */
1 F; |) |. z/ k4 Z7 C# N( d
/****************************************************************************/
, d) t7 K% B* N: O. j z
void GPIOBankPinMuxSet(void)
1 v8 [. \: O$ `+ \5 }
{
6 C% n" s. [! B5 C$ y
EHRPWM1PinMuxSetup();
3 U# i/ F4 R* u% J: B
( G4 A% H# ? G- C0 L4 Z
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* F! a: {9 @% W' ]7 l* [$ S
// 作为捕获功能时管脚方向为输入
4 t" ]6 h- x* f) U: V {+ Z- K
// 作为辅助脉宽调制时管脚方向为输出
G0 d( b R* I# }" i( j
// ECAP2 / APWM2
, q! ?* |9 D3 Y" l) r0 i6 S* t1 v
ECAPPinMuxSetup(2);
- t" ^& u# l- _ a
6 Y/ l- V) b9 h) ~3 U4 H1 a7 j
// ECAP2 / APWM2方向设置为输入
$ h: g! q# h3 C: T( i" p' u: f
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
2 |0 u# m% H* a% }; s, X; w
}
9 f* P# G/ e9 D$ H6 _
/ Q( i P, i' T, x# u7 x
/****************************************************************************/
# j/ i. b4 p8 b' r8 [
/* */
9 G5 L* h! A1 u. O5 g
/* PWM 输出波形 */
5 d" M- g1 M0 I+ A ^6 f/ _" S: m7 g6 g8 M
/* */
: E. p% [( V% ]0 \6 q+ k6 I
/****************************************************************************/
9 o; J% |+ u7 w3 `) l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( @% w8 T" V6 L) g; a
{
" V8 N: b8 `! X6 h
// 时间基准配置
x Z8 r+ i+ h- `- r9 H; |
// 时钟配置
# w. M. {/ K! ?& ?& G
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
3 E2 O0 d5 W8 Q/ T) W
! P# S6 G$ o2 g+ |1 G
// 配置周期
1 ~7 b: M- G+ S; _
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' z5 h; l! Q0 r, r- ~) D
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- z& X: r( e( Y6 P
' ?4 e8 {' I8 U+ i
// 禁用输入同步信号
% i8 ?( u; ]8 g3 p: A$ }" e
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* o- m: G. Q& H6 Q" X3 z
( U5 E) \. J9 u: j" ^
// 禁用输出同步信号
7 s$ e; G9 \2 l8 o) ]9 x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( _- t# r; M, y4 ~6 \% o
& K. Y# x V) w8 h9 y6 ~: j
// 仿真(DEBUG)模式行为配置
0 J. K: \: ^) b9 n' ^
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 j }; x: u/ K& h; x
9 k. V( r+ V# \" _8 W- D: a
// 配置计数比较器子模块
}: m% {4 V) S( a0 n" S( G
// 加载比较器 A 值
1 E+ w2 `! O: I5 i; h% H3 R J
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 M7 ?9 M: G- Z, @, {1 v* q
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ o) k4 J; }( o E& c0 `+ j2 g
3 }6 Y4 @# M- _$ |8 H
// 加载比较器 B 值
- N* K* b9 N; {# F
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; t) b' B9 N) N0 E% v. ^1 b+ B& _
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 q0 h a' k$ S4 y9 }* q( N
4 n3 u2 G% G4 U9 `' g& N6 ? L6 S
// 功能限定配置(输出引脚触发方式设定)
$ h9 Y4 x) r) [, B; Z+ }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
$ ~- N$ L5 [3 }3 X6 M
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
% a4 r q+ t1 E3 L- \+ b$ z( R5 q1 L1 t
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
. O$ _. L4 D7 X4 A! {; c
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- E' T6 ^( M1 t3 f" @% b1 v, p5 L
0 h+ c) Y0 K x( ?5 L/ @
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
1 g5 k+ `- F t
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ x, K! C n }: `
9 p) R) {5 Y& P' D" O
// 禁用斩波子模块
) l0 O2 v. L9 D7 E0 _
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; b6 B6 |" d7 n/ k, i
# C5 {4 p: L/ K$ h$ G0 {
// 禁用错误控制事件
" Z& b3 s. j# P7 e
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 z( p0 t0 M' T) T4 H6 I9 e: a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! u. c% Q0 X \! P2 [) ^/ ~
/ ~2 K0 R5 K2 T
// 事件触发配置
9 L- Y$ P# t7 f7 N2 n5 i
// 每三次事件发生产生中断
1 Y) I* R3 ^( j" b1 q3 _
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. X/ ~$ w& B7 [# A
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. V! [- z3 U8 I
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 S! d' {% w4 B( t" V% t* Z
// 使能中断
7 s; V' n4 y3 }8 T0 ~! ~
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) C7 K5 Z* h) I) I
: Z! \" A0 e; Z9 P" f5 ?8 M7 X
// 禁用高精度子模块
* d: m) Q) c- O
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& y: Z/ b" U0 f/ b
# ~5 k v2 C* T k* j
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ `7 f5 A" r d
}
$ u e1 @# q# [" I
4 M: T4 Q/ d8 w& o# F
void ChopperWaveform(void)
: m5 |: W4 Q( L& R/ _7 X
{
: i) F) t X, s& w& L+ F
// 50% 占空比
% f+ N1 R1 j6 [# T6 x; Q: r) R
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" b5 V- b: N* q$ o
// 4 分频
- n% @ X! j5 L: x- T' W/ U9 J
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: q) {% K$ C5 p/ `
// 单个脉冲宽度
+ o( O- n; k- s- N" }. n) B% o
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 d& M8 i+ D4 {0 L2 _: b
// 使能斩波子模块
0 F4 U @1 T( @% D" E! z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ p! ]! X( W: f" S; q4 b9 q) ?
}
6 p: Y: b- W( X8 \, ]
" u# `$ r C4 y8 [5 D1 F
/****************************************************************************/
2 ~6 p' u* {5 Y/ u# X' U
/* */
; T# \* D+ o3 \8 ?( b
/* PWM 中断初始化 */
7 F4 ]/ G" |4 P, s: a1 }
/* */
/ f; J' A" m1 E I6 W* d
/****************************************************************************/
: P: `- {9 r: J& U+ N
void PWMInterruptInit(void)
/ C; n+ G4 a( ]+ S4 u3 X
{
" E6 Q* Q' _ q- B: a. N4 ?5 f
// 注册中断服务函数
' t7 s1 v/ k: D2 @
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' L& q0 N" H$ k) B$ J, ]
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 q# l0 x6 v/ f: G `4 C
: `2 X/ u8 W9 H, n1 j
// 映射中断
# c' r/ W/ N" R( G: N5 }& N" x
IntChannelSet(SYS_INT_EHRPWM1, 2);
7 a j0 ?2 |) W) v, L
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& E/ G/ a/ U5 u, v( N
/ T* S9 [& J8 R m6 y1 M; u% T
// 使能中断
" D& X5 i7 K4 k$ m. x) C1 l) Q
IntSystemEnable(SYS_INT_EHRPWM1);
1 |8 m' A: ~+ ?' f, z o
IntSystemEnable(SYS_INT_EHRPWM1TZ);
( I% g1 K9 b$ p5 U
}
4 V9 _0 o: O+ m5 P' Q4 b7 A
) o4 D/ B* p# ], J3 W
/****************************************************************************/
5 N3 D( d: _; d `7 ~" Z& h" K5 s2 x/ F( t
/* */
1 ~4 H# d$ V% P; H" P# n% ?. g
/* ARM 中断初始化 */
8 g& k2 \& y' I9 p, C3 n \; N/ |
/* */
8 `, U! u9 S' A. s* N9 `: `" a
/****************************************************************************/
\' R8 D9 z* _' H1 z5 ~, d) G
void InterruptInit(void)
6 I- B7 M' P! W( |
{
Z" S7 j. `1 T1 m" E3 q0 b+ \
// 初始化 ARM 中断控制器
& r( [8 n/ v0 X* }3 h- }
IntAINTCInit();
, |! P. ?/ r/ }" \. y
+ W/ p! B$ R/ Z5 H
// 使能 IRQ(CPSR)
) x+ w4 G' X3 O) B. M3 B
IntMasterIRQEnable();
+ ]* k6 X- W5 g4 _1 M$ }4 L
& Z9 ?/ ^7 b X% x1 V# c. B6 q
// 使能中断(AINTC GER)
+ _+ y! E) x9 }2 O o; S
IntGlobalEnable();
) u9 e% T8 Q5 y, R. U( o
6 \6 @) e. P8 t# e
// 使能中断(AINTC HIER)
& |6 [ z: P3 c4 Q2 M% F6 Z
IntIRQEnable();
) C& W! ~- s# m7 B5 ^/ V: l0 ? G+ \
}
) F. ^* U+ G1 o5 d3 O
9 k# _" Q. ?- n6 [
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" @- ]/ \" F- K8 r" |
/* */
* G- \8 ?5 @8 \. U& M
/* 中断服务函数 */
7 v- p' _2 v O5 \
/* */
' A: H; O; }( z5 }! r3 Q# t: W+ N2 u% r
/****************************************************************************/
$ d4 N3 g1 i5 E' e4 l. G) ?/ X1 Q
void PWMEventIsr(void)
/ r6 o3 D& o2 e ?0 v1 [; b
{
2 F! c9 c2 j/ ^' ?! q) X
IntSystemStatusClear(SYS_INT_EHRPWM1);
% b; \ v* S1 G9 c" r$ x6 N, w
3 F6 M$ X" [5 w9 V2 H) |
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" _+ h4 i) n! F3 H, X# }
}
% l7 x. f6 K8 ~6 F: ?
' N* X& d8 O% L9 k; ^$ M5 z
void PWMTZIsr(void)
; i8 ]6 Y9 q; q- G2 m
{
1 {% S) [# N& K) J+ c2 I0 I3 X( W0 i
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 f- E% m* B' X. R
3 v% l2 p' E8 f, [
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' k* h" ?& y' b5 P1 K. V" ?& J
}
! u2 y2 W0 c4 k% ^( Y8 _+ n
" R! {: n, e. { e' `
/****************************************************************************/
7 f* I, E5 M3 G& g
/* */
$ E; ^: d3 J, Z' U7 ]( i2 z
/* 初始化捕获模块 */
) J" [5 N* f0 }4 E4 K
/* */
* K7 ]5 _% v# Q1 m- I6 r6 y k
/****************************************************************************/
: t' w5 D/ O0 }) }4 n' R+ s" G
void ECAPInit(void)
?6 C2 _! A4 N2 u
{
% s( a& _- ?9 m1 H8 @ \( S
/*-----设置 ECCTL1-----*/
! J% n! O. ^/ ?/ g1 A3 z
// 使能CAP寄存器装载
8 D$ K' Q8 a A2 O! g! r' K! \/ i
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ d( z$ o0 \' i/ t
// 设置预分频值.
- S3 g" u5 S. p5 }
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; ?. n9 B- T# V4 ~* Z+ V
// 上升沿触发捕获事件
2 f$ ~* w: B' {* k0 p& h" ~% e5 T i
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 Z) Z: a9 c% k3 f
// 输入捕获后重新装载计数器值.
, b8 X% E) Q9 y1 e! w. O/ h( {' I
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
3 k$ ^5 U$ d4 m) C0 _
. q. v! E; h8 z0 F
/*-----设置 ECCTL2-----*/
0 D1 V: D, F1 ~ b
// 连续模式
. G J( U* ^6 F- U, [1 T( k% T
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
& e( F; c6 n; ^# p+ c, a/ `
// ECAP计数器TSCTR持续计数
0 X; G* _6 U" j9 K: T6 V8 w
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
" G/ f0 q. B/ G) o0 s' k( R8 T
// 禁用同步输出和同步输入
1 T% v" P+ n! k4 K) l" ^
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
8 n, T" Q; r& v0 B! G- c
// 配置 ECAP 2 为 CAPTURE 模式
% `4 f, @, J, a, h w! ]" |
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
" B& w! l7 h6 A# C- e
# E1 l8 s4 R9 d/ q; ~! I
// 使能中断
j* J: w* Y; B" {. r# k( y
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- e% B: u" V _/ H( N
}
% v7 g, ^7 w' L. F0 ]
: Y7 e0 y2 r# ]! l8 j' E( ~, Y9 \2 b/ b
/****************************************************************************/
& ^5 T7 m5 \* p: T; G; K
/* */
/ T8 r$ S# ?. D/ D) a
/* 取得捕获结果 */
1 V: Q8 }% v6 b+ H2 w$ }3 L
/* */
P3 o% l1 R$ x3 T" D
/****************************************************************************/
3 E- G$ H& P% M# i; R5 a
unsigned int ECAPRead(void)
* f2 @7 V( G V' B' L G h; z
{
; r1 L3 I2 y6 A
unsigned int capvalue;
1 M# `. _* l0 Z' e- w) h
unsigned long frequency;
' U* B }) ^& r3 Y' n) U0 j& l
8 f6 i1 i: j8 M U7 a' a
// Event1 中断标志
" ]* c b% [- M$ G! s; [6 n- \
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
: k: T* F% t% b2 Q2 z6 S {
{
3 v& [7 J8 [ c
// 取得捕获计数
5 _/ d* D9 J- I
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! p7 s* a# b" J/ E& P: {
capvalue = ECAPResult.cap1;
5 f1 K3 e) ~# n4 w! z7 Q$ M/ L
- @' m, g0 K( l, N6 u. q
// CAPTRUE 模块 228M 时钟主频
. a& i# @$ l* g9 [: y* }
frequency = 228000000/capvalue;
4 ?( ?1 E7 d9 ?) S5 l8 ]: b3 o
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ ?0 F3 g0 J. t" T
, N- D1 J3 {! p$ @- }
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
0 t2 A$ r: W5 i3 l8 m+ w; T% R2 g
// IntEventClear(SYS_INT_ECAP2);
' ]9 ~) D7 t* v* C2 p- Z
}
4 ~" n: y9 N# d/ Q1 O
return frequency;
9 g4 K* t1 t. Q; y) M
}
- n# |0 g& a6 L' {' f
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
0 n' V2 Z+ f$ n2 [$ r8 U$ t
[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