嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- T6 _, a- `- @& P2 Q8 S
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
. |% M6 y. \& ~& v
/* */
+ u! A4 f! e% J( W# m" b0 v( j
/* 宏定义 */
2 z, a1 N, K; `0 h7 C- H
/* */
0 P! v. z9 i4 M3 H6 r; u
/****************************************************************************/
# q5 V: ^; V4 ^( W2 i- b! \ J
// 软件断点
- R* [, p$ o7 E0 V ^
#define SW_BREAKPOINT asm(" SWBP 0 ");
+ ~& _3 |- @( _1 b
- f$ r" ?/ x' x, D6 M
// 时钟分频
5 |/ r9 k" B+ j9 } F( I9 l$ @) v
#define CLOCK_DIV_VAL 228
& N' i. w% w, D0 P; l: \7 t# L0 Z: F* S
5 o2 h$ c( j: A$ K5 ~
/****************************************************************************/
% q, d( b" J5 _, u' x4 m/ F
/* */
9 c" x2 I2 {" J- n2 Z& X6 k0 ~% z
/* 全局变量 */
( X: M4 |8 Y# L" a! U) U
/* */
/ d7 X( y1 O+ |$ D3 o) k2 h& j
/****************************************************************************/
* y8 ? O6 M5 B- w, o
ECAPCONTEXT ECAPResult;
" w, u. s; g1 h6 }
2 U" G+ Z) W i4 \) Z! |
/****************************************************************************/
+ M0 X8 U$ x, x; M( R
/* */
& M( F( m9 E4 V1 r6 R8 q& n
/* 函数声明 */
8 g( ]' w. k% Q
/* */
# z( R+ E1 B( C/ T: y9 m2 E
/****************************************************************************/
9 C+ `* P( i0 g' Q" J" R
// 外设使能配置
$ b0 e: @& W+ d, s
void PSCInit(void);
0 v+ I: [8 W5 p- m% h
/ { W- Z; L: a! U$ T h+ r
// GPIO 管脚复用配置
. q; P( N) Z$ R" k/ b4 q4 k. A
void GPIOBankPinMuxSet();
" v, ?/ k8 a; v1 e; a [
* m' }, o) k: E8 w7 e; A. M
// 产生波形
7 ~! a; \" l& R% l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, B$ m' ]4 [6 f
void ChopperWaveform(void);
5 d& J1 E9 |, h$ Q5 K/ {1 Y: n
; K7 ^) E& r' }8 M; m5 I e
// ECAP初始化和读函数
! f. c s" ^6 ?9 x: Q- k
void ECAPInit(void);
! i7 c7 X" d% c& C3 c4 m; M
unsigned int ECAPRead(void);
2 K8 _2 _* ~2 z( h, O
# ^7 o4 V, M) q3 l
//ARM 中断初始化
5 }! r! u; Q! E$ A5 ?
void InterruptInit(void);
8 H8 F0 y4 g' W" r
- B: \2 [& ~- G- A8 O# Q* _2 v
// PWM 中断初始化
8 J9 p3 x% t2 D1 k" h
void PWMInterruptInit(void);
# g: |+ s6 m" b& M! Q
// 中断服务函数
/ d! A' q: E4 n* t
// PWM 事件
+ M& a% k: E) U; C5 M6 g3 g2 S
void PWMEventIsr(void);
2 }; C/ J3 L l, \+ |; e
// PWM 错误控制事件
* z$ |5 G" n& N! o, S: A; n. v' X
void PWMTZIsr(void);
9 z: M4 Z1 `, s7 W
# C% Q. a- G) M5 g% H, e$ [3 f
/****************************************************************************/
) P9 z# j+ B0 N6 c$ F v
/* */
9 U8 ]) `) j V
/* 主函数 */
3 x' t: |8 u0 _
/* */
1 o3 o7 ]# [1 u) O) ^1 ?$ Q+ `
/****************************************************************************/
6 z: h; E* \9 o% P% a' ]9 e" L* b
int main(void)
- S1 r9 ?) U7 p9 b# J
{
; n& ]* H {2 J+ ^
// 外设使能配置
' i+ v0 l! X5 _+ ]0 K" [& h
PSCInit();
# W3 w7 j2 @0 g, T1 i: ]
1 r! t' D- X5 L
// 初始化串口终端 使用串口2
" b) Y0 r" s* G" r2 z
UARTStdioInit();
8 a V+ S0 \1 y" g0 X1 m, c6 ?
5 y5 c1 R( v( `/ l; M8 G! E0 y2 o
// GPIO 管脚复用配置
4 R$ D ^5 y5 a. l% H8 X
GPIOBankPinMuxSet();
: P. o6 F$ Q0 l/ W1 m2 I
. N" x* k. n0 P- m9 K+ `- u# u' n
// ARM 中断初始化
7 w8 t( F A. u" C
InterruptInit();
# f( `% y& Q; Z/ }
) h+ r, h+ n: H) X- r; M) ^
// PWM 中断初始化
7 S& U; |0 U; H6 y5 j- G% `" \6 {
PWMInterruptInit();
" s U5 p. K4 h3 ^0 g: \
7 P# J4 v# B5 z8 S; h9 N
unsigned char i;
( X' [0 P/ F- B' H9 f5 P& O
unsigned int j;
/ C8 s4 l) |5 k
, Z, ]$ W) {0 C
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 [1 y/ }6 P" d: ]
UARTPuts("------------------------------------------------------------\r\n", -1);
9 ~1 `* y( p) c" x( Z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% @3 h6 |8 C. T `% Y" Z
// 产生波形
, a! a- }+ X/ N3 F" x
PWM1ABasic(25000,50);
* ~: A Y9 r6 I9 Z/ [
3 u9 v' ]2 v7 a
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
/ U9 F, u. y2 ?7 K- I( n6 o) w' k$ z
UARTPuts("------------------------------------------------------------\r\n", -1);
6 s% u* w, N9 Z7 d% j- y' g1 ^
3 b4 E# c3 R V2 m# J# U
/ }7 E# h4 X+ }! h9 n
8 ~0 \/ o, S" |& p: W1 |1 P: }
UARTPuts("------------------------------------------------------------\r\n", -1);
+ E2 e' Y& o7 b" a7 X; S2 e6 I
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 m5 ^0 f5 @( T, N0 i# p
// ECAP 捕获初始化
! {7 R# c1 |1 _8 x
ECAPInit();
q$ S4 Y2 E" M) T& u- I
UARTPuts("Initialize ECAP.......\r\n",-1);
* ?8 L. B8 R0 D4 s: j' Y( ~
for(i=0;i<5;i++)
/ L% E) n _6 F2 P
{
2 F4 z- R1 v5 p F
for(j=0x00FFFFFF;j>0;j--); // 延时
; k# |/ A$ G9 L% s1 s
ECAPRead();
8 C% l N! K2 T0 M" }6 M) h
}
% r+ T' D& e7 Q. c( ]- @
UARTPuts("\r\n",-1);
$ p. Y, |' H( G" x# C# R; E
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
$ q% D7 k7 e9 W3 \6 B! p3 s/ @
UARTPuts("------------------------------------------------------------\r\n", -1);
+ U% T- ?% ]# F3 _# n0 f$ O" D/ l/ C
" i3 L% `# h* k& K+ V* o+ P0 T
// 主循环
) g! H' b% L: U9 v a" w
for(;;)
9 K. \2 `7 ?# Y5 V6 ?
{
4 P5 D3 v2 E" G6 u2 x
& \" g% |: w& q, Y$ s9 x, k/ ?! G
}
) S p( ~7 T8 v! C
}
6 \5 M0 b( T& l/ F3 P7 w1 X# i
& m1 c' L# Z& a3 m* w( m% w: D7 s
/****************************************************************************/
2 U2 e7 x, P! E7 A4 @
/* */
& ^7 a) W7 T0 k3 B6 [9 C0 G+ I, L
/* PSC 初始化 */
, Y9 T, V. r% f0 ~! }$ L# r
/* */
) I3 H' P. @% T
/****************************************************************************/
1 \' {1 M7 C% |
void PSCInit(void)
& e& ?! w5 B& z7 f) m
{
$ y! O" r, [3 A" ^
// 使能 EHRPWM 和 ECAP 模块
8 P! s+ j+ E$ M+ B
// 对相应外设模块的使能也可以在 BootLoader 中完成
! f2 }* G6 @ A
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 ]1 w. M. \. a1 j- {5 A: k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ i( i0 h1 G9 q8 P; e" T7 w9 ?
}
/ |; R9 H/ |4 _
6 e9 G C5 n; l+ o J
/****************************************************************************/
7 F. Y) w9 e( a# q! `. s
/* */
9 l8 p" v. ]/ J/ X6 a2 N
/* GPIO 管脚复用配置 */
7 K5 V9 g" |( ~ X$ [
/* */
8 r1 R/ H3 z8 f: W1 G
/****************************************************************************/
: [1 {' O, T A: [# n9 K
void GPIOBankPinMuxSet(void)
, U9 A5 ?4 ~0 r2 e9 H3 T7 H
{
& _$ q$ _/ W3 H& x$ C; D
EHRPWM1PinMuxSetup();
1 v' ^ ?* d' Y) ?) H4 p: Z
7 {* {- l, ^4 B Z# Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- ]4 [$ z0 p9 p# `
// 作为捕获功能时管脚方向为输入
: x1 ^! t% F7 Q! E4 L0 K! Z* |
// 作为辅助脉宽调制时管脚方向为输出
2 d+ H4 ~; M7 t$ w8 \( F/ V5 G
// ECAP2 / APWM2
$ |4 C! a( q4 s' k; Q a# U
ECAPPinMuxSetup(2);
" l+ U' A5 I% ^9 j; H
2 x% [9 I7 [1 X3 E' s. ~1 n
// ECAP2 / APWM2方向设置为输入
! O) u0 F5 }& C5 n& {1 Q6 c
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 ]8 H- w) I% c) A) x: N3 e! E
}
S' d3 q. ]5 x' y4 z) e+ _; _
8 s! f9 }) ]4 g: d- V7 S v) b; m. x* f
/****************************************************************************/
' p& ~, G* ^4 G6 A9 _
/* */
4 P# j1 ^) y9 e& i# {8 R
/* PWM 输出波形 */
; z' q: f1 @% L' f
/* */
. V7 @7 P O I; v. c+ s
/****************************************************************************/
4 j; A2 }! V( E: N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 W( h' u. @* l% Z! T D6 T0 e
{
* T# ~. ~! w4 ^2 b$ C6 Q) W
// 时间基准配置
0 F l! H! q0 D; @' t7 s4 z$ z
// 时钟配置
9 K; [" S) n% ~2 N
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" p# w" c: {) O6 x8 H
) Z% j+ E2 L8 h; S+ E
// 配置周期
6 X* N6 o4 w0 w" f3 W. r
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* A0 V' S3 c/ H( S1 n
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
5 L; t) X) P/ R2 p
: Z/ N4 R1 D( Z" u, h) K/ l- J
// 禁用输入同步信号
! E: v! Z i0 K# P
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
. m+ s/ q4 S3 y! a9 W" L
' w0 b$ X! T3 f- x
// 禁用输出同步信号
& }' ] x; l! J% W. v0 R
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* o; k+ v! X- g5 o" U8 f7 Y$ E
" P+ m4 D$ l2 _; t) Q( i+ ~6 y
// 仿真(DEBUG)模式行为配置
; a h0 y1 l" T- Q& ^% e8 @" p
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 F0 N8 F2 H2 L: T: Y
4 D5 q `2 s4 C0 a l" x+ e, I* b2 e4 H$ L
// 配置计数比较器子模块
& W7 V1 a3 s3 U0 t0 v2 _
// 加载比较器 A 值
5 x: [6 [' Z' U' M
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% _7 d! d) }* q/ ^0 T" Y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 M7 j. a9 n8 H, A
# X" _$ p/ y3 {( ^( N4 \
// 加载比较器 B 值
2 w, C% j) v. }+ X: @
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: `- `8 f! }: V) n& L, Q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, N! K* ]! i# y, g( M9 H) v
2 V3 U {2 P/ r
// 功能限定配置(输出引脚触发方式设定)
$ O! h8 R: @ J5 E2 i8 u! j
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: B6 v9 S4 c, t, B
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. [1 E3 S" |: `# L
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
( l- J- \' ?2 T7 K, w
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 _9 a* Y& e4 R4 _5 Z
4 V# }, D% r F+ S
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 j1 L, O, ]6 c2 w
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, f. ^" C3 B8 e s+ A/ \+ _7 ], h
6 a# r" N9 w0 v+ _: l5 u0 _$ h7 i
// 禁用斩波子模块
0 ?, y$ O! ]2 m
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 j$ h' [( A E% e" Z8 O# U
! D5 a$ {/ V% t6 x" l \2 T
// 禁用错误控制事件
6 Q2 N' V$ i4 F! N1 e2 ~1 y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. b# x" |- r) i$ n& {% q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
. B6 H7 F8 A9 g) J( s5 @
, s9 M* ^3 M( _2 j, Q& C
// 事件触发配置
5 v" r' E% [4 c# Q1 @# w& O& l; I
// 每三次事件发生产生中断
( c/ u/ f5 v2 U# n0 m6 s" a
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: A3 W, m b' ~1 t5 |8 Z4 }
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, n* B$ P: P; ?4 E# {8 {2 h$ {
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ U' @; H0 `' {8 [" K0 U
// 使能中断
3 U/ h' B _3 i! w ?1 W# Z- \
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ J2 b7 `! [4 r) n6 I# g
6 ]( R* m- s. D+ q- `* d8 g7 z
// 禁用高精度子模块
# H( H k4 J5 f$ t/ J
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ u9 l! K$ D# z% g
' @4 @4 J- h3 }0 X; f+ c
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 U( Z' F" J$ w% d; @$ J3 R, @
}
( _, s: _# {! X% s6 w3 D& s
. |' y+ f* J& C' M
void ChopperWaveform(void)
0 ?1 a8 o. E* R- N+ ]8 Q5 a
{
' D6 E! h0 q1 t) E7 f$ E- @
// 50% 占空比
, q2 k9 z& h( L$ z
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
# z) S+ p- p' `6 s, ^4 Q
// 4 分频
+ r% H" R* }9 C2 x
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 L, }; ~. O3 m* K T- s
// 单个脉冲宽度
% U* I9 i V2 J$ D$ d) U/ n3 a
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 J. \; O) s C6 u3 L; \, y
// 使能斩波子模块
C4 h, z$ D* [" R! n
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ v. o" k0 E; q% p
}
4 {7 x2 G% j: G8 c; p% R) ^. c
: l0 o) N2 Y i8 b4 |; e: |8 W8 H
/****************************************************************************/
# ]$ ?; W. [; m: q9 H
/* */
- ^. S3 [4 c4 _+ s
/* PWM 中断初始化 */
) x+ p* E' R' y9 p
/* */
& j; n; n: o8 y7 R- [5 ~6 i( n$ z
/****************************************************************************/
% v/ z, b i1 p5 i [6 d$ ~
void PWMInterruptInit(void)
3 C& K" `" M3 F; `7 w
{
( M/ x2 [# [; t& X& g* f
// 注册中断服务函数
& E# a5 v/ D6 r: A
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 q9 f8 v! c' ~8 L6 m
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* G" \5 W7 f. }1 J5 m
# m7 z4 T6 T3 R
// 映射中断
4 [2 R+ t" K3 V# D& l
IntChannelSet(SYS_INT_EHRPWM1, 2);
3 ?. W: B. M; W1 o0 B: {# K. ~
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( A' X4 L0 \8 i1 j
{# S7 J9 x: C0 Y9 p% P. \+ q
// 使能中断
" ^' ^5 t; ]9 Z+ z" z. V, r0 T% |. G6 l
IntSystemEnable(SYS_INT_EHRPWM1);
D& ^# Q# H+ K; |, \6 v: g
IntSystemEnable(SYS_INT_EHRPWM1TZ);
. t+ p f- M/ }, E
}
7 @6 C( E' P; c$ B
! F2 h* w7 m( c9 d- N
/****************************************************************************/
+ V2 O9 u `+ R4 u$ m; W
/* */
R# k2 G, U4 G1 _
/* ARM 中断初始化 */
" s P& b2 t) r. Z
/* */
/ Q5 m1 m0 j7 r [1 L1 j( g/ x; X; q/ @
/****************************************************************************/
$ f0 A' \$ L: B4 h" K
void InterruptInit(void)
3 q% J6 U: O2 u- t" C
{
$ G/ p- ^7 J9 S( c! {8 ]+ ^- K
// 初始化 ARM 中断控制器
: H$ P$ t" ]: M' z: n
IntAINTCInit();
+ d/ P9 b2 h" M: A* p/ D' o
! f9 g( x! X& r* J& `% \
// 使能 IRQ(CPSR)
8 P1 W$ r7 f( B( }5 c' b! a: r$ B9 {* K
IntMasterIRQEnable();
" k9 _: `2 ]+ {5 \
! o j% v' ~' |! R5 v4 `
// 使能中断(AINTC GER)
9 q g: L8 H$ e8 e
IntGlobalEnable();
4 _( Y7 c% L7 Q9 o( v
# f ]4 P6 [! B1 t# m
// 使能中断(AINTC HIER)
) P5 @" p# [9 V' _
IntIRQEnable();
+ D7 L" t) r, {6 X/ h
}
" @: w: O/ m5 k# ? q
+ y V6 `3 _( z4 I) r* T
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
7 Y6 H$ R7 T8 \9 {9 D- n
/* */
9 G9 _) Z$ p; C+ ~! C
/* 中断服务函数 */
, m( _# v5 ?$ ~: v0 @
/* */
6 H. w. T# ~, z7 N$ ^5 N2 p( y
/****************************************************************************/
% | U2 Q8 N4 t
void PWMEventIsr(void)
Z' d. F7 A& O. Z9 A2 ~
{
6 U5 r. @. x( L& l0 {$ D: b, V
IntSystemStatusClear(SYS_INT_EHRPWM1);
8 C. `& b& O: @2 t
$ a" r+ ` w1 [# E. U8 ?
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
. ?3 u# l5 I) }2 @& G3 o
}
8 z# d1 Y4 ?! N0 r$ B5 l
B) l" l4 `0 [! _! x5 w6 G
void PWMTZIsr(void)
: ~0 i0 D3 e D6 w. X a8 _, `
{
9 p3 n" X! o4 [+ M: S# e
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& r3 D$ L8 Z' A/ r0 |9 X8 k
6 v7 x, |8 n: }# S
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) W. m; V* w% K. X& [
}
4 ^8 ^8 R% m1 U5 w7 c5 q! U. j
: Z. s1 C4 i; K$ d/ v& H' t% v
/****************************************************************************/
1 I* m9 I2 J! M9 B+ P" C
/* */
7 R+ v+ H( f4 ]& q" v7 w3 ^
/* 初始化捕获模块 */
; {9 A& t0 f4 d. f4 Y% D0 g
/* */
7 ~) ]' S" W! i$ N8 @" g" C6 l$ \
/****************************************************************************/
* y3 ^9 E) o* i/ F
void ECAPInit(void)
0 [4 F) S: [5 C' X& C
{
& i2 T! Y) m8 Z- t# z8 l
/*-----设置 ECCTL1-----*/
# @* r$ i8 x: r' S) k5 M( H3 `4 [ }
// 使能CAP寄存器装载
9 |: C3 o2 F3 U1 v5 U% n
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. ^7 Z$ ]: M9 E$ S3 s
// 设置预分频值.
2 Y9 W. q' ?. u% z6 m9 A+ Q, p
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% P. Q1 L- A; w
// 上升沿触发捕获事件
0 y1 c& c$ N2 u
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 M) p4 W; F6 e2 L
// 输入捕获后重新装载计数器值.
. v1 ]6 P+ }8 b: y5 ~" r
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
: T g; z! o2 @0 W" L
/ r8 g' ^& ~1 k3 ^: S
/*-----设置 ECCTL2-----*/
I4 C( {3 x% v1 W( m) U; `: e
// 连续模式
3 _0 I2 w6 Y) A
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, `! x K. q8 i. E. e4 R/ `! i
// ECAP计数器TSCTR持续计数
" W# I( M" v$ _* p; y8 c
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
7 U. w: x9 _" x: T$ j, @
// 禁用同步输出和同步输入
- Z2 f& J6 U% M' o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 t8 f* t) S8 M; N& N/ Q( W
// 配置 ECAP 2 为 CAPTURE 模式
% S! l0 m3 b' y; i# j' Z
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
, |2 g9 G7 z2 J3 X3 E5 P
6 P7 ~* H+ R: ^) k9 n! h$ A
// 使能中断
1 k2 I1 O- H; y2 i3 r1 J
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 R; I, [, W6 g) o9 e% Z
}
+ Y# T( s. I7 l' ~
6 L0 [3 G7 Z. V' ?9 P( E
/****************************************************************************/
O- _. y8 E" M7 l6 i( _3 O- o
/* */
) f$ _0 t' Q& z0 J$ |, A4 a
/* 取得捕获结果 */
" K) L8 p9 q Y! m' P( M" L( F
/* */
4 i3 x& m( l, `) A9 z5 _1 F/ C. j
/****************************************************************************/
- e! D7 f, z4 V9 Y! ?
unsigned int ECAPRead(void)
) [9 ?- S3 `$ r$ r' y
{
4 R6 u: H3 F/ M( a0 W8 N. z3 m, |
unsigned int capvalue;
1 ?4 O9 Y. u6 s/ _
unsigned long frequency;
* _( J6 O- c+ }% K0 v
4 y% K- q" @6 O6 o' k0 C0 @: d
// Event1 中断标志
, P* y) d; {1 W) w
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
# ?5 _9 Y& B7 }: c
{
! U7 \; W# ?! w& Z2 G6 s
// 取得捕获计数
/ |2 H8 D& Z* o3 J- c, x0 s
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 e" Y# s) R. h+ O
capvalue = ECAPResult.cap1;
6 @4 S: O5 y2 E
- y: H+ i$ Q7 z/ N# I7 m3 i' a
// CAPTRUE 模块 228M 时钟主频
5 |7 n& a8 C, `
frequency = 228000000/capvalue;
; G3 w* K2 y# d& n
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: n) W/ f/ W1 S1 _7 u& [ s, S9 e
0 T9 \8 \6 ]- e2 d- g
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* j4 u& O+ f* B! u" r
// IntEventClear(SYS_INT_ECAP2);
, W) y$ O- w/ i
}
6 u- f( o* \* J
return frequency;
% X- ~& ~* P0 ]
}
4 @1 I7 a6 |" p) H0 Z
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
& u2 P0 D/ [9 Q# W1 C0 S J
[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