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