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