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