嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
0 P+ m! y( U8 m0 p5 A. F' W+ _
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
- L% Y6 q. |* B! |( K+ | d
/* */
8 o: g2 K' W7 D2 e1 e x
/* 宏定义 */
T+ T; Y2 \& @: y, b. T
/* */
; l9 n. g0 P; R0 z6 y
/****************************************************************************/
% x* N T4 A4 W
// 软件断点
4 K: {* |, p: d6 E$ _
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 x; F5 ]/ S1 o1 Z& a7 W
! J% V2 m3 g' |' k2 @& t" n
// 时钟分频
! s5 f$ |" Y# Z& K6 r* B: C0 A5 b
#define CLOCK_DIV_VAL 228
" a* M+ V* N# s) P' n3 L
' o- i4 h3 B$ k) ]$ p9 b
/****************************************************************************/
\" S7 I5 C7 K/ Z8 X3 |* Z b" z4 |
/* */
7 a; Z' T" t5 f+ b5 L- X' Q! p
/* 全局变量 */
6 H$ p0 e' ?' Y o0 H' a/ e+ [. ~
/* */
* }: L0 p8 I% D- j, e, U/ x
/****************************************************************************/
- I$ g- R5 P) q' |, c( R# b1 R% K
ECAPCONTEXT ECAPResult;
1 q9 o1 P% s8 i3 W, w; p- U5 e
: t- ~5 Z- j5 r! Y" @1 p
/****************************************************************************/
: ]" M9 \9 J0 [: U1 B
/* */
, i% P0 z2 ^6 a/ l
/* 函数声明 */
$ u; b: C0 f1 r, H
/* */
: X( z# X, z& c1 T! G j) Q. @
/****************************************************************************/
" s. }/ V5 Q: l7 C, x9 J
// 外设使能配置
" N- ^# s; q! _7 G
void PSCInit(void);
( s! ?( V @& H' q+ e; t0 Z, G
, K; V j8 I' }
// GPIO 管脚复用配置
2 Z) \; X, s4 w1 N9 \0 e
void GPIOBankPinMuxSet();
# X# O" d! u/ a) @9 q( S3 [
# M% L' D( w A( d
// 产生波形
2 U; v1 W' k8 g
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 p' C! y8 U* G' ~
void ChopperWaveform(void);
' P0 n# W' _6 B; ?, R! K
2 Y! _3 |, L5 z+ j t
// ECAP初始化和读函数
) E/ V1 P; P5 w+ e: \ ^6 ]6 j
void ECAPInit(void);
& ?3 p5 h$ |) N. _
unsigned int ECAPRead(void);
1 D8 Z# v: X) a
; y* x4 E" E% T, i8 C
//ARM 中断初始化
) c F2 G8 W$ R! |
void InterruptInit(void);
6 g% B3 Y! j4 Z7 Q5 \% q
# i+ Q& W4 h2 A0 a3 w Y2 B
// PWM 中断初始化
; A6 k5 }( B0 B I3 x* z0 R6 ?
void PWMInterruptInit(void);
5 X9 ~0 b- J% n5 ~ P0 L5 B: V1 d
// 中断服务函数
3 J, X; E6 B: p) u: h6 z
// PWM 事件
5 C# q1 l) V/ Z9 V u4 f2 X. {) O
void PWMEventIsr(void);
2 a: Y! r# o& y0 \/ J9 D
// PWM 错误控制事件
* Y: J4 c& k0 _
void PWMTZIsr(void);
( _) T" x) B2 n3 h) B: y5 \0 ]
- G) Z. w1 t& E& e( o. @& \
/****************************************************************************/
4 t2 x3 j1 }% _* `# p! m
/* */
4 l/ h6 X. D1 N1 [6 `3 X: E5 m
/* 主函数 */
4 V! `) r, K; {- ?' M' x/ z
/* */
; {& [7 _3 }" ^6 [7 B" Z% f+ V9 d
/****************************************************************************/
. l6 K# Y! }& x8 o1 d: j/ g
int main(void)
: a2 X. X" t8 m6 t
{
' E0 N/ C* C a6 l
// 外设使能配置
1 a9 S- R3 `, r" K6 O
PSCInit();
/ U9 U) _6 F; i: p6 u# W0 k
4 C) `; d+ J$ B
// 初始化串口终端 使用串口2
% W8 M( D" ? _
UARTStdioInit();
$ ~* M8 K9 g( I+ ~/ U1 k$ P
" q' ^% m+ T! {( s8 v
// GPIO 管脚复用配置
( a3 J4 d+ H( M1 P h
GPIOBankPinMuxSet();
8 e3 I! Q- F6 X ^- S1 `
# M- @/ Y, m- S( r; z) P a/ N! u
// ARM 中断初始化
( [, {) j/ z' \2 a8 T7 ?
InterruptInit();
$ g& r# Z. J, i1 v
2 @% o$ r1 ?$ [/ `0 T [! J- u) I
// PWM 中断初始化
/ L- [2 U) Y& T0 @4 J: H, N
PWMInterruptInit();
' z/ q" V: x" n- O$ a, q
- ^! L- R9 p! D1 q8 i2 O2 K
unsigned char i;
4 X1 p3 J# b& i7 U; Y2 l* S
unsigned int j;
/ ^, C# }3 q. h
& u# q4 K2 q6 S3 ]( U
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 j! H D( x$ O+ v
UARTPuts("------------------------------------------------------------\r\n", -1);
0 y6 }; W( I9 G/ q$ g; s1 t8 \( w
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
* Z! ~9 `2 c/ L% y7 K/ l
// 产生波形
0 z( H# C o6 n9 e
PWM1ABasic(25000,50);
* k3 k& E5 _/ n9 ^' o: ]4 z
2 `& V. b E; ?2 t
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 H/ b7 A% y4 Q8 v% u1 D7 W
UARTPuts("------------------------------------------------------------\r\n", -1);
* ]' J! ~# e+ d& }
! D! `$ l2 E; A( ]7 G% V, }
0 n* ?/ X& p3 t& {) d% S
9 `; C6 `' p! |: @; n4 p& U
UARTPuts("------------------------------------------------------------\r\n", -1);
d/ ^0 r7 l9 N1 z/ Z! k
UARTPuts(" C6748 ECAP Test\r\n", -1);
+ A' f' a8 ~2 A( r8 s8 V
// ECAP 捕获初始化
! c( C& _/ L) ]9 j
ECAPInit();
f b2 p7 w) A% L
UARTPuts("Initialize ECAP.......\r\n",-1);
1 ?. H0 m& g8 P2 U" q# L0 |
for(i=0;i<5;i++)
3 z) u$ Z4 ~ z
{
% i; o: s& q6 W# _6 K
for(j=0x00FFFFFF;j>0;j--); // 延时
0 P# l# c& P C1 d" W; _# C
ECAPRead();
4 s. d2 `7 |* F) ^# \5 v
}
8 s# d; E2 d3 d/ G
UARTPuts("\r\n",-1);
9 y' s" u) V- _) ]/ ~ h2 V
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
5 Y$ T1 |! |- N8 |
UARTPuts("------------------------------------------------------------\r\n", -1);
; u- n8 ^, l: e
& [% r2 o& J; @1 h$ ]& y
// 主循环
$ W* z7 m; |% R5 p) M
for(;;)
5 \4 k% {* r6 n6 y
{
( N0 E3 n- L4 e: b0 `) }& m
3 B$ H) Y: M- S2 s X& F2 p% R
}
. Y. Q0 i/ v3 L: _* e$ ?
}
: [+ F0 ^& }0 A( S' A* g" n, I
: i& i5 L" ?' W9 ]; a
/****************************************************************************/
0 k: j. m9 U X, ?
/* */
- ^% w) N! |" x/ \1 Z8 b
/* PSC 初始化 */
2 M0 L3 W( ?& X; }7 ]( o$ D
/* */
6 q6 u4 ]# ]" H& V! t, c
/****************************************************************************/
_' A% A! l. t$ f( i- [- ]
void PSCInit(void)
2 E( b1 R& ^" K- ], b
{
* B `: l5 W5 i7 }( c/ W2 H; ?
// 使能 EHRPWM 和 ECAP 模块
5 _1 a+ Y0 a5 U7 {
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 U/ Z) I, I- `, h( T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% b! F7 E* ?% S1 S }) D' o1 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 d! |' F/ J" |! B4 a
}
F' [. i9 _& F! y6 I* B* R
7 B' l, w0 T6 u+ R
/****************************************************************************/
0 v6 m5 K1 Y z. Z1 j7 v/ ~
/* */
* x8 a2 M- |, Q) L' K6 A
/* GPIO 管脚复用配置 */
$ I1 u9 F" h) d2 e* N" L5 I8 D
/* */
, M6 x% V0 X; V, w! z2 f* i
/****************************************************************************/
% Q( O' d" f8 f; s+ H: j1 ~
void GPIOBankPinMuxSet(void)
" g5 w6 i/ I/ H& _$ F: J! f
{
# S2 n& u# L- A0 J9 G6 s
EHRPWM1PinMuxSetup();
4 z0 P% T% B+ m0 T! r$ e
0 i6 Z! C+ L+ w+ u
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# @2 v5 ^& J/ R9 K9 a
// 作为捕获功能时管脚方向为输入
* X: C2 f/ ^; l
// 作为辅助脉宽调制时管脚方向为输出
5 y9 j4 D8 ^: s* n6 Q! }
// ECAP2 / APWM2
; o" Q4 A& b9 d* U. R- Y
ECAPPinMuxSetup(2);
; G4 D x$ B* ?+ n
$ c) A/ w; y$ s" a7 v% d
// ECAP2 / APWM2方向设置为输入
2 y6 c* e- ~, h) |0 |
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) t7 k9 |/ v3 c$ B) a3 x. A2 l
}
3 b8 P' v7 g& r& u# ^, C$ ]
' l( g- d$ o; R, d- C: v& H& W" z
/****************************************************************************/
* z) n2 x. R( B; a# U. `# W
/* */
( p& t2 N! `; Z0 p! D( {7 d/ C
/* PWM 输出波形 */
& B+ c; T* F& L) n/ @+ j
/* */
5 Z% T) k- y2 p4 Q- y& S& A0 g: y
/****************************************************************************/
. v) w) K( _1 X i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- G9 W6 c0 A3 n/ N
{
9 a8 `2 |8 C9 e$ ?. p
// 时间基准配置
1 o a6 x+ u5 m
// 时钟配置
( t4 Z) @3 U, _
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 K3 V& k, f3 `) Q) R. k, Z9 v
) W, t; A/ n: I+ q( O6 c
// 配置周期
( c/ u, E* T. l' |
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' Q/ `, i" L$ c# ~7 I) W
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) ]+ |1 W8 d4 J& z" P
& {5 y3 F, k0 O+ D
// 禁用输入同步信号
; n' ~# J+ C: Y. l$ b R5 e
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
: q8 S( \5 d. {% J9 _
% }" k" \ |8 U/ V
// 禁用输出同步信号
$ W% d0 w! `. V( b; Z- r1 H
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 m; ^9 |4 m6 b/ j+ X5 h
" L7 E7 G& `. ^8 ?; j9 ]
// 仿真(DEBUG)模式行为配置
& i& [2 G6 \: u1 B
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
5 j5 T/ |7 _$ `- \6 w
. c* Q. O: i( R3 h8 W+ T3 s
// 配置计数比较器子模块
) V, i% x& t; A2 b2 `' q4 O
// 加载比较器 A 值
2 N) i" r% O# W! |% j% y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 I% }4 S) L3 F5 W
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 V, F9 r( _+ \, o( Y+ y* p( M
/ [1 T4 r3 X% d* p7 I
// 加载比较器 B 值
/ p# R( q# J" B4 s
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; d, p2 j7 b' r
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 O5 H- u1 [3 O' z# ?3 b( [
; ?6 \; b' j: g |9 V$ H
// 功能限定配置(输出引脚触发方式设定)
- S, J6 d& E. V2 y" h( ^& ?: `3 I
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. ~, P% u9 i$ ?3 ^ n4 L- w; L
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 z0 }8 J: m5 [! C$ a. X2 I2 \7 H
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" W" ^; O5 d5 ^' N, y9 a( k3 @1 T- M0 C
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 T. Q2 S! J, l
6 K5 M- M- o$ \
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
! U `0 T, c9 x
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
& K5 A6 \- O) u) w
2 v4 d# y4 A* f9 Z" S
// 禁用斩波子模块
/ r/ F2 V% K+ c) n
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- b* ^, f" j7 l
3 F# i: V$ B' J3 ^" I0 D$ \' @
// 禁用错误控制事件
( B& T' x% l& y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 q |0 E' u6 V( Z& u
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
* m# w, q! D2 b9 n
$ y2 T6 s; y) ?% L* E9 V. p
// 事件触发配置
* S! I: A: r4 i3 J* K$ A- Q
// 每三次事件发生产生中断
7 S+ Q( }7 e- u$ |
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
6 u6 W" y2 d e# x* a: f4 V
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) \) W4 U% W( u4 s+ r& \9 t% ]
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 N2 S7 E/ {+ T2 t
// 使能中断
8 y" m( k* X" q( y* w% I9 ~
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 V+ E7 w" g- d, o
! F+ c( S1 `5 A+ M6 m, O) S7 L
// 禁用高精度子模块
; ^. U3 R/ c0 j D' G
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# `8 c5 C1 P! r) G$ q7 Y
6 A) U. ^) j3 \' u' p
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: u5 H# W" i3 o$ o* A
}
7 z1 b# C6 R4 K+ F1 s% T+ J
. S8 {" ~9 K5 l; |( v; }
void ChopperWaveform(void)
' i1 ]# K3 C# t: j
{
% t8 d$ ]( K/ X6 ?: a
// 50% 占空比
+ m; W' T5 u1 n. I
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 w& e" o; n/ u% P1 `" Y
// 4 分频
0 @7 D8 J5 N6 c
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
' y4 u* b$ Y ?! Z
// 单个脉冲宽度
* D) e& _* \$ ^* i1 i5 s
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# H% F; [+ S" n" C G" t. D0 c3 g
// 使能斩波子模块
- o" T2 N! g" t) @2 w# y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ E; \& G7 s# E. e
}
# Q8 H. t- N0 g6 O
& L6 G0 j. I2 h/ X* J
/****************************************************************************/
v9 c' p1 W' X% x
/* */
/ N3 U4 B9 e( i( Y6 T( J' b
/* PWM 中断初始化 */
% W4 i2 P6 T) S1 `% ]- |/ g
/* */
) _# D- s9 w5 o2 ]% Q8 W, i
/****************************************************************************/
3 K. N6 t! ~" R4 W* k. |4 w
void PWMInterruptInit(void)
1 L( @! h# D, x5 T5 _2 e8 C. Y
{
o0 g0 u! b6 l* d8 U
// 注册中断服务函数
' G! G$ V0 G6 T, C7 |6 {
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! r4 o3 d$ _9 n- P0 f
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 t& `& P' i+ l" V/ m
# _) T3 k0 o/ E/ G& o
// 映射中断
- K$ O. Q/ C& m% O' A! f& q
IntChannelSet(SYS_INT_EHRPWM1, 2);
; u) ]- x3 r2 f- m8 U# h9 s. }% t
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
2 \0 B& v. K& C, D# P
9 D6 V1 r5 v7 `; G
// 使能中断
' i" w7 J4 W/ X/ M7 I M: K7 N
IntSystemEnable(SYS_INT_EHRPWM1);
% y4 Q, U/ u. K1 C* I
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; H% m4 w& u; c
}
0 q5 O, P4 B/ x8 ?" \" r; P
' C: H; U' O* q# v
/****************************************************************************/
7 h' D2 q. F7 N* L. L G% X; Y
/* */
! m) O3 Q+ L; o
/* ARM 中断初始化 */
, H0 V! {8 o' m: K3 P* J" @0 V
/* */
' j1 S* r0 ^3 N" d7 I% A; E" `+ z- D
/****************************************************************************/
1 |" a! l+ O( @1 e0 Y& s" W/ x l
void InterruptInit(void)
9 g" n& _' G: P |" K. N
{
' k& j5 L3 O$ |0 \
// 初始化 ARM 中断控制器
% y! }# t4 \0 S- T
IntAINTCInit();
1 h( i( v4 L3 A, c$ S# s- ]5 _% v" w
' n0 f6 \% N! A0 i) N L- F4 t: @9 u
// 使能 IRQ(CPSR)
/ y/ _/ |3 [) o
IntMasterIRQEnable();
: ~/ A! j8 x: Z4 I
6 B, s. m* [3 B8 |. C; b5 W, G
// 使能中断(AINTC GER)
8 ^, p8 W. S$ i/ Z+ U1 @
IntGlobalEnable();
" @4 @/ _0 h& }$ A0 s1 O' k. N
" ^) U- \) E3 Y. b$ J/ Q$ r8 o) S
// 使能中断(AINTC HIER)
( i7 ]4 s* E; v2 J2 C
IntIRQEnable();
# I, C/ O/ {" U
}
& R- d; m- z" c2 [7 V( k+ T, B0 w7 J" L
k3 i a, u9 x
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
3 |& O2 ^- @7 L9 `& m1 k
/* */
6 A. q0 C) p& L( t
/* 中断服务函数 */
- F5 Y7 T1 e& K6 Y4 X R
/* */
7 M7 y, j6 B M; o; Q0 }& O- c
/****************************************************************************/
6 y, F- N8 Y' N w6 t+ D& `$ s3 B
void PWMEventIsr(void)
2 l/ i6 w2 N) Y
{
% _: f/ J# G1 r7 Y$ p H
IntSystemStatusClear(SYS_INT_EHRPWM1);
; f& f& P0 f( B( X3 v
4 [+ z+ {% ~( s# T+ v2 U$ R; j. a4 z
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, J3 N' L' [' o$ a2 l; X0 y
}
% w4 y' K F) J1 z- N7 K8 M
+ y3 z' L& q+ D8 I( i) m3 N( q
void PWMTZIsr(void)
O1 K3 G: A" ^6 o8 |. H
{
6 l N# e/ p# s3 A$ L( \5 C% W K6 l
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
4 Q' X, _2 N5 R5 j! I* v2 ^# v |( G
1 x' i, \- o6 S& _9 C) ?
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& ^: ^- D6 \& {% P3 P
}
4 @! I0 a* D; x x. s
( x9 W# k- D$ }6 ]
/****************************************************************************/
4 [) ^3 M& C l( B9 b
/* */
- C: \; V0 x! X' t
/* 初始化捕获模块 */
2 i8 O+ t! p u% e u0 _4 x
/* */
- l3 J1 m! d N( ?
/****************************************************************************/
: a4 K4 j* l4 T T' E
void ECAPInit(void)
! f# I" v0 s8 k8 S: S% m* Y6 U
{
3 m @# g* }. v3 _, Z' N% S% r
/*-----设置 ECCTL1-----*/
! D) K% \+ K# p, h7 v
// 使能CAP寄存器装载
/ ]5 W/ m. `+ i
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
" [. d& m- r1 B0 n3 k% J
// 设置预分频值.
2 @/ h9 z0 ?# i: P; S
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
8 a- J" N" O5 _9 T9 b9 D7 v0 c* o& N
// 上升沿触发捕获事件
# r7 @& O% ^: J9 _( g: b6 n
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! Z2 {, X% \+ c* v/ X
// 输入捕获后重新装载计数器值.
. G! v. e p, W& Y8 \" U3 ]
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
; w7 w" s0 O+ C( o* q9 m
/ I2 K* W0 E5 R% @
/*-----设置 ECCTL2-----*/
( q" P$ Y) X- O( B0 G, L- V
// 连续模式
8 }" I4 e( n9 p' T
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
1 a r' I4 N8 [2 D, p+ q
// ECAP计数器TSCTR持续计数
# F( M. U. V$ V+ t0 E3 \
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! {' F. k, W( d0 _
// 禁用同步输出和同步输入
: m, P+ @- M7 Z0 b* k
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( `0 s( R7 [6 _. J( ]0 b, n8 z
// 配置 ECAP 2 为 CAPTURE 模式
+ ?& p8 v' B& q3 ]
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
: P6 r1 ~3 |+ a9 |4 q
0 v& u w7 {2 t7 m3 P. v0 W F
// 使能中断
3 ~* F( C( o, C3 _0 l' s( e
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
; x# b7 K$ i5 v% B8 A3 _
}
& ]% V' [7 f/ o) ~% X
$ c3 K& S" _) V+ [7 J
/****************************************************************************/
3 M0 f' x( J: S4 N4 s
/* */
% V8 H! p5 h3 I: Z+ T6 G
/* 取得捕获结果 */
! ^1 o! u5 L( c
/* */
8 x, B0 ]' L4 q) B; k
/****************************************************************************/
/ l, H* c7 ]0 |" F+ s( B$ j& X
unsigned int ECAPRead(void)
7 V3 y. V) v# c: G+ n, ^+ X4 \
{
8 f9 [3 c) N0 L; @& u4 `
unsigned int capvalue;
; L; G% ^. H, _; e/ s3 B
unsigned long frequency;
% u/ L1 v8 T( G9 _
$ R+ s& L. x) m1 I4 I! f! S
// Event1 中断标志
; q) p1 g- a* z, F2 ^' j7 @4 w
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
% |3 a! q$ T( o# I9 G6 m
{
* ?' V. ^7 E# C. b) [' c% t
// 取得捕获计数
; I O; ?( b0 @" A8 ]& G
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
+ ~7 H3 \: r2 O# S
capvalue = ECAPResult.cap1;
0 ~2 {* v) m7 f7 D9 Z$ l
3 I- o' N' ]6 v g$ q3 ~
// CAPTRUE 模块 228M 时钟主频
$ r O8 q- N- u! v+ b& Z. u8 V9 _4 x
frequency = 228000000/capvalue;
3 S" J* M e+ g9 s) ?* u
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. f U' Q0 O/ B
5 S6 M: g# I: }) x1 N
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
9 q" S) h! A0 | x
// IntEventClear(SYS_INT_ECAP2);
/ V) `4 n: Q& q0 B. \) F8 M
}
1 d; c1 D; Z0 a/ K+ f6 f# d* f/ p
return frequency;
+ _" ?- V; i4 L( Q0 y
}
4 c5 a- l8 j2 Q0 B u/ S0 U
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 v# {, ^9 Y3 J' V+ 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