嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" ^7 o4 N1 K/ I0 h
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
% b& }) V C; H' t, I" \8 N6 v
/* */
4 F, t0 |% I+ u i2 v$ Z
/* 宏定义 */
( @( T' ^0 F: ?4 f6 f7 a4 t) }
/* */
5 e9 Q' m* Y- @, {8 m% x
/****************************************************************************/
3 M9 n! I7 S& I* v5 G- K2 X! H$ m
// 软件断点
/ N0 A4 Y6 I' q& A& S$ _2 [8 |" T8 i
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 w o; a8 k! N" A1 Y
- B% j( b, t& v: g2 P
// 时钟分频
% v6 @4 j/ c3 P R
#define CLOCK_DIV_VAL 228
& l9 z0 J% ?. `; P, o* m/ S) k
y$ A; m# q# w- k& r, V
/****************************************************************************/
! y b/ w( m# {" g. O
/* */
, i' H) r* o/ V# e& B5 k
/* 全局变量 */
7 K: h& D4 Y" `) q9 t# b5 g
/* */
$ \0 g( r8 d I" V2 V7 }: ?% ?6 K
/****************************************************************************/
* |: z0 T3 P# w o
ECAPCONTEXT ECAPResult;
; x6 Q( u/ i: x' N y" k
! h" I$ `3 {$ G, J
/****************************************************************************/
( c( R' N9 W0 B! u5 G' G( j8 Z
/* */
* |0 E% m+ J) e _
/* 函数声明 */
! r3 A. W0 U/ g5 [$ j3 @- j' N
/* */
+ O& c2 A9 {2 F0 P: f0 Y) _" j
/****************************************************************************/
7 y3 ] C( t5 ?, i9 O) n! d
// 外设使能配置
5 y) p- w1 S. l0 ]# p, a M
void PSCInit(void);
% T: K# r( ?9 ?6 |% E' `' y- _6 `* e! Z$ t
1 g4 Q7 {$ r! M2 S# y4 y0 v; m
// GPIO 管脚复用配置
2 R8 w/ o, c3 b
void GPIOBankPinMuxSet();
& N7 g8 d- ]9 z4 N) @% q) |2 I; L
' y5 A9 u3 j6 c8 o, `3 }- v
// 产生波形
3 `% P. a" ^+ R7 X9 e8 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 p1 D; g" E& M! |' b" \
void ChopperWaveform(void);
4 I& Q0 N$ W) H4 u
, S3 m* a9 m5 Z. S6 |
// ECAP初始化和读函数
, C6 m; X2 _) V+ L
void ECAPInit(void);
; e& m0 D, S9 j! ^9 `5 @* o
unsigned int ECAPRead(void);
$ s/ ^& R* r! ]! c4 b2 m: q
7 Y4 j3 o J6 m/ S1 p% A( C; U
//ARM 中断初始化
6 W2 s F# `% W0 ]
void InterruptInit(void);
# Q, U8 B* w: H# a: P; U8 G! i
& G |" |- B: [9 O% s3 {
// PWM 中断初始化
/ ~8 A& q4 A4 z- h4 t! _7 t0 r
void PWMInterruptInit(void);
& w3 `! \ F" X* Z1 t v2 D- e4 K
// 中断服务函数
) o3 Y3 m# |( q8 L" x" a- c4 [$ U: M
// PWM 事件
1 ^% @& B9 Z! w$ V# K1 U
void PWMEventIsr(void);
1 T N$ d4 h$ _6 ~0 [ }0 i1 C
// PWM 错误控制事件
% h% F4 Z2 D/ H$ C9 @
void PWMTZIsr(void);
) [/ o: t' {4 N! X
0 y' ~- R0 P6 U: |9 v* w- W
/****************************************************************************/
9 g' o. _( U0 n# e( p: @
/* */
1 D. K& W$ R& R1 d& H
/* 主函数 */
4 R" G* I/ J6 V* P( V
/* */
# C5 }' @" B2 T( }
/****************************************************************************/
: {0 z, `& W0 u6 y" `7 @# t5 S
int main(void)
8 k$ N8 S3 ~4 k& ^1 D
{
0 \& [+ k# b% w' Y; n4 ]' s
// 外设使能配置
3 V0 Z+ g: _% K) ?+ N* k3 |
PSCInit();
. l/ o2 F9 h# h$ u2 V' T
5 {0 U" \4 @4 X7 z
// 初始化串口终端 使用串口2
M+ G+ Y* m# `$ p/ u0 f
UARTStdioInit();
/ p) m) |8 b4 @: x" ~
5 P1 A' C: P- W$ O5 p
// GPIO 管脚复用配置
! M$ \* N9 q+ \
GPIOBankPinMuxSet();
8 U6 n9 _/ s5 T2 Q
9 Y3 n1 K+ g j, o9 X* D) h h( Z& u
// ARM 中断初始化
8 @8 S& Y* B+ `, B% i* S0 S
InterruptInit();
6 W! {9 i B/ N. [
* K9 r0 U% @" G8 n. C
// PWM 中断初始化
, [; H1 T+ e& A2 w
PWMInterruptInit();
c) k! B3 e; U. [4 ?/ B2 ^
' [/ B2 \8 L2 i! s: M
unsigned char i;
& G; a a: V2 N1 `
unsigned int j;
" ]% R( N0 y( Z$ l @% U+ T
* S R8 Y$ ~- S: D
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ y8 l. X: {" X! k/ L! t2 T
UARTPuts("------------------------------------------------------------\r\n", -1);
' }8 B; Z- }6 T
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
/ G# c9 a) A: m3 ^" T4 l
// 产生波形
, V% N$ x y+ N
PWM1ABasic(25000,50);
+ n! W4 [0 s! K$ X" N7 |$ I
" R4 D' u) k; P4 L4 E7 ^# Z$ y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 c5 Y$ L2 a( x
UARTPuts("------------------------------------------------------------\r\n", -1);
* _' N- L* I, f) y- z
/ |+ H# g0 [- [6 I4 T. e! c" B$ [
: S3 V0 W2 y, N( g
" {+ k$ P: O' o" R5 b/ Z9 q
UARTPuts("------------------------------------------------------------\r\n", -1);
. j+ {; b+ i4 z. |5 K# @/ _4 i9 j/ |
UARTPuts(" C6748 ECAP Test\r\n", -1);
P2 x# W V- B" g- j8 p
// ECAP 捕获初始化
+ r/ {; W/ B( l: P M
ECAPInit();
! Y- v3 i {" K5 r! |
UARTPuts("Initialize ECAP.......\r\n",-1);
8 r; _5 `: t8 N. D4 S! ^3 h" |' p, K
for(i=0;i<5;i++)
9 }% a/ {" ?" |. \
{
( H0 _7 e1 t- l& S- Z* `. l
for(j=0x00FFFFFF;j>0;j--); // 延时
: }) k w, E) t3 R
ECAPRead();
& R+ U( v3 M# W: p7 ?7 C+ A Q
}
4 g% A2 v6 J$ Q( N% x T2 B
UARTPuts("\r\n",-1);
7 A: r/ r5 M/ p# a( w$ \
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- g3 _) x1 [ y; B3 h) P* A9 K$ d
UARTPuts("------------------------------------------------------------\r\n", -1);
, k9 @* ~" L% h8 |. L# S9 h
- k0 _" _' I+ o0 ? z0 n& Y1 Y! p
// 主循环
]" h+ k7 i4 P
for(;;)
# U. z9 a2 P4 r' `
{
, w* X: ?) S; @. o: F% \
$ D/ J% o" W4 O$ i; n9 @* Q$ q
}
% s! y2 t7 B/ ]# q( W
}
- B( F# E& E+ t) ?( Y
! H( z: K9 z0 q
/****************************************************************************/
6 g, b7 l/ Z1 p- x/ B! y% I2 b/ `
/* */
" k6 D4 h0 n) F- `
/* PSC 初始化 */
( G" ]3 G9 y9 `; o
/* */
2 h# n- ^/ Z+ j/ w R8 e \( S
/****************************************************************************/
, X+ i3 C3 h8 b4 n' c# n4 D3 }
void PSCInit(void)
9 E- M4 \: _8 U$ P( y& W2 Q4 \1 C4 x
{
6 M' ?' a' N x% t& s/ M( r: o1 S( Z# z8 X
// 使能 EHRPWM 和 ECAP 模块
. c. y$ O+ Y: t
// 对相应外设模块的使能也可以在 BootLoader 中完成
6 K& }5 {. ~+ h8 {) k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% O# p5 l S" O8 y, H! x
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 C9 e7 [3 z, o) H- Q# B
}
( Q, ~$ m( l+ A0 v( B; t9 W
8 w" g" _+ W7 i; o( u( R
/****************************************************************************/
( q# {# p. M% r% {
/* */
3 X$ `+ A1 x5 e y. b7 C
/* GPIO 管脚复用配置 */
' h; r$ O$ L# C' \6 K T3 U2 N
/* */
5 m) {1 t& |" u9 C
/****************************************************************************/
( n0 B- O0 e+ n3 O$ `. R
void GPIOBankPinMuxSet(void)
8 {; [. r" f& z& H# r. T! {
{
, T( {8 `6 k# I B/ Z8 w' L
EHRPWM1PinMuxSetup();
% T! M* S1 Z( @0 ]9 h
" x9 \& E% @, g' j$ Q, ]
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! H' s) l0 u. q2 a5 ?; m$ s
// 作为捕获功能时管脚方向为输入
! ~; Y" o( i: l; g
// 作为辅助脉宽调制时管脚方向为输出
! P$ D3 ?7 m) S8 n0 W
// ECAP2 / APWM2
, ]! n% j* g! W) m
ECAPPinMuxSetup(2);
# }$ i) w" _9 f5 E
' p3 s: j. i- o4 |' {6 m% E. n
// ECAP2 / APWM2方向设置为输入
- K+ |. y: s8 F" N* @8 p; l
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
1 w, S1 T3 }) M/ o- j+ A! I U
}
) \- ^ O6 O8 C% _- h( U
s: m& {- L0 l
/****************************************************************************/
( U0 u! D# Y8 z* V: `
/* */
/ p1 v2 K' Y( X
/* PWM 输出波形 */
7 m2 ^; u# H: H% P
/* */
7 {5 M/ z& ^: U
/****************************************************************************/
. C/ I+ l+ o7 s& i/ B$ n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. c" M- J0 r' E* R
{
: L% z& I3 y% Z( \ A' g1 L
// 时间基准配置
( q, Q, A5 C& e& z8 Q
// 时钟配置
8 ^, `' R3 L: L( n
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* d, f9 U3 j) [4 R5 g) S- V# k
8 G; t* |3 b t, O. \
// 配置周期
6 a5 s4 _7 b, a/ B" t
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 L$ u5 R+ p8 i
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' d0 K3 `5 U, T% z4 [
" _6 M& e: {3 t3 K0 ?
// 禁用输入同步信号
. j' g5 k8 d9 T$ s) q
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* }% \* x! ?4 o6 p$ q. {' z# {
9 j4 u# C% |/ X3 Q/ B; s( k5 w" a
// 禁用输出同步信号
, d) s& i5 l: C" k! c2 f6 p
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, @! Q2 w. F k' U
/ l3 E5 R: R% W& g. e0 M0 I' F- M
// 仿真(DEBUG)模式行为配置
8 v$ w! T4 r) H: k' U% J
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! O" W$ l0 d7 f+ E/ _' M
% h$ B) r% o; z- I7 x
// 配置计数比较器子模块
- | W; v# i, n% n+ Z! J* a# q" A
// 加载比较器 A 值
9 J, n& H2 i* f
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. O$ _ s$ T9 F7 s+ U% S6 Z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 _9 w& d, [8 e& `; P6 R
; p4 W2 b" T) I/ N( D
// 加载比较器 B 值
/ p( g0 ~. I7 {! H- ~& p9 {1 S4 A3 J
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 f$ ?4 A4 E( f5 X& M6 c( t
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; \/ n4 E# _& d% Y
|/ S( |* n. k P
// 功能限定配置(输出引脚触发方式设定)
3 C+ {' H1 v# k1 ?5 {6 ~8 c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- e1 \0 W/ e" D9 k, m7 w
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 x0 ~* e! `7 D) c9 B
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
, Q# X$ K- Q0 u2 o0 \6 C ~
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 G+ v0 P; G( X1 ]0 i; x t
7 U, `" y6 ?' ]7 w# z+ U) o( M
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 a4 c$ }$ H. v2 P1 s: A
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, \$ w* n2 P4 T: k5 k
' E3 [3 z9 q9 K6 [! ]
// 禁用斩波子模块
' ]5 P. w$ p5 J4 H/ ?& J/ A
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; V0 B7 {3 S0 |
* V' j0 N; o' ?1 k4 a3 E2 c* B7 E2 l
// 禁用错误控制事件
- e! P; \3 r# x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ t( E8 _* M& ]! S) r5 R+ W/ D4 }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& n- g; A1 T0 D! l2 M+ Y2 C. }
% j" n& ]& U) \) a- Q- Y
// 事件触发配置
9 p1 O) g. z9 `6 b; }1 U# B. L( i
// 每三次事件发生产生中断
1 J# k; b1 N! ^$ ^' }
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% C' `' {3 J+ z" Q
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, _+ h9 n7 J9 ~: ?& A/ |
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 `/ H5 _* x" D" x! V% P
// 使能中断
* ?1 `% R1 @. t, k( s
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" B# ^ [# F0 v, q$ j
, v! X, c# e2 j' F) c: ]& C( U
// 禁用高精度子模块
7 }. f: b9 ^' \& D: z) }, p2 G
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- y4 _8 _6 u7 W, d
- X2 _& {2 V0 F0 u
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* ^$ J% X9 E) ^/ v
}
& s+ a) n' p& C
9 |* G+ K: M8 I8 u
void ChopperWaveform(void)
6 F' W j$ Z7 W" Q
{
1 z# C, t2 A, J7 [$ R* P
// 50% 占空比
( O. @/ l/ z w$ I, j* F
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 i) c: O8 o6 K- E
// 4 分频
4 b9 P. p4 j. s% ^/ |5 `
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ a8 {$ b2 n3 C( j
// 单个脉冲宽度
( z% W, g, }9 j. t
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 e* ^! j3 u0 _
// 使能斩波子模块
! K* r+ Q* c$ T, {
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# {. K0 o1 q7 K: ^
}
7 G1 a. i# }3 r8 t
2 t1 @% N' Z& R2 P
/****************************************************************************/
% s* x) [$ u/ f r9 l/ k
/* */
: {0 I: L8 f2 g4 b- ?& R; y3 M- T
/* PWM 中断初始化 */
1 U1 m$ l+ P( n8 Q' E
/* */
* W- f2 Y" X f: L' i
/****************************************************************************/
" O( c5 b( g5 o4 h6 H7 f
void PWMInterruptInit(void)
& _/ C1 g( M% a- `6 @
{
% O8 w3 R- X7 M: d7 |
// 注册中断服务函数
1 e$ X6 S: G3 t) ~: ~* d
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* W3 Z% O8 q. J1 ^8 v4 A
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% Q2 k1 \0 J- v; C+ D
" o0 `. d D# M) D" [5 }$ h
// 映射中断
( B5 R! f8 f9 e8 D
IntChannelSet(SYS_INT_EHRPWM1, 2);
8 h0 v6 f- f9 H- I
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 k; n2 t2 q; C
3 V# [ E) z' @ k+ P9 M8 `$ X8 J
// 使能中断
5 K1 L9 ?1 Q) j- A0 Q
IntSystemEnable(SYS_INT_EHRPWM1);
! |' h- j& N2 V% n' i0 T1 B
IntSystemEnable(SYS_INT_EHRPWM1TZ);
( v4 D4 L& m& a8 b2 ~
}
3 A0 i4 }/ _9 E R! v
2 O# j- Z" l& Y% r5 |* c
/****************************************************************************/
0 Y O% ~+ E/ ]3 P* ?
/* */
; @: F7 `( A& ]3 m) \
/* ARM 中断初始化 */
6 c1 [ M6 m6 b( F" C
/* */
2 w) w K0 Y8 y Q5 h
/****************************************************************************/
0 F$ T, w& q& S. A# s- _
void InterruptInit(void)
4 Q* b1 S9 x- m% t
{
' d2 J) a5 ^. C) F. s
// 初始化 ARM 中断控制器
! c% Z5 X" ~9 s, x* x0 V0 o$ N
IntAINTCInit();
' z) A( O( N( W4 [* |7 R; l4 a4 \
. l% n* d% z/ r
// 使能 IRQ(CPSR)
4 ~! p( |1 P u+ J9 m7 ]
IntMasterIRQEnable();
; u$ I1 I$ R5 b4 r( J
/ |7 m( ]( B X; Q4 M& g
// 使能中断(AINTC GER)
- j- J, ~9 F4 p* m
IntGlobalEnable();
6 h5 ], o$ Y/ v! _; R2 w
2 W+ v% K7 v i, v: s2 t3 r0 c
// 使能中断(AINTC HIER)
* i$ t7 y, a3 }# ? |- v. X- J
IntIRQEnable();
5 V" w3 k6 S- i5 k# I
}
5 z3 V3 {* C- m
# F$ i8 |* k& L y7 \
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
; p D2 l) p2 p7 K" b8 N
/* */
8 b) \( c" H: i) W8 H# v' g
/* 中断服务函数 */
) i7 v/ v8 A6 D; Z2 b7 ^, H
/* */
- s) X. H0 E. D: b* n% _
/****************************************************************************/
* m @4 y6 C; K
void PWMEventIsr(void)
/ X3 W }' {& n. n# A; W
{
3 M# w9 l C) K8 J0 U; s1 f( y5 @
IntSystemStatusClear(SYS_INT_EHRPWM1);
! {+ r+ H, L' U# i
- c$ {1 n; ]4 Q, L& l0 V0 J
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 f; j3 s: P& T
}
2 S6 k9 G) u& x5 B3 }6 v. w
8 w6 q( V& s' V* Y! W
void PWMTZIsr(void)
2 f; p" H' T! S7 [
{
2 @. p( b( Z7 U5 H2 r
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 g: B, A& }) q/ |9 N
, y( ]4 m2 F4 k1 j0 C3 u4 Q+ }6 ~
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 e2 _2 B) |) K0 X% _7 b6 R# m/ V
}
* Y$ X; D- U8 g$ p, ?) I& E
M8 I- z$ a7 K& D! m" S8 O
/****************************************************************************/
* F3 s" ` \2 x& l, u
/* */
: B0 r4 ~ o' t
/* 初始化捕获模块 */
( i' X# K* g6 j6 t
/* */
; a: q+ t9 U8 Q( c
/****************************************************************************/
; S& X P! Y, \* u* [
void ECAPInit(void)
- ?) t1 P, [' m+ u: k) S
{
( p7 \, Q! r! m( g. G B; P
/*-----设置 ECCTL1-----*/
$ k, D. ]) {2 a! n; R9 F
// 使能CAP寄存器装载
0 k) x2 y% J, m: S _- h& L
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& ~1 e: e& l0 {# P
// 设置预分频值.
$ C1 R! }/ M4 [% O4 Y- f
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% i* M& k- ~# p% n3 I+ C
// 上升沿触发捕获事件
8 C* [: @8 b' z( O& T R
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 G* C9 B( p, w, R- Q
// 输入捕获后重新装载计数器值.
( h+ b' T- P3 F
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
. s+ h; G# z& J' I) ~9 b2 e
3 e- ^0 X; t# }6 A
/*-----设置 ECCTL2-----*/
. H5 O+ t( [1 K/ ]
// 连续模式
0 W y( v( {$ d
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 y) `! f0 L5 {# y0 M/ ]
// ECAP计数器TSCTR持续计数
& o( v* j& w& d( Y! V, W9 @6 x
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: a0 u, q" s2 A' G+ ^- d1 H
// 禁用同步输出和同步输入
: b6 [4 B& m# U/ o2 U( m& j% p! Y
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
. V* @2 v, a$ n# Q6 D. `+ K3 V
// 配置 ECAP 2 为 CAPTURE 模式
( }% V& Y: N2 D% g" D
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
0 U8 e1 Z7 d& k4 U8 S3 @$ _5 a
# f2 s. t# |2 H- N* r- R
// 使能中断
' k& |% V& }- [7 t2 j- H. \! p5 r6 A
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
4 s% b& w, J$ l- `% w( |
}
0 N I$ a0 `/ ?7 z
+ S% L7 }7 }, L: s+ G+ J2 f
/****************************************************************************/
# O* d+ T, K2 w+ u# O
/* */
& Y+ U4 n; d/ v- F. ^. N; k
/* 取得捕获结果 */
/ U0 K+ r5 N( F% o: c
/* */
6 R$ Q8 D+ \ X2 U2 j' a/ H
/****************************************************************************/
9 n( t5 Z/ N; k ^7 j# u5 n5 P
unsigned int ECAPRead(void)
8 W6 G3 p# G" M) |/ h
{
% a- p! V" ] x( V# v/ d4 [
unsigned int capvalue;
/ N! U. p O, Y4 P5 _; Y
unsigned long frequency;
# v8 x$ J: I# \& |& ~. }+ G) x
, N! T! I& ^3 t, O3 C4 u; p6 _
// Event1 中断标志
- Z( T) R* F- g+ j' x9 }# z
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 m4 C5 N" e+ h% s
{
- a2 U, C' B& {- U2 k
// 取得捕获计数
% N$ o* L5 T0 y' g0 O8 z7 c
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 Q E) s' \5 @1 b$ A" C/ i
capvalue = ECAPResult.cap1;
# P& y* `% y' ]6 Y7 l
1 K" v* y9 I( u% O$ v p! S3 R
// CAPTRUE 模块 228M 时钟主频
* E: L. Y: {6 v6 S5 M- Y5 T
frequency = 228000000/capvalue;
: R4 I- {1 [ s: ]1 O0 g
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ }* Z) J8 ]4 L
4 v9 B8 a. k# @& `' L
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 i0 ?/ I1 l# u) T! p- G7 w
// IntEventClear(SYS_INT_ECAP2);
8 a8 z: v/ v4 b' v5 l1 R0 E/ O
}
! x; X7 t9 s3 Q. Y2 p" c
return frequency;
' s1 d- Y% H& l8 E
}
% s( o. ?7 q- _2 @* Y* |
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ P2 @3 F4 p+ s, G0 m0 [7 G
[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