嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
. j3 ` U) ?" V! E
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
* k" f' R. n1 V/ @4 j* j* K9 T
/* */
. L9 d) p8 ]' q& A6 s* y
/* 宏定义 */
- A* `5 y [5 @1 p, L
/* */
/ J [( L& B- ?6 N7 k3 B
/****************************************************************************/
$ W1 Y0 @) c9 V3 M. z# p
// 软件断点
/ M* u% w2 s3 X. z! ]
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 g# n+ p* I$ s% N# U
: b+ r# I$ l( \" z" k" X5 y" p
// 时钟分频
( b9 N8 z" x8 M1 g5 l! K7 j
#define CLOCK_DIV_VAL 228
9 o6 W; R* \" C
- x' v0 [8 k5 B
/****************************************************************************/
3 N, ?; p% X% n' [( x6 O9 b
/* */
/ }3 b/ @0 U/ W: a5 ~! a9 S
/* 全局变量 */
{& v3 n, B; ~( O- u
/* */
0 O5 Y. w2 S* t' C
/****************************************************************************/
/ i. h1 b4 `0 N" e, C8 S q
ECAPCONTEXT ECAPResult;
* H5 T/ C& F. h: K2 p& E3 w0 l; F
% p3 L7 F5 L8 P: f
/****************************************************************************/
% x+ P* j( V0 h- V! b2 w
/* */
) O& }) u4 |3 e+ B1 O
/* 函数声明 */
6 f8 I% `! r! H4 g' l' W# _
/* */
7 E- r8 r+ i4 z9 [" [
/****************************************************************************/
; x9 [. r9 n, n! r2 a" R+ d% s5 G
// 外设使能配置
) w0 B2 w- X! k- j
void PSCInit(void);
) O, Z. e' \8 E; O% A
; Z' g; ?# O% }- e7 |
// GPIO 管脚复用配置
: l0 t$ l5 F; n. M
void GPIOBankPinMuxSet();
- Y4 q/ h0 e3 ^) t8 @
6 X' k0 P& N1 j9 S/ b
// 产生波形
/ R5 [; U$ H) b, z* a2 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 {) b% C6 ]9 ~, ]
void ChopperWaveform(void);
`* @5 _5 l& q ]
3 j1 K- M' p3 ^
// ECAP初始化和读函数
# m# G q# n2 F/ D8 v8 w
void ECAPInit(void);
) j5 }) c% [9 J
unsigned int ECAPRead(void);
9 Y: P% M4 V6 @, C7 H Q
]. \! @3 {! N4 i7 U3 f" ]6 n/ r
//ARM 中断初始化
* }# G# u6 q) ?/ G
void InterruptInit(void);
4 U: N3 f C6 h% z' ^+ Z
) h# |& G0 E n) z" ]
// PWM 中断初始化
2 [: n, T% O7 y6 t; J. b
void PWMInterruptInit(void);
: x1 F7 W+ k s+ Y; R* R
// 中断服务函数
# |, V" C9 q8 { z r7 G: j
// PWM 事件
. C! Q. b3 z$ p0 Z" p3 O! i
void PWMEventIsr(void);
/ ?1 j z9 e: X& X9 v( Q7 e
// PWM 错误控制事件
& m) r' d. J+ ?" |+ n+ d! C+ f
void PWMTZIsr(void);
$ b h$ |/ X6 Y
8 e1 c5 Q! X+ A! a$ f6 J, p' Z
/****************************************************************************/
9 a A7 |( o: y9 n+ Q' [2 J+ }
/* */
, w+ H6 W# h5 U0 x4 N7 ]" R+ P
/* 主函数 */
5 E4 s7 p( T L9 r3 J
/* */
- A; T5 v) |$ C
/****************************************************************************/
7 V& H* B: |! `; z. C" b- F
int main(void)
2 a, S7 m7 W& y! p% T
{
1 }4 H2 I% @# z- R& h) r
// 外设使能配置
+ x: A' e( Y7 l- x; ~; x1 v
PSCInit();
4 S3 S8 | u- m! ]$ Q: m
: S" i+ O- M# W G) ^/ [1 m
// 初始化串口终端 使用串口2
8 I; r3 y0 i# ^& \7 Q& q
UARTStdioInit();
* p! b1 g/ z2 z4 a: W5 W4 |! M
8 I$ p) u; i4 H* v5 g: k
// GPIO 管脚复用配置
4 J. `; d9 `' o5 S# ^
GPIOBankPinMuxSet();
. t9 Q8 \5 X9 p9 w1 J |& b- \
9 F$ y" ?# J$ v6 v6 L
// ARM 中断初始化
7 E, @ w' e- j0 K. p J0 x2 J) D
InterruptInit();
1 a4 K, X3 p0 b, R+ n6 C' Y
, v8 D! F1 d* h* N7 U4 l' I$ M
// PWM 中断初始化
8 ^0 p) D2 C7 f8 \+ f
PWMInterruptInit();
9 J4 N4 [& O; H# J1 L
% A1 N1 [# E3 d& Z& [
unsigned char i;
8 s8 S; u# ~% L9 `+ x
unsigned int j;
+ J5 b& ^7 u# |! D
' U2 F7 h& b! f" i1 N0 R/ ~, D B# H
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ L$ B3 p4 E& @& W# }
UARTPuts("------------------------------------------------------------\r\n", -1);
7 W8 O9 s; r- u& @5 M
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ ~( ]7 C. [- o8 C- x
// 产生波形
- C1 E8 [ H( G& [
PWM1ABasic(25000,50);
# I) U8 h: }1 B4 `/ O! c
% }1 e* t$ R, t. I
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 p1 s% Z) b8 m( n
UARTPuts("------------------------------------------------------------\r\n", -1);
" |2 H4 }$ ^0 x) g
& v& O/ @1 @2 a+ t* U
: c# h) o& U6 T! ^: t
: P/ k1 v0 ?+ A: R! e- A, d. r- c
UARTPuts("------------------------------------------------------------\r\n", -1);
' ]/ Q z7 c9 P
UARTPuts(" C6748 ECAP Test\r\n", -1);
" O: a. G8 y. p4 B8 f( |% ~
// ECAP 捕获初始化
' a K1 x, H8 h+ Y, ]0 y' e2 n
ECAPInit();
8 t6 E0 R- O! v& g2 ?+ I+ D- _
UARTPuts("Initialize ECAP.......\r\n",-1);
! g3 `; Z* \2 q1 H( I, B: W5 ~
for(i=0;i<5;i++)
+ }- w7 `6 t( c" R1 {) n, f: J
{
. h9 S3 l/ \' k X4 y
for(j=0x00FFFFFF;j>0;j--); // 延时
3 J2 Q& j- h$ Z$ ?& T, \6 u6 O2 x
ECAPRead();
& ^ T# v$ p) B' p6 W! \9 K
}
: @0 g0 Y3 \, \; H3 f
UARTPuts("\r\n",-1);
; P; @3 l, K y+ \' p; d8 R8 ?$ Q- J
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
9 t4 {" A. D( q* C
UARTPuts("------------------------------------------------------------\r\n", -1);
4 d3 f" t' W; F# j" c U; h
2 B; d$ a8 `: E# e( t
// 主循环
8 W+ k! g8 {8 M9 K) n, u
for(;;)
$ N! N8 ]7 W% U7 S4 V- {: u& m
{
- z( {6 ^* J' v# |4 @ B7 U
3 ^/ @/ \6 `3 y5 f
}
O7 V5 w% ^5 ~# Q# e8 u; z3 y
}
- y9 L/ i. H, X6 g
& c2 w9 l6 N+ p* K) e5 W* i
/****************************************************************************/
7 r5 o8 O& H; t& V, C( i1 x) ]
/* */
/ t+ a& i$ m1 d, s8 ^+ C
/* PSC 初始化 */
' d+ ]- p6 D9 G {) y
/* */
$ u% J2 x; l" g2 H
/****************************************************************************/
3 x, {. {. Y3 H
void PSCInit(void)
* A8 y" r0 Y4 L' p
{
* n0 O9 P& Z: g& g) l
// 使能 EHRPWM 和 ECAP 模块
' \6 t; X' O" t9 {6 u/ U( O
// 对相应外设模块的使能也可以在 BootLoader 中完成
& K3 i- e7 j! [1 O# b l- V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ Q: E# C: a" ^! F. O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- T4 p2 W, b2 j4 K
}
N0 R7 ~* r% }6 P$ f$ W
/ @5 k6 h; l* `/ P& f( z9 g
/****************************************************************************/
$ ]- `, _! b; \' V+ T
/* */
8 n( K/ h, D, S: f6 w, D3 l
/* GPIO 管脚复用配置 */
. Z0 w1 }. ^0 E& |# E9 X
/* */
" w% f- E/ L- `" |( i6 m' O6 |+ Y
/****************************************************************************/
0 Y; [! D7 B: `/ M8 G
void GPIOBankPinMuxSet(void)
0 U) O, @3 K2 b( Z
{
- \$ }% C1 ]" G% w* E7 u/ Z
EHRPWM1PinMuxSetup();
8 r/ k. D; `* I: s6 P3 b2 B
0 N7 G8 H! |. y) D7 M$ Y% y3 k
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ ~" X& d3 |8 ^0 N$ Y( a$ m
// 作为捕获功能时管脚方向为输入
7 f% y0 S7 |5 ?9 B* s4 d8 j' x
// 作为辅助脉宽调制时管脚方向为输出
& ~4 @: E3 ?8 V( V
// ECAP2 / APWM2
# s. n) ^; z+ f
ECAPPinMuxSetup(2);
' f+ Y( m; e, D1 {% v4 x1 W& A+ a
, ~5 ]5 I5 I M. m- [
// ECAP2 / APWM2方向设置为输入
+ t* ?$ {* k! ]- {5 [
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
- Z$ q6 o9 U2 b, G! A
}
/ _) y% t0 g5 h% P6 I$ D" U) e& Q
2 A, U+ y/ N! r- o
/****************************************************************************/
. D, g8 Q% I: a& e% [/ C d
/* */
^0 P" D" e" P. D7 `
/* PWM 输出波形 */
6 g9 G9 |1 b' T0 T" B
/* */
8 {% P: m# T1 e" l
/****************************************************************************/
- }( p! F" X0 t: ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
0 @8 J. T1 {/ x9 y! R' ~, t
{
: V& r! y. S9 Q' K4 k) Q( q$ \- E, i
// 时间基准配置
! c( ]' i! X ?/ g. L( H# S9 x
// 时钟配置
, c% g, _8 K0 {" T/ n2 o, Q$ p- T
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" Y) z( `: l( }0 @$ H' d( j
$ l' t l0 W) f1 W3 I! r' a
// 配置周期
# f. }! w- h, h7 r0 t# y
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 E! t4 j4 B M' d
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% B/ e* M* ~- n) p: q
# o2 n- Y4 B5 r
// 禁用输入同步信号
5 l# L+ }/ r$ x( c1 X! \
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& L& P% A8 B6 N7 G( C
. l6 x# s7 D# `3 u
// 禁用输出同步信号
& Z! s# {0 v2 Y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. [8 ?2 a' P/ _% i1 q
% p% d4 p8 d s+ U4 e/ t
// 仿真(DEBUG)模式行为配置
" K* [$ |6 p) L; u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- p/ M6 a/ A& R; I k" k* d% J8 g0 e
$ C/ o2 j! L* \
// 配置计数比较器子模块
# e+ W% g' n, a) n5 `) ?1 J2 k0 f
// 加载比较器 A 值
7 C/ f2 X P: t8 z) }0 e3 S
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 c- _4 o% l1 M6 t7 B* x: a4 {/ f
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) L6 o! Z) F; C9 h0 L
- i/ h2 {2 G% L0 r
// 加载比较器 B 值
) w% O' I7 l" G4 s" W' T
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
) q2 x! W# L; ~' M% U# C1 o
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
D* p7 f C" D3 t9 D! b
# ~* W5 K( i# f. _6 r
// 功能限定配置(输出引脚触发方式设定)
$ q% |% I x4 |. Y u" G. }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! J- A" Z* }! n+ q
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: [! ]3 w0 g8 W9 q2 l5 G
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
8 N5 ~* S6 J3 P) |( }# h
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 p; M# i2 W, `; |" A
/ U" R9 H% b" [/ b2 z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 T% ?$ l" [* Y" {+ j
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
5 A) M, q5 C3 \
! D0 }1 w" q r! u8 x
// 禁用斩波子模块
4 J& [. a ?7 N) }0 M. }4 \, g
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; h5 T: |) G8 F: g$ P2 i$ ]0 E/ E
9 R* n: ]+ p; E$ |/ I1 t
// 禁用错误控制事件
2 i Q1 u- U" \$ |* }7 U
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
5 z: x# `4 l7 L3 L; D0 m
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
0 @6 [$ L ^% o
2 P4 F& w. @/ m5 p& n" k
// 事件触发配置
9 e+ \) I" M; i4 b
// 每三次事件发生产生中断
. j% H9 _2 a: j( M V8 }
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ Y" p) b1 p$ @8 n$ e0 r1 k
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 E1 ^- T. s. r; j+ [* a; S: t
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 ^$ A5 O ~3 M6 B
// 使能中断
$ B2 A8 {: Z( k& y1 I- D5 k
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
( C, k1 T6 V) W2 \: N6 L
" m5 H* ~) @7 K% O# `) L, {1 t
// 禁用高精度子模块
; @3 [5 y$ t1 ?- S. P0 H
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
6 C7 V( m7 i1 u6 u0 [% w$ f
8 e% ?) h8 F. j2 k: U7 Y
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: p" d6 b. C: u6 c9 D
}
, V; f2 l0 n. { W
' R/ b: s. p1 r0 y
void ChopperWaveform(void)
, r& s! J. P0 ~0 @
{
$ u2 o6 N8 [4 r
// 50% 占空比
6 ^$ F: n- W# A! D
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
+ Y- O5 I/ B' s( y# _& M- d. |
// 4 分频
+ Q6 |( l9 U5 v" z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 b ~( b( D1 d4 \2 Y* ~$ h K2 T8 |
// 单个脉冲宽度
$ B+ y5 o- u7 b) F8 f* M# j' }# k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
; c2 r: h2 v7 _% O1 n4 W, o( g5 {
// 使能斩波子模块
9 C0 `5 H; }7 H3 u7 \: d# T
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
Z& T+ Q5 U' U" m
}
/ [7 g( {! }5 r8 v& ?3 d' N0 C' a* |
6 L8 n9 a& k( p7 k8 g: M" M( v
/****************************************************************************/
' V! E. M/ k/ t- h# p7 h
/* */
( @/ ^1 V" @$ c8 B6 d
/* PWM 中断初始化 */
6 ?3 i/ N# }! J. w, \ y
/* */
) K% D6 @. G" l% } } ~
/****************************************************************************/
' N v# g2 X. t! Z
void PWMInterruptInit(void)
9 ] u* k1 p6 C2 ]4 m% U1 x8 O
{
2 A6 m9 \+ h. P2 b4 F
// 注册中断服务函数
" i' q( h+ R s9 D9 B3 n5 c# N4 K3 Z
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* |3 V4 p) ?9 B! ~
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
9 f" l" h9 T( S* P, u
% V1 R( j9 G+ y; g" ?5 L
// 映射中断
7 U9 ]5 B, E5 h/ B9 E h' u) n6 ^* h7 s
IntChannelSet(SYS_INT_EHRPWM1, 2);
o0 G( o- i) I; s; m9 V/ F
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# i( P' e* ]" T+ v; K
; P; [' |2 @7 }; j7 U- |2 h7 s3 U
// 使能中断
6 w5 l8 x3 z; B
IntSystemEnable(SYS_INT_EHRPWM1);
1 A9 l% i5 \: n+ T
IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ {' j/ x4 t8 @$ d! S0 C9 g5 M$ H
}
3 y0 B' Z# w5 l7 P7 r) t
% `- t: T+ `) ]0 d, G# N& k
/****************************************************************************/
3 {3 S/ i& B3 L& U2 C# ~/ F+ k
/* */
: A- M* s& a5 U/ X
/* ARM 中断初始化 */
/ r( x! K$ Z- `$ D D0 A
/* */
9 w5 G& |9 n% T; e, v! T
/****************************************************************************/
1 C5 `1 T% o7 ]+ n
void InterruptInit(void)
1 L8 U$ [; N6 j* G( r% a
{
1 H# x7 |4 w) x0 g. ^% J
// 初始化 ARM 中断控制器
v8 K8 A4 _2 Y
IntAINTCInit();
1 e6 v, P% s. I8 Y+ W
2 J9 ~2 x7 D/ [9 Q/ ]0 N# x
// 使能 IRQ(CPSR)
' e8 e; M# N2 |3 ?/ S" u, ]
IntMasterIRQEnable();
$ k9 N2 o5 e: ?% i
, J6 ^# ?) C- @2 Q
// 使能中断(AINTC GER)
8 ~( I( t+ \$ v, Z O
IntGlobalEnable();
. B$ o7 n* ]& g- |
1 _5 e& F( u- j$ c
// 使能中断(AINTC HIER)
|) M% v! ~0 D4 K9 b6 X- y8 `
IntIRQEnable();
0 T4 ] [# G$ L7 B
}
; z- p8 T8 n$ }7 s
! m& l9 X( j4 s) n5 I, ]
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
5 k2 V. @8 P- ^% u: ~
/* */
$ V U S& `$ w! ]+ f
/* 中断服务函数 */
( {$ [) `: w# l& k$ u/ X
/* */
& [! k H4 b0 }0 F: n. }* f
/****************************************************************************/
: C c) k( Z: j8 O3 D
void PWMEventIsr(void)
* Y7 F* |3 H7 Z0 c5 A/ W. ^
{
. B/ s, G m# {- F+ t% z7 a7 h
IntSystemStatusClear(SYS_INT_EHRPWM1);
6 c# o0 Z. o" v8 O7 Q, o1 [
3 p' j& i; a: D' [3 u2 x
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
% q3 N4 v1 K; a" x
}
, y. V0 \2 `3 r7 R K- j# v
$ e4 Z1 g2 W* d; [3 K1 s
void PWMTZIsr(void)
$ Q! b6 \- s, ~' g+ X6 F
{
1 U2 J! Y5 c- X7 X% {8 ~) Q6 ]
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
: K# z* Y' i g4 D" g5 Y% G2 N
6 n* Y1 {! b" P$ C$ L' H
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& \- [+ ^' K# J. l5 ^
}
2 k w, p% g$ p
% c* \( C: P9 C5 I+ D
/****************************************************************************/
$ i' j4 }6 B4 Q( c" v( J
/* */
# R$ ], G3 Y2 }+ a8 D! T7 D$ S. J
/* 初始化捕获模块 */
7 k. z( @- [: a9 q, e3 k8 i) T8 y
/* */
- E) N# X8 v! `! ~) v [0 t) N+ y
/****************************************************************************/
7 C8 E$ L, c- z
void ECAPInit(void)
, ?. A6 R" Q+ A; r2 A% c
{
* t6 C! ?% |1 x
/*-----设置 ECCTL1-----*/
- Z# `: }+ Y; c4 E3 h* c! g; p
// 使能CAP寄存器装载
' j( k6 V3 z/ u* t9 v
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
2 F4 G* S9 X. N" w$ O
// 设置预分频值.
9 ]* g) G0 z" w3 [3 E! b( l
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 z) B. K4 G0 O* r$ c. X+ A2 l' E- n
// 上升沿触发捕获事件
/ q/ R; G# @8 Z, _+ }, d6 r$ W* w
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ g2 v0 [1 |, [( w
// 输入捕获后重新装载计数器值.
! ^. p" i8 [! N3 o: y2 L* Y: |
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
4 G+ F2 G! }& \" y; v
& J1 S& g" @7 a
/*-----设置 ECCTL2-----*/
z9 u9 K; m$ ?( y4 Y
// 连续模式
/ M8 G& L- _" k" G% _; Z
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- x0 s; k7 Z- ], q) u2 T
// ECAP计数器TSCTR持续计数
4 ~3 C; M/ o5 j' t4 R
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 K; X$ J7 M: Q# `
// 禁用同步输出和同步输入
1 X s& c& v# J6 x! N; v9 w+ \' V
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 n \. s1 T0 s1 V1 k, B
// 配置 ECAP 2 为 CAPTURE 模式
" y. { i! q( t0 A$ t
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
! H; O# R9 [ O' V) n
: d) V2 j) j4 D* O4 J6 ~4 }
// 使能中断
5 {% `+ J0 T8 N5 W
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( z! t7 r& h/ }: @! Z5 N
}
- K; m3 ~4 n) k0 z0 q7 h2 N
+ @/ s" W+ |# f* V
/****************************************************************************/
0 I2 n6 S& n: |- \1 U( Y) Y
/* */
9 R( `% l8 b# H* W; A
/* 取得捕获结果 */
' w5 J: o; N7 F" I8 p( {
/* */
7 D9 f) ^; G; m1 V, h5 q& Z
/****************************************************************************/
2 N {6 l5 |) w! E* F! T% V+ n9 x
unsigned int ECAPRead(void)
8 b! @+ y$ `1 X# k
{
* Z6 \. W) V0 k. [; G9 R: _
unsigned int capvalue;
/ A9 T) i) p5 `8 R
unsigned long frequency;
; H- b/ Y$ Q; X) y2 `$ k* W
: G9 g7 u/ _, H, T2 Z/ N8 [2 i: C0 Z
// Event1 中断标志
! H" A) O9 s- p+ ~
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
! L& B, m1 |. C# Y( X
{
+ b/ a& Z1 @6 L& `8 O& s' }; V s
// 取得捕获计数
/ ~$ O) A! k* \ k
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. I# c5 I2 n& L( R: B' p
capvalue = ECAPResult.cap1;
$ @* w, Z1 m; U
( q' H8 [& {. q v. G5 \! y
// CAPTRUE 模块 228M 时钟主频
$ _' ~) S% V. ^* N3 ^
frequency = 228000000/capvalue;
9 \& j( q, z0 q( @' G- j" a* H
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
$ M# g2 f* E$ D8 z
3 c$ M5 g+ b% ~! u
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
3 X+ y( `2 d: E. a# A8 G6 ?# i
// IntEventClear(SYS_INT_ECAP2);
3 d2 H P7 i/ J L9 p
}
* C+ ?% Y+ }% e' v
return frequency;
, J/ b* P* q" d2 E4 k) q3 l" C
}
# E4 l* [. \0 j
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
! v9 i/ C7 v9 J/ C; @ [- f
[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