嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
* }, E6 i( p( F" Q
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
* `, i4 |/ t6 \: y
/* */
& K5 |# F% S! h8 H! o$ f
/* 宏定义 */
- v: I6 `& A* h4 K
/* */
' g" C5 J3 g$ z7 d6 m+ A: v: A( b+ f/ A
/****************************************************************************/
4 t) v" H3 D8 n6 \ d2 q
// 软件断点
, I- T, h; ]4 y
#define SW_BREAKPOINT asm(" SWBP 0 ");
( P& k, J( b- I: F
- t2 P) |! V# b9 R" T
// 时钟分频
. ?" n1 ~% {$ H: V
#define CLOCK_DIV_VAL 228
2 Y' ?8 d( ^3 E! ?* w4 e5 f
7 v$ a/ `8 C1 q1 b$ h
/****************************************************************************/
" ~+ e& c. I0 x9 m* m9 n6 _
/* */
4 w0 b- z6 r/ w& {, l5 D0 K
/* 全局变量 */
/ e1 w: J5 }' e+ Y) L
/* */
1 B8 j4 F1 [6 g1 C6 |. C3 C- o. M: x
/****************************************************************************/
) h$ p9 s" C9 h& I5 p
ECAPCONTEXT ECAPResult;
9 S: n% l6 o. a9 I
+ b- F% y. w3 l9 ]
/****************************************************************************/
9 D2 k" l. n% U2 ?! L2 K6 Z4 ^( R
/* */
; H3 n j% i( b( { Y1 p: d
/* 函数声明 */
1 J/ s1 a& X- z2 P, D
/* */
{ r3 E* J9 a! I# H
/****************************************************************************/
$ I+ k; e+ _7 V) S4 s- G0 A$ [
// 外设使能配置
# i3 a/ x; v5 f& w3 [- ?
void PSCInit(void);
1 v: x; Y: L( d2 d' a0 b& c- o6 H- U
) W O" S4 z0 {1 b2 a( h; ]6 R
// GPIO 管脚复用配置
8 V+ j7 ~1 D, ?! a: v
void GPIOBankPinMuxSet();
5 |6 y" @7 e7 n0 r2 u& ^# F8 ~
1 [4 d4 E8 n5 z. G$ C2 x
// 产生波形
( o" z i/ _; ] y) J6 M# k U" j: R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# }; y2 o/ N1 e' u; s" V. j
void ChopperWaveform(void);
. Z$ ^7 H2 w' D9 w
9 b, K9 i" V: r; B: k. d, j
// ECAP初始化和读函数
: W+ M T6 R0 Y: X0 Y/ s" Z. h
void ECAPInit(void);
! }: G% P3 k) _! l3 m% f' d* M8 E
unsigned int ECAPRead(void);
7 c8 f$ q2 V8 Z N; b9 Q" C
# R* y; A% h- G1 t2 E8 D5 j6 w
//ARM 中断初始化
7 c/ c# T1 e( g6 {6 m8 Z
void InterruptInit(void);
/ m; b, v5 d" T( ]
6 ]* U0 V; o# z0 j
// PWM 中断初始化
6 j2 r+ U) E! i
void PWMInterruptInit(void);
8 i4 m& r8 W0 [2 B: I9 w) R: a
// 中断服务函数
+ }1 b2 V& [/ R7 E
// PWM 事件
" n p2 E% y* T$ Z0 v2 H: `
void PWMEventIsr(void);
5 f- t. T; F7 ^4 i& G' o
// PWM 错误控制事件
5 I6 h! K9 G& O) p
void PWMTZIsr(void);
6 e4 C( m8 ~0 q4 P% k) t
# k7 `: m8 O5 D$ U. Z
/****************************************************************************/
! P4 K( G0 c+ P* x( p' o
/* */
. Z. ^7 q8 K" P X2 P( |
/* 主函数 */
5 d9 j0 `- k, o8 J; ^
/* */
& ]& Q( I1 [' |' |* Q: l, V( r1 z
/****************************************************************************/
' P6 ^0 [0 b& z3 W, ?' m1 u
int main(void)
- b/ k* y+ T1 u3 V/ M& T* v, h" r
{
7 @# g2 u/ Y/ N3 Z! ^
// 外设使能配置
# f+ Y5 p4 X( N g- H
PSCInit();
- w/ A6 C- F5 q$ p
6 I8 ?& j5 T Q0 u7 V# f* c( I' P" z% \
// 初始化串口终端 使用串口2
) {. _/ o9 z1 h, w% R: ^; v5 D
UARTStdioInit();
9 A- [0 U! A# s' g( f' [; z. y0 p0 I
. s _2 O: y/ x2 J; U
// GPIO 管脚复用配置
1 R1 t) l# `4 H3 x P0 g8 f( [
GPIOBankPinMuxSet();
" F* ]5 w, c! o* S4 i9 I
7 s$ _# }8 _4 c1 L% J
// ARM 中断初始化
! A% \, X. ~' C1 |* u
InterruptInit();
! {1 [5 E- q& W, a9 V: r' Q; J
) C t3 p% y$ v
// PWM 中断初始化
6 `7 m4 w6 K% |' c% E
PWMInterruptInit();
9 Y; z: U, g4 m4 `4 _) K i; V
. V0 S/ n% S: e
unsigned char i;
/ ?( f! _" F8 ]3 n
unsigned int j;
; {: t0 P- j: f# q2 G
5 S/ |6 C3 m; A0 r: J) [* ?$ f5 G
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, b# L) v: j$ I3 A [, i& j+ B& T
UARTPuts("------------------------------------------------------------\r\n", -1);
0 V0 k' A8 Z8 m( D# @
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
- y* V5 L' c' U
// 产生波形
* Z* K0 X! ^ D9 X* k: w6 H
PWM1ABasic(25000,50);
. I) b( _1 q4 h4 p" |2 b
$ a- Z7 H* b& N$ \, h" p$ [% B
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 p; N+ B, I. R* l5 ~4 V
UARTPuts("------------------------------------------------------------\r\n", -1);
: B' t0 p7 T/ o* z9 w; g
6 Q8 ^/ z6 \$ S( y) f
6 J6 C: v! ^' C z
. ~5 [# z5 m0 ~
UARTPuts("------------------------------------------------------------\r\n", -1);
9 f0 ?3 [% b( N( g" I3 X/ l) ?
UARTPuts(" C6748 ECAP Test\r\n", -1);
- F2 q" U4 b2 s: C. r5 ~
// ECAP 捕获初始化
5 e4 g9 D- P+ Y( F8 c0 | O8 A6 Q
ECAPInit();
7 {& d; Y2 p) Z2 K
UARTPuts("Initialize ECAP.......\r\n",-1);
4 p) t3 O2 P! \
for(i=0;i<5;i++)
- e/ @/ m/ _7 F3 E4 w
{
$ A+ n" L5 B) N5 } H# |
for(j=0x00FFFFFF;j>0;j--); // 延时
# C7 I! j% l4 y+ a" I; {, @1 }6 h
ECAPRead();
- o) Q! K# k/ K
}
, x. o0 s2 l$ p5 h
UARTPuts("\r\n",-1);
" a, R* {9 A7 g4 e/ k$ y" W/ j
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 P/ R$ ~/ e% R( J1 V2 B
UARTPuts("------------------------------------------------------------\r\n", -1);
$ B+ W+ S) b5 h
5 n6 B( S4 x: I. _
// 主循环
" B1 }2 [# @9 O% H9 A9 P$ t- W
for(;;)
! h4 P3 e! e1 U
{
+ D6 z5 o# j7 b
. t& N# m. S; u, z/ f: W, h) z3 y
}
8 o F! F. A8 o0 r
}
2 b h. Z- W' X$ H% ~- {6 L U
# g7 \% y3 A) G1 ~: T3 {
/****************************************************************************/
8 q6 F" c# Q6 s7 Q
/* */
" a, F; w8 m* ^
/* PSC 初始化 */
! j# M: s) v7 J2 e, K; d1 Q
/* */
- Z- A J. J+ J% S) G; j8 J' P
/****************************************************************************/
. \% ~. |# k1 a$ d, X9 d
void PSCInit(void)
( H2 M# L( m3 m6 A
{
6 m7 v) z8 @. _8 [
// 使能 EHRPWM 和 ECAP 模块
" w! \: j( C- O2 p# O' U
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 p- }8 ], d% L( D6 {1 |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; ]: z) h( Z! E+ @, c6 k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. N( O# b0 U! |4 Y
}
7 ?$ n7 z; |% h4 n
$ l# f) q: a5 h6 w4 @+ D
/****************************************************************************/
* d1 Q- R+ h7 z+ I3 N% L
/* */
A- a, T/ C: |. f+ E# W- O# \
/* GPIO 管脚复用配置 */
- }! {( i5 v+ a: _: ~ v$ w
/* */
" P; K- @; o9 z- ?7 K1 X; k
/****************************************************************************/
+ u6 H* H( T3 s- X- s9 j4 y. w- Q
void GPIOBankPinMuxSet(void)
* X/ [8 a3 H+ h7 @2 {, ~
{
" d( E1 f, S& a* G
EHRPWM1PinMuxSetup();
: s) W9 T( a/ J7 j4 ~' o
, a7 h V6 V X
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
8 S# X- F' a* t3 V5 s" V
// 作为捕获功能时管脚方向为输入
0 F) p8 z- X& g2 h0 P
// 作为辅助脉宽调制时管脚方向为输出
0 Y' B* J! Q, @8 Y( v
// ECAP2 / APWM2
1 L( g' C( U) h# ]# O# C7 O) }
ECAPPinMuxSetup(2);
/ N E# F) {. B6 |2 u
1 g* n( C' j. x* c2 h, n' G f
// ECAP2 / APWM2方向设置为输入
+ G- }$ }$ @% O* |
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
9 P) c3 c; o$ j+ z
}
- F" V5 k8 |9 g& x3 J0 s
# c& b0 U) c0 Z+ f& S# F
/****************************************************************************/
* q; L O/ _! Q
/* */
8 K$ h0 y t3 c$ L- q1 W% I5 X, W
/* PWM 输出波形 */
" @. R4 l* J& G m( b
/* */
& k2 H0 d2 u1 q5 W1 J5 r
/****************************************************************************/
, L8 {* L/ v$ G& G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% B) Z9 h2 b4 H+ w+ i- g! V$ D. N( y
{
) E. E( P" K2 j7 m$ Q3 R0 L# S$ _: e" n, d
// 时间基准配置
- c5 X3 w3 V; I/ l, M. m; N3 F
// 时钟配置
7 z# i; g- g9 W& O; }
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
) o$ C/ S; j- ^4 H' B* b
& H7 d' G( V r9 M9 b) I* w
// 配置周期
3 R5 u# |. H7 d$ b; C9 }+ @/ T- O
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& {# Q6 g1 C! R L! R
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ Y4 ^6 Y1 D' f9 U2 B$ C0 W9 \
* _5 L+ i# g6 W
// 禁用输入同步信号
* W# f- E, y' V% h7 h, K1 @
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& m; @* [1 n# y% ]) }
& A) A4 T, [: H" ]0 J* q
// 禁用输出同步信号
: } T( w1 w! |, r$ [0 ^$ U! v
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
& u6 ?" p: J" ~" U) Z
5 v7 G: ~, c) n0 E) c {6 T
// 仿真(DEBUG)模式行为配置
2 p G! \" T8 r% v* }" E
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
. B0 ?# K+ i3 k' F3 {( i' P
: s/ ~+ C. l1 |* |, r
// 配置计数比较器子模块
2 o6 m- T% I- z+ U
// 加载比较器 A 值
. P7 t% a9 r3 W
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 G- b2 J& x% _0 q) U" L
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 W& w! S( x7 x l9 Y; O
/ M% z, A. m5 h/ R( i
// 加载比较器 B 值
* l; A7 E, {" A9 `
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: h" W4 z) X3 E2 ^5 z
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ {- @) t7 w9 w; x$ n7 y0 B" B
, X- G' G4 S' Q! ~
// 功能限定配置(输出引脚触发方式设定)
% n9 Y) a, }4 }& l2 w6 V7 ]
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; ]: ~6 J! D4 Y4 J% E
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ S, n+ c5 H' Z& U0 L
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ |4 I \. ?/ Z5 E' X v
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" P, Q* q+ j: Z
; f5 M, ]/ j! l G, L7 v- o( Z9 i6 t# p
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
, U, b, o- R0 S7 ]' v
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ h9 x* n( V: ^- _
1 p; R8 l% @4 h# ?1 x6 d
// 禁用斩波子模块
) c" A! R: D& d7 ^! J
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. `" [/ W% A4 G9 [
( ?6 V! _( X3 a X
// 禁用错误控制事件
! A, t) x$ s+ L7 v7 x+ d
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: L' S5 Y4 N! c/ B) ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
* e5 p# Z+ ~7 t6 m
' W- g1 g' E9 h/ A' t# k
// 事件触发配置
$ { w9 Y0 U" V7 d1 [2 c% Y7 Q
// 每三次事件发生产生中断
3 c+ w; d5 o6 W1 o/ t/ M( b
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ R- Y# e% ]7 [
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
1 d& I% {; I. l( V( E2 C
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
9 h' C( |5 U: Y( U; P, p. u& G
// 使能中断
, y+ g$ Q% n H4 m: _* N
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 s& i$ P, S7 \, f& E
$ }* X* o3 x$ x# h6 y2 Z- ~
// 禁用高精度子模块
% z) r: f% m3 w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ p" V5 w S% c) a. D4 X
. \) P! Y, X$ y" r% d; w
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
+ _( O& O( ^+ k. E
}
" I- f, G3 @, R3 v5 N& O
0 B' h- a' c# }( j7 Y
void ChopperWaveform(void)
5 ~- X. C7 }" u
{
: q1 @" C7 T# q5 W
// 50% 占空比
/ B3 \- d- z: M2 A. V0 q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' t( c, C P* B
// 4 分频
! p" q" r/ A7 C3 G. c; U2 r
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( |' S. }3 y; `/ ]( U6 d
// 单个脉冲宽度
8 H, m9 ?: ~9 x$ e, N+ O9 B4 F% _. ^
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
e( q1 k& Z0 g! |1 ?+ K9 N3 s) T
// 使能斩波子模块
$ [3 T h/ b1 f7 a( i- m
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
f, P3 [( M8 `: ^
}
0 j& F/ E i4 |' D2 o* {
9 Z6 U: W" |- ~- i
/****************************************************************************/
) E. p9 C( Y' @# P
/* */
: u9 C2 n# t ]. K
/* PWM 中断初始化 */
# a) ^6 k+ o" R) C- N9 ^! t4 K
/* */
U' v' b8 a' |7 z
/****************************************************************************/
% S3 M+ ?( [% O2 ]+ G) S
void PWMInterruptInit(void)
3 c4 x3 }5 B$ r; o7 m9 c
{
9 g- \$ K) `) b) Q
// 注册中断服务函数
8 d# P5 k0 f' [6 L& Z
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' u- E B7 f6 {3 z- r) R
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
& {+ r/ e- e: t/ b' |$ b3 k
" A, a9 ?" Z, z
// 映射中断
8 X. Y" i b* q, o, C
IntChannelSet(SYS_INT_EHRPWM1, 2);
# |' ~2 d0 h* M( d/ l) N7 T
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ k( k" B9 m6 x* c2 C- h7 x
~$ E! I4 B0 V8 u) ^, ^/ g
// 使能中断
2 l, w% t# [) n, r! a( A
IntSystemEnable(SYS_INT_EHRPWM1);
6 w, j% e8 L) Y) ~+ y* r9 g
IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 L& q* K+ c* S# |2 s
}
7 ]6 ]' z2 z8 A
- }; i" F; G3 g0 F% I4 L& v3 x4 b
/****************************************************************************/
9 Y& U- c! u+ N- V& U
/* */
" L, V5 ]; `4 {) ?4 _( N
/* ARM 中断初始化 */
* }* H7 t7 J# x, y: U
/* */
8 \+ |( L+ \- u5 l' x" J
/****************************************************************************/
# ]+ X9 W' J' M1 m& h! Q' w
void InterruptInit(void)
5 ~ r& s7 P. g# v
{
; d0 ^/ l7 s" e
// 初始化 ARM 中断控制器
; J2 d4 i( Q! l0 k) M3 m
IntAINTCInit();
) [. c0 N$ o0 t2 @# C# V; M i$ J8 }
. g- @: w ?( c0 O5 k( p, ~# p
// 使能 IRQ(CPSR)
5 S$ J* e6 n$ F- O1 Q( M' g4 M
IntMasterIRQEnable();
0 w9 k( g. R3 i
/ S" q5 o% W7 p8 h- W
// 使能中断(AINTC GER)
# ]& _. ^/ F6 T4 K7 `. t2 z5 v7 _$ L9 I
IntGlobalEnable();
& e$ h0 z: N6 x" m4 h
/ K/ ?' |* [6 W8 U
// 使能中断(AINTC HIER)
6 q$ N1 w2 Y" a W
IntIRQEnable();
$ ~% ?9 `4 s$ v9 x
}
% [9 C+ P) _1 C% r9 E
+ G4 @: h2 q4 e9 x/ _
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 }* N% k% t4 Q# G$ v; Q; p
/* */
1 D; s3 e: G9 f% J1 _2 L
/* 中断服务函数 */
3 j7 F( W5 R; ?/ A
/* */
, S1 O& _9 E) ]; `% o8 F( J
/****************************************************************************/
5 s5 ?) A$ M5 Y5 H4 A1 U" k9 T/ E
void PWMEventIsr(void)
$ Z" s9 l# f/ Q7 X* H
{
0 J' l4 ?" G" u$ H, i. I
IntSystemStatusClear(SYS_INT_EHRPWM1);
( X' T2 H1 ]* S+ N9 q
$ o- P+ _! k; F
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
* a/ @: U0 C: v/ B' s* g4 ^
}
2 p, U5 f8 H/ u% z8 ?
" G v) y- s% Z+ ^7 h ^8 ]
void PWMTZIsr(void)
0 x2 D/ Y9 P. h1 c, j' a' K: v& q O
{
" Y% P" L6 g. V* Q8 S, j4 K B
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
, J8 l8 y6 J9 k8 x$ i
; E9 I- T0 ]: _ B1 K5 W5 ]
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
8 E) D1 ]1 A2 v. O0 r
}
; u6 ?* H$ V8 T
$ J2 [+ E$ V5 _5 Y, F9 h l0 |0 L* h$ s
/****************************************************************************/
) i. h( m! }8 y1 U& a0 C
/* */
G! [; P0 m1 \) G, |6 d
/* 初始化捕获模块 */
) {7 ?- Y5 _+ D
/* */
- D. X# G: o5 p7 l9 z3 j) L3 p
/****************************************************************************/
2 s p/ L. T Z( s( @7 y3 h* m
void ECAPInit(void)
6 A; m6 C' n( H& q5 _
{
# d4 A4 W5 }5 g
/*-----设置 ECCTL1-----*/
! e Q1 @" V7 Z+ s- \; k/ W
// 使能CAP寄存器装载
& |# {8 j$ m/ S `& S- n$ a
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
9 [$ C& w' {/ R, v# ~7 l$ c
// 设置预分频值.
$ t2 E8 J! Y+ o5 v$ Y: k4 U' k& I
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 c: F0 I& c y, N
// 上升沿触发捕获事件
3 J& c, I3 D1 X" v
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 ^2 l, R- D7 N! r2 _ A
// 输入捕获后重新装载计数器值.
~/ c, a p( q# C
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
& N( ]% B R. X8 ?/ c7 F/ j
. R$ V) H' {. u) b% i6 Q/ }
/*-----设置 ECCTL2-----*/
9 @1 D; U8 M0 i
// 连续模式
/ h5 U' S! I( b
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
. v+ g/ B* X' z& w* X, m% [
// ECAP计数器TSCTR持续计数
$ ~! |8 t: M( @. g
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; L3 y( w9 p3 E2 ]8 s
// 禁用同步输出和同步输入
4 y9 G j8 R' @3 E: n' Y
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
( s5 t( A5 Y1 {" I8 O8 C; R
// 配置 ECAP 2 为 CAPTURE 模式
: g( s5 f8 W/ s1 x1 W2 ]
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
, O2 s n( f% d0 b2 v- |0 D
2 \! x1 s: p* f! V% E
// 使能中断
* [6 K# `/ U5 u+ P/ m: I1 {
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
- q2 F& }" _" y$ z9 _0 ^( y) K
}
. }# Q, Z, \- c" y3 ~" ~
" x: q' h: A! d; e! W9 h% X: s9 x
/****************************************************************************/
. I D, T7 V' W, l* z9 e2 l
/* */
9 J: ?% V! e" ^9 A% ^+ k4 W$ T6 P
/* 取得捕获结果 */
+ o5 @6 E3 M/ G$ x6 x) {
/* */
" j- l" c; D5 E8 l- s# N6 D
/****************************************************************************/
* y2 K! o1 u M& Q6 T6 I
unsigned int ECAPRead(void)
$ j% ]# q8 A' @; ~. X
{
( w, w V- ~/ C! X
unsigned int capvalue;
" O% h: p; |) ~( A @4 B8 O$ A6 x( a7 l
unsigned long frequency;
1 i: `2 Y$ u5 N( u% K) l
2 o7 _5 j& z( m, `2 U
// Event1 中断标志
8 W- N+ I# M- o% v; S: ~+ m
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& T8 f+ K7 j. d: D' E: i
{
0 I1 ^* K2 `3 s2 C5 O2 p
// 取得捕获计数
- D; F/ w b3 Y; J3 s
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* J0 w( ?% c* u7 t
capvalue = ECAPResult.cap1;
- O; d. ~/ U# I0 E9 X8 u2 |
# r! K m6 Y% g0 g/ u
// CAPTRUE 模块 228M 时钟主频
6 j' ]. y6 V7 D0 t/ C. R, m
frequency = 228000000/capvalue;
' T3 [+ P7 e- `
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
# A. ]8 l6 Z$ q5 O7 U% f& {. @) r
3 F @$ I9 B) L- r) P# Q, f/ W
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
+ g$ F3 s( H4 y W O
// IntEventClear(SYS_INT_ECAP2);
8 D' P) W) |# a' d( B4 T3 }7 `' F% [
}
+ S: Z. ?) o, B3 m. W
return frequency;
k9 _* G. z3 j# G; V' ~: t0 T0 \
}
& j' f! v! f4 x( A5 Q. a. T
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
! E9 {: ], O9 ~/ `" I
[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