嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 g2 e2 {: e; S& H$ y* U1 n# T5 u/ n
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ O- K- M$ s* C2 f+ R( d/ Q: M
/* */
& _+ ?4 w+ |8 }1 _# W. z* G5 Z4 h
/* 宏定义 */
0 Q7 n% m& a4 e& J, N& Y) g
/* */
) T9 W1 D9 ?4 n E, `
/****************************************************************************/
2 T4 U2 i7 I: C F0 w& J" I
// 软件断点
7 _' u5 v1 D; D6 }
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 k4 [- V% U" k7 }' ^ q
+ h7 D5 _4 e1 \9 f2 }4 X
// 时钟分频
& a! I+ m8 o2 O& X4 i
#define CLOCK_DIV_VAL 228
7 y# V; C& c( {+ o* T- x
7 f; U- R7 K- m
/****************************************************************************/
3 C! _) I. E8 e9 D& H
/* */
, _/ @3 W2 F1 j. T
/* 全局变量 */
: M* i% t, H' S5 |
/* */
0 d& H: z) U5 ]/ h3 p+ x2 T* y
/****************************************************************************/
, n& V! N" N8 n' }: ~
ECAPCONTEXT ECAPResult;
8 H' I% G, R9 F" N6 `5 \) }) Q7 {2 L8 u: ~
3 I+ }1 o: b. G3 L) W5 U- u
/****************************************************************************/
& c c) d' K9 F# N8 r( ]
/* */
7 L- i8 v, w- w( a
/* 函数声明 */
% \: X! ?( A' p& O& I
/* */
8 E% t: z* Q+ S9 [5 f
/****************************************************************************/
f- N! @3 o8 E- \3 g k
// 外设使能配置
' t' `8 t' m4 f1 {% K! @
void PSCInit(void);
8 b8 G' Q$ d! z
- f b% o) J3 A7 W9 B' v% Y/ {
// GPIO 管脚复用配置
2 N! I9 l% d& F4 N( I2 j2 b: w
void GPIOBankPinMuxSet();
) s& H0 r3 U5 W5 g: P
" F& n+ x5 Z3 d5 P. E" A) q
// 产生波形
8 w9 `1 o% { W& ~7 w0 n( `
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 W9 J- {8 u8 |
void ChopperWaveform(void);
0 T d% J% G* V0 G
' s, G# U" p2 m
// ECAP初始化和读函数
2 O. h1 U# j+ i, Y
void ECAPInit(void);
( X8 r. I( ` `5 |, A9 }
unsigned int ECAPRead(void);
8 G# `' D& g6 u3 o9 O$ N' U G2 u
( }# M) z5 e: G5 g! ]3 q1 |
//ARM 中断初始化
/ V$ R* ~2 B# }9 A" M
void InterruptInit(void);
) P% U: r' @, N5 I0 w( F
( l) s5 G* @" _% n* B; s+ v: @
// PWM 中断初始化
/ W9 \; V5 m% `) V/ Y! j; y
void PWMInterruptInit(void);
- ^/ m: @- a5 `$ {0 ^, y. K/ M* v
// 中断服务函数
% w" _% L7 o2 b" Y) ^( u
// PWM 事件
$ J6 r# y+ N( J# N* ~) ^* n3 K8 o
void PWMEventIsr(void);
1 U, P7 r5 K: H8 c0 i- `
// PWM 错误控制事件
+ P6 L& r6 C, w: s3 J! t
void PWMTZIsr(void);
5 `6 @0 ]4 M; H1 d$ Q
7 U/ S5 r+ z$ h- o
/****************************************************************************/
1 W, N$ |2 q$ v. s& k7 k
/* */
" d# A) w6 |3 o% z9 S6 v7 Y3 d
/* 主函数 */
; D; ]& z) ^6 z! x$ ^) P3 B
/* */
& @6 T3 Y( ^7 s: ~ w) F1 J
/****************************************************************************/
" [8 g3 a5 D! E
int main(void)
* n' o- V# y. I' a; Z) p
{
7 R5 `" O; d; b' ` e) N; @
// 外设使能配置
- x+ { G' g, q
PSCInit();
0 s% W4 G2 z4 i* V
5 [, D$ X; x* o- }3 L
// 初始化串口终端 使用串口2
2 N" k3 Y! f2 S6 a0 ]: d8 o! f1 T5 o: U
UARTStdioInit();
6 k6 J: D# u0 |. |# t1 b& x
) Z3 m; ]4 ^% E6 n/ B
// GPIO 管脚复用配置
9 |$ W( E3 B1 o' x4 k' y
GPIOBankPinMuxSet();
- Z) [7 l) g9 _ T$ D) W+ E
1 y7 y/ W) a0 F! x R
// ARM 中断初始化
8 ]6 ^7 D- r' b
InterruptInit();
, I( ~/ |* v {6 C j! B: E
\. }+ W2 ^) ~4 s
// PWM 中断初始化
9 g' d* P# u: }7 N1 X/ [# W" p
PWMInterruptInit();
l$ c2 n1 u# M9 N. o% Q
$ f( t5 u3 r6 `7 d; N1 m5 i) v
unsigned char i;
0 U$ j' r0 d: v& k0 ~
unsigned int j;
% s/ F ?1 C6 c, q
- R6 X2 j/ n$ S9 O
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ p) f) Z1 m7 |1 W" \6 J+ x
UARTPuts("------------------------------------------------------------\r\n", -1);
5 i) O+ {0 S% f4 v
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! H, E' x' l' ?! r( P
// 产生波形
* U0 T. V. H+ g) D0 Z# N! E5 x H
PWM1ABasic(25000,50);
8 ?" E& v' Q, {; I
4 S7 v1 D* J5 a6 d
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
- u0 p& L* ]3 ?1 H
UARTPuts("------------------------------------------------------------\r\n", -1);
& e" F$ }+ F: z3 W- _
5 {6 J+ f3 L5 {3 v+ p
0 s- V, A6 G* e! a# A+ J3 m
( \$ [; ?% I2 R( w& d3 k
UARTPuts("------------------------------------------------------------\r\n", -1);
5 l: H3 M: U' ~8 v1 n1 b
UARTPuts(" C6748 ECAP Test\r\n", -1);
" b4 v( N3 P+ \ d1 {; N
// ECAP 捕获初始化
& s; g6 C2 ~. }6 `2 X7 @
ECAPInit();
K- c( g+ O/ [) V
UARTPuts("Initialize ECAP.......\r\n",-1);
4 D/ ^* r% S! d' m
for(i=0;i<5;i++)
+ e/ `8 g- ~/ N3 H
{
( g, \9 y- O! ?) G) H; }6 C+ V
for(j=0x00FFFFFF;j>0;j--); // 延时
6 a6 v1 U2 W8 O D/ ]$ i, M
ECAPRead();
C. Z5 M. W& ]0 b) a) h
}
+ W1 C1 @0 l" x. C! I2 {, {/ O2 n7 i, h
UARTPuts("\r\n",-1);
6 ]6 C$ \. ~7 @! N% ^2 T! y
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 h _4 i) y9 g8 s5 C
UARTPuts("------------------------------------------------------------\r\n", -1);
: c$ |: T* e8 O8 U
. f% _" R- O# Q8 s
// 主循环
2 _: y# |; ^2 _* w
for(;;)
, r" Y( t& Y0 B& b2 `+ q
{
* q# O/ b' y8 Q9 ?+ Z+ ^7 D- |4 u
9 i( M. {, O- L0 F2 Q; l
}
+ y/ Q1 V8 ]/ ~' v) ~4 w8 x
}
# x% H8 R, w) }" Z. I# l% m6 W! v
* b2 e, E. d& r/ \9 n& a
/****************************************************************************/
1 T4 p& W5 ?0 C1 L9 o& M
/* */
0 y4 _* c6 ^, k/ T, b( f4 D
/* PSC 初始化 */
/ n/ \ O- u! a% X$ O" Y/ L8 T
/* */
; P: L6 X5 i; T2 a0 z
/****************************************************************************/
) y( K4 x, E; S8 q5 ?* Q
void PSCInit(void)
$ G! o0 b1 s! m6 Q! R
{
' n% @+ C- F: D3 d D
// 使能 EHRPWM 和 ECAP 模块
4 D; O- A& ~4 m! G9 m5 a1 q3 ?) \
// 对相应外设模块的使能也可以在 BootLoader 中完成
8 E T( s! n" K" a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 `+ L, y' P9 B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, \0 O. k4 K8 e
}
$ V0 v, D) U$ V& O
& m B; j9 E+ d4 O. R
/****************************************************************************/
0 l& N- l& O8 W1 F, D& [
/* */
5 h. j; ]7 T& j! l7 L* w
/* GPIO 管脚复用配置 */
5 A1 h8 _/ y9 I
/* */
( d' [! h8 p/ o
/****************************************************************************/
; S" D7 e8 x4 W% i
void GPIOBankPinMuxSet(void)
2 m3 E* g, ]* F1 b$ H; n3 ~
{
7 u* s8 ?& c* D+ n: t* }9 z
EHRPWM1PinMuxSetup();
- J7 w3 z6 g+ Y( ^5 O5 i
( z( T- t" C5 b' X8 i# g& s- Q1 W
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( P; }7 v1 ?* Z9 G7 F
// 作为捕获功能时管脚方向为输入
) ]4 g7 v* O! x$ v% C
// 作为辅助脉宽调制时管脚方向为输出
/ |' n" r" N& U O
// ECAP2 / APWM2
) }- u6 I/ ^2 b9 E8 d& |
ECAPPinMuxSetup(2);
7 V% `5 P" }' }4 M& y/ t
' y" j5 D8 \' p1 a% r
// ECAP2 / APWM2方向设置为输入
3 G0 T5 M4 ^/ b, T' ?2 K
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
9 ^3 N y4 l4 ]+ J3 y0 g
}
0 x7 H, }, d' P" m
4 u; r% _* T6 h3 J: U- W
/****************************************************************************/
9 |2 c p/ l6 X0 q* i* v; v& F
/* */
4 P- { q" g1 K$ N" r1 G1 E' q2 M
/* PWM 输出波形 */
3 g& \3 v2 X5 A; f# ^
/* */
7 _- p8 i* L: I8 c+ ]( z! o; E: i
/****************************************************************************/
9 M* H0 k+ [. T# X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
& Y2 ] |7 n+ ]6 M0 n
{
# [& j" h( a8 D7 K& H# ?8 h
// 时间基准配置
) _% L. o0 a3 l. f! R* i' X
// 时钟配置
& _4 n% K" M* i( {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 y# K6 R' T9 P+ `+ z. e
% j* Y* Z) L% S
// 配置周期
( o7 G2 }2 m, Y. I
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 u! r; x' ~0 e {+ Y0 l; u: D5 K+ _
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- P* z+ d0 l4 _$ R5 Q+ b" x
% x" U: L) u/ |4 _9 R
// 禁用输入同步信号
; v$ N9 b& h6 [# X( A1 ~
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
/ W9 e5 ]4 x% N; X/ r
% m Y9 n: e' T
// 禁用输出同步信号
6 {0 c9 h2 {2 H1 n9 X* d4 J
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. _9 x9 K: S! u
% O; b( R9 h: }/ \+ l
// 仿真(DEBUG)模式行为配置
" c5 j- S+ G& p, |
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* Z9 C) {2 K0 N5 Z# \) p
- [9 o: j8 M$ K3 J
// 配置计数比较器子模块
9 D2 l _1 w6 {& A D; \
// 加载比较器 A 值
) }9 {2 q I; A& q* i& l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
/ e/ L8 [2 ]) H7 T$ ?5 L
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
/ p( \/ Y- @0 T* o
E" {; S4 e5 a
// 加载比较器 B 值
, ]2 L5 `8 N' Z5 `
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 r( c8 x" k+ s: O" B
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* G- {' T2 n- p8 ~
$ U' E& s' ]& e# K* |( w+ ?- p
// 功能限定配置(输出引脚触发方式设定)
+ l$ L# d4 F N$ T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ X* v3 m6 k; Z2 }1 P/ I! `$ `
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ W6 Y! O. E: _: H9 H) u
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
K5 Z( ?' l" q7 R H! w3 ^
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ u2 ^2 `+ ?( q! r. ?7 {
! C( ~+ L+ i* h
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
# r$ ]# Z9 X) ~! T0 @2 s
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 y% x. T& s* M( i
; E( ]- r) y% r% ?
// 禁用斩波子模块
; B( p. I( H% @5 t4 ~9 O+ M# s
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
% E8 `' Z/ W9 `. @
/ @) J1 v' U. |0 [- D+ L
// 禁用错误控制事件
+ Y6 D0 ^- n0 _/ a& Q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
3 C6 O! o# f+ l: C1 N
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ p2 S& u6 `3 |% k
W1 d2 m: @% H g, ~9 d
// 事件触发配置
7 s# f7 ?& ]7 W+ C% U% ~6 e0 V" x
// 每三次事件发生产生中断
! Y" U1 T+ o% a, q; y4 s1 L
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 ]# W0 e, i/ q1 k; Q E4 d
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( f$ U2 Z8 S |! v* O
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' Y7 s$ u2 b$ J! x/ e
// 使能中断
* {6 {0 Y' S. s3 F. ?, K2 ]) W1 [- u
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
5 W$ u% s4 U% ^9 p
% n3 r' |! W, Q f' u* z
// 禁用高精度子模块
: W8 Y2 }$ f, D
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
9 G' p2 j0 E5 U
! v$ B8 k, O! G- |6 } Q, @) \
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& S* u$ p4 i1 G4 n: g# B
}
$ c9 x7 P9 |2 ]1 h
. Z) a* s$ R1 U- E
void ChopperWaveform(void)
2 O. ?) y# n5 A$ b# q7 h: |/ i( H
{
" I6 ?3 L' t/ X( b$ ]$ O
// 50% 占空比
& s0 R1 c# `( I* ^* Z+ d* b7 c1 d% J: `
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* P+ k) v* N$ n, @( W4 J7 s' h
// 4 分频
6 }1 |! B) @! @2 b' K1 s
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ B# @- {& W3 d R) i& h% c! ^
// 单个脉冲宽度
( f$ h* Z5 X( O
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ A. O% z. z" I0 ]/ l- x
// 使能斩波子模块
" L4 G2 P2 t/ w6 b1 C
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 N6 n9 {# C0 f- P& w' p
}
" \9 @0 M# q9 ?# V' H: K
1 c( X; F3 b- V, Z1 b
/****************************************************************************/
7 |: |2 ~* Q5 P( Y* b
/* */
# M: o3 w* g2 L/ l- n6 r
/* PWM 中断初始化 */
7 _& c; c6 j, _- U
/* */
$ M* o5 E9 y- ^! G
/****************************************************************************/
& Q7 f8 b$ j3 k% e0 m
void PWMInterruptInit(void)
/ l) o- @" X+ g/ K; x0 e
{
; A' w! C4 ?6 G9 r' F
// 注册中断服务函数
0 R# r9 `+ t2 ^# j$ u. P' G2 R2 W
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* m! p% J. W0 Z3 ]* x S
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% y) c+ d2 \" ^- I9 h: k
/ m( ~ M- x- ]7 j% z
// 映射中断
' ?) |4 l# ^; a( n5 F$ x5 Y, F
IntChannelSet(SYS_INT_EHRPWM1, 2);
) Y2 J" c Y+ \8 {) h- `( L* A
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 g2 U2 |0 X$ F% N) W
@ e7 b. @* d" j* \' b6 o1 q5 G
// 使能中断
. K5 s; Y9 X1 T7 [+ B% B* d0 I
IntSystemEnable(SYS_INT_EHRPWM1);
7 U. P8 Z/ Y# s
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 j; j- w* W5 Q5 l( ^
}
& H/ O$ Y. B: Q/ m# }
% G5 V5 E$ ]% @
/****************************************************************************/
! E1 U4 f/ O9 W$ d
/* */
$ T1 y5 n9 k* w$ o+ Y
/* ARM 中断初始化 */
- G9 R8 c6 r. m4 D- P
/* */
" N* c. p! k5 r* l1 u" P7 r
/****************************************************************************/
/ m" f! d' R# r% I2 l- M3 Q8 O
void InterruptInit(void)
& |4 _/ H, n" l% i; ]( Y
{
. x+ U) R. \' E0 g( f
// 初始化 ARM 中断控制器
- P/ M" Y" m- W0 \3 u
IntAINTCInit();
* c; z; E, I& ] g2 ]+ u0 i
! W0 a: C% J$ s) n1 a
// 使能 IRQ(CPSR)
* F4 t$ h+ |7 G H9 B W4 s
IntMasterIRQEnable();
2 g5 W/ T- `- {/ ^
. V" x+ L5 X3 G' b5 L
// 使能中断(AINTC GER)
/ c1 S$ _; `# |! w p
IntGlobalEnable();
7 V. e, H# B3 ]
8 _# }4 K3 Q5 _3 Q
// 使能中断(AINTC HIER)
$ y/ t# R, {3 c9 ~6 o$ Z( S
IntIRQEnable();
9 ^6 d7 \, R7 K7 u; [
}
# S9 M+ F! e9 N$ J1 ?
+ r5 _& i: M* C2 N
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 @$ F- X6 |9 e
/* */
9 E" R7 u0 ^5 i: w# u g
/* 中断服务函数 */
% ^) r1 x" d2 S% X' i
/* */
' v4 U+ l, H% D) ^! F
/****************************************************************************/
" _, E2 e {. F5 [9 \+ M; |/ U* c8 L
void PWMEventIsr(void)
5 Z2 m3 e1 ?; J2 ^. ]: T+ q' |6 w q
{
) c4 X: } P$ q7 L. [8 L8 ] f
IntSystemStatusClear(SYS_INT_EHRPWM1);
, B. x4 y/ G2 b+ U" q
5 x4 V( @& a; O0 b; a3 V+ b
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' n3 O; H6 I; b) N+ ^
}
& c7 z4 V1 Y' F9 [' y9 R X, b
) v: @0 i T- D9 C# ]0 n
void PWMTZIsr(void)
( Q5 S6 n& H* J( e- h- n
{
' ?8 _- c8 Y3 D
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 C7 j& Y' j4 f( v1 M+ p' I4 s# b
& F9 d2 Z7 J7 z) }+ p
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 T) ?! \1 S1 k- D; J" V
}
' Z2 e# ?6 ~8 ^8 j2 n& S
8 ?6 ~$ g+ W, U1 f) F
/****************************************************************************/
% o: ]( u' N" E# ]/ l# w1 c
/* */
4 s6 m2 i0 \7 j( V
/* 初始化捕获模块 */
' r$ ~! s4 ]& L% t- F& s5 w
/* */
) j* |4 Q4 C' {. ?
/****************************************************************************/
& D5 n8 \8 b& G4 f
void ECAPInit(void)
1 b3 @ I6 W, q/ w+ d
{
0 H& H$ h8 z5 I
/*-----设置 ECCTL1-----*/
! e4 _" W7 K$ C& l: h; x
// 使能CAP寄存器装载
z6 z# q; K; ~' \2 ?$ b
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
4 ~$ R& o8 T' K. W
// 设置预分频值.
/ N, N3 M4 |+ f( G4 i% C( N) f2 \4 r0 N
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* h1 i: Z: J% p) B9 J- l/ [
// 上升沿触发捕获事件
3 M s( L- J: B
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 i' Q& ~8 A2 L& P: Q! m
// 输入捕获后重新装载计数器值.
) b# s1 a) l% _) w( s7 `- z* r# \
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" {, p2 f; {( x6 i$ i
^( ], `. D4 \; B
/*-----设置 ECCTL2-----*/
2 ]+ Z$ D$ z( J" a
// 连续模式
1 t0 U) ]& r- R0 P6 w$ E8 {
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
' I; a2 _8 j. m/ T
// ECAP计数器TSCTR持续计数
& |4 z7 g% g) c) e2 s
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& R: i4 Y, M. L) U, ^4 T
// 禁用同步输出和同步输入
R. w8 e0 G# `' e
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
; L8 p, R6 Z7 j* r
// 配置 ECAP 2 为 CAPTURE 模式
. Y5 a4 p1 o, h2 o9 x
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ j7 a; {% s& H& z! Q) i
: D* y3 M+ W& E5 C: q. ~" M
// 使能中断
2 C9 ^6 i/ N/ Z( S! A# n
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! H0 M a* I9 ?/ ]! \
}
6 s4 f' h; ?0 U! G& D
# y* b! N% d" a6 P
/****************************************************************************/
, i0 j1 r- A) c. c% n& t
/* */
* f6 v, [+ R7 U3 }6 H6 p
/* 取得捕获结果 */
( A+ d! t# ]2 I: U. R; }
/* */
# X: }: m8 g: [- T! f+ o7 S
/****************************************************************************/
+ c, Z( ?# i& Y+ @6 _3 S- F0 e+ R2 _
unsigned int ECAPRead(void)
: Z! ~, L6 s {" ? Z! \) Y
{
9 D; b/ K5 B5 A" }( c
unsigned int capvalue;
7 t2 R- z7 G6 s( ?4 {
unsigned long frequency;
8 A+ C I: h9 s4 D% f# v1 h
0 u" ?; L, \' {$ b& c2 O, K
// Event1 中断标志
/ t( J9 [' G: _7 h7 S7 Y
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
/ D$ j* K1 I7 i8 m+ v* U, ~8 n
{
$ f' U' u: Y3 L
// 取得捕获计数
# R* I% n# \( c. [
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 |, s! Z* {) F1 h( Q& R. e- {/ O( A) f
capvalue = ECAPResult.cap1;
% [7 ^+ C: V. C
# l5 h1 T3 r& x5 D8 j: w
// CAPTRUE 模块 228M 时钟主频
$ u' v, a! V) V% F* F
frequency = 228000000/capvalue;
+ ?8 J( o. E) M2 |3 R
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* i0 l% H2 Y9 G1 h5 W1 e2 M
1 ?- \) @1 P& m
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* z. `& \. y J! ]$ f
// IntEventClear(SYS_INT_ECAP2);
/ @' _$ a% @6 _8 u
}
& F' Q, i! j0 N3 g% u: Z
return frequency;
" @1 g' i2 ], y0 c; |
}
( }2 s( L9 E% x) f- T+ C% x! |, @1 ?
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
3 \* S9 x6 J. q' D- M' r
[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