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