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