嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 {1 f& Z! }3 B( g8 W2 @
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
$ W( P3 l9 o. |5 T
/* */
% v' I* C5 t( y" ]8 u; C- q5 l9 J
/* 宏定义 */
* Z9 i% {6 b$ z8 k* c4 S
/* */
, M( I& B, _- ~- r
/****************************************************************************/
# ?+ @/ w+ `7 W' ~6 T
// 软件断点
$ ]: J# c+ z6 U0 B9 H/ |
#define SW_BREAKPOINT asm(" SWBP 0 ");
3 |0 r3 u7 Y$ F! ?# ~) Y: D
) l& l/ j: c4 D! D3 C7 L+ z
// 时钟分频
& q) G, ^7 B- [) L% g# P. [
#define CLOCK_DIV_VAL 228
8 `" e& M. i7 ^" s2 l% i1 W
3 @5 k+ O: p, w6 Z5 a
/****************************************************************************/
1 Y& o% s, I( V
/* */
. I! k$ D' T4 M) s4 m( }' C2 b4 P
/* 全局变量 */
# ?, e7 P6 K7 Q6 g
/* */
7 o8 I; T4 V! ?5 x1 @8 ~7 ?1 T
/****************************************************************************/
* M s& S( Z7 c6 w" b' ^
ECAPCONTEXT ECAPResult;
+ z9 I; j' [% O: l9 P0 L
) r* _7 s1 {8 S# r& V) ?
/****************************************************************************/
9 A5 W1 B! ?/ Y6 u
/* */
2 o# O, j' r$ h
/* 函数声明 */
! }2 j% {- Z; N, P# u/ N
/* */
/ h. x% a+ }: u* K; ]1 }6 Q
/****************************************************************************/
9 K7 q- Q1 t% f3 c
// 外设使能配置
2 ~, [% n) q$ x' |$ Q
void PSCInit(void);
) Z" Y, Q6 k0 C+ O0 K6 y
5 x1 J& M( s9 c( e: L" o: g, e
// GPIO 管脚复用配置
. r& B: H, @. q) |% D
void GPIOBankPinMuxSet();
9 x# `2 x- x7 i. i* V) p9 R+ U
, R0 s. x7 z+ L$ u& T
// 产生波形
2 O# X5 m, x1 T; _& r. A. B/ L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 R* I3 n: J |
void ChopperWaveform(void);
. D* s6 E! d) W7 c3 A v! {9 w0 D
. C6 a1 K/ v) F; t# p+ N M
// ECAP初始化和读函数
. L1 w7 f5 D: } z. ]) p
void ECAPInit(void);
! X8 r0 Y" w0 D) @ `2 d
unsigned int ECAPRead(void);
8 K, r4 A9 Z9 g8 H! x1 Z8 p
! Z. S" B8 Y4 \ z' J4 t
//ARM 中断初始化
3 S+ t% ^$ P+ F/ `# s5 _* W' I2 `
void InterruptInit(void);
( f( U g8 A; H8 j8 S
( X) e+ o+ O8 x7 Z. \
// PWM 中断初始化
& U4 ^2 _2 W$ R
void PWMInterruptInit(void);
8 I- }6 g0 }; T: x- }* m
// 中断服务函数
6 c0 M# _: e/ v2 k9 T6 ~* M$ |
// PWM 事件
8 i ?; Y2 h- V; F0 F4 j9 V9 @
void PWMEventIsr(void);
: V( ?) }) N5 \6 G& F8 D
// PWM 错误控制事件
4 P3 K1 t* K+ W3 D$ M. l4 }/ R
void PWMTZIsr(void);
% p( \+ \8 e0 L* `3 m0 k- p
& K1 i: @' ]+ n4 Y
/****************************************************************************/
' B5 K. w. `3 |% t
/* */
, Y! _ }5 L U2 f' Z# P3 |; }
/* 主函数 */
" B2 s' ?0 K9 |' R$ V5 t3 l9 d
/* */
, z( a) Y5 Q) O6 v6 T( N& t
/****************************************************************************/
7 Y1 B" q0 g/ M
int main(void)
: \. _* }) I( J$ m9 d
{
7 R% }$ n1 k: h
// 外设使能配置
) H% B8 t/ K* X: H8 y. R
PSCInit();
7 C4 A: A3 X! A' F
+ j! s) O& B; C
// 初始化串口终端 使用串口2
" n! w* ]4 P. c5 N
UARTStdioInit();
) [8 y/ G/ Y, l' w2 m# J
+ y6 r6 X j7 C
// GPIO 管脚复用配置
4 D- V) ]% Z5 l, e, N
GPIOBankPinMuxSet();
. ]) I1 ]- F! i$ z6 y
: M8 F# e* T- y* s+ C* |/ n
// ARM 中断初始化
3 e$ _6 a) z9 e1 q W$ s
InterruptInit();
% E2 \" X5 M A" L
! l$ y* U$ Z3 {0 M: T: [/ A1 J* G
// PWM 中断初始化
' C1 T) e* Z8 x
PWMInterruptInit();
" C! O) b) p% p6 b6 h8 y: k$ Z
3 \" F3 b# c% H" g5 H6 h
unsigned char i;
: p1 ^0 d$ h, I6 |2 v
unsigned int j;
j: e2 u& T7 [2 i& k
. C6 K2 p+ f: S1 j! O( K' W' h
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ n* i1 U% n3 S0 ]
UARTPuts("------------------------------------------------------------\r\n", -1);
( M% O9 { |1 k4 o" g0 H; a$ i+ i
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
3 g5 O: D3 e5 Y4 ^5 c
// 产生波形
- L6 M, }% l( ?' T5 {6 ^
PWM1ABasic(25000,50);
' w% X" D) d& |1 n
7 Y; T5 A3 x+ [* Z- {: ]2 Z u
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
) l/ [& |- n! ~$ m
UARTPuts("------------------------------------------------------------\r\n", -1);
6 ~) n0 F) z7 L. g* S% `# \: p; e) r
5 M4 K. h& m1 `5 \
3 C9 J9 S5 b* Y8 b9 H# M- w
- I" P4 s0 G, L9 y- a- ?
UARTPuts("------------------------------------------------------------\r\n", -1);
6 n# P+ n" }1 Q0 F! G0 U' p
UARTPuts(" C6748 ECAP Test\r\n", -1);
: X3 j: S/ r, `3 z. p
// ECAP 捕获初始化
. c5 `! Z4 N; N. N" u. p2 i N
ECAPInit();
/ |" L' M& Y. a/ u" f9 f# q
UARTPuts("Initialize ECAP.......\r\n",-1);
- ?" J! p1 L$ S; |
for(i=0;i<5;i++)
" E4 U' l& ~3 h/ G% Q0 J
{
{1 ^4 E" i: y$ A8 b! e
for(j=0x00FFFFFF;j>0;j--); // 延时
( a' P- ^+ T; d9 L- H) t) _- R
ECAPRead();
4 E5 L/ Q. _% z$ V/ ^/ ?
}
0 V* C* L% b2 q7 A* n8 Z8 }
UARTPuts("\r\n",-1);
& g. O% {5 i1 }( J9 {" N
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! x5 |4 z0 z9 R, f7 ~2 p7 J( v) c! Z
UARTPuts("------------------------------------------------------------\r\n", -1);
4 d- l, H ~& H
8 M5 j) Y* d$ k# o
// 主循环
6 _1 z0 {; {, N' Y
for(;;)
: g. \& m) t2 s
{
, N) ~ Y% t4 @
* g z% u3 i# G. m0 N/ T, w
}
3 U3 s9 }& d* H
}
+ Z3 z; {& a0 E$ f+ s) U
0 h6 ]% w. @0 i6 W, `* q
/****************************************************************************/
4 F e) v% p( z! y R8 R' j: i
/* */
8 @) e: g' G2 N w0 p8 y' `
/* PSC 初始化 */
" L2 X! I* L' S, S) J+ t
/* */
# o+ c( b1 G. z9 N S" _
/****************************************************************************/
3 r5 G6 b0 W* _' E# {- U
void PSCInit(void)
. B. D- b3 z( q( _
{
' r3 W2 D9 t5 w, [6 h0 x9 `
// 使能 EHRPWM 和 ECAP 模块
( W+ I& e u% c( S4 N
// 对相应外设模块的使能也可以在 BootLoader 中完成
; C! }* Z) U6 }% }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: o+ n$ f) p; z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% g/ j7 U7 q5 m! F
}
# n- I4 o9 L: t* p' z/ O/ I
; s( J( G- T' l$ j+ I7 y" ^
/****************************************************************************/
% F- N& }( ~- O
/* */
- ?0 b! O6 @) j5 v* i
/* GPIO 管脚复用配置 */
- L u7 B$ f$ X5 t" e
/* */
6 e& j [! p% x& E( \& i# _
/****************************************************************************/
2 E% E9 d& ~( t/ o# O' [, F
void GPIOBankPinMuxSet(void)
+ [' M, i7 _: P, K! c( c
{
" O& @7 M2 n8 o" t
EHRPWM1PinMuxSetup();
, `+ x$ p J0 B7 z: q
& R( z( m; O4 X
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; X$ v$ `; }* ]! F* ^; S
// 作为捕获功能时管脚方向为输入
% J3 i2 g- S% _* N& `8 ^
// 作为辅助脉宽调制时管脚方向为输出
( Y; L' n8 N' c+ K* f- o
// ECAP2 / APWM2
, R- _4 t" C/ v' h- C
ECAPPinMuxSetup(2);
b k% v4 o" ~# v8 |/ w; M
/ U4 J2 y, ~) j1 L5 r, C1 h& O7 x
// ECAP2 / APWM2方向设置为输入
0 ^* ]2 S" l6 X# t. `3 B
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
2 s+ H' k9 H+ F/ b$ G- ~1 w
}
: {) G1 F8 E4 y* i
$ ?8 B4 |! S1 J' i2 {7 @
/****************************************************************************/
6 C/ @. a0 A' ]. S
/* */
; N, r6 d; |8 D" |- k( E5 v
/* PWM 输出波形 */
) c5 k/ t# Q8 a) @) w
/* */
( U! A1 i h2 u1 J1 @3 w) m( R
/****************************************************************************/
5 U) X1 }2 n' P" n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
L. [3 d2 o1 V- w' v R
{
% X9 U# e: g; U# G# o) P1 d8 e* D
// 时间基准配置
2 B) L$ z5 L9 q1 m
// 时钟配置
* S5 z! G ~/ `8 w1 s1 B
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: k* a- C, I( i) l1 u- g) z! ^/ z
- w0 r4 g$ B' Y& l. J! a2 r6 }
// 配置周期
: ^' f3 C o$ w K( Q, _, ~
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: a, H3 o* Z' ]2 @
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
x; m p; u# h+ {/ f/ o* V
% X/ Z, _+ f: ^9 }0 T) s7 V
// 禁用输入同步信号
3 k/ ?- }+ C) A7 I
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
) |, F$ Y) v# n+ ?
) G& f/ b% N! {; ]6 d) l
// 禁用输出同步信号
' _3 U% s0 C* s& L. e* F3 t
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 E) ?7 Q+ Z- t
0 E9 { J' Z1 u F: P$ m
// 仿真(DEBUG)模式行为配置
" g$ \# u# b2 _* p0 X
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
3 O, h9 j& `2 h$ N6 p' G [
; F4 a5 d) z# X( h
// 配置计数比较器子模块
x8 t3 \% K/ R5 I
// 加载比较器 A 值
" h5 @3 |0 u1 z, N5 y6 b; e
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
! q6 ]; k9 S2 r6 P$ o5 W* ~
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ L Z. k( d3 ]! e" V
- j s$ Y2 y$ u$ y$ c/ L- T0 u' m
// 加载比较器 B 值
6 r7 a) w, s' k
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
* X6 f, O% f; q* q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 p3 r& N$ `& G2 u3 e
4 w+ d$ r+ p W5 W
// 功能限定配置(输出引脚触发方式设定)
9 D$ ]" e3 v) g$ X
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 L9 S5 a. \2 q( Q/ M9 l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; h( r& m6 ^9 `
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! j) E$ d4 ]3 c, c! z, J3 O' ]
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ F9 }1 L+ g3 f* w" R. e
: o# y. G F0 O4 [4 T: i. Z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
Z. i) L' r( T. Q! d' w
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. g( L: O# @+ D1 A3 O
i1 @3 M; D. ~2 c7 q' Y
// 禁用斩波子模块
' V2 A: u F+ E7 U6 F7 N, ~
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
( d. S7 \, J# \' d# X
; R2 B* L. C' Y
// 禁用错误控制事件
$ k) M5 s c7 ^, F @
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
+ B" [7 `3 g/ n- f2 q8 l/ G
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- |6 V9 r0 b& l% q; B
+ _+ T" A5 y- p+ B: ?1 g/ P
// 事件触发配置
; Z9 @( y, f& G! e
// 每三次事件发生产生中断
5 d# L+ e6 b% s( ?
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- W! o/ Q: j6 B# r% M) o* H
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
+ Z$ M7 L* t @& ]3 r/ S$ x: e
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. C$ O+ _1 r% ?( ~ Q# h
// 使能中断
1 Y* l/ X& R' Z: M; N
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
: ?/ a- t; X9 A
7 J6 J4 `0 ?6 c$ _6 O
// 禁用高精度子模块
6 p$ `, |7 ^" V, B8 \; r! n
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* f# u G: P% s
9 Q0 ?' W$ i1 u+ _
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 i; _ x u3 g1 _, l
}
6 z5 j4 h) K/ a1 D. o
/ ^ j8 s @: S2 H
void ChopperWaveform(void)
% l; y9 S( p; Y- F9 D3 g
{
7 P5 w1 p# V7 L( u7 @% x
// 50% 占空比
1 m! G& P; F$ e+ O6 `, Y) n6 ^
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ v$ g, `6 B& O, l4 W1 A0 k
// 4 分频
' T: Z: i0 C: |; D6 T0 p, X
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; }5 r& g a' o* I
// 单个脉冲宽度
T. |; E9 M# a5 q: ]
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 }9 F7 {3 A2 A% h# r) K, x
// 使能斩波子模块
: n2 ~, k7 L$ c3 x) r! h1 V8 P
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
2 R" s1 a) ]6 O9 [
}
9 d! W/ L1 |( V" |$ `6 r( G G& {
9 Z! r( C5 G* R) R# Q: e1 ]
/****************************************************************************/
, w0 X; A9 B5 p9 @, O! L
/* */
6 J a6 k5 @1 N
/* PWM 中断初始化 */
) V( g: ]! v) L/ G4 U0 C
/* */
) s; F' S& ?9 r7 P0 [
/****************************************************************************/
2 H6 R H# n2 P
void PWMInterruptInit(void)
! o. F2 R4 K; n
{
1 @' J7 E! i' t
// 注册中断服务函数
+ } C% O) W% {) V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( V6 p$ K4 y9 X ]& [) |$ q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; d/ i! W9 U: h+ L% G1 c. D
# v1 u- b0 `/ H' A+ k+ I6 R' O# }
// 映射中断
7 F& B; T, f( c* D3 A
IntChannelSet(SYS_INT_EHRPWM1, 2);
" v3 _8 U, e0 @; d
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* [( T! J; a' Y* c! A
6 x; z6 ~+ [) d7 \
// 使能中断
2 e F, z2 b8 O/ U D
IntSystemEnable(SYS_INT_EHRPWM1);
( Y$ T6 ?/ O+ {; T2 ^7 S2 ]
IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 e. y$ W: h2 O5 Z; r& ]
}
/ C8 p) Q8 U+ [
7 l ^; a9 K# M; Z; w; b0 h9 @' [- M
/****************************************************************************/
; H8 b) p1 [! k; Y
/* */
3 O9 ~. v7 {9 \: B8 z& f
/* ARM 中断初始化 */
, y+ Q0 J8 p* J
/* */
& t r* y/ x$ l2 M% r J
/****************************************************************************/
$ o8 {1 q! f4 c8 z1 b% a
void InterruptInit(void)
2 Q0 M& K8 d; c1 ?
{
J s4 V+ D: K. N7 U1 |" E
// 初始化 ARM 中断控制器
. W) F* |# \5 K: Q
IntAINTCInit();
! P* K D8 c- @5 t9 ~) J; a
3 s% ]. o$ A8 [: ^6 k
// 使能 IRQ(CPSR)
; u; E# r! P! Q# Q" v0 A. U# u
IntMasterIRQEnable();
+ n# [" A: Q1 S4 J0 W5 z- P$ [
0 P6 d& H( A8 O. g# b
// 使能中断(AINTC GER)
9 U' ]8 `. k# H# |3 y) N |
IntGlobalEnable();
6 K3 z! i* l; o
" v% Z0 E) a; r7 b) |; n# b9 ?
// 使能中断(AINTC HIER)
8 n: W9 v; J1 P; s$ ^2 U
IntIRQEnable();
# S6 ?1 }+ e* ]+ }. y7 H
}
) l2 I- o4 X7 i+ G* \. ]
9 \, {& |4 @- s& s* \" U
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" \$ I/ t1 _% I9 U
/* */
% {# @3 g7 `+ J- W4 q
/* 中断服务函数 */
( K5 Y0 m" l J: t& |! z
/* */
1 O" R" ?/ ?5 C& r/ E! K4 f. C
/****************************************************************************/
1 T! l7 ^$ K4 y& Y+ Y* s+ b
void PWMEventIsr(void)
9 g! b; {3 W/ a$ _( P, }. j
{
' F0 B& L8 v9 u! I
IntSystemStatusClear(SYS_INT_EHRPWM1);
( z( a; y3 A9 c4 g' O! P
2 G) e t( b* i: G |! l" a- G8 g
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' }) E$ H" ~* Z9 `4 K
}
5 G9 F9 P$ f+ p& z4 t) f
5 K4 D4 C- U+ x/ L/ ~/ B$ g
void PWMTZIsr(void)
$ ?5 ]; T" E' F
{
; {# m- K6 s8 r) m
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 X# U' C; B$ w4 h& c; L
! B, ~: B4 \1 V5 T
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
( K6 B& ]5 z n8 @# B
}
9 a2 i# m* T4 F0 k% c
3 C! r+ e7 n- J' M8 H; {
/****************************************************************************/
t- a; _& F8 F0 c" X( s
/* */
1 U7 `5 Q4 W4 S _6 u3 ?
/* 初始化捕获模块 */
* z8 l. ]: j! C
/* */
# A. R) d9 y0 E _ r3 v
/****************************************************************************/
% ^* Q; }% O, g) l; m9 \
void ECAPInit(void)
" u3 a3 a7 ?. O& z: M7 P+ L- |
{
5 C% O) q! z, B9 I. k3 H2 [$ }0 Q
/*-----设置 ECCTL1-----*/
& e: p8 ]4 m, D9 Z
// 使能CAP寄存器装载
* S) m/ T8 O. r. P$ Q
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: J+ c* I! Z# b: h
// 设置预分频值.
: F" E8 q. H6 J0 B% G5 E3 K
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% p# _+ K; V7 Z; k& W: V
// 上升沿触发捕获事件
% K* j( v& ?; C; v. z: n
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 `; c9 M' ]+ w
// 输入捕获后重新装载计数器值.
" q' L2 \# k( c( ^ K2 p
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
' P' d2 j3 e8 H M" O
9 o) D1 n2 L/ |/ U' ]
/*-----设置 ECCTL2-----*/
9 G7 r/ }, f. \& C S
// 连续模式
/ i5 t* f! C0 B" O" U& o
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* o4 x1 U( T- K" n
// ECAP计数器TSCTR持续计数
4 B; |1 A, o) T9 ]$ l
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
1 v8 w3 B! O& D
// 禁用同步输出和同步输入
4 \! ?0 ?/ n2 w0 ~
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
; U: Z# f8 n9 O3 D
// 配置 ECAP 2 为 CAPTURE 模式
2 S+ J9 e' P( e( B
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 T. v9 d4 O0 g9 X# z& _
6 T5 O8 F$ `5 W H* |+ {1 R0 F
// 使能中断
W2 {2 v) f/ h4 I2 w4 `
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
& g A8 o$ D5 c& P5 Q) |8 X' ?" S
}
4 e" Q% S" ^! M1 m( y
3 g1 h9 [: |# I2 R L& ], I5 J5 f& m5 p
/****************************************************************************/
* L6 j4 _% C) p! O
/* */
' X; p( L8 Q# M5 N. {6 b
/* 取得捕获结果 */
6 d. u! ]- x, ^
/* */
2 I5 a) ~/ t- o3 z" u' j3 m: Z" a) N
/****************************************************************************/
& A _5 k$ e4 _5 e
unsigned int ECAPRead(void)
) N9 y" z0 \: q* Q
{
3 E4 X! q; N; `7 w+ T' _, E
unsigned int capvalue;
: ?, D# q. p* Y% O5 B H+ n+ t0 t
unsigned long frequency;
" V' z4 v6 O2 \1 M$ I L; e
k. N* V8 G4 r1 L9 }2 }
// Event1 中断标志
% P3 ^9 E* s1 k8 R" m
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. z0 a% K# w' ^9 V, b: ?
{
2 U! x% \! ~% r, A
// 取得捕获计数
$ _0 N4 ?1 I, c* Z; C& w
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 w. P$ y7 o' g3 i/ v6 ]' S8 H: p
capvalue = ECAPResult.cap1;
3 h& Z6 r, P6 r6 j
! O1 X+ v* _' w N& W* x. }
// CAPTRUE 模块 228M 时钟主频
" ~& g! _# N' `& t' f- H+ D7 X
frequency = 228000000/capvalue;
7 l. f0 O6 {5 s* V) M) O
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
4 S& ]. _2 [- A3 @' n
; b: E& \8 T4 \. e% p" u
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) A% g" K( Z& j. T# E
// IntEventClear(SYS_INT_ECAP2);
2 w1 { h3 Y/ f2 X5 z N4 r6 I* \
}
3 \& @0 H! F! J7 L& _( z
return frequency;
6 Q# k. Y# h7 M
}
, _ W d, p: b: A1 ]
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( ~2 y e+ m; c+ I- k4 q1 [9 S
[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