嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 A" p8 l- A* A( _
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
5 e7 p3 |4 L4 o6 N" q: L
/* */
/ j/ t5 R) |- P9 v
/* 宏定义 */
' @' X! I. W7 b- P% q5 l
/* */
, I+ M8 V: z& y x# B
/****************************************************************************/
5 j p8 R+ o% r m& g
// 软件断点
# Q" _2 [8 V d& k6 K/ y6 J
#define SW_BREAKPOINT asm(" SWBP 0 ");
) y) i( m9 _2 Y8 M8 ~
# f) f4 i5 e6 w/ c, b
// 时钟分频
+ D1 v1 }, V- E* r% ?
#define CLOCK_DIV_VAL 228
( m: h* R1 M h8 ?3 I- A" j( p* Z
# m* r; x7 [3 y' m0 ?4 f0 |
/****************************************************************************/
- s' q+ }3 c; v
/* */
) U: y7 ?4 u, t7 A1 r8 i0 M$ q6 o6 y
/* 全局变量 */
: f' c3 K4 ]4 M* R% Z6 k8 Q
/* */
! n5 s3 q6 L3 _1 p! {6 o
/****************************************************************************/
$ H8 S6 s4 `$ y% _1 }$ R' M
ECAPCONTEXT ECAPResult;
7 s$ D1 E8 `$ j# |. Q5 s
: c6 i, H) c2 h3 y
/****************************************************************************/
* [5 N0 W* ~ D7 l" J; G
/* */
* x6 U/ L2 M% D) W3 n* V
/* 函数声明 */
+ M% i" d4 W6 O8 B3 }
/* */
2 G- _. e+ Q0 ^/ [9 K
/****************************************************************************/
3 B( C: I6 e: H
// 外设使能配置
9 d% W- U9 R! u0 y. [& u
void PSCInit(void);
1 `& c$ g7 P- J" Q. o6 a v2 L; m
7 l m8 a/ q% \$ ~/ c/ m0 I
// GPIO 管脚复用配置
6 ~% ^# |! x7 ~; j
void GPIOBankPinMuxSet();
2 J! s; p/ y1 z" b
6 o7 ~& G0 P3 @$ a& U5 `$ j0 g
// 产生波形
6 V* c* e, U" N9 `8 _' i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
3 r) R! z) j( E. r" N: o" t0 e
void ChopperWaveform(void);
* _. G8 s$ a, ]* Y; }' ]
r2 O6 ]/ v0 @+ V
// ECAP初始化和读函数
. K G% C/ y5 k, R" l3 x' o) Y* g
void ECAPInit(void);
+ ^( X" C) w# \" z0 A
unsigned int ECAPRead(void);
2 [' I4 A3 ]# h% j# B
4 |! |( p- g7 w& t
//ARM 中断初始化
. s. P2 S4 A2 \
void InterruptInit(void);
/ g* X5 s/ K8 s- O$ m
$ r5 K _+ P' {+ a- _; g: l+ Y+ ~
// PWM 中断初始化
: v9 k* A: F; F2 z
void PWMInterruptInit(void);
. _9 W0 x5 X7 c
// 中断服务函数
; i4 E, g0 d8 J ]5 ?) l
// PWM 事件
5 c- @; G) b7 Q- c- `; j
void PWMEventIsr(void);
+ K9 m+ K* y1 u# m, u. `2 w
// PWM 错误控制事件
& o! k- i. G. c- R! R' |
void PWMTZIsr(void);
2 y. D$ F$ x* V9 ^
- L6 R0 X( s3 E& E' D3 W1 t
/****************************************************************************/
* i5 h- m. M9 q) t* F* k, Q# u
/* */
' b' ^) h$ E e. V
/* 主函数 */
2 ]3 I0 }6 t4 `4 i3 N
/* */
/ e {! B5 d# T& v
/****************************************************************************/
1 R. m% L$ c5 M" b4 \& m; F
int main(void)
' C" h" T( u* @% q9 Y, }
{
* c2 R! j. c7 b# R6 ?; l
// 外设使能配置
+ i) D% V: A1 }/ s i
PSCInit();
3 ~& Q. C- P5 M7 g3 i+ c+ v7 E
; a; J' b/ X) a0 o% h1 F6 i
// 初始化串口终端 使用串口2
# @+ E% f! h' o1 @# F
UARTStdioInit();
& k* q8 A9 l H6 d$ Y( h
( Q. q6 w8 j. U# C
// GPIO 管脚复用配置
5 ?* ?' w- h6 p+ O3 O" r4 \' ]
GPIOBankPinMuxSet();
! n( Q& y) H+ E& r
) s) @- O) p+ O' x) U; h; ]7 z6 l
// ARM 中断初始化
3 A% {7 ?$ }' O7 j2 t k v
InterruptInit();
9 W1 x* Q: r0 ?4 e
0 J: f/ b- h3 u2 i4 X. k1 F3 r
// PWM 中断初始化
) f) T9 @# y" D2 r8 e: e
PWMInterruptInit();
! [ S! J3 {' T. N, s" y% O
5 S9 D- z3 M+ ?
unsigned char i;
" K& n5 R6 O, v1 K3 [
unsigned int j;
' j6 ]5 X) ^7 a" |9 F' @: S3 t
. @% N! O* p' n# `& h% H6 I
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; z# V5 T& p2 N& }% K0 e/ r
UARTPuts("------------------------------------------------------------\r\n", -1);
J& G6 b- G; p& X( b( X* y$ ~
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
4 r* ?, L0 X, Q. W8 {
// 产生波形
) X0 x2 m6 A9 l' Y
PWM1ABasic(25000,50);
& x$ ~* ^/ c+ f
- ^) g) J0 U6 @6 H" T+ {
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. v' Y& a' K' N9 h. l `
UARTPuts("------------------------------------------------------------\r\n", -1);
( V& i# X$ l W
' w% S2 z& C5 n- d( [! D M) x
- i: j$ f( M5 d1 x6 v# b4 u
1 E5 W9 m. c$ n: J
UARTPuts("------------------------------------------------------------\r\n", -1);
{# ?: c4 w8 ^! H
UARTPuts(" C6748 ECAP Test\r\n", -1);
' ^3 H! X" w" n4 I# T' X# J; a
// ECAP 捕获初始化
4 w$ h! h; i* N2 \' Q: R1 z" n
ECAPInit();
) s( v- T, S5 R. v3 ]* O9 R5 L6 p
UARTPuts("Initialize ECAP.......\r\n",-1);
7 J8 ?( X7 f4 ~% H8 w. s
for(i=0;i<5;i++)
$ J+ ^/ U7 \+ J1 m
{
+ {- s3 S2 D# V. s- D- _0 \
for(j=0x00FFFFFF;j>0;j--); // 延时
5 U0 m& v m2 F# \" ~7 T- `
ECAPRead();
9 M2 B$ A2 y1 N( |! u
}
3 m' W$ I+ j8 d- U3 H
UARTPuts("\r\n",-1);
7 O% z1 J6 H* }
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) x7 c! F% q$ j# Z7 v6 g
UARTPuts("------------------------------------------------------------\r\n", -1);
0 ?( o2 L# t% C! e! C6 d: N6 P
) L9 Q7 T" Y, j& X' g" j
// 主循环
. q9 k" C6 i' S
for(;;)
0 J2 i; `3 d* M4 |* O4 b
{
% x+ D* f \( {/ w5 g
" n# R+ ]/ M' ?, P3 x
}
0 m9 f/ p' V& I+ [" m, O |6 B
}
- [0 E4 K$ m+ J4 c
7 w& _" s- B: f
/****************************************************************************/
E8 J) B- i- m; m9 Y$ Z5 Z
/* */
& {( n1 a/ ^* X1 {5 W( N/ K. f2 ?
/* PSC 初始化 */
$ w$ A Q& a0 D5 {7 B
/* */
) l- ~0 ]; a! g$ T; Z
/****************************************************************************/
4 r$ _/ _( d3 e1 X
void PSCInit(void)
0 A( O4 B1 o8 ?1 u0 t
{
2 ]& t) h6 X+ G& N# R
// 使能 EHRPWM 和 ECAP 模块
+ N1 C! M) e8 l& m j. N" c7 n
// 对相应外设模块的使能也可以在 BootLoader 中完成
: t6 g d; e! Z8 e4 r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- Z. L6 H S' N: b/ d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; M! q4 z8 A; k/ o
}
! a* L& ?( q8 y* l; {# _/ ~& m* X
3 g( Q8 \* x+ l. Q, [! k
/****************************************************************************/
0 |. L- }7 [- Z6 Q; B0 S* y# f
/* */
% G. M: b I5 I! U
/* GPIO 管脚复用配置 */
* g* v+ \' Z: T' e3 r3 y/ }
/* */
6 o# ~4 B) }0 w3 ]- U5 S; A C
/****************************************************************************/
# z3 G6 |) f4 g( v6 v6 m9 s! Z
void GPIOBankPinMuxSet(void)
; D) L A7 x1 J/ _" C' a
{
- ^# k" P7 _* I: t9 D: ?( F; i
EHRPWM1PinMuxSetup();
9 m; R6 i- V) ?# P" o7 |' [8 ]
$ c4 N" P3 [6 y2 R9 v- h9 t
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
5 V$ N" b4 X2 k0 C% K$ T
// 作为捕获功能时管脚方向为输入
9 ]% t; E) [( g$ U
// 作为辅助脉宽调制时管脚方向为输出
' D4 h$ O+ P; m4 `
// ECAP2 / APWM2
+ Q2 V0 H) I6 o
ECAPPinMuxSetup(2);
: @8 X! k! P' k% j6 m, |5 p
1 U* M- U. R7 S) q% s
// ECAP2 / APWM2方向设置为输入
+ P" B0 L3 x# |! X
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 \; m- z2 b5 S8 {. J; a
}
4 G$ F6 O( W' H
5 \! G! S+ x% x! Z0 o# U9 U! n1 i2 {
/****************************************************************************/
) A9 p* ?( D, g$ G0 S$ ~3 X& D
/* */
% K+ ^# O+ Y, G
/* PWM 输出波形 */
* U+ ^* D) p0 _
/* */
% d( D4 G' P3 _3 g
/****************************************************************************/
- x7 _2 \% r) y& `
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
6 Y: r0 O8 @( n2 x
{
& V' P; v! j: E
// 时间基准配置
[/ d# ^, T8 Q+ X$ q! ]# t! }) b
// 时钟配置
& M m Y( K! x8 L% N/ T Y; {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
N$ J& z8 Q. H' s8 D
9 D% O9 B D) d* k
// 配置周期
1 `# Y4 I, {4 {
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! l d8 Q$ i7 ]( @ t% x. J
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
y9 ~" }7 k+ _# H9 l/ ~# s
, S! D- R" q; N) N/ t6 V
// 禁用输入同步信号
8 C+ E. Y6 P0 q: S4 n& P
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ s6 ~2 U) O$ J7 L5 x
# _1 h/ u$ Y+ l( Z& {7 H
// 禁用输出同步信号
( F {: u: ^, g6 T- z$ Z; t# S
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ Y# J) G: c! [4 F
. n& J2 w! a. h4 \( d) ^
// 仿真(DEBUG)模式行为配置
2 Q+ m" b r ~+ b1 G. s
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 Y9 G8 u9 S# c3 h& F% }! t
! B( U' m: s, ?" r1 c* p# }
// 配置计数比较器子模块
& A& m" G4 q. \3 b+ ?7 D
// 加载比较器 A 值
; l9 l; z; z2 ~, Q# C ]$ U; ~
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! M2 e/ [7 |/ a. K. L$ Q% G
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 x# \8 v0 t" [. d8 y! |- E
* r" h% W# f( h1 \8 P; E9 e
// 加载比较器 B 值
- p* ^3 x" Y; j& H
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
! O" K3 J1 o% e" w7 _6 S' ~: P5 h$ U+ v
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 @5 j; M' T" T! O- R! @, J
7 ~1 M6 d$ f0 a8 k# p5 ?
// 功能限定配置(输出引脚触发方式设定)
$ [- D; Y' C) c8 |6 Z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& K" g& y, y1 r! `6 M
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: j5 p! f: Q# v( P, p0 c
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) a" u T% Z2 {; e S
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
% s; K, o8 U" w" H
' h7 `& S, V) \; V) C: e* d3 T
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 L) X: w( S2 n' N
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# p9 v# U" S2 `. }
- Y6 y5 Z' A) Q) P3 m7 y
// 禁用斩波子模块
; w# m* ]9 v# U2 J" |+ W8 C$ }
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. ]; m S' Q) w" x
! G! T2 p0 r2 \% ]: m+ T0 L! U! F
// 禁用错误控制事件
. O, [! e( e) Z+ q9 Y8 g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. n1 h7 a& J! S d, S9 h1 C% X& a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! v5 n0 b+ k3 w. p8 Q& Z( k
% W+ U+ u/ e8 m, h" ]& Z. G
// 事件触发配置
" y# v1 ^2 H/ w, ?( a
// 每三次事件发生产生中断
2 D7 ` [& o! e- y7 o
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 T* v" W, j5 _" i5 P6 E' p
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 R0 j. T: | n" b% W( j8 O" L+ Z
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
6 K" u8 o% d f6 M+ J+ j
// 使能中断
% B' `# A% ~6 W3 j" n
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% v+ c: v$ g. r& Y; U3 H) n) k" Z( |
: W- Q' v4 j/ H% v' l7 |' ^
// 禁用高精度子模块
6 C9 N7 h: w$ {
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# Y! M, w8 g2 Y9 Z4 X
F5 c& `' U1 k8 _1 M, |0 b) o
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
0 i. ~# w: A7 ?, _
}
1 `* I* Z6 m2 D/ [2 K* z4 R, V% m% t
: x' n0 h }& Z# M1 y4 p' Q
void ChopperWaveform(void)
4 |2 l! |) G9 Z: U
{
' u2 i2 K- B. C* C* V
// 50% 占空比
% a% K: Q- u# r! `/ z& `- f
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 D. t9 v( ]' }9 n
// 4 分频
9 j% j A' E: f# Z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) @0 w& c6 P. d" }( ~. y0 j
// 单个脉冲宽度
H4 r0 t: h! m8 [( l" }
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ d4 |' M" u2 G
// 使能斩波子模块
) Y4 G5 q6 C4 ?
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 c& U3 T# D1 p- v3 F! }% h2 D
}
; f2 l$ o, Y( ^" }
7 J, r3 r/ r, \0 W( } }+ q
/****************************************************************************/
& v/ ~* o9 L6 s* S; v3 m* B! k; d; H: C0 y
/* */
+ z8 h5 z2 v3 ~ \! d
/* PWM 中断初始化 */
- q4 K, [7 {4 j, b3 Q/ i
/* */
* g! {6 x c; H! |0 y1 p6 u
/****************************************************************************/
: g$ C% E1 v; S
void PWMInterruptInit(void)
/ w. r0 B! P- G2 p0 e) S
{
# W* m" \+ o1 V# d2 A( L
// 注册中断服务函数
, G2 u+ |/ c* v" E& N$ r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 r' P4 m) w7 T0 E# b2 }
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 p5 A6 c. v' e9 A' h
7 E1 h( f/ h9 n' v" F9 c( }
// 映射中断
' |, }1 I1 A: O: B8 o$ F
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ V; w( S. [1 ^) ^
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ c/ l8 m2 r( U" l
3 B/ U- y1 ]! X) d+ _
// 使能中断
. M/ l$ U) P" q- [# a: ~
IntSystemEnable(SYS_INT_EHRPWM1);
) v' X V/ n; F/ g' v. g
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 k6 z, W k# |3 a0 d: B/ p2 }
}
1 f/ m2 `* p3 G0 k2 V1 ^
+ x: N- \- b7 d j
/****************************************************************************/
$ m) J( D$ P2 L$ t& q( H K
/* */
9 g/ s" W6 R/ e8 O) j
/* ARM 中断初始化 */
Y2 O% V$ k; [( r* X
/* */
$ A2 i# w& m. p
/****************************************************************************/
, R! Y5 p8 T7 s
void InterruptInit(void)
/ Z$ k6 J6 J8 F/ Z
{
) ?" | @4 b h* R! R" Y& y
// 初始化 ARM 中断控制器
O' K, G- ^7 g
IntAINTCInit();
7 }( _& Q9 T( t; f
* o T r* l% C$ \
// 使能 IRQ(CPSR)
+ i$ A: i! Q4 A4 D+ k' {
IntMasterIRQEnable();
- W/ r5 o) @! g+ h' y& M. R5 L% r: W
9 l* _* S) S& k' {3 t* j
// 使能中断(AINTC GER)
4 C9 n3 l q; z) A# S, Q
IntGlobalEnable();
- @- @5 W( ?/ I% v8 c4 U4 w
* v9 y8 L5 H ]: y8 c
// 使能中断(AINTC HIER)
5 l: `& @1 C0 |' D1 V1 p
IntIRQEnable();
% ~+ m, s# {2 b
}
# \5 I1 u$ X& D3 Q2 G
2 r6 T% s! X8 U: @ J
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
3 k! P' \: n ]9 A; g1 H
/* */
2 Z3 ` l! E! O' Y9 s
/* 中断服务函数 */
6 M0 J8 F) l; d1 o7 _
/* */
1 T$ E H* j9 [4 D$ `2 Z
/****************************************************************************/
- K) Q. }1 U# Y) Q
void PWMEventIsr(void)
+ Y/ G2 f8 N3 h$ s" }& w
{
! Z3 D% d% p# r: f. c" K+ \8 z
IntSystemStatusClear(SYS_INT_EHRPWM1);
0 _! M* {1 V2 r! c! S* Y8 g
# W* Z7 m s1 w4 |, a- A
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 u" o: C5 ~0 u: f5 U
}
9 w1 H+ \+ i7 c1 q' J
- G& s; ?6 g6 Y5 G! S
void PWMTZIsr(void)
2 q( q9 Y- b9 J; L
{
, l9 _2 b" J* u! n7 z5 K* ?+ o
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# f0 Y9 @* _4 R
+ e* J4 d+ O6 [- G
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- F7 D9 e5 j) b
}
- q0 G7 [% P% n, \8 ^4 X$ V
& q5 d. B9 B. }" r' I! T, _
/****************************************************************************/
9 F+ E' k& W' h' `- J% G* N6 D
/* */
8 p% N/ h/ N) J8 b2 L! r
/* 初始化捕获模块 */
1 _9 E0 h' x) P, ~% W
/* */
. D- i- _( g- V
/****************************************************************************/
! Y% x5 E3 {% h
void ECAPInit(void)
/ o9 s3 f9 t* v
{
1 N. w8 @; F* k9 g# i
/*-----设置 ECCTL1-----*/
2 m1 E: M" {2 x7 W5 @0 R) z8 s
// 使能CAP寄存器装载
8 t8 V6 [4 t3 ]. x. w5 }
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ r5 v6 {5 j+ j b& Q/ [8 o5 J
// 设置预分频值.
& R# ?- x( d' j
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
. Y8 E- l0 Z5 q8 Z
// 上升沿触发捕获事件
, J8 d: O3 h5 O( Y& T
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
) W! ]# z+ C5 r
// 输入捕获后重新装载计数器值.
5 j! r' L1 w: L: ~$ g* H
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
9 q: B% B. [" V+ L
+ M, j& u) |9 G
/*-----设置 ECCTL2-----*/
% e( W! S. n3 i# e1 S% K
// 连续模式
* o R) \& O! q: D# y4 A% ^3 f
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 `) r8 ?+ E, S" O6 v4 M& h
// ECAP计数器TSCTR持续计数
5 ~! \$ b" n2 X, p+ C: g
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 B5 A5 ~7 t" E
// 禁用同步输出和同步输入
( t* B& y3 B4 L5 {7 w
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
/ Z, ^2 K* s! W v
// 配置 ECAP 2 为 CAPTURE 模式
# _! h U! v! t: Q; m1 y
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
$ [3 O% R, D7 k
- A- d) U- [7 Q; f" n$ y; Y
// 使能中断
3 P8 M4 ^% @+ k$ s
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
* X6 V6 Z& J0 z8 E$ E3 b* Y, e
}
! S" H1 q, I9 e% Q
! A. l& Y4 S. p$ p. {$ v S" ]
/****************************************************************************/
5 m# m2 Q% N* R5 E* ]' A8 a
/* */
* M. C+ _; [/ t C) ~
/* 取得捕获结果 */
- |2 W; m( ~6 e' N4 N( i2 h/ k: F
/* */
' d: W, h& t+ z6 e' {; u
/****************************************************************************/
# E3 c6 r: u$ T+ i
unsigned int ECAPRead(void)
0 e" Y3 j- Y( o1 U6 E
{
+ o& ^5 H! w1 h5 u2 a
unsigned int capvalue;
) f. N" s0 V$ T& p% i! d
unsigned long frequency;
+ C) \+ a- V& A2 s3 p2 o
' V5 h6 T, M! h( z
// Event1 中断标志
8 ^* @1 t5 b( T# g
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
7 C7 M- ~- X$ ?, S
{
( X; t+ ?+ n. v" H
// 取得捕获计数
! d7 S4 c- E* M# X1 q
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 N, e: R5 }( e! O' o6 V
capvalue = ECAPResult.cap1;
2 L$ `$ A$ r' z8 X
; u" ~% \% R$ h' z7 R$ q
// CAPTRUE 模块 228M 时钟主频
9 ^# E3 G! m4 h6 v
frequency = 228000000/capvalue;
8 n2 O3 P3 {; E
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
1 e0 x9 |' G; L4 i
( t2 h7 _, s! l" j3 ^
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
, c% @3 c# b, x6 B4 ]' h+ F
// IntEventClear(SYS_INT_ECAP2);
9 ?) e* p8 ^" V0 R1 P$ C' b' u- `
}
* I4 ~ p- I7 O0 b$ T3 N
return frequency;
4 s, M' V' T) V7 F" D/ u2 z
}
3 ~ Y0 A0 y2 W2 H
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
# k: V' P, u# ~4 o0 }
[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