嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 Y- j: f8 R& f& h* ^
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
; \" N/ T$ R8 V: I
/* */
# U- Q# ?% F8 G" C
/* 宏定义 */
0 x! |$ @$ ?9 w C
/* */
# ?& C7 U# j, {
/****************************************************************************/
$ |6 N1 w+ Q( r& X4 A
// 软件断点
0 u$ F7 T9 {" u9 q# ?. R$ X3 L% p: X
#define SW_BREAKPOINT asm(" SWBP 0 ");
& n/ c1 l2 a4 D, C! W$ T7 T5 V) N$ }
: e" q' M. |' A, c$ V4 J+ ?! P$ v
// 时钟分频
# s0 n! U& A! Z8 J
#define CLOCK_DIV_VAL 228
( D& i0 }+ \5 S4 e
3 w0 T0 G' b) ]$ @* ~
/****************************************************************************/
- A; d( F5 h% S8 L3 s+ M
/* */
6 ~) w7 T! i y4 c( G5 F; _+ ?
/* 全局变量 */
1 @/ e" a: \; L2 J( j
/* */
* `7 Y0 R* X: G
/****************************************************************************/
1 u3 S2 _# G. g* t1 E* B0 i) @
ECAPCONTEXT ECAPResult;
! I4 f/ [: d4 J3 S
! ~' M) v8 U# ]& G! _
/****************************************************************************/
8 C. j+ j0 _1 Q
/* */
: ^' ?: u W" A
/* 函数声明 */
2 C# J8 ]4 R& B1 x8 d
/* */
' Q2 }1 b( N: u- A% }5 V" y
/****************************************************************************/
5 a) u' ? Z: h- F( f; b
// 外设使能配置
& D, `' j6 P8 z/ A
void PSCInit(void);
/ L' b2 N1 t$ i' F; k$ j/ ]3 p7 G! g
% h& M6 P" D5 c! |. ~: Y
// GPIO 管脚复用配置
8 w" v% ^0 M* _9 F" @& s
void GPIOBankPinMuxSet();
6 {/ `% A S# q0 e
) q1 u! q# N6 ^( l& Z5 ]
// 产生波形
2 G! u( u& X# Y+ B b% V; y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. M" F2 R! N# O
void ChopperWaveform(void);
* J6 u3 `6 |2 K. r$ g. ~/ U
$ Y6 j) A& [6 D# C" [
// ECAP初始化和读函数
9 n4 N7 r$ c( u& k, P
void ECAPInit(void);
5 a1 D8 D' [# O$ S/ q
unsigned int ECAPRead(void);
7 ?* ]" }# q% [" A
' o5 s3 T2 I2 i& C- A
//ARM 中断初始化
8 K- l7 k9 [3 S/ M1 H. B3 u& C C
void InterruptInit(void);
# P% B5 {8 `1 t. f
7 N8 E5 d1 N, {( J8 r- k7 d& [
// PWM 中断初始化
- ?/ Z6 J, Z& Q$ ^# j
void PWMInterruptInit(void);
2 ?5 _) M! W# D4 [; M' O. J
// 中断服务函数
% R" A$ i# p% ~' W9 i7 K5 [" `
// PWM 事件
- X; Z0 d0 d% v! ^2 F" A, K: u
void PWMEventIsr(void);
" P) y( x, ~9 q6 T7 L
// PWM 错误控制事件
5 h8 [% z* m. I0 r" x- |) }
void PWMTZIsr(void);
: a( a8 C7 Z2 T; g# e( p
6 J5 |. @+ R5 o$ h E* g; H3 {/ ? k
/****************************************************************************/
' P( b; p8 K# i" d# M6 d) ]- {9 B
/* */
g. j3 M+ Y8 U: N, u8 S2 Z3 ?
/* 主函数 */
/ r( C. n, a0 w$ m% F
/* */
: d S0 a. m% ~: j q& w* h
/****************************************************************************/
/ |* Q, R: z9 R \1 y
int main(void)
* }' ]. }* v y* X/ V0 y, ]
{
" ]; B/ j! j {" u" m- `' D. O
// 外设使能配置
+ b$ ^5 l7 n. ^
PSCInit();
. V" c( T' |$ ^. N
6 l x; n. z. Y _2 R& U1 L
// 初始化串口终端 使用串口2
4 G) f% _8 `- [5 y' n( x
UARTStdioInit();
* z$ k) G3 J, J* r6 W9 f
( i$ j: v% n% I1 b
// GPIO 管脚复用配置
: u* M$ a5 ], c) x3 y
GPIOBankPinMuxSet();
- ?% a# p0 Y4 X- i
: U( K0 [% A0 Z( q
// ARM 中断初始化
/ r: t4 W- X7 x( K! o+ _
InterruptInit();
$ k. F- ^6 t5 _/ [ m, l ~6 w
7 {7 P3 j' U+ E7 w) Z
// PWM 中断初始化
* R5 @/ n8 [" O# p# N$ N
PWMInterruptInit();
* [) d6 c1 E7 s1 K. d7 ~. a
( U D9 k, ^* X4 p2 p: E
unsigned char i;
0 `* ~3 w2 }! l7 j% P
unsigned int j;
0 {. G/ o8 y3 R, q9 s& \. m
+ q0 E9 W& L" l6 v" @3 J6 c
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
0 @2 |: S3 c% ^6 h9 e" \
UARTPuts("------------------------------------------------------------\r\n", -1);
( S' `& O2 g$ J1 B* \5 U" k1 p) u
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
( T5 x3 q4 T( R+ T) Q
// 产生波形
" v( p/ _5 R" S( U- _, K
PWM1ABasic(25000,50);
" N: Q$ d" ]- ?6 n7 y3 [
9 Z) q+ T+ F7 W: ^; m
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
/ Y/ D3 \! E% V$ R
UARTPuts("------------------------------------------------------------\r\n", -1);
6 g5 D1 C1 O+ E4 d8 E) Y
5 D) z( s. E3 y& R) h
9 Q; i- Y; ?" q H3 f
6 ~& D& U' x& N6 e2 L
UARTPuts("------------------------------------------------------------\r\n", -1);
, Q4 Z5 H @* ^8 }5 w
UARTPuts(" C6748 ECAP Test\r\n", -1);
0 a( _# w9 [+ ]9 q- z6 a& k1 o
// ECAP 捕获初始化
- Q% a! k- `! h, n
ECAPInit();
' G) V, g g" d( Z* B
UARTPuts("Initialize ECAP.......\r\n",-1);
( M1 w; c# k* f( s5 ?
for(i=0;i<5;i++)
7 D9 |5 u3 l" ?& r% ]; g
{
0 l% r4 r7 x0 R
for(j=0x00FFFFFF;j>0;j--); // 延时
& k* x2 L9 `: [! q
ECAPRead();
5 x# Z# J& j' d2 G) N* e+ O
}
# n' S; b" y/ h0 V1 t, l; _
UARTPuts("\r\n",-1);
$ @# J1 I* N q' O% s
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
0 N5 V1 D. u0 X U5 G Z# z3 _( N
UARTPuts("------------------------------------------------------------\r\n", -1);
1 R/ q+ r7 O. f, v9 U
) u: n& s7 Z" F5 d
// 主循环
% w- {$ D! l. @' |8 b4 Q
for(;;)
+ {3 i& m: y# Z
{
( U6 k' j, @1 Q
+ Y( C& |7 G" ~' [- Y/ n5 ^
}
# g; S$ i" Z! h g5 `+ r( s
}
: A; g ~& g2 k( e9 t, s- o$ q" v
) S3 X! U" t; o; Z$ r! f2 F6 B
/****************************************************************************/
, G3 \3 J' H( t: T4 Z% F r: u+ ^6 U
/* */
7 e. u# D) C8 U! C! H/ {
/* PSC 初始化 */
8 d) g/ ]4 E2 i
/* */
) Q8 w$ H1 o4 U9 ? I
/****************************************************************************/
7 g I( \ F2 {6 f- n' Y
void PSCInit(void)
5 j# [$ K7 M! {. W# Y
{
7 O& _! q# ?$ ^; s
// 使能 EHRPWM 和 ECAP 模块
* T8 F) Q4 l) A- f6 {& @" O
// 对相应外设模块的使能也可以在 BootLoader 中完成
; a5 e7 i* t2 i$ Z" j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& q& e; m# [+ F8 ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 M' Q2 Z; x: {
}
# {( i, f& O/ u+ `5 K
; L& s" G6 S5 ?5 \
/****************************************************************************/
0 D0 Y+ m/ s4 p) r
/* */
: |; \& E( e% r! L4 q9 j
/* GPIO 管脚复用配置 */
5 R& b3 i) m6 W
/* */
, J! M. I/ I: o; A; y l6 A$ Y
/****************************************************************************/
c2 a1 v0 ?( y$ ~
void GPIOBankPinMuxSet(void)
) N1 V, G" h4 W
{
7 u% T2 z" M/ L7 ~+ ?
EHRPWM1PinMuxSetup();
# _5 _! j2 B4 w) S8 ?0 p, o# d
9 |: o2 ?, T1 ?* J: L
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ Q6 h3 X2 Z$ U2 L
// 作为捕获功能时管脚方向为输入
! Z$ f2 f* l3 g
// 作为辅助脉宽调制时管脚方向为输出
6 x+ A) U' Q2 `; d5 Q; o! J0 x- T" f
// ECAP2 / APWM2
; i F f" O2 K9 f6 I- w
ECAPPinMuxSetup(2);
. Q5 C3 s+ e# N. R6 v0 x: w% b
3 [: M( r0 e0 p8 E5 \+ Q
// ECAP2 / APWM2方向设置为输入
8 b) w3 S* t: ~4 S1 v& T
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
6 W. n& u+ ?# j: X: J; y, z
}
. w: a% d/ B5 u( G
. R: M% y$ }* E- c' o
/****************************************************************************/
1 [* o5 J4 {/ y1 O4 F
/* */
1 x" b" O1 w$ t% P1 U$ f# _
/* PWM 输出波形 */
2 b5 e3 D- R- F1 a/ Z) x
/* */
; v; v' k/ k) g* Q
/****************************************************************************/
9 ]; j g! o+ \5 t; ]* I; P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
4 M4 R* M2 t4 Y' V
{
# m$ s7 I8 F/ p' ?% y
// 时间基准配置
+ h; `: \" E! J6 K# W e3 K4 \5 _
// 时钟配置
( e$ X3 W3 A; l* G$ j
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& Y, Q; s. R& M1 j( `, C
/ J& o& g3 R! h8 y( C5 v8 `
// 配置周期
( V4 `) i* Y( E, S( R
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' y1 b) [3 J: `& c% m0 X6 S' `
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- z: ]% }* [3 J2 b: z) p: e
/ e. \( V& }3 \) O2 G/ ^$ Y
// 禁用输入同步信号
% z! e' ^) R! o9 A7 h0 K% F
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
. z/ o1 W4 K4 i( s9 r. K0 ?
\9 s2 ~! j' c/ A+ T
// 禁用输出同步信号
7 f" b# z* A2 _' S1 y: z: B# U" a
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! X$ ` V) v/ D* Z# @& L
; l3 u) |$ H i# f
// 仿真(DEBUG)模式行为配置
6 c3 n! x* z9 v
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 V. K$ ?, {/ N' v
7 [9 X2 N1 N% c" K T/ J* X& O
// 配置计数比较器子模块
+ o; G$ }# D- b7 C" j$ }
// 加载比较器 A 值
' `( ~( r+ e* m& E
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 ^9 z5 t. r: z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, V$ a& ]7 c. y% E' p
, Q# |6 G! w r
// 加载比较器 B 值
% Y# D8 |. N0 W3 p$ u" C
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, _+ e9 r& M% w8 }2 H3 q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: W) k" K# S, P y8 C" s" S8 g
# C/ p y' p! G- R' R4 d7 o, n1 P
// 功能限定配置(输出引脚触发方式设定)
Y( g) R) `, A; l4 z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, u# r, a w6 F- `
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! t* x( F0 t" Q) f6 P& E o
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* G" |. z) `$ A) `! r4 |( Q
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 b& @0 y3 [2 w: E- [3 z, k
i* z, v3 G% m b# e8 ~
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
9 @9 X+ ^+ W0 B/ S- R( J
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) B5 Z' @4 V* N& o; {, m
* S7 k2 `' b+ _3 s6 h
// 禁用斩波子模块
: l+ b8 ^! q% O
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- s. w4 U H7 D# m
* I$ j8 J6 o4 _! E
// 禁用错误控制事件
9 A1 e, x- B! j; v8 h) _
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ t& h7 s+ W9 Y3 O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- V1 r2 o5 ?0 ?4 E; n9 g& W4 S
; j& y( F I7 t+ T
// 事件触发配置
9 x E2 A/ B, I' A
// 每三次事件发生产生中断
3 C% M/ f1 D% A K% q8 y! ^6 y+ Q) q
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
9 v( Z* S5 B4 l# K
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 V; D4 O) O/ O" i4 B3 |
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ C+ t& x/ Q# y8 z$ V
// 使能中断
8 C0 A4 D* P0 a9 v; F
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ N8 }# z0 D$ m2 u4 s
7 m8 Q: }. n$ b3 D8 Y) ]; l( I
// 禁用高精度子模块
" i2 [% v2 y" w. I
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! z m( P( g; h( r
: c5 q. j! c: D- |1 R1 X m5 h
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ ` K' P, g7 G4 f6 Q: \# B
}
* F1 ?6 N% E& m/ B
( z* d- V; S' X# a/ {5 s& @
void ChopperWaveform(void)
) x4 e% k! L2 _3 ~0 h
{
! f1 O; U7 H8 u4 i$ T& z
// 50% 占空比
7 v8 r) G# S' J2 @1 }
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
0 t" O" }: t/ Q7 z
// 4 分频
/ g! t: t5 z% D* x/ e; o
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* _9 e( Z G( s p3 f& R. V# y3 z
// 单个脉冲宽度
' x; o9 p V0 e8 w0 a) u: [
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
@4 \( ^! Y: B8 x3 |8 }
// 使能斩波子模块
) Q+ J+ Y5 o1 K# r ], @& p6 s
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
( y6 D% L2 Z- o7 f9 ?. c% f' F( p
}
2 U- x' F8 A! Q* s2 l/ V) ~
- k* u" r+ w/ x3 f
/****************************************************************************/
- i2 a5 S6 {) `" f! k7 J% \
/* */
5 v- C2 g" s* z7 B
/* PWM 中断初始化 */
; u6 v8 f1 H5 G$ t5 y& l" |+ w2 X/ h
/* */
/ y: {& X; f* ~' v- t4 E
/****************************************************************************/
8 y7 `1 z. `& E
void PWMInterruptInit(void)
. j+ F! ]! C$ y, U. {
{
. s4 X& ]! L; `4 o; h! m" v
// 注册中断服务函数
( n, b5 N0 p" G! a5 e
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
, j" w2 E: M5 L* K* H- p D' _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
+ ^ n' x" Z" J8 D7 r* r
( s1 r F. o; Q+ R5 V3 c0 m
// 映射中断
: p+ n4 O. a2 w
IntChannelSet(SYS_INT_EHRPWM1, 2);
! A$ p! ]7 u e9 T Q% n _- F
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 S: H; j H! h7 G8 N# _
* H, b: e$ p% B- P' A X. Q- u2 v' r% j
// 使能中断
( c8 l4 b, k! X* i% p
IntSystemEnable(SYS_INT_EHRPWM1);
. |; t& \) f2 w+ J" _9 t X$ S
IntSystemEnable(SYS_INT_EHRPWM1TZ);
7 ]6 x( j( X; [3 F1 I4 M$ h% m
}
" E0 o% a" t5 {7 g- @( |
: W4 `: L' F" w
/****************************************************************************/
& u; Z) M) g, H: h9 ?& A
/* */
: |& Q& ^+ `$ G, ^! N
/* ARM 中断初始化 */
( U$ g, Y# @7 a( G
/* */
1 j9 W0 G1 A7 ?" ?0 H
/****************************************************************************/
; e! e9 R! p+ w
void InterruptInit(void)
8 _2 o1 C; t: m! J, P: D0 I
{
# a, D. w( Z* Q& Z: |
// 初始化 ARM 中断控制器
/ k+ J- w, ^7 H2 [7 q4 m
IntAINTCInit();
" e3 F- h- Y! b; P. `2 F
E. j6 [, x3 B: y/ `" x2 w
// 使能 IRQ(CPSR)
4 @* g* @; _/ u% D$ L
IntMasterIRQEnable();
5 q, J& p- q; R& Z6 k/ x( Y; N
- d; ]+ |! `" |6 {% y4 U/ `
// 使能中断(AINTC GER)
d* F' y* {5 u/ j5 X
IntGlobalEnable();
# u) z8 ^+ w/ J% m# a# c
$ z/ L- ~$ A" }# }
// 使能中断(AINTC HIER)
) X3 G7 m e! r0 T+ P' ?) _7 q
IntIRQEnable();
: h) Y. @. R1 N. \3 ~/ A+ D) N" n
}
. N4 L$ o) @) D
9 b/ l4 l% s2 r: T: f
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
7 y5 `9 t- |5 H6 M3 e
/* */
; r$ N6 E8 [7 _6 {0 v$ `7 d h: u
/* 中断服务函数 */
4 |8 G+ b- z, F8 a/ a+ W! T
/* */
3 h4 Q" v, h! i* @$ v
/****************************************************************************/
0 T7 j, T/ }' f6 I
void PWMEventIsr(void)
0 s2 f( d1 [6 S7 h8 f0 B) r/ F; ` k
{
7 g+ T! `. B. Y3 Z* ~
IntSystemStatusClear(SYS_INT_EHRPWM1);
* B* g2 d1 s+ @" `/ v) V2 g: ]
1 w s- I C- ~& z0 D2 l
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- F; O( Y8 d& ]+ W. _( }
}
G8 x2 e/ B. s5 X4 d8 y0 y
, n+ f( n8 C* A, Q1 u, j
void PWMTZIsr(void)
" ^; f) W% M' l7 M. v
{
, }, h3 V. K' j2 u% k" c0 x8 @7 b3 l
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
2 G9 c: Q1 Y8 [: n
9 B7 W, @4 Y1 [# n# x/ W
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
: X* u# M+ R H; F+ ?, @! a1 x
}
$ b0 X: O( f- [5 e% R ^) R
7 Q4 l$ N1 ?( G1 Z- a1 ~. b) Y
/****************************************************************************/
% j8 _9 o- A4 Q) P* b- ^
/* */
" O# \- c& U3 L
/* 初始化捕获模块 */
, U* o6 w, i+ _3 F7 p& |
/* */
* ^& T1 k0 w. Z
/****************************************************************************/
4 Y, [3 |2 J' ~1 U6 B- F7 |
void ECAPInit(void)
; p. w. _ o4 ^& x5 ]2 O
{
% D9 f: R8 |0 } ^4 {) D7 Z
/*-----设置 ECCTL1-----*/
, k% E0 ^4 p8 b3 l
// 使能CAP寄存器装载
0 R7 s X. ^# w0 y
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
! p+ J O# T2 z! ~& w. o" @
// 设置预分频值.
; ?5 N# X# M$ a2 \0 s
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
* E( u* K/ c/ G7 F9 L$ |% n8 s% @
// 上升沿触发捕获事件
; L2 s! ^4 ^' ~% u
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" `" f+ I7 i; ?* k6 G( m1 Q7 z g
// 输入捕获后重新装载计数器值.
! J) }# b3 F- {
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 s0 s3 x# p1 v% d# a
; b4 a. ^5 {" J# g: i5 u+ o7 j
/*-----设置 ECCTL2-----*/
@. Y% N. O3 G7 F
// 连续模式
9 n: m# P+ i+ g* x" i; v( `1 ?
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
% X2 A$ Y, O) g- l) ]+ B/ w
// ECAP计数器TSCTR持续计数
8 H W4 K( ~9 z
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
) p% j8 S |" r" w
// 禁用同步输出和同步输入
@2 x0 ?" y Y
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
7 d6 l+ O) Y+ B
// 配置 ECAP 2 为 CAPTURE 模式
D% \( J. c+ s, K" |* ]
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
' `0 M O7 ^3 [* g, L H2 b0 z
3 L: a0 M5 O# O& k5 M" t
// 使能中断
! C2 x) h( D) ^* l' |& @
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ r$ q# {) L1 r4 _5 X
}
$ k8 z" d5 F# ?9 S+ `5 R
2 W& a$ y% }9 |6 n% T$ H
/****************************************************************************/
, S. m* P0 @/ p2 H) \* a7 l+ x
/* */
" A1 f% m9 F2 f( M+ l0 ~
/* 取得捕获结果 */
3 c. F6 m J7 B2 h4 W' j! S
/* */
" X# \; x% ]) k# `' C' _2 k0 j
/****************************************************************************/
/ [* e8 I% T- Q7 {( w
unsigned int ECAPRead(void)
$ c, h7 d5 ]3 i) \5 R
{
. I; ~2 y6 `4 k" [8 Z% y3 {! `
unsigned int capvalue;
6 n) n5 d( A, N
unsigned long frequency;
$ i& |! a# Y5 `! p, f' J5 Y
9 [0 A5 Z3 w# i+ K/ B' N ]# a
// Event1 中断标志
2 w' c& |! ?( W/ l! t5 L' J
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
3 H, C9 A, G3 ~7 X
{
9 F& h! |+ E c$ c
// 取得捕获计数
) V, z1 d9 w. B/ f" m) r) M3 B
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
; W7 `& o7 m m% \% v3 l
capvalue = ECAPResult.cap1;
0 f1 X1 n3 M- d5 r6 ?5 j
* x- {4 U8 e+ Z8 z, U' [7 x$ r6 q
// CAPTRUE 模块 228M 时钟主频
' j: |) g4 c" |7 h7 N& C
frequency = 228000000/capvalue;
, r$ w$ V, A( g+ q3 @0 ]" l
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 m1 j6 L, G( I3 |5 ]9 ^7 f
( ? ?- E$ [ q' @) z* |
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 x" H; O0 y p" s) ^5 v
// IntEventClear(SYS_INT_ECAP2);
1 t4 m$ p; c% P( g/ N: k) l1 [
}
5 K1 D1 v1 F, c0 z) E$ b
return frequency;
& }- W2 l( ^/ H9 ^: Y
}
% p$ K. X0 F2 X9 r/ P
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
# d8 E: C" z: f
[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