嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
: g' |; M0 j* c' c1 m
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
5 T0 m: h3 Q+ f: }6 u
/* */
s' T7 N8 R9 ?: J+ Z& `) s
/* 宏定义 */
, \4 n+ [: x$ a+ x$ x, ]
/* */
. [$ x% ^" d6 ^5 ]
/****************************************************************************/
/ S1 u% B3 }' `3 _3 P3 _. D
// 软件断点
% X) N; v/ l: d; |$ g3 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
8 N( l& i* m+ a# h7 t& W+ R: h
* y: J5 r) K- Q, j; k
// 时钟分频
' ?, N% _% v0 n2 v9 g, S1 D
#define CLOCK_DIV_VAL 228
$ V- v, _* C4 J; S6 v
) p$ h) m& Z1 u O
/****************************************************************************/
3 y2 r, r. d! V' o% a5 n0 X
/* */
4 u6 O* V) {6 r+ n- s3 X: `
/* 全局变量 */
+ H6 c5 S' l2 x; N/ e2 P
/* */
* r" M2 I9 w* D0 B! c1 U1 v
/****************************************************************************/
2 q$ @5 ^ E9 i7 S; V
ECAPCONTEXT ECAPResult;
3 P' s9 r6 f/ k6 U; e" v4 f
. E9 w8 w7 T" f+ e4 i' k
/****************************************************************************/
$ Z1 H$ x6 p+ ~ @: L% M- |
/* */
6 u. m% v# w! o; S7 I
/* 函数声明 */
. }/ Q6 S7 m1 v0 E3 s1 \7 E# b
/* */
: [$ g |4 B8 g A( Q2 c
/****************************************************************************/
: A- @# w* o5 G) {" N4 Q1 i
// 外设使能配置
6 C8 E% B4 b: C+ R' F' I, M
void PSCInit(void);
7 B1 J( |$ d/ R* b- E* ]
+ c) i. ^: j- o9 ^
// GPIO 管脚复用配置
4 T, V- w" D4 U5 Y$ [7 U
void GPIOBankPinMuxSet();
7 D" p. g8 [# M5 T# o1 {& K2 F" j# p
7 F) U+ s B. Y& K; N
// 产生波形
( F0 ~" A/ S4 {0 J2 H
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 b: _- c& P: Y( F
void ChopperWaveform(void);
. i- C, O4 q; u
3 v, z7 k1 U( S0 K, c4 y
// ECAP初始化和读函数
3 D0 [# K- j+ D( u! r& z2 Z6 r
void ECAPInit(void);
& l4 P f6 Q: u7 S
unsigned int ECAPRead(void);
- \. [+ Q L, F# G1 o
& T7 l! k7 L8 ]
//ARM 中断初始化
7 C2 r! g% r! ~( e# N7 o% c/ Z* `6 m
void InterruptInit(void);
" ]4 `/ R6 X* O5 p8 m
1 C7 P( m( c7 o# a, s3 [5 g- X
// PWM 中断初始化
. N# U& o( {& O' y/ T* S/ O3 u! p# x8 n
void PWMInterruptInit(void);
( b, U/ h5 c7 A) [2 C( U
// 中断服务函数
O. h9 \' L% s! I
// PWM 事件
" u' I8 g" [' E, A
void PWMEventIsr(void);
- d1 g$ K- |7 _4 B1 A
// PWM 错误控制事件
9 S. W6 `3 P% b6 k2 s/ ^% q% J) {
void PWMTZIsr(void);
* S$ D8 F! D- k8 ~
f, q8 ~ G. T! X0 H+ Q
/****************************************************************************/
* x- \* N, }, m
/* */
( F' X$ p4 r7 I: v; {
/* 主函数 */
7 a! G6 H; P) j: O; M
/* */
' e! a9 C' q t! ~, c
/****************************************************************************/
; M1 U; j, o5 w) L
int main(void)
* G6 }4 U& p, p4 \. g3 w
{
; ~/ ^, T3 [5 ~ q# y, ~& }% l
// 外设使能配置
9 \, T) d8 {* @0 W* e4 t# Q
PSCInit();
& W1 w# G& B9 b) R9 V/ S2 ]
+ d: E& H7 }6 F# T* ^8 C( l4 Z% d6 `: U
// 初始化串口终端 使用串口2
) u; r, S: x+ a% q
UARTStdioInit();
/ o/ C0 t0 r3 b) X5 D5 m- \" u
% m+ L& F1 K8 C4 K, \ t+ ]% F/ V
// GPIO 管脚复用配置
4 g8 I5 G. V/ d2 K
GPIOBankPinMuxSet();
$ L+ u, x# n! f! F" I
; e) s" q- g; y7 a; t" @, m
// ARM 中断初始化
$ K6 u$ \ ^% g. U
InterruptInit();
( V/ p$ {: R) v S; x2 y, |9 L
" i* I. F1 h$ }- j
// PWM 中断初始化
4 U; e2 t2 R8 P6 L, p
PWMInterruptInit();
+ G& y3 W( n1 s- {) Z3 F I" A
* x) A+ n! j* M& Q+ Y
unsigned char i;
: }- S2 @0 _: j% n
unsigned int j;
! s/ R( B( a! I& E
' R8 J% E: P; D
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 `0 Q& B7 x+ k6 k: N. ^, q& D. P
UARTPuts("------------------------------------------------------------\r\n", -1);
; O6 Q0 L" _+ o* Y+ {% x
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
5 ?- ~- f6 s& h& ?
// 产生波形
& s2 \ ~: I6 t" ~' m
PWM1ABasic(25000,50);
# P7 v0 n* F; T+ A. a3 j7 z: }# E
v+ V6 p: O6 ?8 M% l
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
( R, S o: x( w* y, l! }, W- Y2 T/ O
UARTPuts("------------------------------------------------------------\r\n", -1);
6 \# o( b* f" t0 p$ _2 h
0 ?3 K/ z: a0 f; X5 N1 H' `) h+ E, l
/ F, ]2 G$ t% E' U
! \- }& z" h. u$ Q
UARTPuts("------------------------------------------------------------\r\n", -1);
* o, z# x5 v# q0 T/ I
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 Y Z4 `7 C3 F$ b' N: k$ L
// ECAP 捕获初始化
1 D7 c* H2 z, l, }
ECAPInit();
1 M; q2 X9 `+ M' ]. i2 K8 T
UARTPuts("Initialize ECAP.......\r\n",-1);
$ G! a v' N* k. J) W3 g
for(i=0;i<5;i++)
5 I0 G' n' l# w/ b
{
, W! o+ B g0 ^. E; H* [, a+ l& b
for(j=0x00FFFFFF;j>0;j--); // 延时
0 \# i0 e/ q/ m4 E
ECAPRead();
" A: W9 F6 ^4 g1 @
}
9 j3 T, X' k- h/ R8 r. M
UARTPuts("\r\n",-1);
5 c! d7 S& |- j, S% Q2 {6 o) [
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
% m0 a9 f- M, V4 F! z
UARTPuts("------------------------------------------------------------\r\n", -1);
- P, a- a6 s# z# F8 w
, a ~1 W6 \8 }) ?: @1 x, c% @! X9 Y
// 主循环
; ]# K- n- x( X: o, o
for(;;)
. ^, u: Y% D6 p( |, F
{
1 v% I" A# G! [; h6 S: Q
O. ]. [% F% z0 n; ]0 P
}
) E" U" Z" @# m& d$ X
}
9 U7 y; d& D2 I; Y
* F5 |+ w" I6 |: X
/****************************************************************************/
% j* B/ X' x* O- l$ w- a
/* */
% n* X; c5 }. m7 R! ]; {5 {
/* PSC 初始化 */
* b' O9 ] k r: f# T
/* */
( J( G: ^$ b, p% q: ~* f
/****************************************************************************/
2 {% H2 [' [4 ^, y/ f
void PSCInit(void)
a# P! E& L* y/ R3 X4 c
{
+ z9 o+ }/ q7 x1 A3 ?; m, a
// 使能 EHRPWM 和 ECAP 模块
) Z- b2 E6 e% [4 {$ D* z2 H
// 对相应外设模块的使能也可以在 BootLoader 中完成
$ l/ h( u# O% [" a" A8 Q. A
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- ]$ I* i7 Q, }9 j8 Z& O5 _2 X7 u e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% g; X1 u+ ^+ l+ `2 r7 m- Z
}
& }+ |+ d* B/ d; d* {
1 L/ ?3 A% v# b
/****************************************************************************/
0 k1 t1 ?5 r0 O" H5 Y) N2 a
/* */
2 W$ T% z/ `; \9 b
/* GPIO 管脚复用配置 */
# D. I4 }+ `8 y# L2 z
/* */
! f5 I0 [7 V4 i; Q0 v. N
/****************************************************************************/
" R" y1 }/ j1 H, t: e6 N+ G
void GPIOBankPinMuxSet(void)
% p! T, V" I; p6 ^7 o
{
+ s0 V7 x+ {) r- N1 E
EHRPWM1PinMuxSetup();
/ l9 z$ ~+ n5 z6 } z( {: C
$ E4 K. q( r( k( t9 W$ O5 X
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
5 Y: U* D' [" e3 |
// 作为捕获功能时管脚方向为输入
* Q* @2 E r6 Y% ^( }
// 作为辅助脉宽调制时管脚方向为输出
; u9 ^: V2 P# i
// ECAP2 / APWM2
4 n/ r8 N& }: l; \9 l* f9 F
ECAPPinMuxSetup(2);
) b/ M6 ` F6 o, `2 C6 F; y7 x
/ p, ?2 F1 U) C
// ECAP2 / APWM2方向设置为输入
3 U9 M) P e k; J0 @4 U
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. L9 s! D4 y2 Y# E
}
$ V8 a& {- P j. I1 g# u. p. U0 B: q+ y4 g
: v$ t' [" |. W# B0 I: C+ r2 n1 C
/****************************************************************************/
: f0 V4 o6 X( H$ J" }! y, O
/* */
: D1 q: `8 N/ Y2 D) Q8 N
/* PWM 输出波形 */
7 _ |) M% K% z w" ~
/* */
- P5 x( f/ ]* }3 Q
/****************************************************************************/
7 J, }% G7 L) N6 E# l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) R. K! P4 o* v$ m; i0 ^
{
4 t- n1 k7 o. Q- @* z" f7 {$ [
// 时间基准配置
& H1 Z' w/ ~! Y1 |; v
// 时钟配置
% v! i- I: h4 M4 D* ]
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
+ m" a- L; b6 D) |, ~5 g# {2 C
1 T: j+ K' B- S% e7 J2 j2 i
// 配置周期
! p3 i- E z: k; [3 e/ V
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 ?/ l7 Q% ?+ f5 S. D- U5 C* F9 T' l- B
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 n1 R, O p/ n; _
3 Z+ A% J K; s; y5 C7 y y
// 禁用输入同步信号
; u9 d: a: r0 R7 _. E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ D- Z0 [2 u7 B1 J0 }( p8 ^9 o
7 |9 J- q L1 i, k, w3 Y- I" j7 E$ _( z
// 禁用输出同步信号
1 E9 r+ b3 o+ J! x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, o0 F9 f. {7 C t% ]5 I; i
; `% Q; m% G n1 R; [! b" i
// 仿真(DEBUG)模式行为配置
7 Q; ^: F3 Y3 @+ i
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) _3 K: E) z" @ H" X3 x( {# m) r
, j$ ?* c% J: P V
// 配置计数比较器子模块
( X" h& j" |4 g2 h9 e4 x2 c
// 加载比较器 A 值
4 O+ r% ]; c! s7 J
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" v/ I O9 _: \; X1 y3 Y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 I6 X6 `1 {8 \6 z: k
& q) n# g; \0 F0 H! W
// 加载比较器 B 值
; v* M* u1 q7 j- h% U! N
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 x, h4 v, |: g9 q+ @7 v
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, v/ A. D5 W$ K# ]7 G( i2 i
0 y+ \6 `' H. e6 ?4 f
// 功能限定配置(输出引脚触发方式设定)
! [ [; R1 C+ t; n+ K, w5 l; t- \
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! G9 a" V3 q& d2 z, L9 Q
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 J( b5 o ?& `! I
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 ]6 i% K1 i+ T
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' s2 D& a0 C# X& ^6 z3 M4 R
# x+ b# J# \! [% p8 U" o; y
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 j3 }- ~3 L/ H& ^' u
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
& K+ p. U; t% M9 M8 |
3 y) F& E2 D. }
// 禁用斩波子模块
+ o$ c L, h0 u, x( z7 M; A3 H+ H. y
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, x; Y' `; M2 m5 {
7 x) O2 P; ~* Q5 V) e% ~5 ]
// 禁用错误控制事件
1 B" @ K/ n1 t
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- ~! G; p) c/ L% r4 q: J9 J( W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
9 K E4 c) E: F9 I4 T
7 N+ Q+ y8 p# `) B
// 事件触发配置
" ~7 S& p" k; M5 ^
// 每三次事件发生产生中断
9 Y2 w# G' p: `3 T$ w) R. C
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; r. H# j( H* ^8 B) E9 L
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- V* J4 b! R& i; v( H- ^1 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) [+ ~0 |& P# ~9 M( g0 I" Z; Y4 [
// 使能中断
: T( a% e/ H: j
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
n/ R2 a& p$ y+ w! D
! g$ M0 }2 R H1 U
// 禁用高精度子模块
6 |6 U- |+ A; ?( B% k5 l
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; V. l5 a; w! \/ [; A P# b( Z9 U
( m4 S7 K5 G; L* G$ h0 e7 N, C
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# _" Z6 }. X( o! w' w/ ]- F
}
5 W U1 T2 ?9 J
9 g) ~7 P3 ]. X. u4 ~) x
void ChopperWaveform(void)
( m; d% o" Q8 k9 B0 L
{
( Z9 N+ q/ T' _
// 50% 占空比
$ }' j5 m7 ~# Z+ Y
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* A' `7 j8 C6 n( \4 w B
// 4 分频
2 [5 e) \- H* J/ @
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: n1 Q4 {3 S6 v- t
// 单个脉冲宽度
- N; N! z+ Y Y
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
6 a* _% I2 d' B8 Q3 ~; ?
// 使能斩波子模块
/ B1 U$ K* |6 r- K; a7 A' P- i8 ~
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
' R3 U. x. d9 f$ N) b+ k1 x
}
) ?! l4 a" J) S( R/ z6 y; h- a
$ ~: v& H% Z0 E
/****************************************************************************/
( s( V2 M8 I# a7 W
/* */
6 q1 d$ Y. ~) }0 u
/* PWM 中断初始化 */
" B2 @: v7 N# Q) R, z$ g5 D
/* */
1 C6 E7 Y+ K* @1 }' g( _7 i# h8 F
/****************************************************************************/
: F: S: l9 |. W5 v! u) f
void PWMInterruptInit(void)
, A2 k% t4 E5 f2 q/ n, }8 m
{
7 O5 x3 [/ ~: B: L7 S
// 注册中断服务函数
% B+ J# @# N' F8 V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; h8 `. ~3 u8 N, I$ }' n' Y; I
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 ]# @. k: o; l0 I- ~1 {
% X7 e7 @4 H! T( j, X
// 映射中断
, F% ]4 o( X% e, c6 d! s4 F, A
IntChannelSet(SYS_INT_EHRPWM1, 2);
1 N! V [ @8 Q2 E, w8 ?! H4 J) i
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 A8 b+ _3 M2 d3 h9 j) t
3 z0 H& j6 H8 u( X! [
// 使能中断
5 t: I! g' k0 i( ?) |5 p
IntSystemEnable(SYS_INT_EHRPWM1);
: g2 W1 u, B; ?
IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 j) H/ Z6 S+ p
}
5 G& f1 i' T; W
0 `. D# x7 }4 n# ^0 u
/****************************************************************************/
) v/ {5 }3 z! l
/* */
6 @: d9 i; J; l u, q9 v
/* ARM 中断初始化 */
1 s- w9 o, S" N% u
/* */
8 Q" q2 ^2 i6 m9 c! F$ Q; r
/****************************************************************************/
4 I5 W' M$ m' g+ k4 @
void InterruptInit(void)
4 N% q7 T4 A% }$ _
{
, b; r! E8 J- B D# x
// 初始化 ARM 中断控制器
7 R- D7 r- N, |* J$ O; ]( ^
IntAINTCInit();
4 v5 v8 e8 C9 B+ w" t, H
9 ?& _: q1 w4 M; s7 w, h+ M
// 使能 IRQ(CPSR)
6 m+ ` ?$ ]/ c+ H: a
IntMasterIRQEnable();
8 ~; x$ ]' k$ ]! T
2 {/ Z3 u- |# w7 ~$ F) T
// 使能中断(AINTC GER)
4 |8 p. s) H1 h/ v4 U7 R2 z
IntGlobalEnable();
. ?1 }+ o% v; j C' o' C
* ^3 l) M! \! V7 p
// 使能中断(AINTC HIER)
7 u: a% H, z/ \" Y% F r
IntIRQEnable();
; M" t Y5 y% X- B( a, _3 C4 a; S
}
) S0 ]! [, k. K
/ f$ Y% A( H2 h- }9 ]7 e
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
% O' @0 Z8 T: {2 s+ L% @
/* */
" j% n! A9 z( Y9 s
/* 中断服务函数 */
: H9 {, B n c' [) U
/* */
. u' G* ?9 g6 R# i6 s
/****************************************************************************/
4 s z0 E5 w" k" i1 t
void PWMEventIsr(void)
' o& s* G3 v$ W8 l$ i, Q% F" r
{
- h! b2 Z+ \7 r+ [" e! |
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 ] |' |) A2 A6 v
6 U! U; s% V8 H- R& X: y. }
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, k7 z% M# [% X5 ~7 I
}
. {% `& a) y) U$ W# T8 C7 m
- J; U% J: [3 b7 Y0 W, {
void PWMTZIsr(void)
7 }, h: c6 c) X3 ?+ Q. i7 P+ o
{
% e9 s1 n2 J( w# J
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
) u3 G5 ]3 O# R
- |3 F* c$ H6 }8 y7 R
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
& Z: C' b5 [: Z A
}
# N# i+ y) {- x0 I" l
* ~1 N) b4 @3 F, {/ D
/****************************************************************************/
: O7 X& x0 z1 N! ^
/* */
, k2 x% E4 t4 t I
/* 初始化捕获模块 */
7 G( ?0 l6 a1 T4 J3 u1 x
/* */
( l0 O; j6 ~# H& \
/****************************************************************************/
5 f4 {5 c' v1 b( w; E. @
void ECAPInit(void)
6 _4 S, y' G; X# Z
{
1 d2 g3 u9 a% {
/*-----设置 ECCTL1-----*/
( Q2 _" W% n2 i4 O
// 使能CAP寄存器装载
5 [6 f5 a! e4 Y& A" @7 K: P
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( x! h+ @8 S5 n+ h2 r
// 设置预分频值.
) y# }" Z, B2 d
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% U& |/ A/ f1 b) x
// 上升沿触发捕获事件
6 [, q- X |* E$ Z
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
# Q6 {% u: J( `1 }; N0 ^/ k
// 输入捕获后重新装载计数器值.
5 f1 {; M6 ?+ z, x2 I$ Z% y
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
W `: K1 `& I8 n8 M s
2 E! l* [' T- l
/*-----设置 ECCTL2-----*/
3 U3 _8 C% d4 Q) h
// 连续模式
7 M8 M) C/ B/ Z6 l$ G
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
6 S# j m/ s, \+ k3 u* u/ i
// ECAP计数器TSCTR持续计数
# X2 ~4 |3 \9 z7 m# r9 J; h
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
8 p4 L n/ n$ w- C/ J
// 禁用同步输出和同步输入
& B+ o* G' a( g% z
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 M) e7 }# b6 {; J0 \$ {. S: Z
// 配置 ECAP 2 为 CAPTURE 模式
/ d2 }* n3 q* F7 N+ ^+ v2 \
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& m- p5 n/ ^9 a( H/ ~
3 s6 s/ s0 R2 `+ P; X
// 使能中断
5 P+ @( {* a2 p( w: Y' `6 S! L
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 A/ a! b1 \# |. v! t M( _! \. u
}
% ]/ N- g5 V/ x& o4 L! ~
# \5 e5 s4 s; C* b
/****************************************************************************/
: J. L4 g8 o# Z# W2 r
/* */
3 X* v$ V" n% m( k* i# n
/* 取得捕获结果 */
/ g9 ~! }" @: C* k- O
/* */
4 `+ t: U' H7 i0 l8 ?
/****************************************************************************/
- R* l5 s- [3 |: w& K2 r+ [
unsigned int ECAPRead(void)
+ G; L7 {- f' l2 E6 W# b0 C' _
{
& Z. L9 X7 {+ l0 I1 `/ p# L+ X7 e
unsigned int capvalue;
2 [. w5 A" ~! s7 T+ ^' J! O
unsigned long frequency;
% c5 F+ b' y# M
% f# j& L, w* G4 m9 }) l* V
// Event1 中断标志
8 Q' _( {+ E4 \4 W" u2 J# {
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
, g6 T+ ?( a {! C, M/ l
{
/ a$ [- V2 K' z' Y% |& g
// 取得捕获计数
( H" G3 b6 B) H- ]+ I- A
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
5 M# o' J- |5 U1 o% l' ?2 q
capvalue = ECAPResult.cap1;
1 p2 v/ N7 K& P9 R: X
, L2 a! Q0 T# F$ Y. \1 g. t
// CAPTRUE 模块 228M 时钟主频
* r8 R7 @3 K5 b& s
frequency = 228000000/capvalue;
, }# S+ V2 _* L a5 [
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
6 X9 u- a$ Y& I& J# {1 ?2 ~
7 M- k* a' M$ P( G8 a) O9 S
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
2 t( C4 J" A5 o4 ]% P6 w9 b9 p
// IntEventClear(SYS_INT_ECAP2);
1 E1 N6 W {, D6 G4 w
}
7 [2 k9 q+ w6 i
return frequency;
0 L! i- C* d) d' w$ X
}
! E9 M3 T) f% m0 k+ e8 Q
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* m: B, F5 Q. u2 g) R. i
[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