嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 X, r* o1 n& H) p1 t1 U
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
$ o) g) k: \- P% b2 K. n) X
/* */
; A# R$ ]) o2 \ K
/* 宏定义 */
4 _4 z- c. w' _1 y7 h* }9 \
/* */
# {" V* q4 q" p4 n# z
/****************************************************************************/
& F g1 k6 m9 O5 d+ t
// 软件断点
, R4 P* V1 P& O* O I
#define SW_BREAKPOINT asm(" SWBP 0 ");
# e$ }; Z! P: a
. H2 P/ d$ E$ S
// 时钟分频
' u) ], k7 \- ]# C1 e4 \
#define CLOCK_DIV_VAL 228
! K4 G" L9 d( u+ f" o. {5 }
2 _( B* O* J3 H- _* {' Z
/****************************************************************************/
. @: a* X- s% T5 e7 u0 Y
/* */
) P i, U: G5 p* \ g S% d. w( W' Y
/* 全局变量 */
; {* B/ I$ Y$ l$ z4 D
/* */
' T" ~8 L3 n: P% m- N
/****************************************************************************/
7 h0 W. L0 D8 Q! J! X0 U n
ECAPCONTEXT ECAPResult;
0 C" v0 _) R h, J5 D* q( g# C; B m
9 {# j$ L2 C# Z
/****************************************************************************/
# G% u$ j; X1 |5 N' m; v8 h
/* */
0 z- r* k+ ]6 o4 c& w$ C9 V( |3 w7 V0 e
/* 函数声明 */
& [, o: Z2 ?& ]
/* */
5 C. _7 h3 x! I) G( [( u4 S% w
/****************************************************************************/
) H' o# o" S5 D# A0 r0 ]
// 外设使能配置
- x0 j" A' d0 D4 U$ V" I$ y# ^+ A
void PSCInit(void);
& g, E+ G" l; `$ ^3 Q* E5 Z1 W
! ]; {7 d, T8 T; g$ R
// GPIO 管脚复用配置
C* n8 O3 I$ ^* {
void GPIOBankPinMuxSet();
& S; H3 U$ z! |. d
3 f4 ?& p) N' G! p0 Z2 Z% k, b
// 产生波形
8 _2 K7 f6 Z2 n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 t" @# o- o# @/ q, w, T
void ChopperWaveform(void);
$ _& i3 d0 n3 n
% [& Q- A3 d6 V1 x
// ECAP初始化和读函数
) i* v t3 i; Z7 b/ v' j+ u
void ECAPInit(void);
7 ]- T2 H& J7 n
unsigned int ECAPRead(void);
! K- h3 [8 I6 |" W8 `4 ^" A2 ]! k
o0 w9 C6 C/ r
//ARM 中断初始化
( @- k; S I7 P( x/ X
void InterruptInit(void);
- q( ^5 Z ?5 ~6 m) @$ N; Y
7 X- D7 [; U" i$ l% t* M
// PWM 中断初始化
6 R( Z" v$ i9 m% c, s! m! K
void PWMInterruptInit(void);
* [' W5 X0 n9 F5 X# h+ }7 A5 U
// 中断服务函数
- ~, S9 g- J' R( |) T* w, v: A7 r# z* H
// PWM 事件
) o% g- G0 G% _" M5 r: `9 E
void PWMEventIsr(void);
6 s0 |; e7 x" T ?0 D# B
// PWM 错误控制事件
3 R0 a w! j' c% d
void PWMTZIsr(void);
+ {3 A, h |, O. ^
+ I& m* M4 {0 `* ?) `! n
/****************************************************************************/
9 a2 \! O# N- ~8 p# }# s5 h9 x
/* */
( R2 `/ q, o; Q2 M* t8 W* H
/* 主函数 */
+ B; x# u* x7 W/ Y9 U
/* */
( b* p7 m7 o! X& E
/****************************************************************************/
r- r. ^5 U+ b" i: f
int main(void)
6 [7 ^1 }3 q, J$ ^6 s
{
( r0 K E7 U* ?. B3 A6 e6 p
// 外设使能配置
9 U( P; \" O4 x6 P1 [0 I% l
PSCInit();
! u7 l: T J# q9 N5 ]1 U
2 v; |9 c$ Q J( h. v j% |
// 初始化串口终端 使用串口2
9 m& Y0 y$ ~( ?( O7 z3 o& r7 u
UARTStdioInit();
7 Y- a; |2 W6 }/ }" O
! B W( m* {+ p: D6 q7 z
// GPIO 管脚复用配置
$ P3 [2 _! d6 J$ D7 ]; M; B" j, t
GPIOBankPinMuxSet();
, x; y$ `2 j& { Q& T
g& R1 I; T9 I, s
// ARM 中断初始化
1 X2 a/ f ^" ?
InterruptInit();
" e0 o8 w7 ^4 k2 ^( s- G
" i3 q! q: ` M3 b/ r6 r
// PWM 中断初始化
$ |* E, \; o0 ]' ~
PWMInterruptInit();
% F; w6 w2 K3 u2 D# u- f- a% H
% j5 p, }( n; X1 g6 p& R
unsigned char i;
! i* Q6 F6 z! } a9 i
unsigned int j;
* C1 w; A1 R" Y% r/ ?% S
6 r! V8 Y& V$ R- ]2 m
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, G( \3 p6 y! x: O
UARTPuts("------------------------------------------------------------\r\n", -1);
9 {8 W/ M( R3 M' b; B! E+ n g% C
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
/ p+ X4 E! n3 S3 d @; `# y1 ?6 B
// 产生波形
8 Q [1 N% Y8 R7 g' w4 X
PWM1ABasic(25000,50);
9 }# a0 K) S* I0 P& t1 t) s$ H+ `9 E
( \0 j# D/ {& [% g. B. C# y$ Q
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
]6 T& I4 t% |3 X! @+ r+ J/ d& `
UARTPuts("------------------------------------------------------------\r\n", -1);
1 c7 w8 d$ L1 |' C4 s2 q
$ A% k) K6 T! m8 B
. {$ d# n0 a- a$ u5 O/ |# C
7 S! T/ ]2 _2 H: K$ [: B, `
UARTPuts("------------------------------------------------------------\r\n", -1);
6 Q. g, R( I# ~+ b# Z
UARTPuts(" C6748 ECAP Test\r\n", -1);
" L/ {, ~) ^8 s5 K" B( v
// ECAP 捕获初始化
' p( G7 g1 c" k( d3 m8 d4 [
ECAPInit();
3 _. {( ?/ V& y6 b5 X5 X! ?
UARTPuts("Initialize ECAP.......\r\n",-1);
F% j1 l6 r' A! P4 W
for(i=0;i<5;i++)
4 D+ r3 r/ u2 ~+ ?: U* G9 _3 ?
{
I2 S1 l/ n" p4 U& ^$ R
for(j=0x00FFFFFF;j>0;j--); // 延时
# W9 l6 J5 X( K/ ?8 t- j
ECAPRead();
& l5 c4 x4 O* ?+ S
}
7 r: ~6 D# u1 s; d
UARTPuts("\r\n",-1);
1 Y3 E4 }& C$ {/ S( I
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! o A! ~6 c" _' A2 a g7 f
UARTPuts("------------------------------------------------------------\r\n", -1);
0 B3 @) Y+ L) k3 r+ f2 a2 ^
. x$ {$ |3 X/ X! B( Q. k
// 主循环
5 Q! t+ T. E8 D/ U N
for(;;)
6 R7 F) o3 X$ S- q1 c/ n
{
% I- t, x0 ?: l3 ~
# w; W0 J5 T" R; i0 a: J
}
_) I: `+ l& ?. H9 [
}
) F4 c# D! M) S) w
, p3 ~+ @6 @7 S( l5 l
/****************************************************************************/
2 z% l: ?! C/ l2 G; B
/* */
" b) ?; [3 d: f; \% u4 G" V! F
/* PSC 初始化 */
) `# j- t0 |' |5 ]0 K' X
/* */
$ r `2 a" L2 Z$ u! A$ Z
/****************************************************************************/
" y8 X) a2 D% d; w
void PSCInit(void)
$ Z" @- g5 `$ H' n
{
; h% i, Y7 b- k- t7 c3 \" h
// 使能 EHRPWM 和 ECAP 模块
, C( L3 J: y( d% t8 x* C. D0 K
// 对相应外设模块的使能也可以在 BootLoader 中完成
W4 _" G! R8 L: B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: n! ^; U0 z- H3 v% T2 A8 I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 f& l$ q& ^7 i% R" W6 g$ r
}
: Q( Q. U# ?! O7 i6 _# F# _
! H4 u5 |( w+ g
/****************************************************************************/
+ L3 X4 U* S2 o& i$ k
/* */
0 T, G7 c: w5 I8 A
/* GPIO 管脚复用配置 */
8 B& a$ ?/ Z' m
/* */
( E* q O% H! \! ?
/****************************************************************************/
: u) N4 L1 o1 h9 Z) {, o
void GPIOBankPinMuxSet(void)
5 f9 ?' G- N- c: a2 X* q, }
{
3 J4 S' a2 @) f9 R" w6 N
EHRPWM1PinMuxSetup();
$ a, t& b5 H; u/ ~. n- S4 v
% w% q- Y/ |) N9 k3 j
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 h! \7 o b8 \' w. q* `
// 作为捕获功能时管脚方向为输入
9 O! {/ O2 o( h- Z& G2 q8 S
// 作为辅助脉宽调制时管脚方向为输出
t7 \. I% L0 p2 A2 C
// ECAP2 / APWM2
8 c1 x& Z9 Z9 e) O2 o, j
ECAPPinMuxSetup(2);
! f; \8 E5 d' \
. `- S& O) s/ o* \
// ECAP2 / APWM2方向设置为输入
. X, G# s; }; M4 o. X* T! k2 y7 v7 b
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 M2 `3 B. X7 J6 F y/ d6 ~
}
) T+ G( W1 f6 w# R
4 \0 I8 F( }( o. S3 e- {6 r
/****************************************************************************/
6 a7 h* z+ {; w @4 v0 v
/* */
2 X# h; v- H& C3 L) ^6 _" v
/* PWM 输出波形 */
$ a1 B( F2 a# G/ Y# L% V
/* */
' p6 }/ `4 |7 e) C/ Q
/****************************************************************************/
* O9 @- c, F8 ~ C( G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" ]& r$ H; s3 E+ v, W7 @/ `
{
; X0 m* c* o7 l/ ~* N, D7 N
// 时间基准配置
1 Z$ P m- s$ |/ R' |) V+ v
// 时钟配置
, {3 O1 [& u( r6 j
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& k0 G U0 J/ m6 i- `
8 v( ?* y! d7 A1 Q7 [3 l
// 配置周期
8 F* i; J5 x# n! s) L9 \
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
2 {( {' |( B1 A3 s& G6 h
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
2 I3 u' b" G* M" f7 Z
& _' V6 A. t( @/ f( {
// 禁用输入同步信号
: ?3 ]) m9 X4 ^7 E3 ]7 g: u% ^
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 G% N* `# P* l* I4 o" K
( ^% @& d3 f1 \6 C
// 禁用输出同步信号
5 _/ K. C- t( {/ I% O: y# t
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% z2 B+ ?2 T: N- H9 o
) M# m( Z8 d# F5 {2 @# w
// 仿真(DEBUG)模式行为配置
# z' L; s# }% C* G# x* }
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! x0 H4 ^, \! `
% X3 ]4 J/ V% f; ~' \' Y$ l
// 配置计数比较器子模块
7 x: @" e# S1 v# M
// 加载比较器 A 值
4 Z4 ]1 s* Y: N6 `' X# u# m
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. w' s( c4 h$ k1 P
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! f! F$ ]6 L- N. t* Q
6 e+ Y% ?' _/ M7 Y: a
// 加载比较器 B 值
) B/ `5 P: E8 {
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
' s; C6 K, q2 e; g+ J/ K
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% @1 H% i9 _* V1 {8 X% h
4 g; t& r, n" [3 E/ h
// 功能限定配置(输出引脚触发方式设定)
' f8 m8 ]2 y& D7 r7 x' r! d
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! g z- r" F8 Z+ y! c' M% N. E
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: d/ ~7 A( S- r) i& D! D! B/ m1 R' a3 T
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 s4 Q F! q$ x/ B+ |* ^" I0 u9 K
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
1 m# e7 f q# y" }7 {
+ a( ~5 m+ E# K& K# C1 q% E+ s
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 [. k! T( j- M5 L" t1 w, l
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 C* s3 e: J* b. W. F. y
. {1 _" L1 {7 j- |9 m
// 禁用斩波子模块
A2 P8 q4 ?5 F( T
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) T5 c, T( S+ E
3 C: r8 Y" j h! Q% c' |
// 禁用错误控制事件
/ u) k W4 O+ I. `2 l4 i
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: A' }0 E" Q! I7 p
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) P, G1 u. D: x1 Q. J
S* m0 g& R3 N& M
// 事件触发配置
/ i+ Z1 ^- A/ d) e' `& n
// 每三次事件发生产生中断
r2 \0 v9 z6 k3 E* r) W1 F* W, r( n
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ _ V8 E* x5 ~
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 ]2 n5 r- x. Q2 [
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; u2 m) J& s' I0 i( r
// 使能中断
( p, |4 J" L' n0 B! R
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
4 m: E6 \$ M5 O+ k/ O
8 X& z% |+ ?, y( S# U, s
// 禁用高精度子模块
# ^& B( d3 L$ c3 R
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
* B2 R# ]; [% ]5 S( X N2 L
8 I7 l& H, ^' u' g
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
2 b2 r8 @0 L. _( s+ Q
}
/ T; S& o) ^# Y# b* x$ ?1 F
% I: `$ U4 ]1 `+ v; t# l
void ChopperWaveform(void)
' Z: r$ ~1 c9 `6 M
{
& k0 X* @! h- x% y& a
// 50% 占空比
" W$ U, r* P% j2 L5 b' D6 u
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
( J1 p( f. \6 x- C( a0 p. r/ X
// 4 分频
4 ~0 `) ]- P; u- u+ \: R! w
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 y, Q. L. z# F, ]* C
// 单个脉冲宽度
: L+ D2 i3 W9 `& U6 D
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
3 C5 N3 F8 f1 g; t# h# [( v/ ^% {. [
// 使能斩波子模块
6 z1 U1 [; r9 n' R
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 l4 h. t3 x: a* {
}
4 p" x" g% j0 j% x4 n/ C
* S! w' {; s! s/ G) {: s& [, P9 _
/****************************************************************************/
' x- H% ^+ Y9 F1 {6 b; Z/ R4 f
/* */
5 ?) ]+ W d( T4 d$ t- @
/* PWM 中断初始化 */
& v) `9 J2 |& t' m
/* */
: @# z+ A$ M: O7 ^
/****************************************************************************/
; q9 R5 c. y* x' `
void PWMInterruptInit(void)
( X5 Q6 i( e: r3 D/ [
{
' S4 S# d! c ~( m& X( |5 V
// 注册中断服务函数
( Y; \* a4 P8 D, r2 e
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
. X2 R7 p0 k2 B
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% Y% L, {; z/ s2 K9 O) ]
( j: k2 n8 ^, A6 |' ~# V0 s
// 映射中断
3 w \+ P9 d1 y, @9 D0 e1 g6 U2 Z
IntChannelSet(SYS_INT_EHRPWM1, 2);
% ]7 K( h0 J' M* \7 `
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
6 w5 ]4 [+ V. w$ o( S( w
/ |1 `3 v5 ]8 z! ]4 v7 i
// 使能中断
5 y8 j% M' [/ O8 h% r
IntSystemEnable(SYS_INT_EHRPWM1);
0 D, ~% S* @9 S) d% h- w9 X
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 C: d2 ~6 O5 ?2 V
}
/ V& C, }! m6 ?" o3 \* L5 }
0 U' H& M: L% P" ?
/****************************************************************************/
2 R& j, r. F% ?1 d& p1 M
/* */
2 S- f, ^) N6 W
/* ARM 中断初始化 */
5 [0 `" ^% |# Y [5 k
/* */
& o. O y3 i+ @2 b% Z$ ~
/****************************************************************************/
# z: B3 b7 W' w5 X$ t
void InterruptInit(void)
) W+ S" \- z7 x8 C' w
{
4 r7 M( J4 ^" G. V5 M# ~
// 初始化 ARM 中断控制器
; s' {5 m, Y. T! Y2 j: q
IntAINTCInit();
0 J8 W- O0 y" n1 m6 g5 [
& u1 b3 g2 g* V8 E1 b5 l- p
// 使能 IRQ(CPSR)
& |. i Z% g- `1 ~9 H7 @
IntMasterIRQEnable();
& I- @$ i7 f- s5 a& ?& C
' B5 N6 ^$ s6 S8 U6 c# K
// 使能中断(AINTC GER)
7 T4 @% @0 Z' M+ Z" _2 p$ ]: y, s
IntGlobalEnable();
( X6 D% p9 l3 ~ r P6 P! n* E
3 a0 U6 @/ }- u
// 使能中断(AINTC HIER)
. ?: O5 M# W: ]! c' V
IntIRQEnable();
3 ^! z! T( K+ S8 T
}
/ S8 r' E5 ]8 B2 P2 I
4 B# l/ `$ S0 r7 [4 {9 }1 s' U4 C) {
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
; Z) s# u# o3 P% u+ R/ J* n
/* */
! l2 R4 Y( g: \2 x1 k" x9 Q2 O
/* 中断服务函数 */
- y' D) {3 W% w/ V4 l+ L9 a: Y
/* */
; g8 D7 x/ T. V& L
/****************************************************************************/
& Q( V! p+ {+ W3 ?7 t- Y9 S
void PWMEventIsr(void)
+ x+ h" o! |( Z- }
{
7 x8 P/ ^' {, L3 m& e7 F! [% _
IntSystemStatusClear(SYS_INT_EHRPWM1);
" V. M* W8 Z; v% ]; {
& a% l& I; N$ N, |$ ^0 N3 |9 ^7 E
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& w4 d0 K7 R( E3 O: F6 ?
}
7 o8 w8 _0 {& f9 v$ [
+ K& o5 _/ W8 |
void PWMTZIsr(void)
' U# n& l7 o9 i; |6 g
{
0 l/ e& b% m6 C9 S; P" ]8 f; Y
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
6 N6 t' A, `# D. C
. g) D! C8 }9 Z$ e% c# l
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
5 \3 F9 N& ^8 L2 t
}
% L% Q. C7 g4 ]; F4 u+ y$ Z' w6 {
3 l0 }3 ?$ v" L
/****************************************************************************/
: b% ^; F+ F9 J5 u% w
/* */
1 k$ E. J- `. Y7 i% @& n7 B
/* 初始化捕获模块 */
# {8 _1 i3 d5 ]; i w
/* */
1 i+ Q/ {3 E0 U2 ?! \
/****************************************************************************/
/ I8 V$ Y f+ t- C% U6 H, Y: Y
void ECAPInit(void)
6 G1 Y3 Q. Q/ Y
{
) v; U f3 X1 K' W. k% o: |
/*-----设置 ECCTL1-----*/
! D5 H" F% B( f6 O( ?9 B
// 使能CAP寄存器装载
& f. D7 A G1 Q8 s; a
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& {9 @& o; [' }
// 设置预分频值.
# r9 ~7 ?/ |1 b
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ u# v) A ]! o Y
// 上升沿触发捕获事件
5 s( i1 e) q+ {
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. K$ K* E6 ]3 G
// 输入捕获后重新装载计数器值.
/ `; Z& b: O3 ?
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ D& u% G; B0 l! v0 F& O8 Q \$ V( k, C
0 h6 u+ A$ [! e5 T- @$ G3 i+ `% O
/*-----设置 ECCTL2-----*/
. h+ @2 j0 p' C. }
// 连续模式
- R# w9 e; U7 s$ @% g- ^
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
) K( h: }1 |1 q* M4 r( X6 V
// ECAP计数器TSCTR持续计数
& v; y& {+ P$ N
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 ^/ ~* }& H) x' o6 E4 ^
// 禁用同步输出和同步输入
+ b4 [. a# K3 x
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
4 W; Y( |$ a: M! H
// 配置 ECAP 2 为 CAPTURE 模式
7 Q9 S: I, E9 k
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
; i& W+ h! ?* j3 E; m
3 r( O' l. E- R! N% `" P! T' @
// 使能中断
7 W3 T. H2 D& w$ `: N% k
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
9 m; f5 K( b) V! T! |; J* W9 ?
}
4 s1 f) Q. |4 W# Z0 j
) s8 H$ G7 n; y! B) T# o
/****************************************************************************/
. c" \$ i' X0 f; D
/* */
& H; Q6 a2 g X5 U# n2 R
/* 取得捕获结果 */
I; u* H3 @8 {+ z! e+ t: n- O
/* */
! T5 q5 S. @" n. I5 T) n" R
/****************************************************************************/
; l/ S( l2 o8 O8 G
unsigned int ECAPRead(void)
3 x' z0 } [: Y' P. Z7 O% N
{
5 D, }! H& _; r( P4 Z
unsigned int capvalue;
- K+ f6 \7 k6 O# U! j2 H
unsigned long frequency;
( g* {( \4 a0 X/ v* D8 P& w3 J
9 ?# y' S" U2 U. U% f
// Event1 中断标志
) z. x& i5 @, d0 ?/ K8 c
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
0 N% Y6 H M! r3 W9 b
{
! U" S; k3 W7 t" S) |
// 取得捕获计数
5 h. i: X6 s+ w: }! J
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
' c; U2 ~8 U; _( q& n2 P2 F) N9 b
capvalue = ECAPResult.cap1;
6 b; V7 l% d4 I6 W$ z) B
5 h c2 b& o& `
// CAPTRUE 模块 228M 时钟主频
% }. [ u/ ]; T+ q y
frequency = 228000000/capvalue;
( ^( x' f; K; ~6 g4 }) U4 Y X/ X
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
8 x: u8 S; \$ N1 M$ U0 Y( y
4 C: H7 ~" {0 P
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) m* e) ^, Y$ }- T; H
// IntEventClear(SYS_INT_ECAP2);
4 s7 N8 ?& r! ?3 A' ^
}
8 I1 v! m: F5 Y: l
return frequency;
3 S) R. Q C+ P/ D% y2 w% ]
}
& h5 `, B. r: b( F
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, B3 C W* Y: v* s* H% ^' z) [- d" V
[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