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