嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
( r( c! c9 z8 ]' a3 [! e9 y, f
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
3 U. T/ \+ _+ S! y6 C+ Z. M& Q
/* */
; \2 e; Y- Q, f* o; W
/* 宏定义 */
! W1 n! ]; C6 ~. S0 M
/* */
+ l e+ M2 ~2 f- f3 k
/****************************************************************************/
3 R2 u H' r p+ {8 v
// 软件断点
, r/ G- y! A+ _4 e& N, ]- ~, J
#define SW_BREAKPOINT asm(" SWBP 0 ");
4 c& Y! j' X. @
" E$ g8 r" m! m! l$ p8 h, C. e
// 时钟分频
; E" P( v0 Z1 N1 T
#define CLOCK_DIV_VAL 228
" _% |, y0 r4 ?2 s' u2 d" H7 x
( H# u$ }0 F& H+ u, a3 ]# \
/****************************************************************************/
6 K8 a- M0 n8 X" }( m
/* */
! Q: b% O9 A0 g& H: T+ s
/* 全局变量 */
, O7 z4 h; l# t5 J
/* */
/ m# L# Q9 a1 q2 Y2 s: H$ b
/****************************************************************************/
$ z/ A# T+ V) @! ^2 g. }
ECAPCONTEXT ECAPResult;
9 D4 ^ r. X u: U8 c; T+ S
7 n$ u7 N- R+ n4 y& Q0 t9 u
/****************************************************************************/
$ ~" H t; @# f8 l) D! b, O+ f& z
/* */
' t, ^& @. Y# g' E3 v
/* 函数声明 */
$ C# Y# K2 g9 T. j2 N- f# K
/* */
3 k+ Y8 b, H' Q9 f! B
/****************************************************************************/
5 C! `, E$ o. H6 A
// 外设使能配置
. e& i" Y7 H0 ^ y
void PSCInit(void);
) U6 E+ s, f" `" c
/ \3 C; b* S( b( X. i' d: N' O
// GPIO 管脚复用配置
3 W" L/ P5 l& }" ]4 P
void GPIOBankPinMuxSet();
0 X1 V; A- }8 N3 k4 f
7 f7 B( L2 n$ i6 i8 b
// 产生波形
6 u# y* s) Q; o6 n, K) R7 ?$ @
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
% h+ C* b, r7 A; a$ Y0 ~% \" K
void ChopperWaveform(void);
" H& R& f8 ^$ e- Y) M* C
2 ]* k% L7 H& h& L" K6 W6 c m
// ECAP初始化和读函数
0 V/ ^- T, L& S# o: a9 @! g% ?
void ECAPInit(void);
! S( f7 V l& G, I' Q; {+ q
unsigned int ECAPRead(void);
4 o( o, \. {* Q5 d1 _7 e
' S" i' b* T! o1 j4 W- ~* [
//ARM 中断初始化
0 ] D. |& j/ D; `: {2 X5 w
void InterruptInit(void);
2 l: z6 p5 N, Q0 D: k
7 V# a6 i$ }/ q$ j0 z. B
// PWM 中断初始化
2 z( c* T7 v+ F, a) O
void PWMInterruptInit(void);
5 {' Z2 K# x z' x5 \" @/ `3 Z4 m& E
// 中断服务函数
7 k; s$ e0 z; K" S" b9 U; x: |
// PWM 事件
, e, X8 v, G- a0 E- }
void PWMEventIsr(void);
% e+ {7 F; V& w& d$ l7 z
// PWM 错误控制事件
( a0 L: q1 G+ f) c2 |3 H4 y
void PWMTZIsr(void);
% L7 I5 c8 k& E- _! f- P
_" i4 w! U5 K& q
/****************************************************************************/
/ v2 u* V! [; @* b
/* */
+ a: q( I- }' K, T r H- s
/* 主函数 */
% |. M/ P) e- \( T: K9 x5 \
/* */
0 w W4 Z' H, J* [* j% Q& i
/****************************************************************************/
% ~$ u" Q4 ~/ J* Q
int main(void)
5 l( }) N/ O3 {6 Q% l& c" }4 I1 B
{
' S8 n& j/ o2 x2 U1 I' S
// 外设使能配置
, ~& s2 c9 p4 b5 F O
PSCInit();
1 r; |) b1 D1 m- T
( d' M+ g, ^ o: d' g F$ e0 @
// 初始化串口终端 使用串口2
; Y( ?9 d k5 A0 d8 P
UARTStdioInit();
: i; \+ l2 Q' c, `. l
+ o# j* T+ z0 b' K7 A
// GPIO 管脚复用配置
1 q, x1 |, m' k; S$ O2 W& E4 q( u
GPIOBankPinMuxSet();
7 Z# G8 W+ s# H8 w- T
( [' g" G4 u: I& ~+ Q
// ARM 中断初始化
$ n, ~7 _* R% ?
InterruptInit();
; Q5 Z8 H4 O: s/ e, h
" Q$ r3 Z3 Z$ H; n* R. C
// PWM 中断初始化
' `/ g0 b. Y q
PWMInterruptInit();
5 U* [9 ?& y& i( l) N
: R8 D1 F& V2 b# n) ?; y
unsigned char i;
2 p2 k2 |) \5 F: o( u' J
unsigned int j;
& ~. | i. U( x0 o3 R, b, `: b1 {
' h+ c. q$ ]. Z, z% O$ H& b) R! [
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ n) E& P E9 H- M+ [- O: u
UARTPuts("------------------------------------------------------------\r\n", -1);
3 R+ M9 V' t7 q$ {' W
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
' s: H) w7 w! s* {7 k0 X3 p7 d
// 产生波形
' j P! N8 x6 Z g1 e* _0 S* @
PWM1ABasic(25000,50);
! }! `2 f9 }; Z, P% O4 F
* ]5 m& f$ }/ t1 w5 ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& D4 J' w) }( A8 Z& U, F. r2 u
UARTPuts("------------------------------------------------------------\r\n", -1);
* E8 |% Z K) B. h# [ m1 Z5 _
! r1 Y% q' j6 Y! G) M0 q! Y* n; y
" d9 L9 Q b2 w# P4 d* ]! Z# r
1 t4 W$ o- \9 _6 s0 h: M6 [6 q
UARTPuts("------------------------------------------------------------\r\n", -1);
4 P9 Y3 C" l/ \' y! \
UARTPuts(" C6748 ECAP Test\r\n", -1);
) c c+ r3 _: T5 [5 Q4 W, h
// ECAP 捕获初始化
2 t" Y% K/ [# ]9 V
ECAPInit();
* c' Q3 G/ ?# V% D
UARTPuts("Initialize ECAP.......\r\n",-1);
/ w/ Y5 m3 z( w: H t
for(i=0;i<5;i++)
$ p8 U2 n- w- A+ K8 T2 `
{
- R" _( M7 a% Z3 k: V- c
for(j=0x00FFFFFF;j>0;j--); // 延时
8 x( O7 ]% h n" b. O9 R
ECAPRead();
8 e: N8 N9 P- ?( L
}
/ m) l- `% q: s5 d
UARTPuts("\r\n",-1);
4 v4 y' c. I" \+ A- w0 I
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
& b- Y7 _% ~* V& d8 n
UARTPuts("------------------------------------------------------------\r\n", -1);
# v' a2 P. f$ R3 f
& K# m( S! _ ?' d5 ^, J
// 主循环
& i. @) t4 D8 e/ ]/ D
for(;;)
& j, v5 h& E0 G( |2 w9 M
{
# O* I( P1 T/ }. k0 r
( ~8 ]3 G" {9 C L8 s2 @$ K
}
- w+ D1 D% u* U
}
: v8 ]+ q! L: w1 D4 i1 Y7 u
2 c8 S# m$ i2 b" ^
/****************************************************************************/
2 ]# t# C5 x0 b
/* */
1 R+ m- _+ c0 d9 b8 S
/* PSC 初始化 */
! D6 v: Y5 |2 ~; B% a( x! L9 Z
/* */
' F0 s: {: U8 ^; C+ W; x4 n9 T
/****************************************************************************/
( b+ Z1 c# T% J: j* W( R4 e w
void PSCInit(void)
* |) O# S/ r3 G1 o
{
$ n0 |$ x7 k t
// 使能 EHRPWM 和 ECAP 模块
; }. x) G0 v. D
// 对相应外设模块的使能也可以在 BootLoader 中完成
, \" ~ e, D9 w* _4 \1 e1 I8 s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! l, _) q* o/ `) W# w0 ]4 H# i% G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. t; X) D; R0 P9 `. r& i& I/ ^7 o
}
& Z) ^5 B, W2 z
+ Z# v- i; w2 O1 ]! o+ H G1 b. u
/****************************************************************************/
; V- @# i0 R7 d1 A" R8 y
/* */
2 ~% p4 @( u5 D
/* GPIO 管脚复用配置 */
4 T9 {) H# G" w* |( D# ]1 c+ M/ m
/* */
0 l2 u: y3 N$ z& J
/****************************************************************************/
8 n2 o) P' n8 h' w" K& E6 R
void GPIOBankPinMuxSet(void)
& G) z$ @9 ]% }
{
2 V: [4 b! {+ U/ ]+ S5 k
EHRPWM1PinMuxSetup();
, ~% H+ a- x& M8 ^
H5 Z8 ?1 \3 ]# W
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; b4 j7 K( M; G" j- U7 M6 k+ O
// 作为捕获功能时管脚方向为输入
3 |( `8 P. V Z$ \# q
// 作为辅助脉宽调制时管脚方向为输出
& g9 ~! Y6 w/ e2 B$ p# Q( }( H$ ?
// ECAP2 / APWM2
# B* A7 ]% ~6 U. Q
ECAPPinMuxSetup(2);
8 m1 g7 R7 z' E0 z7 a T
7 K0 m8 }+ q7 n
// ECAP2 / APWM2方向设置为输入
6 n! G6 ?1 E# J$ a
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( r% g4 Z$ G( e7 ]7 k: {' L
}
: r$ [6 p9 k- d
4 b) m; _! ?" ^ i$ u! R' \) X
/****************************************************************************/
& u, P- z2 ?' s2 ]* v; ^
/* */
$ l) t8 k) X4 }( E3 g8 A2 ~! s
/* PWM 输出波形 */
7 G4 |8 ~0 q$ @' ~+ x0 r
/* */
g& M( V7 Q) O; S
/****************************************************************************/
, b: L7 J* x' m; d/ X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; n- D4 v1 _- _. {
{
5 b$ I8 \+ R% p
// 时间基准配置
5 C$ l" c" t1 T3 {0 w0 v0 \
// 时钟配置
$ P* o# D; s5 @% B- {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- j) B& G! [2 {' g6 y' P
( J2 e: ~9 N0 c, Y9 b0 ~. W
// 配置周期
1 G. W+ {& k. U2 d7 U/ Q% P
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
# d, V& m2 ^0 O6 ?
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) ]5 ^- e* R, T, B: u
% b# u/ W( j; P9 v" a
// 禁用输入同步信号
: F0 F) c; E* `
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 r8 `2 T5 m$ Y% [% b
* O: t6 q7 M2 D* y. s
// 禁用输出同步信号
7 ]" z$ {# ~% ^8 ~. h
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
6 V+ {1 D2 D* d. R i$ E
7 P; ?7 m9 |5 {3 b5 Y
// 仿真(DEBUG)模式行为配置
+ ]+ j0 e/ O* s* e
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) N( i: j [6 {! ?3 J
. d$ A S/ B. p' R5 e# L
// 配置计数比较器子模块
$ ?1 y. j+ c2 M9 X+ q
// 加载比较器 A 值
% |8 C' z" \. A( _$ B4 {
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' L9 U" c* W, ~; F7 C. K8 n9 a% U. H
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
A% m: h( G; M6 g
# e5 }$ _8 e2 b! F( s( Z) v# q. D$ C
// 加载比较器 B 值
% x; \' Z* B6 c) a: C- R
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" f. f z) `" C- h. A+ z0 h0 I9 B
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) ` K7 o$ t9 z. h# W
: D* v) d% Z: {8 h- _
// 功能限定配置(输出引脚触发方式设定)
; N% t% a" ]: z: ~& }( E* f! }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, V/ p) G' I& T- t
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 r6 r& A/ X. ^. B7 Q6 w3 D2 F
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 Q' e$ Q! d$ F# p1 r
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
4 z5 |7 T* B% {2 ]" r) I# ]2 s
/ P4 O3 r3 B i$ }* a
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
" X9 W! e( `- l( U) q6 a3 j1 j6 ^
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* T2 z- J8 c# l6 E v# a" Q* A
& X: V. B! T8 w8 m
// 禁用斩波子模块
+ [4 a: a8 ^, @; ?% G
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 Q4 ^7 H6 L4 y( {1 E; b9 j
l6 r( \8 d, u( U6 B+ U j
// 禁用错误控制事件
& a0 i3 a& W0 R1 o0 l9 W2 |
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: X, i/ B8 J' u
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
* {8 w' |# |. q' Y9 Z
& W* l8 f- K0 ] ?" F- n% z
// 事件触发配置
& p8 U. D5 \! N2 W# b) A y) c' ?# t: M
// 每三次事件发生产生中断
6 z' G* \( D7 [- n% J9 e
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 e6 f9 _: f5 N2 h- {; k
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 p! C& i( ]2 L* V' B) K
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 u( U3 _6 {3 U K- {- V- B
// 使能中断
* |7 j$ k) I& ~8 A( p- \! p
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! z: i3 k& P9 F" S9 g
! i" g) l3 J5 P
// 禁用高精度子模块
7 L ^6 a& W! _& u) N
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
4 w# S7 e0 K$ O7 ? X
+ @/ K9 g+ N; ]; ]5 _
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& I; J8 P, @( o0 ^1 z
}
$ G2 k1 C$ J k2 b0 }! L
9 N/ w; _' N7 n
void ChopperWaveform(void)
8 C/ J0 t: D4 o" ^3 f
{
( ` t4 @4 Z! a3 c& d P
// 50% 占空比
- j1 _2 r& {& @- B: b0 i
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
5 s+ b, F* K, G- {1 U
// 4 分频
- E6 R! ]) c6 ^/ j) M! J
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, Q- y' b) ^$ k) J, ^* T
// 单个脉冲宽度
- _, r9 _- ^2 \; ~
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# v4 s0 k3 }% A. t6 q6 k* ?
// 使能斩波子模块
9 f% J. x( |' `/ J, P0 [
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 p, E V- _ K/ K2 d8 I% W
}
1 x# C/ b0 K% o
1 m+ U/ ~6 o7 u
/****************************************************************************/
, y# l( D$ G3 J( K' \
/* */
/ w+ ~4 v) A6 ^
/* PWM 中断初始化 */
. U# k4 H! {. e# y7 T, n: ^
/* */
, u8 j( o" K/ O4 r3 C
/****************************************************************************/
( K/ P( z) P2 U; w# ?0 g7 | ]
void PWMInterruptInit(void)
' {$ j$ |; D3 b* U0 P
{
+ P0 I2 v- N& r5 A
// 注册中断服务函数
8 O: O ~1 K4 l+ W# [
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* v" m+ J% a: V* x/ k. H8 z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- [# w/ `4 Q8 ]0 `
' H# ?7 N3 n8 R1 v
// 映射中断
3 p. a* F0 {/ s }: D: |7 \
IntChannelSet(SYS_INT_EHRPWM1, 2);
! l! [4 T8 f( T% {. L
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# k' U* Q# h5 l: H
' J( h+ V- D9 s- _+ u
// 使能中断
' T: o+ {, @. g3 p' @3 Z5 H! Q
IntSystemEnable(SYS_INT_EHRPWM1);
/ z; T0 X4 X- f2 S) ~7 |9 E
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; b9 L- D7 G1 C& V# T6 @3 U
}
: y9 g. R# r y9 J+ r# O4 w
I3 H9 z2 v" q7 n0 b
/****************************************************************************/
/ S6 J0 m6 Z) E: I h
/* */
3 j7 R6 O# {* `" e5 P4 T" h3 B
/* ARM 中断初始化 */
7 F0 ?7 C, v4 d
/* */
, t) M) V2 r! f$ w. x' I
/****************************************************************************/
9 i6 P/ l" z4 o% @
void InterruptInit(void)
7 E' k9 N! h+ H7 |! g
{
7 Q- W( }* {/ z( @- N( t- E, L
// 初始化 ARM 中断控制器
1 ?/ [$ t/ @4 o% W9 ]$ _
IntAINTCInit();
; `" F& ?7 {& E
! s0 [* n* t+ w1 J5 r, w/ v$ u- s
// 使能 IRQ(CPSR)
$ i: _5 l8 M+ B
IntMasterIRQEnable();
5 e1 m N! c+ H
# I0 h" L$ m6 M# g+ V9 A& V% v# J% ~
// 使能中断(AINTC GER)
9 k2 C3 O& I9 v" X
IntGlobalEnable();
/ n8 ]( d* M; |& Z
/ Q4 R, b7 n, X
// 使能中断(AINTC HIER)
) ?/ U/ ~6 R2 Q C' S
IntIRQEnable();
! ` S" D& V. R
}
- E3 K2 c' k) R' l! d& B
' v/ ~% V4 h) ~$ S
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& n3 ^( d7 X6 \+ s% N- z8 j! b/ J
/* */
' V" J) z+ X9 L: h4 j# L; h& O
/* 中断服务函数 */
5 X2 v; M' ?4 Q! N! L5 ~
/* */
% a, j% V, P$ R0 [; j
/****************************************************************************/
' Q* `4 R- i) f' u f }
void PWMEventIsr(void)
$ u: h3 y8 G# m! T8 a5 ? D
{
6 A! W/ Y' K& n3 H
IntSystemStatusClear(SYS_INT_EHRPWM1);
& |! ~5 O3 E- h# u- Q2 G9 F
3 Q$ l" `, v. [. \3 \
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
$ m% b1 h; Q' H/ V/ t3 J. _9 D
}
& @( V ~$ {0 {! I0 i
5 a1 Y& I5 P0 l/ h' J
void PWMTZIsr(void)
! e% k7 I, S0 ~8 b2 D
{
9 k ?( N8 [& r* x
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
6 _! i/ X% w$ Z* D; X
1 A {" \ p# T$ }8 F0 _$ z
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; y/ C" ]6 p& H0 d4 i
}
2 B' d6 P# R8 }) I3 P
. y, T7 C1 ]. o; t+ E; {! Y
/****************************************************************************/
% M) P3 k3 \' B7 ^& H
/* */
6 t6 |6 c0 C9 p7 }$ V* G0 q
/* 初始化捕获模块 */
" F2 `' S' s3 |) w, X
/* */
' Q1 b5 C4 u# c, f6 _+ P
/****************************************************************************/
5 I, l3 D4 F; e( I- O6 u& J( d+ c
void ECAPInit(void)
5 h- T0 I& d4 ^# I& m: S5 l, ]
{
( Z* q/ S% m% q9 `8 x
/*-----设置 ECCTL1-----*/
" L" V3 u4 e) G' v9 H1 K
// 使能CAP寄存器装载
: V j2 M2 E) f& `* ]) \$ L
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
l4 S: m; s4 ]% a
// 设置预分频值.
5 @# A/ _0 q r5 t+ F$ R
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
/ T4 n( ^$ \4 i! J5 a7 N3 g
// 上升沿触发捕获事件
l; O- }- c2 J0 c! T
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
* g0 n' d8 W ~
// 输入捕获后重新装载计数器值.
5 H Z. I4 A) H! B3 ?5 V' N7 Y
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
, S( @5 _/ j1 W K
# q# l k6 t& u3 m( M
/*-----设置 ECCTL2-----*/
: a# p; i: {! O7 J# F
// 连续模式
4 P" ^7 ^- F2 u, t* v
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
8 y/ [. l+ E8 j' s; S# q9 K N" K
// ECAP计数器TSCTR持续计数
% T4 r1 |3 a7 v4 A+ f B8 `3 {
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 `% N3 | q9 _* `
// 禁用同步输出和同步输入
8 H' p+ j9 L5 l4 F W( r( `6 |9 C; x
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
$ U# b% f! Q% R) A
// 配置 ECAP 2 为 CAPTURE 模式
P! ~" N& z6 D8 h% B6 y; v
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
! q1 P0 e1 d/ E' _( w+ c3 X, w
3 {. O% E% n* D& Q7 B
// 使能中断
2 E. U$ ?# O H
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 {8 k; O- X( m, \7 _! r0 F9 \" O$ z
}
6 `, y! R/ }/ \- k; u
3 [! B' }% e4 l( s% q
/****************************************************************************/
. R$ x# S; M5 f4 j7 p' h
/* */
: r0 u" V. U- Z6 T0 }& P8 p
/* 取得捕获结果 */
2 w1 \. u$ b0 A( p5 M
/* */
$ f8 X. S6 k5 T' U& u6 [/ v
/****************************************************************************/
+ x7 @ W$ W `
unsigned int ECAPRead(void)
+ W6 y# {* j2 j2 V: c5 y- ~
{
* c j9 A; m0 ^7 u0 @& U
unsigned int capvalue;
9 T: ]- H- _8 K+ ~ g5 l) w
unsigned long frequency;
8 `, j. n8 L. |5 C7 n% _
$ F! C4 D! M3 s
// Event1 中断标志
. h2 ]8 A3 A, U* h v
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
' \% r) Z% [! q- b0 V
{
/ X+ c9 j1 C+ t$ {+ [8 v% l
// 取得捕获计数
. b$ z: u; z- k4 }
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 y4 S: }5 r8 _' o `) \
capvalue = ECAPResult.cap1;
+ K9 g. A0 ~8 L
9 g4 e( I0 }+ k6 @% e. j
// CAPTRUE 模块 228M 时钟主频
: L* f1 D9 H' E8 x: C- A$ T3 M
frequency = 228000000/capvalue;
0 I/ Z3 X" x6 R; z7 t3 @. ]( a
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
^5 h" u; R: q2 @1 }
* F' ^/ `& \3 S0 i2 G0 l
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
5 Z) U1 v0 @2 L% {
// IntEventClear(SYS_INT_ECAP2);
; u" t" F4 u8 C: E
}
8 ~' J8 A" g8 ]+ d& Z! [+ ^
return frequency;
: L/ _8 Q! G$ q7 ~* H; {! N% V; W6 {
}
4 O0 O2 a/ F. e
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) {+ Y/ @2 E3 r# }# G8 E/ w5 |2 y0 w
[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