嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 _2 o- j$ H% P( |& j% w
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
& m2 \. E' t$ X8 {& a0 I& D" U
/* */
2 ^* J, h" w$ \7 `0 I
/* 宏定义 */
" K7 |9 ]; C, h! n
/* */
8 s6 K, L8 S& f# ~
/****************************************************************************/
: |/ J& e6 p& U8 |% j9 N+ n m
// 软件断点
8 O- t& n6 |5 h/ ^
#define SW_BREAKPOINT asm(" SWBP 0 ");
" b9 N* z- p* S2 m9 x9 B2 D
% k# A: V- r: N" Q
// 时钟分频
) K/ {+ X. ^ Z( v
#define CLOCK_DIV_VAL 228
# D! M" R) g0 Z& T
5 ?( ~- R! |' p6 @/ x6 V
/****************************************************************************/
# g: P, y6 W$ y& f, s. x( Q6 U
/* */
c+ a9 k# f# [
/* 全局变量 */
9 _( V0 Q4 J2 R( e8 J6 k$ m
/* */
* A2 @9 V1 [! \$ L+ Q, H( d5 v% ~3 ?
/****************************************************************************/
, f" W1 F5 k$ U0 ^
ECAPCONTEXT ECAPResult;
0 d5 x" m- c) a! X5 W( @
0 p+ t4 R8 o# l$ ?% |* E9 J
/****************************************************************************/
7 s+ \ |% c! Q
/* */
: _! T- v7 f+ y- F5 r7 g2 o8 T& \& O
/* 函数声明 */
, |7 ]. j9 X+ ^( ^% S; Q) I% J
/* */
" F8 R( L$ N. x. L5 Q0 q W* R: X
/****************************************************************************/
" t+ M* k! a p0 Z7 n# Z, b
// 外设使能配置
/ C& H$ p8 i9 O) W
void PSCInit(void);
# i/ p& N4 ]$ s2 z6 \7 Q2 n, R. R
- M6 h' U4 x/ p J5 \
// GPIO 管脚复用配置
4 P, z, P0 q# x i
void GPIOBankPinMuxSet();
2 e* D+ {) p) S8 g3 i1 J; ]
4 K+ o+ j+ J- r7 [" s
// 产生波形
' {& _4 F! ^! ~9 T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, K- T5 W& c, A, n1 u3 N) \
void ChopperWaveform(void);
7 M7 F [$ t$ {* s2 J
1 J( z& w: T, P
// ECAP初始化和读函数
% T: Z; N) b) a! l& O3 b
void ECAPInit(void);
9 m& o9 L# C/ I/ c
unsigned int ECAPRead(void);
3 R0 i6 P* ^/ \" B; @3 R
3 w. {: n: ~( I! ]9 e
//ARM 中断初始化
/ g p* @5 G# A, P8 H
void InterruptInit(void);
" `* [2 P" r& W, _* _5 r* Q
8 u/ l7 {7 M8 q. g, J7 Y
// PWM 中断初始化
3 B( Z, c0 V" g6 C2 f6 y
void PWMInterruptInit(void);
& v7 F0 K' j! I9 g4 H8 ]
// 中断服务函数
) B' \; y* ~5 x8 h6 e
// PWM 事件
" Q4 M# @- n! f; X) O8 i
void PWMEventIsr(void);
9 j- S6 l2 d, ^
// PWM 错误控制事件
+ X6 X+ h$ f% j: G
void PWMTZIsr(void);
. C/ X% N2 v3 c6 ?1 ~$ ~
+ F. v7 N S: s) t
/****************************************************************************/
- B. p& _6 x6 a
/* */
- P6 D- w2 c5 j3 [: i: w9 P' f8 Q
/* 主函数 */
L. ~ ]) |3 J" G! @! F& `
/* */
8 H; E4 n7 B% t# {! o; I
/****************************************************************************/
) T1 l9 z% Y/ P$ q8 L. y
int main(void)
" X: `. E% u' `0 ` N# n- ?+ S8 G) a' l2 ~
{
8 ?0 e, \7 j$ @
// 外设使能配置
3 o$ f( R& W0 l( f
PSCInit();
! ^- J# Z6 d- i% Q
4 t$ @- F" a& U2 L: I% K
// 初始化串口终端 使用串口2
6 k$ C0 `6 O5 R: ~% d
UARTStdioInit();
J6 ^% W3 ?* G g, L: B
$ N0 d8 n$ \8 j( X8 Y- G
// GPIO 管脚复用配置
f7 H: _# y% b: B3 ~! F0 B
GPIOBankPinMuxSet();
" J: L& _2 n+ {/ `, g( D
/ Q; @: w! F; d. L8 e+ O+ \
// ARM 中断初始化
; u* N7 _8 |, H: K
InterruptInit();
, `* R$ |7 P3 j6 A* e% T
9 l: p# b3 b1 n T# P
// PWM 中断初始化
3 p$ w9 U' u- E
PWMInterruptInit();
! s3 ]: t) B! ]6 a4 I
0 y, g$ y3 D. z8 [" [2 F. M1 Y
unsigned char i;
$ F5 i7 \' z; T7 Z% v
unsigned int j;
$ H- C2 q5 n, P0 Y8 H
6 l7 \* s% h& ^8 E2 V, s
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 Z' i4 \4 S6 O8 w: N0 E+ u
UARTPuts("------------------------------------------------------------\r\n", -1);
9 ?3 N. |' o. ?
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 \4 d8 j; ^. x* y/ h
// 产生波形
9 L& e6 @5 V, p! y. o& Y, K) ?" Y
PWM1ABasic(25000,50);
- J: a, A! @% N- z8 C6 g4 H
0 D1 `; N9 Y! Y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& z5 A$ z# V/ n
UARTPuts("------------------------------------------------------------\r\n", -1);
+ E5 Q! F& p8 W* y8 Z/ u h- Y
( ]5 }/ ?$ `& N) R% \
) z" v/ e$ C, G! ?; ^. P2 r7 `! O. R
, J2 l g$ r7 w4 O. q( j
UARTPuts("------------------------------------------------------------\r\n", -1);
6 o) c8 E% Y; c
UARTPuts(" C6748 ECAP Test\r\n", -1);
* n. k. G- k( Y' L: ~; E/ P
// ECAP 捕获初始化
( V4 Z, I7 M7 J2 r. u
ECAPInit();
- p: j) \1 d" c; k* s# y3 |
UARTPuts("Initialize ECAP.......\r\n",-1);
: c0 q% |% r5 ~. i3 x& O3 \/ B! B
for(i=0;i<5;i++)
n( ~7 j; E7 c" D. v% u1 T
{
+ ], j) y1 ], } `" N/ D
for(j=0x00FFFFFF;j>0;j--); // 延时
, M9 v9 J# b z7 S
ECAPRead();
3 H( A4 e+ q# h. z# D, A9 r1 \- z8 R
}
& D' ~* H( S9 ^5 [: k \- `+ _
UARTPuts("\r\n",-1);
4 Q: ]- \6 m5 N! t. m
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
2 [5 U/ Q( i; Y8 g( \
UARTPuts("------------------------------------------------------------\r\n", -1);
$ v0 A D& g) a
$ v9 K% A! k2 ~: V
// 主循环
% P( ?! d1 P6 {8 G. \0 Y
for(;;)
6 B; w& t/ S0 T7 m+ G
{
: u3 h& p) ?* r. W+ t
/ u. s3 D; g# @; ?
}
) l3 _ w2 q6 r: `
}
5 Q0 S) }# W( w6 ^& S( C6 U
/ W2 M( n& C& w6 v
/****************************************************************************/
' P, L+ O) S: x0 d5 h% K; X: X
/* */
/ a ?) a5 M; B M$ K
/* PSC 初始化 */
9 {1 G' `' H5 V9 Z( c# v
/* */
4 D1 f" b4 k4 b; I, z( ]9 T. F
/****************************************************************************/
& ~/ J' P( d! ^3 ]4 A9 {4 N1 e! E
void PSCInit(void)
e; n- u$ _4 h) K6 ~9 R$ X) D* i
{
% y q0 e, g& y8 t7 h ]
// 使能 EHRPWM 和 ECAP 模块
2 e9 f! [" Q: o' ~! b! d/ J
// 对相应外设模块的使能也可以在 BootLoader 中完成
! Y9 S/ x7 s+ Y) W+ Z/ H$ [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- _8 v' w' l) W. n+ J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 v/ b' K0 n. E, s' b9 a/ O
}
# h# s4 S- z: ]: v/ A
4 P8 ]1 l5 @& Z3 B; o" `1 H! i! B
/****************************************************************************/
( H6 q) U2 f/ k
/* */
y! s1 v! S& h! R- r) U
/* GPIO 管脚复用配置 */
" H0 |& D* |1 Z' U" M# W
/* */
1 G5 R6 z- n' G4 |$ ` p
/****************************************************************************/
& C/ Z7 L8 s) C# u2 |4 q
void GPIOBankPinMuxSet(void)
) d' g' X# C8 |+ d, J7 h
{
" }$ x: Q. G6 b7 \% U
EHRPWM1PinMuxSetup();
+ R( @3 C* Z0 B( h! a" J
: u1 e+ F/ M3 c+ v( p3 o1 ^3 T
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
0 \. t, f4 ~# k1 i1 W$ }
// 作为捕获功能时管脚方向为输入
: E1 q) p/ i" A* u6 v3 f( l
// 作为辅助脉宽调制时管脚方向为输出
9 T, E9 D) l9 Z/ C3 Z0 n$ W! R
// ECAP2 / APWM2
# u% X# X, C5 M4 t- e; U
ECAPPinMuxSetup(2);
9 P+ g0 a: m* B: U" _
8 ~! _3 C) X) {) p. _* H
// ECAP2 / APWM2方向设置为输入
; u+ ^: K/ Q9 @( p- F
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* x6 A2 l6 z/ k/ N6 d0 W
}
+ g3 Z" o2 N% g% E, h7 E
* c$ U8 R! Z4 u4 J
/****************************************************************************/
! n, M b. L Y$ Z3 Y& g) N
/* */
9 A* N0 v; L) Z8 I: I
/* PWM 输出波形 */
2 Z1 @ g8 A- e/ H3 l. _& r
/* */
* D; I6 d/ s* }) }8 y: Z, O
/****************************************************************************/
, q: w: X3 H, r+ \: H
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
8 Q2 k, I$ {! p* j. ^7 A
{
2 e/ M6 J; l* `1 e: d. U. L1 O/ m
// 时间基准配置
. a, E4 B$ {: ~5 D% T
// 时钟配置
' g/ w" |+ G* C% x. C. ]
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
5 k1 A" S3 y3 s8 _2 L# k
s* `: ~ [8 x) r
// 配置周期
& N' ?/ [5 z3 W6 O
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ W5 R1 O5 F, e0 R
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ C# E2 T% b" R. t/ K0 u
( [2 C( p$ @% \
// 禁用输入同步信号
6 b* z9 d% q7 h1 n6 f
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* {$ C Z+ Y/ i, _ ~% ?+ N
; h. a- N" l% S/ m1 C; m9 L8 P- y
// 禁用输出同步信号
( k4 T; P& [8 t! I4 F/ f- J: k
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ m+ x L- N8 M% ^+ H3 j! D
, J- p- w& M6 y6 u' n
// 仿真(DEBUG)模式行为配置
: p, d# C! ~( }0 C" S
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 d( O, c- k5 o* ]
/ t9 q* m; \7 o4 h% Q; Q" L% A; g
// 配置计数比较器子模块
$ o; \; h+ p! T# ~- C8 [
// 加载比较器 A 值
$ i9 _, K4 K2 R
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" u$ V) S8 W2 z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# l* b7 `( x& h, Q; l& E
0 H) A/ ?1 n, G
// 加载比较器 B 值
" A- x% d$ E- A! E# l- d# d
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
# L% a; f& Z! V8 Y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 m* v$ A1 C$ H& Y( x
3 ?8 C1 R% T& a6 s$ L% P3 @8 n
// 功能限定配置(输出引脚触发方式设定)
- V: K$ V: Z1 H7 c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
% C# y! a; h# Q" A# I
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
1 `% V M2 ~+ h& |' |
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 m6 B* j/ I# F6 r
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- |, d" q/ }" m) X6 }0 @
. w! f b6 b n9 G/ b, S
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: @7 |9 ^: ]- C( V! N/ O. m s( K4 G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ q% ~8 C4 K$ O3 X4 T- M
9 V3 F# l! U/ j% l2 G* p- T1 q
// 禁用斩波子模块
" Q% ~ { ?) v+ X: J
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 v1 x4 d" M1 q U& a
2 d! \& r# K6 W
// 禁用错误控制事件
3 U& h/ r2 S8 |, v* q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
* D; [7 ?0 C7 \3 C$ [
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# k5 u% p, n4 c8 U3 A8 t2 l
2 ]6 [& {: Y8 s, e3 V. S/ |
// 事件触发配置
$ B) r3 F8 x6 i3 I& U; A6 A
// 每三次事件发生产生中断
" I ]$ z9 `! h9 z6 ?
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
9 [) u6 e; r. a& m* a7 j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* p1 c& B# I4 b/ l0 I
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
* J8 b9 M6 E, C# [2 Z; g* a' h
// 使能中断
+ }" e; s) i* g0 N. p
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
6 D( U0 @ M% r' e( x
+ c4 T9 e7 q" g! A. }( V9 p' Y1 [+ K
// 禁用高精度子模块
# a! j4 q. F& Y* a, f, s& k
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
$ ~: K6 I @ e8 J: F% o. y$ X: x
$ x3 R+ Y# w7 ~/ n' }
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
' F' i$ }* y9 m* t- g
}
0 x: o& P) j+ t' ^# g
6 i8 H. K( l; X7 ^5 d0 C0 N
void ChopperWaveform(void)
/ C% W4 X. A1 S0 v$ Z
{
3 y' T$ S. ]3 }# \' _' n
// 50% 占空比
% U$ E* o# F& [" G# R1 J
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
) U# W$ E V8 |7 L
// 4 分频
1 M. V0 q8 l: y: R
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
$ }9 V3 [, }5 e% S; O a0 N
// 单个脉冲宽度
3 R0 f4 V2 m" v- t' B3 x4 H
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
d. M2 N6 u) g& j% [( e. O
// 使能斩波子模块
; L% H& m. c# T3 |3 d* F8 H- s% N
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
" `" n" L4 c5 v- \ e; j; h8 W
}
/ R$ O/ v {9 ?/ D, Z1 d' ]
* ~# v* W) P6 \) \
/****************************************************************************/
# L3 _) r" t3 I7 L' N
/* */
% s5 }! }; F/ T. u4 j6 [
/* PWM 中断初始化 */
# f6 N) ]+ k* q& x B. v2 p/ O
/* */
. ]; Y& ~9 F) Y4 A) L. y7 \
/****************************************************************************/
# J! I+ D. k0 D% C
void PWMInterruptInit(void)
+ r# H* a2 \/ V5 J3 O
{
' f, q! t5 j" \5 c+ H: A
// 注册中断服务函数
8 j* L5 Q# a, i: a0 A" N
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) `0 P* n- @; g' O: u
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 W! ^- L3 G( X' T! r- `7 N
! `7 q* L* [ Q/ E5 J5 [
// 映射中断
9 g w. Z1 q7 H8 }
IntChannelSet(SYS_INT_EHRPWM1, 2);
! ^# X5 G3 {/ K6 x: h3 J" Z
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 f5 _0 G; i* t
3 v1 l- s8 y0 t9 A
// 使能中断
' _! Z5 |3 X- K" \" C" h
IntSystemEnable(SYS_INT_EHRPWM1);
; A0 I) j7 o. l! f+ s
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- s. R5 w* s T% k. B' N* g
}
& I9 a" k. J! @; u
6 B3 z. Z0 M% F% j7 S
/****************************************************************************/
# b7 L( b/ }6 c; s5 m3 g) g
/* */
% _: s( e$ _: m% Y
/* ARM 中断初始化 */
& ~7 T+ z4 E7 U5 E
/* */
8 C% ^( r0 i7 Z; O% R! r
/****************************************************************************/
1 s$ {( `9 D0 Q, l
void InterruptInit(void)
Q; H2 p( `4 Z$ `$ ~% N2 w. |
{
8 n9 `! N8 x$ m6 `4 @/ D8 \1 v; Y+ K
// 初始化 ARM 中断控制器
$ Q% d+ O+ {- n- I, X8 e3 K
IntAINTCInit();
( F0 b, V' {) a3 Z1 t
- O& r5 p* r% |/ [6 \! h, H
// 使能 IRQ(CPSR)
3 i/ l' C/ @! E. {/ I
IntMasterIRQEnable();
: \9 \* \5 U" j/ S6 i9 |, i
: }- t; Q1 S0 d% }
// 使能中断(AINTC GER)
$ n: W4 U( p# k8 f
IntGlobalEnable();
5 y- B2 B6 ?. W
/ E+ j8 {' s0 S* K
// 使能中断(AINTC HIER)
7 Q7 B6 X+ t' a) h
IntIRQEnable();
8 {, q# b# N. t8 I1 t
}
9 G8 E% c, F. p. | x U
0 t; u2 S t8 W8 J, W' f, W, I* {- h
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& P4 F0 | B: q+ a
/* */
% j; N/ O' _+ X
/* 中断服务函数 */
# m& V+ U, O! l" I0 H( \. U+ O! a0 N
/* */
7 E5 m. I/ t8 u( R K6 {
/****************************************************************************/
& E' c) F l5 _3 Q2 Q
void PWMEventIsr(void)
" R5 c9 x @% D: F# r9 J# D/ u
{
$ e: \' [/ I7 ], w# s
IntSystemStatusClear(SYS_INT_EHRPWM1);
# B) Q& ?" d3 w5 N0 W7 K
' C# G: J$ U3 g) J* l* i8 S: s
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
`7 W0 f' |, b v5 H6 v& K
}
+ d E% S& o# c; z0 m2 `; E# t/ o
0 R8 C1 ^' o: g/ E0 M) g9 s
void PWMTZIsr(void)
! W6 u' t9 m$ t, l. @
{
6 k7 Z& r( b ?. C w+ k
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
) Z- I2 c: J0 X. G; F
" t* [3 K. \" J5 R3 T7 i
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- J4 H& X3 h1 D- u2 _: t$ h, i
}
1 X. T6 n' y4 }: F
1 d+ f. O- _ d
/****************************************************************************/
! f6 l- A Y$ X1 P3 k
/* */
& O( V# l1 [: i$ K
/* 初始化捕获模块 */
' J# l1 @; }$ B! G
/* */
2 ?1 ]4 C# L# L( }- [ c
/****************************************************************************/
( m3 q7 `# f0 ?9 @) ]% T
void ECAPInit(void)
" C; R: L4 h6 f: W
{
; z: o4 X/ m5 R: l1 Y+ C( u
/*-----设置 ECCTL1-----*/
) e' K+ d5 N& h& B, e
// 使能CAP寄存器装载
7 Q. g# O. h) b; P
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
* L s" O" ?' k- ^$ @
// 设置预分频值.
& b! G/ x$ X1 e$ J6 B% M
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
, Y; N9 A2 a P; \1 {. A0 u9 q
// 上升沿触发捕获事件
: w, o# I5 M O! ~
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
, N+ k, n$ n8 X7 o
// 输入捕获后重新装载计数器值.
( ~$ \8 X, [/ Q9 V& x- L
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 N1 k. ~9 v: D8 {8 m* N- {
6 ?4 o- J4 S5 Q' }# V/ p: \+ @
/*-----设置 ECCTL2-----*/
1 V! E+ a4 Y# N, [- Y" j4 k
// 连续模式
7 W* `: d3 ^1 M8 r9 a8 c4 V
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
- G* h- C6 ^; f5 v8 N( U7 \( G' H
// ECAP计数器TSCTR持续计数
3 Q9 e3 ^/ B* c2 A9 H, v" [: ^& P& I
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
# G7 ]2 k8 M; ?
// 禁用同步输出和同步输入
; S2 w, X! \- d' ~* _
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
# m- G3 s4 I8 [& v
// 配置 ECAP 2 为 CAPTURE 模式
% ~( j- l# K- e/ I6 s* r
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
6 T* Y0 w6 i9 f0 g- B! T
3 D) H6 r9 {- \. f# H
// 使能中断
2 T8 e Y5 v8 L3 d
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ |9 u3 w2 _6 L; d b
}
$ T+ d* h0 e, l
6 Z' |% E$ ]( U$ E
/****************************************************************************/
0 T) j3 f/ c& ]* s- N* S
/* */
% T: ?8 a. e& t
/* 取得捕获结果 */
( ]8 P& w7 Q4 v/ l$ t! K
/* */
0 `, T! c' r, `: N d( M
/****************************************************************************/
( z4 }+ d% Z7 Y q [
unsigned int ECAPRead(void)
x0 H& u M& K7 _
{
5 E: A+ A9 _6 X7 |* ]# T# k0 X3 L
unsigned int capvalue;
# n* C% o/ N) ~! l$ P
unsigned long frequency;
! ^; c; d. | {0 @$ w0 A
/ X2 h2 x9 T) m4 n
// Event1 中断标志
9 ~) e0 h/ c6 d* e6 U0 |
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
- {8 {! } [3 h- {% d0 U
{
- B$ C9 C9 n+ H, `
// 取得捕获计数
0 Y! Q% y7 {1 T) o ^/ d, ]2 b
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
9 x+ K- m F' u4 k
capvalue = ECAPResult.cap1;
" n/ v8 k1 M$ I9 R2 H; m
8 ~( A( {# ]* c, _9 O& |
// CAPTRUE 模块 228M 时钟主频
{* I# k5 C* A+ X7 a6 Y/ y. `
frequency = 228000000/capvalue;
- \! d, k7 f8 t4 S1 d7 C
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
) T, I/ _! z$ V, P2 M0 ]& |% j6 n2 s X: H3 D
6 \+ |7 Z8 m( R! i; r
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 `5 _1 D% L8 J$ r1 ~& t
// IntEventClear(SYS_INT_ECAP2);
, w+ m8 m6 T1 L9 ]& G- p
}
4 C; |, J7 ?# V/ I- |' G
return frequency;
/ |& r8 l, f( U; u8 K/ c
}
; s' V w" w) C" o! }, y
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ v* A4 Q n- Y( i/ c
[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