嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
8 o3 s8 k8 ]: e$ ]
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
* a* _8 V( ^5 H, E) K
/* */
0 v6 f* I' y- P: Q. U3 h
/* 宏定义 */
5 l W- [2 Q' l
/* */
P. J6 U& y, Z2 c/ o( K
/****************************************************************************/
+ q$ @; Q4 ]% k D& L
// 软件断点
2 i% P8 w b9 I" o9 k) H4 Z4 u4 h
#define SW_BREAKPOINT asm(" SWBP 0 ");
* M) B# k4 R3 f
5 G, {0 I* |# \$ j: b
// 时钟分频
3 `! x# k/ Z3 O
#define CLOCK_DIV_VAL 228
- [& l+ L1 w3 |
7 M7 Q/ h l' R) E* H3 r+ j
/****************************************************************************/
$ ~) t0 {8 W' i
/* */
& O! ?0 R: \0 o g8 `
/* 全局变量 */
( Y# P# F1 P6 z- s! P" t
/* */
4 J" M: s+ [- W+ ] [
/****************************************************************************/
, P5 q# s1 f9 Y# z
ECAPCONTEXT ECAPResult;
& v- A% e# ? Y( A
4 L* m/ K1 Q: X D
/****************************************************************************/
8 \+ r: ?% M, J4 m2 ~$ B* ]7 o( t
/* */
# w( l K/ i8 D% e/ U
/* 函数声明 */
9 O. |' _ u" B. ^6 \& @! B
/* */
& I7 J" J) e' u4 z6 w! I. U% `
/****************************************************************************/
4 E+ ]$ S s9 |' V4 {
// 外设使能配置
8 ?9 ?$ [; V" A; p# y0 d$ p
void PSCInit(void);
) n3 g% S+ g# t: ?# p
9 ]0 R9 t3 x* K" z# E2 q5 H) l' {
// GPIO 管脚复用配置
4 K' {6 Q- F& \! G% Q( B" O
void GPIOBankPinMuxSet();
) l- c8 m: n8 F0 u4 N
5 m, ~- C$ t# V. G- Q5 F# i
// 产生波形
& X) ^5 e8 S* ~; N& [2 z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 z# V3 I5 D. c3 z k
void ChopperWaveform(void);
: q/ E* X1 }" `- P# c
6 o% O; F! r3 b
// ECAP初始化和读函数
" X& J4 W' u1 a. E3 `2 d3 a
void ECAPInit(void);
/ W' c5 r9 A+ v: M
unsigned int ECAPRead(void);
" \2 X8 ]8 V+ j0 Q- f
' p! T& g6 W2 i6 \
//ARM 中断初始化
$ o5 v1 x- I% n4 n& v7 B, M
void InterruptInit(void);
# `) x: t9 f5 L
/ p x- }3 @3 w. M7 g K; R$ ~7 M
// PWM 中断初始化
4 B6 l. Y0 X8 T# k$ ?
void PWMInterruptInit(void);
2 m3 R# m5 l: D* c4 `
// 中断服务函数
# _0 A$ m2 M: X( D
// PWM 事件
7 {: o+ Y* Q6 V9 I8 c& D4 I9 v
void PWMEventIsr(void);
6 t3 k% C8 R: s$ b0 N) j+ H Z% B
// PWM 错误控制事件
3 E0 d- f' K) h2 r
void PWMTZIsr(void);
# i0 D* B+ p- M- Z
. c; a \- I) D1 n7 W$ j
/****************************************************************************/
/ n. [+ _& {4 e/ v
/* */
/ l& r" i; e1 u% y `) S
/* 主函数 */
2 d, Z9 V6 m4 W9 \/ q: S
/* */
- h! q. _: `! h: l4 m6 d( `9 ]
/****************************************************************************/
0 a/ l! [1 G# l- U$ L# K
int main(void)
: o0 w4 g( t( [* y1 t+ E
{
( B# o; l1 v r$ k
// 外设使能配置
+ z( ?/ e* n3 k6 o0 w/ e
PSCInit();
$ Y) d( Q A& P4 E- F/ x- ]6 B
) p, \# |, R3 j' G8 Q3 O
// 初始化串口终端 使用串口2
9 }5 U3 o$ w9 `( x
UARTStdioInit();
4 E% _* `1 a2 X' Y+ ~
: O/ |$ S6 ]/ g
// GPIO 管脚复用配置
1 N0 f0 Z& a$ _# M4 ]: T8 |- i
GPIOBankPinMuxSet();
2 i' t+ [6 N/ p) R3 u. B
5 I$ D) c$ a+ S7 o
// ARM 中断初始化
) X' U0 R, k& Y( t w
InterruptInit();
4 r1 e: o: t; H
, A6 D- ]- O* [+ m2 h! @
// PWM 中断初始化
9 W# }: t1 d+ P# ^
PWMInterruptInit();
. D1 L6 ?. @4 y+ o
+ o. T5 F3 v: \
unsigned char i;
3 H) d9 ~! R( f0 H0 ?& m- X
unsigned int j;
. Q/ R" p, p" {8 p
4 U% c, T% |) i: A
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
- a% i2 C! }( n7 o: f
UARTPuts("------------------------------------------------------------\r\n", -1);
& y! X! u9 d4 N: Z! T6 \, f
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! [! ]& L) ]; g
// 产生波形
& O) T: s4 G/ q) S( b: _% q
PWM1ABasic(25000,50);
8 T: ?8 H! G, r; W. Y4 S
& h. U* N# H0 d- s# O! d; O
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
+ q1 B0 D' H- h& b; c3 u8 X8 e
UARTPuts("------------------------------------------------------------\r\n", -1);
5 s0 x \8 V+ A5 w6 q7 W O6 n
# @* H6 D' O9 e' s
/ x3 E* g: J z- R
( O4 R0 g5 n; W
UARTPuts("------------------------------------------------------------\r\n", -1);
7 F4 O' g& c5 q7 X+ ~% k! L
UARTPuts(" C6748 ECAP Test\r\n", -1);
' p: u `$ X, A |1 d& t* A: m
// ECAP 捕获初始化
5 w- n0 b9 l* Z0 F% [, x' c6 G
ECAPInit();
# `# k* u& y) {. L |
UARTPuts("Initialize ECAP.......\r\n",-1);
# v" w7 n9 ?% n) J3 W$ V0 X
for(i=0;i<5;i++)
+ l4 h7 Z. ?+ f) A; {
{
. B7 @( J c( V- L% e' ^
for(j=0x00FFFFFF;j>0;j--); // 延时
% @9 o& d# b5 Y+ i2 {1 U& p
ECAPRead();
, Z# `6 d4 }- L' R: H7 C
}
: z: q0 g9 n' ~1 b4 a6 Q' |
UARTPuts("\r\n",-1);
% l4 X5 D: j( y; A
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
2 i# X: g9 c2 ~; F: w
UARTPuts("------------------------------------------------------------\r\n", -1);
9 Z& O" N) S/ r. T* G8 g3 E) B
4 Y8 h/ b% `: p: f# U
// 主循环
0 ]) | e9 b2 g- e* Z8 Q
for(;;)
% {+ h; v) ^: o2 @: r
{
0 D$ {( u- Y0 n d, n
$ Y* i& V/ x. @' _- I m/ C% i! ~; m# p. p
}
# ~ ~2 v$ i/ D
}
: s' D+ G% z m
1 ?+ c3 s- F" q6 |/ g
/****************************************************************************/
4 Y! b- ~8 U8 s
/* */
& w! c+ P- m" Y" r$ N
/* PSC 初始化 */
2 [7 R/ K) q/ `! y
/* */
/ J0 `; L1 t1 C( A9 M; k/ ?9 A
/****************************************************************************/
+ c$ m/ P* n) b" c4 n" }; S
void PSCInit(void)
) ?: j* {! R5 j$ X2 {# K
{
- Z" v# B( u. G. m
// 使能 EHRPWM 和 ECAP 模块
4 X0 R" @6 ]" S* L+ |
// 对相应外设模块的使能也可以在 BootLoader 中完成
# Q' N& k+ Q6 q1 D0 B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 ?7 v6 \4 H! v6 E6 B: ^; d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. ?/ p2 Q( c* l H0 p
}
) I" Y8 x" P' N% M( o) T
% K( k u/ ~& Y2 H
/****************************************************************************/
# a& D% D1 R. n- ^3 Y2 @( g B
/* */
8 V6 o( h1 @/ B: G% p- S
/* GPIO 管脚复用配置 */
$ j- u5 w2 [: K1 y+ J) m' [* g
/* */
7 q' B U1 m" ]/ i0 F: q
/****************************************************************************/
$ J* r+ w' n: `! p% z9 d* Q L7 w. X
void GPIOBankPinMuxSet(void)
; ~9 V6 A5 ]' K) X
{
8 i& T& k! x1 I9 O' Q( L
EHRPWM1PinMuxSetup();
$ C. _0 M& i7 N
$ @; [! R; ? o
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ F3 M: i! C/ ]5 b+ Z, y
// 作为捕获功能时管脚方向为输入
0 b# P3 c% D' U/ E4 ^- _* l
// 作为辅助脉宽调制时管脚方向为输出
% T3 _. N1 o& ~# s# q
// ECAP2 / APWM2
, y( {+ {; o9 v7 u; J$ L) \' k& o
ECAPPinMuxSetup(2);
2 m \ s8 D$ p1 C6 u/ B
. S) Q" X% ]% @" h) b
// ECAP2 / APWM2方向设置为输入
' r% G% D2 A# ?* S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
4 \! s% _! L# N6 ?# R+ R7 k" g6 u6 `
}
1 s9 X" g" b2 y F* o( h1 W
+ x; g! g9 r6 ^! I# _0 J
/****************************************************************************/
& c% v* M. b J6 W
/* */
k. B' g; f5 j: R7 \ p# _
/* PWM 输出波形 */
X: e0 ^, e5 U4 e
/* */
/ }( h9 ^0 t4 n* x! f: Z! c
/****************************************************************************/
0 c8 t) m9 c& r$ a: j
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 ]( c' ]9 J: ~+ @5 V
{
: d- w" x, X2 d- \1 j
// 时间基准配置
: A7 k9 n6 j! u5 R
// 时钟配置
9 {) W2 j/ V2 s P% n5 \/ D
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( U, |+ K; d* Q5 D
5 G% o( _6 S1 t/ i$ y
// 配置周期
+ U; a7 k! ?+ H; s9 m1 G" @& S
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& f* t8 S; i9 A5 ^& P) b
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ A+ H% J ?0 i5 l @- K
8 Q7 I( V9 ]! [" W9 g8 N# \# B
// 禁用输入同步信号
8 H* d$ ~7 ]( z3 Y. Q. m9 K" E: ~# V
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& [3 H- p9 E n$ L0 F
' C# T/ H) D- s$ H7 z7 P x
// 禁用输出同步信号
; ~+ j) d6 e4 c2 i0 ]% u9 u- n+ c4 z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 X$ n3 R- Y0 n% K8 R6 z# {& N
4 c4 Q' F$ [$ ?- V
// 仿真(DEBUG)模式行为配置
8 J2 S4 ~, p- E _1 \& N
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( l1 i2 N6 M3 L/ w
" B8 y! ?2 f O$ G
// 配置计数比较器子模块
8 X+ I5 ?: k4 P; Q3 _3 p
// 加载比较器 A 值
. T7 p, _+ Z: n% }; t
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" z e( s/ U2 O
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 B/ J( B& Y p: a D% ?
2 }9 ]7 F# D/ x) @( `* C. y; J
// 加载比较器 B 值
" [- r; U6 H4 Z f( Z. D
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 I; ~" A( v/ R7 \9 R+ S# i5 T! e
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, D( P& c5 G* p- n* i
2 B" t. I# Y. D% i
// 功能限定配置(输出引脚触发方式设定)
3 X8 a, v6 J; H1 w. G! C. x
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
7 ^: m3 S0 G! Z+ V* U6 I) F5 c
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
% D. v6 O3 q+ {- R: O- K
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* |% ^& ]" \' H' u
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
# e4 N! ]4 a9 S+ v. r
# P5 x, a' n% `# E
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ M# _, i- _" ?4 ]5 { e7 W# N
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
% P" u, L* P, k3 J- q
5 P: @' d0 ~* [) S: w+ _/ X9 }
// 禁用斩波子模块
6 |' y9 i$ |) U# s! X) n2 @9 g
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- T. M) n& q1 B" B4 \
B* E2 b* A3 H6 b" y1 h! R
// 禁用错误控制事件
6 H! F, g+ @+ J, M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! X7 K2 z- a5 v* ]
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, C- b: R# o* u& W
: K" E4 O2 s+ G
// 事件触发配置
6 h5 C1 }' Q& l2 [! V4 P
// 每三次事件发生产生中断
# H& z; ~6 R8 z" u8 ~- c
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) w* j, y3 P/ Y9 T# B( b j7 I
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 ^/ F7 S( K2 Q. H
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- Y9 l4 ?; @% v6 A4 s
// 使能中断
3 F3 ?$ s3 Q% n2 Q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
* `3 v6 M9 i' L
: y6 A0 c5 f8 S! @
// 禁用高精度子模块
9 Y2 M8 D @ L( x
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
) W# J5 y5 ?- i# d0 |- P
( Y. {$ a) G& j
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 h& H" M0 S1 C9 Q! p& i0 t1 j
}
' q7 ?( d/ `# Q6 K" {
$ J: u. e- T7 _2 p! `0 H% d
void ChopperWaveform(void)
- C: e6 i U3 M, Z
{
4 v; ? i+ |3 g) E
// 50% 占空比
8 W8 v, c; _ ^' l
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* V6 l: C. F6 o* K7 S
// 4 分频
; g1 |! E F5 O F
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 ]( g9 s* R9 L$ j9 P5 W
// 单个脉冲宽度
( W _/ [! }0 D4 z& h
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 m6 J* g6 f I2 l! i# K
// 使能斩波子模块
/ U- B; h4 V* g! m n4 V. M
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
/ Y$ W- r$ M+ L% h9 ?, ~/ Z7 H& ?
}
8 A$ G' T5 B% C; R- K: K7 ^
4 }* w' A- K. B
/****************************************************************************/
7 m/ y8 G' P# O( i' D, \5 ]4 }7 k, e
/* */
* f) W* r/ @( k2 ^4 C
/* PWM 中断初始化 */
+ J# w. R; {) Q, F
/* */
3 n# ]3 r+ u+ U5 V7 U0 ]
/****************************************************************************/
( p+ ?9 O- T6 k. y& F0 Z1 U
void PWMInterruptInit(void)
* {# i8 J! A3 d
{
0 L7 J8 m% o& b4 K" r
// 注册中断服务函数
% V% e, X7 v E8 A8 q4 T1 V- \
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
. g" B8 `: s5 V/ M
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 ]! `, c: S. Z0 E0 [& L
( Y" J& l! w( f9 v" k
// 映射中断
, e& I& U5 D6 e4 Y
IntChannelSet(SYS_INT_EHRPWM1, 2);
7 s1 d$ a% v. f
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* g: }+ [1 w% [- E# F
0 f/ L/ u3 U3 \
// 使能中断
+ {! S7 p% X% N# B# |
IntSystemEnable(SYS_INT_EHRPWM1);
3 }$ g; e" ~6 L1 A; ^0 u0 j: w
IntSystemEnable(SYS_INT_EHRPWM1TZ);
/ u; J8 ^& J X7 J
}
, }6 u1 ]' r+ q# a
+ O; H$ d, Z5 t+ ]! Q, E
/****************************************************************************/
$ V; H" K/ `( U! Q# r7 J# K7 V
/* */
$ F/ Z- B1 n# j0 p* Z, [
/* ARM 中断初始化 */
. u! x' r( ^& U$ A. v
/* */
: @8 H0 d5 j2 H0 K4 T
/****************************************************************************/
( a$ G' O- B. b( a& J9 j; l
void InterruptInit(void)
8 N$ ]3 [( a3 \
{
9 w2 t! l, E* K7 ?, t
// 初始化 ARM 中断控制器
3 j6 K+ e4 o: o( c
IntAINTCInit();
6 N( x3 I- ^- Q4 j# D; Q. Z1 K$ R
4 P2 } O" G; N4 _$ a
// 使能 IRQ(CPSR)
1 E; O: l! H/ `2 a C$ q& C2 s
IntMasterIRQEnable();
: J% a" v- _' t% x, R& Q; S
3 m6 R# L1 x" f0 u6 ?
// 使能中断(AINTC GER)
( r. H+ w1 R" v! Y. X
IntGlobalEnable();
$ Q- A$ c. K9 u' v+ d0 Y3 F. p
( [* t$ U- [# }1 Q9 u: x* M
// 使能中断(AINTC HIER)
# L# c+ u, S+ {) d$ o6 k
IntIRQEnable();
3 m) y1 U3 ~7 n6 T! j' G- E$ w
}
9 s* }3 f4 m `5 g/ k
' {) B' l% {" ^5 W
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
1 E- u! [! \; o* d% `$ m
/* */
2 m/ \/ C" R- U# d. Y" t9 z
/* 中断服务函数 */
. {; b3 ?2 W9 y6 L
/* */
& o: x. i! J5 W; r: b e+ M
/****************************************************************************/
3 V6 I" w) x0 O9 [. @) l$ O3 V3 m1 [
void PWMEventIsr(void)
' N8 B* o, f6 [2 b! I' W
{
5 `6 z4 d9 R1 O3 c
IntSystemStatusClear(SYS_INT_EHRPWM1);
" ~# V( c2 w/ H' j( c# N/ w
4 o7 T+ G: x! G0 c
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
( p$ |8 D( a. `' \* ?7 C5 |1 D7 J* M
}
. S) y7 H+ G# @6 g2 E' ~) {
/ A3 }& C/ R) e0 T* u
void PWMTZIsr(void)
1 ?5 h- v6 Y9 T# k# F8 G9 w" ?
{
1 ~# w' H0 c4 o: ?2 { B, ^0 R- X8 r
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
: {. b/ q& r3 g( D& c
- j; z0 Q/ m- c2 s( F6 J
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ s4 k# A! c2 Q. S9 \% w/ p
}
% G' J& ^" m! Y9 o( e
' C/ L) U) y: y# m/ B- A( t+ G
/****************************************************************************/
* u M- R7 d$ P. x( b0 Q
/* */
- P- H/ n$ g! K# L: N/ |) w7 m& g! \
/* 初始化捕获模块 */
1 @% h. }$ z' a2 g; v. D, N; R
/* */
0 H, G1 o5 R8 t% S+ F/ F6 n
/****************************************************************************/
/ }. t' b# n6 r& K/ \
void ECAPInit(void)
! ~& \ M6 j3 V1 k. L, u$ g3 i
{
d4 s; O2 b1 L8 h6 x( _# a
/*-----设置 ECCTL1-----*/
3 w1 y: o O1 f3 ?0 Q) g
// 使能CAP寄存器装载
! O$ H0 ~( ^3 [
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
' \0 H1 Q7 b2 C! l- G3 `
// 设置预分频值.
9 n9 ?# j6 D+ Z3 S2 S1 B. |7 L
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
2 X7 P X6 g+ M: o2 Y& ?2 A
// 上升沿触发捕获事件
5 J8 }4 ?* A5 y H1 m
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ J% L4 g9 h# j8 i" }% @5 K
// 输入捕获后重新装载计数器值.
9 e7 C/ @) E4 \- l |" x! \
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 U' L* m! O) c4 u; X* {
3 v1 ?& w [' Z$ D& M
/*-----设置 ECCTL2-----*/
, K$ e" z, p' }8 ?8 ?% S4 I
// 连续模式
; ~) {$ P; c+ D) k' s9 D
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
9 e) k9 D6 ^0 p" B5 I
// ECAP计数器TSCTR持续计数
- [! c6 T& i& F. H+ I8 o$ l7 g2 Y
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 E6 M5 i$ h( G: p, b8 x
// 禁用同步输出和同步输入
- V' W; A7 d u) [4 l' P9 e
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
! W; |3 P6 ?" C$ }/ K( S
// 配置 ECAP 2 为 CAPTURE 模式
" D: F, s' a! u
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# C: [# ^( r, v
) G2 _$ \1 O6 i2 [7 C4 z3 a& Z7 \
// 使能中断
9 a& R8 L z& d$ H
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
, L. T K$ w( T+ a& z
}
" W7 j+ u0 I2 H0 p/ S7 ?; T
# d1 n4 S3 M6 W
/****************************************************************************/
5 y/ ~" [% m: R( V, Y
/* */
* C( D) L* O- A% p! \' u3 o4 M
/* 取得捕获结果 */
9 b8 A! Z5 i- f0 T& g
/* */
" D5 F! W+ s- z% G. V
/****************************************************************************/
- q! h$ w A$ Y: T
unsigned int ECAPRead(void)
z, g. A* u: A' A7 d& J& A) p% W
{
# a/ T F* e v2 j1 w! U
unsigned int capvalue;
! y& E& U! A/ l7 [- x
unsigned long frequency;
* S5 ^2 V! x2 J( r) w, q
* R5 V5 c% s0 b& j! r& G
// Event1 中断标志
; f9 h2 q S# x5 v1 S9 t( F$ i
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. [" { |- ^1 J# b/ w
{
) q6 y- B* d; x8 h9 j
// 取得捕获计数
6 D) G2 R; k" U
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* ~" B+ H9 X! ~
capvalue = ECAPResult.cap1;
4 x# P( K+ I5 N
% C- y3 f& W9 \8 s. y
// CAPTRUE 模块 228M 时钟主频
, p; H& R/ k y) _) e$ h4 _
frequency = 228000000/capvalue;
0 }1 W, m( i1 M9 [4 ]5 m/ \- H q
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* F" I2 [& [: J, @& F! |* h
# [2 ?8 f% g! |: I
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* T8 @ e9 ~9 X( T. |( l* i5 t
// IntEventClear(SYS_INT_ECAP2);
3 F0 ]1 K/ K, [! \2 e% W& v5 F7 W2 r
}
0 P% `0 X) j0 Y7 F; Y
return frequency;
. a. c; R3 v6 S; T2 Q2 v. K
}
) t( x G5 f; V& W% p* X! T& _
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 F$ ~: J6 e. m$ J, k# |
[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