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