嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
3 Z" Q2 y# A3 ?9 G
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
: X1 b4 H1 q1 b
/* */
S U! l8 }5 D# n, j6 C" `
/* 宏定义 */
. N9 ^: t) [. V. b# J, ~: {. o) g' V
/* */
# e$ S8 M7 ~1 N( Q( _0 Y7 c$ x# T
/****************************************************************************/
7 h6 g E) @ ^, ]* w% Y* ]
// 软件断点
7 x/ V7 ~% K! `7 b3 w* s& G* h
#define SW_BREAKPOINT asm(" SWBP 0 ");
* i% }5 b+ I( {) j% Y
D M3 q5 Q$ U, y9 B
// 时钟分频
0 G7 l8 J- X. i! d+ z4 |
#define CLOCK_DIV_VAL 228
% x- b1 {1 H# E5 _
% P+ `5 P- s9 m8 }( U
/****************************************************************************/
1 ]8 i) a$ q) ^, U7 I' ]
/* */
0 q$ {$ M. F8 ~- |1 k$ B
/* 全局变量 */
) c1 O/ F" `, X, H& o) x4 U/ P
/* */
k" c K' N/ e) T) j7 j
/****************************************************************************/
4 w) z/ [$ S2 F! O; E9 d( }
ECAPCONTEXT ECAPResult;
/ n' |5 {( k! |6 T4 ~; Y
9 R$ B0 z2 w, q. H x5 }: I
/****************************************************************************/
# I1 [- j& W8 m5 q
/* */
# {' n2 `: ^2 m1 V( K" N3 }
/* 函数声明 */
4 q$ L9 X) Z% Y2 f6 S. r
/* */
) g8 A$ C% B' _% P4 `
/****************************************************************************/
+ F. Y. r. u. A* o' Y3 }
// 外设使能配置
0 y! |* `0 I6 d0 j) H) {6 g/ u# q( r
void PSCInit(void);
* i. I6 i" K9 a! I! k
. n/ p! w! w5 S( \
// GPIO 管脚复用配置
! ^+ ]9 s! \' b; K3 |' Q+ [
void GPIOBankPinMuxSet();
0 B; H% \) `' Z8 \
+ m% |9 @1 Q3 v# ^# W
// 产生波形
! Q% U* `& ^% \/ o3 Z. j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
" Z/ {( k* [, k. I6 j: E# L
void ChopperWaveform(void);
* Q# V: T! X/ E' C
: a0 E" i$ N3 E4 U9 m
// ECAP初始化和读函数
# Z. u% z- _, O6 g
void ECAPInit(void);
5 ^( T0 j- o% a- }3 E* J% D
unsigned int ECAPRead(void);
$ V2 j% I5 } |0 X$ B: g& M
& S9 [, `/ y& v% ?2 E5 _$ t" J
//ARM 中断初始化
' @4 y: D. x6 E5 [( i ?& ~4 b; F
void InterruptInit(void);
9 g' C/ T. N0 q" m$ \
$ ^2 P( O; K' I, A
// PWM 中断初始化
. U3 `7 \; f" f8 O* _# I
void PWMInterruptInit(void);
. |+ }4 e7 [2 |$ V
// 中断服务函数
; v5 \1 U( @! ~! q4 S% o* m
// PWM 事件
1 [' X3 H5 k _7 u- X K) a- d
void PWMEventIsr(void);
; D% s9 R- {9 V' V/ F
// PWM 错误控制事件
, I A3 j* {( B& S* L) d% p
void PWMTZIsr(void);
1 i- P7 J: C: @) M- c) f6 h
/ l$ {* r4 _( i) s# m
/****************************************************************************/
& B J0 n% z6 H5 s) x
/* */
) E+ h5 h. b: W5 t
/* 主函数 */
P5 [2 B8 W4 A
/* */
" B$ j& a3 N8 V0 M, U* N/ X; m' W
/****************************************************************************/
4 p! s9 A) P& J+ ]
int main(void)
, {4 [! m% B6 g- B
{
+ x! o2 w$ A+ Z; e, h' S' y% y
// 外设使能配置
( N9 s* F# Q: w# A, z' b. m
PSCInit();
5 J4 |/ X) o1 T9 q
% t5 v* A. I% x' ]# X
// 初始化串口终端 使用串口2
4 F; c9 Y* B7 ~2 O# P6 m
UARTStdioInit();
. x* b8 y- r/ A: w2 h
& v$ i `# W) P3 e
// GPIO 管脚复用配置
- s8 v1 @3 ^ y; n" g
GPIOBankPinMuxSet();
9 f0 b) V- O. t9 a. @: u
' \$ x5 O8 D9 G* ~% d/ ^
// ARM 中断初始化
$ H3 {3 y2 J- U
InterruptInit();
8 H) V. R; e0 y) ^0 p2 ~
# V0 D3 c# \* @" Q
// PWM 中断初始化
2 c; r4 C/ U& J$ K
PWMInterruptInit();
6 i4 C& z7 J" }1 |& @# C: e
/ @+ X, i2 ]7 H+ K9 P9 E
unsigned char i;
6 J1 s+ H% A% A7 Y5 `
unsigned int j;
( {' b+ c6 i! ^ M
5 y8 p0 H" m/ g5 L% n8 o
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 D; O% Y4 I" m
UARTPuts("------------------------------------------------------------\r\n", -1);
% Q! s8 C& O3 E2 _+ z+ y
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ E( _! C/ T0 [% N2 M
// 产生波形
9 m/ q) N. m, y E; B5 a
PWM1ABasic(25000,50);
: e7 `8 P& _8 y. P1 `
- j3 ^$ `2 m& K: r1 O3 b
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
5 |- J# t& z# d0 q5 e/ `
UARTPuts("------------------------------------------------------------\r\n", -1);
x& |: _0 j; y
9 S. Y N$ t! j" a- ~ J! H( n
J9 O1 @: ~; A. E- S
1 b% R: j9 ^; {: w+ [; \
UARTPuts("------------------------------------------------------------\r\n", -1);
9 O& C; F% \, s9 L0 z4 p5 Y
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 R6 k3 g# o+ I6 k( ^
// ECAP 捕获初始化
9 a( @. O0 h. l/ `' g; `4 J) E
ECAPInit();
0 n+ b3 `5 |9 \0 t) Q: C" K( V
UARTPuts("Initialize ECAP.......\r\n",-1);
/ f4 g- [3 b9 x5 ~7 E, e
for(i=0;i<5;i++)
9 i( b$ F- g0 E( m8 H/ E; {
{
, {2 b* f: R3 D L* L
for(j=0x00FFFFFF;j>0;j--); // 延时
: j; z, z& y& u1 T6 ~8 E r
ECAPRead();
- M/ K0 C4 D# Z
}
# i4 O9 y* D) ^5 J9 N2 B: Y
UARTPuts("\r\n",-1);
7 e g# H- V& D6 o- W/ Q
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
% J9 C: f9 [5 ~6 e, y8 K. V6 g
UARTPuts("------------------------------------------------------------\r\n", -1);
s1 L1 ?& d5 j3 s* r! a
; J' Q8 e, {1 I0 f# K
// 主循环
+ T6 c! e$ `' `
for(;;)
) }( g/ s8 c: C! d6 o; @
{
+ R; ]3 Z( L. e* [
2 I5 }; x1 W( K6 P" T. o
}
, d/ y( L P7 ^" `
}
l& u/ Q, f3 q3 a1 d: B- j4 F
0 n4 n* j7 Q' ^/ K3 F; o" d
/****************************************************************************/
& f) m8 T: q0 Z" q4 r% K; [% u. z
/* */
* @( s. e( L& m! U* ^
/* PSC 初始化 */
+ @, U: X( F7 X9 d( N! @' m
/* */
0 N$ d0 K2 S- B
/****************************************************************************/
- B. |( ?6 [* @4 `; V' b
void PSCInit(void)
. j( F8 m' [; X
{
: r9 O- L3 P, q# U3 O9 d$ h
// 使能 EHRPWM 和 ECAP 模块
$ x8 H: m# g& O2 |
// 对相应外设模块的使能也可以在 BootLoader 中完成
- X( n7 L$ a6 P+ G/ L% ]3 `- E: s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! W/ t- H. r+ W, `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! N# g1 g; l W1 P7 ^
}
9 G4 o, J; H, h1 u7 ^6 _2 x
# E+ j- y9 |- ]2 c7 Q9 g
/****************************************************************************/
- N+ s; s# F M# e( h$ I' K
/* */
) n( J ^% `: O2 w6 F
/* GPIO 管脚复用配置 */
^: x9 F( h( j" R9 X
/* */
) F, I# F4 c# f8 ^1 a2 t- h
/****************************************************************************/
: K$ J1 Z/ _4 ?6 w+ c7 U
void GPIOBankPinMuxSet(void)
2 I# K8 d4 D6 [5 M% H
{
% U3 q7 \, p" N" B4 u
EHRPWM1PinMuxSetup();
9 Z8 R( v6 Y0 C Q
W8 u @$ I; c8 T6 Q
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; w% Y2 V8 v3 R
// 作为捕获功能时管脚方向为输入
* s {- b. M3 G( O) C
// 作为辅助脉宽调制时管脚方向为输出
0 E3 E v% V8 x: W8 l
// ECAP2 / APWM2
e! ?. `; J/ w4 d7 `/ d
ECAPPinMuxSetup(2);
- s$ y* |2 w% J$ g5 z
- q( F6 ~6 F) o3 f/ k* D
// ECAP2 / APWM2方向设置为输入
" U) d# ^" D, Z/ f5 u
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
/ G9 q; h7 G- e# U0 z/ h7 h9 n
}
8 _$ t0 u' h8 N$ R5 R4 Q
, E+ D% Q- a! V: J) W/ O
/****************************************************************************/
C. x$ g T! ]! |9 \
/* */
. Y. z* n. M9 _
/* PWM 输出波形 */
5 E9 [! E9 f" W5 I$ k
/* */
4 F2 |; q0 E8 F
/****************************************************************************/
8 Y2 d% l: L$ P) e% s. U
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
0 h5 M1 r9 ], _: }, [9 g a2 H: O
{
; ^, t! q& W, O" S; J1 w
// 时间基准配置
% O( ^' }* x) t: s/ H x7 s1 {8 `
// 时钟配置
O8 y$ Z% E6 }/ I: Y
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
2 @" U6 o. N. }
# d X" N: L7 o
// 配置周期
: e7 t' {; f- k4 C
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 M9 Z9 N& h+ O9 r. S7 ]0 b P
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; D# x* g O6 m
, s) i3 s7 q( b, \
// 禁用输入同步信号
7 a8 ~" p; q5 d8 ^
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( B& D3 G, l/ z' m: y% T4 Y( m
2 W4 p6 B+ P; V9 b; q8 F7 u+ t
// 禁用输出同步信号
+ J) G" U, t4 K2 ]# u+ |+ K
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! o. i; ~4 Z ~( e7 V5 B
2 c* X9 U; T' M( e' g
// 仿真(DEBUG)模式行为配置
$ t8 M" Z+ j d0 Z
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
/ C! q6 T% }# s" P$ e3 u* r
" f0 `6 b& `% O8 k
// 配置计数比较器子模块
0 i- x9 x; O( H6 h+ z) f2 j
// 加载比较器 A 值
, J& ?0 W i5 w
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ W% U" v1 J _5 `) {+ Y8 {
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" L, n+ \! m6 P; \3 [6 {' |
# |+ @4 t2 c$ \
// 加载比较器 B 值
2 y/ T% [) {% X% ^
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ a$ e! G6 H% a( G
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! K. F& x( t+ I- X& k% L3 h
: `$ g' D. J- R) L: d
// 功能限定配置(输出引脚触发方式设定)
9 J! I# I' ^, k9 u2 X) s3 Y0 g
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
W; n1 v! j: s/ D0 ?" k+ [4 @, P
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, U7 Q4 `4 W6 w0 s0 h
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) [- Z! b$ f( C2 u+ n/ I% f9 V
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' w5 {; I* L+ i( V9 T
- j* P) e2 }- q2 i
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
) `; s1 ]2 m) [; V3 l/ ?7 V2 H
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ K9 Q. j8 @9 C/ F0 C- @
& E }$ A. j$ w" b, s
// 禁用斩波子模块
# a" e" v# I, k
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' K% b1 }" p0 A& l2 ^; c
6 i! }# k; p! R8 {
// 禁用错误控制事件
) m" X" P2 K+ W6 e
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. H5 E2 [" \4 i. @" J0 |
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
. d5 }5 ?4 [$ G t3 r
' ^+ u. {, f/ ]4 L0 u/ {
// 事件触发配置
9 M0 h+ p' Y4 O% f9 |
// 每三次事件发生产生中断
0 R5 O3 \8 h( Z( A% ^3 n1 Z1 S7 S! z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- x w, {( o L9 X. a
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 ]- w, ]. I2 {4 u
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' s( w7 J( u6 `- g5 g& j
// 使能中断
8 W( v7 g: Z4 a
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
5 r; T5 a5 D) K4 Z6 m1 B/ A! L
# Z- X5 b9 c! J: `
// 禁用高精度子模块
% M% P; v0 E! j5 I
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 H- d& u6 B- b# k$ n. e1 b1 O
6 a6 T r; [( B; ~) U- k' ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
% L1 h9 p$ B- X5 e. O! B
}
/ Z" w/ d; J; V( w
1 b* f5 n: V% g8 S9 g; D! Z" H) y
void ChopperWaveform(void)
% i# v; f' | j; ]/ r
{
) ]+ Z8 `1 H6 J7 t2 p/ c Y
// 50% 占空比
/ A) J7 z. ]) U0 W/ p* ? F1 ?
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. V8 n" \# C$ R! _! p/ _1 `/ J
// 4 分频
/ E/ z6 W; M8 Y3 ]5 A
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
9 L9 q+ g4 F6 H+ T
// 单个脉冲宽度
: W/ a3 E2 E% `) f8 o( _( ^# s% Z
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 `1 c# ]8 a3 b4 H& b W
// 使能斩波子模块
g! D4 K& U5 K$ a
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 R9 h' u, a/ {" ~* t0 m) i5 r
}
9 K% v1 v0 P& c9 t
0 o# M4 |' T! q' N9 i0 S7 J
/****************************************************************************/
: j5 \* u* b- t3 d% J3 N, d
/* */
& F1 D& G. b; T
/* PWM 中断初始化 */
0 e$ o7 V# E+ @: g1 F2 y8 l
/* */
; w: j" m6 }( J. Q, V5 f
/****************************************************************************/
& I9 v1 G; t8 }) V* f* c' H o
void PWMInterruptInit(void)
! U, y0 p; {2 b2 o* z
{
( B3 Q: }1 q1 T8 I
// 注册中断服务函数
! Y; z* Z& b6 U) T7 z$ Z) m- l
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; D) q* e o2 o) P( V3 s
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ M: G/ Q% h5 L# x$ g
8 a3 H- k3 b3 G8 P+ q0 q! W" ]
// 映射中断
' b) o) K7 Y& y6 N* O
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ s7 X$ v- w% j- l } i c
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 l! K3 t/ {# d( e
+ J, j |% @0 g) U& ~ x
// 使能中断
, B. t1 y0 H2 m% N, Q c5 z. h( J& v+ x
IntSystemEnable(SYS_INT_EHRPWM1);
4 I: U& B5 e5 T* h, F
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- V6 Q, V1 w8 r/ N- t
}
. z% O S6 L9 {# W0 b2 T" N; O& V
4 d. c$ i; C( o; N" p, y" Z
/****************************************************************************/
4 j8 Z# n5 Y; A3 P! b9 k
/* */
6 f& K. E" o5 J
/* ARM 中断初始化 */
$ T* R5 F5 Z) `9 ~. z
/* */
0 B. P( ^! D0 V, O
/****************************************************************************/
8 q3 m; i) ` V. X' m% K
void InterruptInit(void)
/ B2 `: ^; _2 R/ Z; Z' a+ h
{
1 n |3 e. t D' C" z
// 初始化 ARM 中断控制器
& z4 F) a# u+ b! e8 o, n5 B2 ?
IntAINTCInit();
) }* B9 M, f' J: F( x4 F
$ d) z- L- ^, F k" \# f/ [) B; E
// 使能 IRQ(CPSR)
, g- s* [ G6 B/ {: W& p" L+ ?
IntMasterIRQEnable();
( v1 |/ d! A/ v6 Q9 q) T5 Q3 D
& `( R( t9 X! t7 ]1 m
// 使能中断(AINTC GER)
% c! x$ D2 ?! t+ x9 P1 R9 o6 R! h1 m
IntGlobalEnable();
/ H1 v& l/ V# H( Y, w
: q4 V+ N' I- i' q3 i
// 使能中断(AINTC HIER)
' K9 u# I" e( G
IntIRQEnable();
/ [$ `) U8 r9 Q; D$ A- A
}
" K9 y* l; M( _' }# t
3 n- R" ^. t8 a6 e' m7 {
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& T2 W4 X) d% q4 k' i* v
/* */
9 y4 o+ F4 d0 F z- M! h+ Q3 z
/* 中断服务函数 */
7 {; {6 u- _( Q6 N6 h+ o- V
/* */
3 D* u$ i& Q6 ]6 D- S. f* c
/****************************************************************************/
( Q" g0 _" Z3 x* A3 R( k9 J3 U
void PWMEventIsr(void)
& C. e9 k9 Q6 h2 U& F
{
( [3 z3 l8 z B c. `9 i
IntSystemStatusClear(SYS_INT_EHRPWM1);
8 L% @) w2 W0 M( T6 W0 B
; J7 k3 i1 a/ y- y( x* d# p
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
0 G0 d' n2 Y: X# T( C0 F9 y) ]
}
7 T3 {- r5 Y3 n1 j' m/ @
. s" s% w4 Z) t. M3 k- I" [. e
void PWMTZIsr(void)
I7 c& F' }. o$ p5 F
{
% w7 s/ v, }- J ]$ H
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
6 I) [1 ~! U" `" e0 J1 a4 L2 [
2 B5 k7 D8 i6 C& v4 o, f5 Y
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
|; z3 }( N$ H9 p0 Q- x
}
! |) I# ?6 [0 a: @7 ^1 D! h2 S$ x
% Z8 A+ O( P: |6 d- H' ~, J
/****************************************************************************/
/ T# u u0 N) c2 |6 w
/* */
2 h# E# I4 R) t- W/ {# M
/* 初始化捕获模块 */
. I+ K, B: P: I3 ?
/* */
# q! |3 W# A+ ]6 G
/****************************************************************************/
. G! }4 P) p( ^7 v! p. d6 F* j4 F9 o
void ECAPInit(void)
$ N! q, X6 R a3 ?& C6 j: w
{
. X; v {- |" J: ~8 x2 S6 a5 X
/*-----设置 ECCTL1-----*/
+ h; s& I6 K; w/ `& M% Q$ p
// 使能CAP寄存器装载
; P$ p8 P k3 t
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& a1 B$ C% w- R! Y9 f) |" v0 | k
// 设置预分频值.
. Q* L$ t1 z+ _4 a8 O
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* I$ y+ Y H. K4 [6 g$ f2 O) d
// 上升沿触发捕获事件
. j( z* X+ l, d7 ^) F' i& {
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ f& X9 Y% x! m& f
// 输入捕获后重新装载计数器值.
4 B# b0 Y6 d4 u) ]
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
, O+ I, h; v- O w( j
# I: n% x \: o2 N
/*-----设置 ECCTL2-----*/
$ K+ l; B R3 x8 A* a
// 连续模式
4 S3 N) U3 q0 k" C6 K) x" G' l( b
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- o) [0 v! r2 p- @" [& D' b
// ECAP计数器TSCTR持续计数
# S9 K7 j/ X" V* w% ^) R- V
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
1 j( K7 p& }" p2 s6 I3 ^7 \' \
// 禁用同步输出和同步输入
- I5 |; D6 R/ [* Y$ G
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
6 Z- T5 y& W9 @4 e h- m
// 配置 ECAP 2 为 CAPTURE 模式
& t/ E! Z, ^+ n
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* R1 ?8 `/ E6 {1 Y9 Z
( g+ M# {, o7 I( _2 Q; p# l
// 使能中断
* [4 V6 M0 G% S4 `3 ~2 x
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 O5 X: Z8 Y: z
}
. v8 [5 }, S B( n: S0 e& C6 Y
+ o# R y$ U3 ~& g& \
/****************************************************************************/
! U, b. |: h# _( i( u
/* */
# h6 Y- I2 T4 N6 U+ O2 X- D
/* 取得捕获结果 */
; [! \" A' V6 K. i- z/ A9 T
/* */
9 q" R3 `6 g( l2 o/ t3 K) y
/****************************************************************************/
% [/ O/ P4 X: g1 m) w9 Q% k
unsigned int ECAPRead(void)
3 E+ r) {0 W# }/ O+ c9 f- [
{
8 E$ l$ z9 R9 z' m1 I6 ]/ S8 ^ ]
unsigned int capvalue;
. D9 z" S& S! d ]) T
unsigned long frequency;
4 P6 y& s5 }0 {/ }( n' U
) G/ D1 X6 J# s
// Event1 中断标志
8 U1 {9 d% {( N( x$ K) z) `
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
$ T7 H) m- @: G5 j( T
{
3 M2 V6 r- z$ w+ |, M6 h; ~) ~
// 取得捕获计数
: k1 d1 T0 `+ H9 Z. [; E
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( q' I- ^$ m: k- x4 o
capvalue = ECAPResult.cap1;
1 V# \9 W; G5 g J6 n+ g
* j- k( {+ n5 G) Q; r! i
// CAPTRUE 模块 228M 时钟主频
8 P1 P: p' Y5 m! s8 o/ V5 @
frequency = 228000000/capvalue;
: F9 y: U1 `4 D3 U2 r9 T( @( y5 \3 P" a
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
, h( ?& y3 Y: C
! h# z! \) |- x% T
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
2 ~: B& X7 R) d: ~: w" ~: Q
// IntEventClear(SYS_INT_ECAP2);
8 |% V5 d! ?. D/ O m' N
}
3 u* s4 V* `7 y4 o w/ |
return frequency;
, _) G3 E; u% i" `
}
! f! V3 V' G5 Q: x
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ ~* {# l) ?& w7 a7 Q! `% c
[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