嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% G9 d) j, w6 R2 _, L* W
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
# N& K* R) D0 `- N& l# C
/* */
% Z/ f- K; s4 {' b
/* 宏定义 */
3 T) ^! s6 E2 c1 }+ H4 S: S
/* */
- K8 v# n2 Q4 h4 t
/****************************************************************************/
6 [# `! s$ @* ]5 ^0 @
// 软件断点
' h$ f3 z' F5 j# f0 f+ s
#define SW_BREAKPOINT asm(" SWBP 0 ");
: v# q" h8 U& n( G" u1 O
" H& ~2 E4 w8 N7 H6 F! @: J% X
// 时钟分频
$ R; C0 m' _6 D Y( Y- t
#define CLOCK_DIV_VAL 228
' i: ]. G4 t4 E2 X
0 }- a( Q ]$ A, o
/****************************************************************************/
1 Y% V0 T- a/ ~% F; X# S
/* */
4 B- R1 j( l9 q( k8 _: E" ~
/* 全局变量 */
- Q, b S; ?$ V5 O' Y- u9 U
/* */
* {% c& R; |! A3 x( U3 R
/****************************************************************************/
- g5 ~9 w( s' q4 J3 V j- o
ECAPCONTEXT ECAPResult;
9 |- r* h! f* F2 w2 x) W* x
V1 n/ {9 @7 f
/****************************************************************************/
! o; p+ F1 V5 K C u5 o9 {- X( j
/* */
7 [' n. P; W* ]5 Y- T) U, q J
/* 函数声明 */
' R2 {$ m5 ?& j) d
/* */
9 A7 \( U2 x& g S
/****************************************************************************/
5 ]$ i4 R% [0 L( @; N- K1 O2 z% C/ n
// 外设使能配置
- _, D. M1 ]9 x4 u/ W& ?
void PSCInit(void);
. v7 D1 A/ ^7 G @" ]- W/ X2 D( F: o
3 {1 }% P) e- Y. c
// GPIO 管脚复用配置
7 }& a6 E6 n/ L) b' U9 c: ^
void GPIOBankPinMuxSet();
. J0 r/ V0 \0 y2 r0 R
! o& F6 Z5 j& s% F" f
// 产生波形
( D* r0 N! l6 X% e# ]) `* D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, j& ]/ i5 k7 D
void ChopperWaveform(void);
, d* y; F( e- e; y
$ i3 q$ w; \- Q9 \; S' P) a; P3 N
// ECAP初始化和读函数
, m) W8 I$ |8 i/ D+ z) O9 `
void ECAPInit(void);
2 a; l& }9 R! B/ G/ ]
unsigned int ECAPRead(void);
4 P% m' g8 R% V2 `" B
: |& D# f! `. Z7 X6 {9 P
//ARM 中断初始化
0 s6 {5 O: ~2 h: ]% _- \
void InterruptInit(void);
1 U# Y. t. P7 v; Z, y# _
$ c* e% `# x, z1 ]5 v; z
// PWM 中断初始化
" M$ o% @6 n* }: z% ^' ^
void PWMInterruptInit(void);
# r$ s/ o4 j( A) D
// 中断服务函数
. N& m% p% g, h9 M1 A
// PWM 事件
9 \4 g$ C" w: G; y
void PWMEventIsr(void);
7 d) \/ N, _7 h
// PWM 错误控制事件
2 u4 R* S8 I. v9 ?- l0 W
void PWMTZIsr(void);
0 O2 e4 n8 v9 R2 z3 ^; D$ D
/ I# `9 D: z, `8 k. _
/****************************************************************************/
1 D7 a& i9 ^8 l7 {2 d) R
/* */
" L( ~2 L, s) b1 J
/* 主函数 */
4 \: }8 ?4 T/ ]. t2 y
/* */
( \5 j) V' l* |7 r$ h# a
/****************************************************************************/
% @$ F1 t) w7 T% e; h
int main(void)
0 `6 n% m9 y. O @9 O
{
& t( f/ D2 H7 X$ Y# ?
// 外设使能配置
& Z2 \$ [, m3 R2 o
PSCInit();
; V1 N) K2 k9 G$ r' T( f' d0 f; l
1 d1 T7 ~' C7 U3 D' S6 U
// 初始化串口终端 使用串口2
# S f2 ~- l0 I- e+ f6 X7 U. y
UARTStdioInit();
5 M! {& S: B* y* k8 y2 d
; H( {* V) m/ ?% X: ~+ ~: P% I
// GPIO 管脚复用配置
) d. G1 y% M, { L, r, a
GPIOBankPinMuxSet();
7 Q: s! {) ?" |) o* Z0 Z
* b% q1 O z/ w) a; w; R* E' o
// ARM 中断初始化
$ F [+ A+ w$ q
InterruptInit();
8 n R$ f l/ ~# X& ^" E# z8 p
4 s2 J6 Q* n( c x5 i
// PWM 中断初始化
6 [) |0 v m' l* _( T$ `
PWMInterruptInit();
* W9 s( _8 ?7 G; N) Z" S" o
) V1 d h8 ?! i# E w% s. {% b& p
unsigned char i;
' \! z. y: @3 ?0 b$ E
unsigned int j;
% Q0 }0 s- i I/ [9 k! z
. U1 @! G0 v9 p6 o% o2 P' X
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( p; @+ f0 x: g
UARTPuts("------------------------------------------------------------\r\n", -1);
* t( u7 w: i- R# w; T# `) k
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! c7 [4 c0 [0 g0 t% g& _: J
// 产生波形
; g( Y4 X4 H9 L) c3 b( N
PWM1ABasic(25000,50);
6 Z3 M) [# w) N; E: Q3 i
4 E1 K! z- M" o
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 ^" j. ~- J- q) |( S7 w" ~
UARTPuts("------------------------------------------------------------\r\n", -1);
$ K- y% I" P+ Y5 z6 D$ S
( _1 ? }0 i# c( Q" g% p+ ~* ~
: s% @5 D4 W' s) m8 F% G7 F
A% c# p# u# L9 p4 ]3 i
UARTPuts("------------------------------------------------------------\r\n", -1);
% R" l7 o: B e! b5 V
UARTPuts(" C6748 ECAP Test\r\n", -1);
$ P: q; v5 u' N5 i9 }2 k
// ECAP 捕获初始化
$ t1 V! t. v2 L% i; _2 ^- i
ECAPInit();
4 b: ^* F% [5 V% z2 E
UARTPuts("Initialize ECAP.......\r\n",-1);
4 r" ]& H" E5 a/ j
for(i=0;i<5;i++)
+ b( h* K. d k$ Q0 j
{
" a5 g7 T% q+ d2 D
for(j=0x00FFFFFF;j>0;j--); // 延时
( r# \$ Q. c6 E
ECAPRead();
4 p# E E* J! u5 J0 i3 U, d1 s4 A
}
1 n% ~6 y) E" C' l( h# t$ b, e2 o
UARTPuts("\r\n",-1);
e i" X4 w! T# N, }2 v
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
$ a4 y6 w( M0 u2 l- G) N
UARTPuts("------------------------------------------------------------\r\n", -1);
4 T* t1 m# |: H" q/ y. O d
- e5 M: q8 X' [. H
// 主循环
) d" R" T9 a) X& X' _
for(;;)
( r, C( y7 D0 K& v! U, ~
{
1 B4 |* ^8 R/ }" c5 e0 u
5 U2 g) J, b; d% Q0 k$ q
}
2 d( V# u5 ]" d8 K* Q D7 Q
}
+ w+ s: k" y6 c6 j
, S3 t3 E; t! { P1 r8 ^) U
/****************************************************************************/
. ?* R) f2 t" {5 S4 z
/* */
8 C4 U; M+ u, Z) M; i& @
/* PSC 初始化 */
; L9 v$ P$ C+ r% J" [
/* */
% N/ @3 D- |; [* @( x6 Z
/****************************************************************************/
6 e; T; H0 o' ]$ j1 @$ K
void PSCInit(void)
9 k7 O1 y: w" W- r9 M
{
7 d/ \5 X+ B5 C, ~7 k' I+ i0 I
// 使能 EHRPWM 和 ECAP 模块
& Z3 H. y A7 Y
// 对相应外设模块的使能也可以在 BootLoader 中完成
" Q/ \ F [( N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 R1 B3 o" c2 R# k1 P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 i C( X6 H& J% \4 X2 Q
}
. \3 Y% E) {& ^7 t" ^
$ Q6 j5 O# w# I- ?+ c" F
/****************************************************************************/
( k! ?4 o% M- [! m
/* */
: |! C( t( Q5 A( E' E* g: {
/* GPIO 管脚复用配置 */
$ }8 i6 G; o5 F5 v7 \7 B
/* */
& w5 z) D! B5 u5 ~
/****************************************************************************/
3 V. S2 ]( i+ n
void GPIOBankPinMuxSet(void)
. r Y) C' J8 m( \( Y
{
1 W7 y% `9 @( ?) f8 {1 @0 [& t
EHRPWM1PinMuxSetup();
# t6 u- f3 Q. q
" F# M2 e4 I- p" ~! D
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
+ |3 f4 G4 q; y4 s$ Z, v
// 作为捕获功能时管脚方向为输入
( D) [4 b5 i2 w2 ?' [* D
// 作为辅助脉宽调制时管脚方向为输出
4 j2 ]. n! W; ~" j
// ECAP2 / APWM2
+ k' Z$ s X' K4 j6 o+ N
ECAPPinMuxSetup(2);
1 j/ G' x2 N; B( h" K) Z
: x# S8 L0 k! k0 Z
// ECAP2 / APWM2方向设置为输入
$ l8 v3 }% R) S T$ n
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* N8 e7 y+ M. m! I1 `6 U$ e
}
0 B! m. C" E1 \1 d
5 q/ [1 L- _3 ~1 ?4 m
/****************************************************************************/
( e8 ?7 D9 m% t- r t- d6 D
/* */
8 X5 p# p6 s) J; m+ j |
/* PWM 输出波形 */
) f/ g8 Z$ Q. S6 F; g
/* */
: E! d1 l* F6 m) o
/****************************************************************************/
( c8 I; G1 A* L6 X! Z$ b4 H. g
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
4 ~$ H! y6 h. K# M2 G) J9 Q
{
$ @ A, M( @* Q' m" S7 W6 ?% I
// 时间基准配置
" U% D5 r5 K% q
// 时钟配置
" r3 `8 x# x/ g/ R
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& a, C- d1 f6 M
; f: n1 [& ^& I8 ?* u- m/ P
// 配置周期
7 u# z, f w0 q, J0 c# b
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
d/ q+ ]2 H" F! w% H) v5 c
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 `, g8 v- H: U7 h
' ^3 ?/ R# R4 l: ]1 O* @! f; L8 K" T
// 禁用输入同步信号
0 W$ ?7 j6 N4 [7 C' i- y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( N* g# f/ Q; e' V9 ~
4 F5 k- m* Z- ^' Y
// 禁用输出同步信号
* M. @" b$ ^: A j. s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, A1 Z- A5 D+ f. k9 j% ^, L
/ c% x( T2 |9 K! u
// 仿真(DEBUG)模式行为配置
. q$ G# F+ d2 J3 c+ J6 ^
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# w% P0 }) D3 T: i0 Q: l; ~- H( C/ C
3 n5 e2 D& Q! j2 p4 o
// 配置计数比较器子模块
6 e2 \; I( Z) g8 o
// 加载比较器 A 值
5 X* I' H2 ~9 U9 R5 U4 i/ \* m
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) f% t' _9 d3 r: f D5 ~
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( x* F4 Y4 h5 q! f
9 T% s+ X8 w8 J# d' ~/ n! B9 r
// 加载比较器 B 值
$ O- P8 S7 P `9 |' s3 D7 M
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
7 z( M* s/ i% }; `8 ], K2 m- D
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& X W- [/ y: l9 S# c `/ ~
, f# |, U% Q9 I
// 功能限定配置(输出引脚触发方式设定)
8 A+ R8 U% {0 ^5 d6 Z& Y; T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. ^' b- v( t5 z; w+ D' o/ ~
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
* @- W5 V2 S- ?, V
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 f: j" F% a1 _1 p" z
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
4 y2 T$ [3 j' i! Q4 I7 x, E4 ?1 ]' G
) v* U. M+ H2 C$ r
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: D: s! q1 t6 U8 T; A
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. V3 @! |- X% m' l6 ?: b5 U
- j* U% {/ Z$ I" h' x7 k. v$ |
// 禁用斩波子模块
# I% K) n% C4 s( f8 D# O, }8 `
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, F I0 K( @/ q
: \1 C7 ~2 i: E
// 禁用错误控制事件
* E3 V. X" W" L( `8 T6 N
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
+ f' t( K ^7 U3 H
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
0 `) H1 N. W; G9 x% N1 k, G
1 M1 m) Q0 X" ~# Y& h
// 事件触发配置
$ |; ?7 q) N& {1 l$ Y( W, L
// 每三次事件发生产生中断
1 L( F" u! i) e0 P
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
9 d! Y" L/ S$ x0 ^9 ~: _9 F
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
/ A, E" I- k8 ]* s# f2 D+ B, ?
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) j/ E6 L5 u+ F* p4 R- R* k
// 使能中断
( i' Y/ p2 Q& W3 c( f' f9 B
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, g v! P( _# q, o: A
! i+ v4 p, k; n
// 禁用高精度子模块
* o8 m' G a0 L- r$ p
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
0 J% n7 Q. y( c5 t
! F; Q6 d* g2 j: L# d; R3 Y
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
$ p- }' G F% r8 q% {- E# W
}
6 T. K4 e( U- Q- ]5 N9 m; a/ `
9 _: o+ j- L8 \$ S
void ChopperWaveform(void)
; C0 C3 }5 x$ {4 C0 Z) d: a6 w0 `( d' t/ H
{
. _" S) f3 @- a2 N; @ J
// 50% 占空比
& P$ k! ]) m) B* @
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
! i. N/ X7 W. B+ Y
// 4 分频
; u6 Q9 Z: |2 P, f. ]4 Z7 Z; e( n
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
; r( J3 B' |' Q$ R* m* }4 |
// 单个脉冲宽度
5 ~' W+ I* l V1 n: a2 S, f
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
& c' v# S3 [7 h4 R" K. G) H
// 使能斩波子模块
Q5 K" C% x1 ~( o" M
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: n) [* O c. |( d0 Q2 _! A; |- \# b* y
}
1 C l: v3 P: p
: V) N9 L" R; i
/****************************************************************************/
1 H6 n. l M' f# U7 V6 g
/* */
* H: q* n7 {7 R! V
/* PWM 中断初始化 */
) N1 V- `7 F: X. o" ^9 x( I$ h
/* */
9 r" _) r k+ b2 g* u8 k# m
/****************************************************************************/
9 }: f2 B6 d. p$ R, q. B% R; n+ A
void PWMInterruptInit(void)
6 g# t2 F' B! b5 g9 q2 k
{
5 g) W9 J+ G1 Q8 m
// 注册中断服务函数
9 M2 P' i' K* _' d* ~0 @
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ D2 K$ l& l! B" y- ]% N! m
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" F2 j" |' p/ e% }" A
# c. s8 l0 H% a! V5 r0 N
// 映射中断
B b/ s2 A' Q& ^3 z- b- p9 R0 W7 K
IntChannelSet(SYS_INT_EHRPWM1, 2);
! c' g+ \! j4 F- f; \! I, U. E
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
2 k9 `/ r% S' V, V( e/ u, _0 h# }
6 f0 {. B9 i8 i( H' K
// 使能中断
' q2 [6 K8 o# ^$ z+ [: X
IntSystemEnable(SYS_INT_EHRPWM1);
Y. N8 p6 g7 T7 d
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 l% H' ^4 r* o& j
}
1 N" l' [6 w* e
- D) I [8 {, s1 u
/****************************************************************************/
9 h8 b1 q5 f4 ]; q
/* */
! e* b7 g6 o$ y0 t/ w
/* ARM 中断初始化 */
8 r. ~9 \# Q3 w' K" Z/ a
/* */
; Q* d% o' ]. e& K3 L6 x
/****************************************************************************/
$ r4 w' ]6 b4 [6 }5 i
void InterruptInit(void)
+ Z/ J6 y. a- s
{
- l& K0 f- m1 c Y/ m3 t
// 初始化 ARM 中断控制器
1 y- W/ \! N' g: U5 ~
IntAINTCInit();
% u3 {: p$ G' O; L* k
& Y! H" `& R, t& f6 U' F
// 使能 IRQ(CPSR)
) P9 Q+ [6 d; v: G
IntMasterIRQEnable();
2 n! o( \. i2 w/ a* b
- G3 r1 L* Q; d* `$ G# ~
// 使能中断(AINTC GER)
! }% O) U5 z: ~
IntGlobalEnable();
+ n1 c k2 m# p3 t/ h8 s `
% ?9 w* U3 c! H
// 使能中断(AINTC HIER)
% u) W, S6 l0 u6 H- q8 y/ f0 ]
IntIRQEnable();
8 a: |; G5 @9 |
}
5 {) N/ Q& E4 h0 J- x2 R4 C5 l0 o
3 Z2 _* U5 ?( ?) f+ b$ \1 S
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
- v; V, D1 d$ c* a* s
/* */
; K/ {0 Y& }" a6 ]3 W: M: [
/* 中断服务函数 */
% @1 D" R" m( e+ W% A2 {
/* */
2 |7 A& B9 {* P, o1 Y4 ^
/****************************************************************************/
# \2 L0 X$ v* q# I5 o
void PWMEventIsr(void)
5 g! ^) x$ x2 C" `
{
& w Q/ V6 o+ q6 h8 l: G$ X. ^
IntSystemStatusClear(SYS_INT_EHRPWM1);
5 h. c2 [7 ]1 G& Q* M
1 `3 G; H' E4 k+ v, H, f! q6 A' C$ R
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ J, G6 X" u& Q9 N4 H3 I' _# L
}
1 m R, |9 n3 D4 |9 ]) D b: o
3 g3 {' V9 u$ G- T J# Z
void PWMTZIsr(void)
1 l3 j( M6 ?$ q6 \
{
. d1 i( J0 r2 ~1 O4 q2 f. I/ [% G
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
$ z" h- Z3 g! H& E* n( k
/ H8 T2 c$ [0 s2 S( d3 U9 S
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 T# l0 ]: I6 z: V5 g
}
2 j8 y' o% Y( p/ d5 S" A
6 ]# q9 ]9 G: w" Z3 L+ q
/****************************************************************************/
6 x+ t+ G' I5 E- v4 \9 W" m
/* */
5 b5 c) e7 B) D1 I8 C
/* 初始化捕获模块 */
b7 H+ Z! J2 S( R& s5 n& e9 u
/* */
1 I' G, ~8 I9 ?- w" f
/****************************************************************************/
4 E8 U* Z& Z! s& W: u
void ECAPInit(void)
+ I8 d' r! Q. p Q: ]" N" J
{
" o. r0 S9 W2 H+ R5 a2 ]" a. |, {
/*-----设置 ECCTL1-----*/
6 M. Q- E3 y! D6 I) l4 J8 r: o) d
// 使能CAP寄存器装载
% O+ W' B4 M; n2 w$ `/ _" M
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
{& B+ r/ Z; c1 [. o8 W
// 设置预分频值.
6 {+ w$ k. K3 L, |" s& p
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# V9 j& e% ]/ Y
// 上升沿触发捕获事件
. l3 ^& Y% z3 G) F6 @6 ~4 t
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
9 I5 F9 N- T) f0 Q% H6 C* K
// 输入捕获后重新装载计数器值.
2 q k( e% ?! L
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
4 f6 ?. x0 n( [2 \
+ n! S" x& U6 V" B" r9 A, q
/*-----设置 ECCTL2-----*/
& _5 t2 G% }. ?( C4 v' u! c" t3 H
// 连续模式
9 V1 h4 ]5 Z0 E1 q0 c
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
; K& A1 m, N; t8 l6 {1 `1 }
// ECAP计数器TSCTR持续计数
: o: s; \* m: z: v5 @
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
i) e9 K& N, ~; O. Z6 H: P8 g
// 禁用同步输出和同步输入
7 ~# s% u/ _1 @) o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
% w7 V/ p4 o& Z, z, `. |" p2 ~
// 配置 ECAP 2 为 CAPTURE 模式
~+ f4 @. B3 P1 m
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- E i$ w( V6 r' ?& T% C& c, K. p
8 E* D J7 G6 M( k! v
// 使能中断
0 V6 i+ v1 \; C
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! {3 h9 m) l' u0 h+ \
}
1 X$ ]) L* W4 B) N! f; [0 x9 l
6 Z4 O; s$ J! c+ Q# c& }
/****************************************************************************/
" u/ k% |7 t$ K2 i; M; K- }7 i
/* */
2 V: O5 F, W+ q
/* 取得捕获结果 */
3 n6 H4 W) {1 Y$ @ |
/* */
; A1 \: k; [0 S) `) h5 e* X
/****************************************************************************/
, S8 g+ `: v. k
unsigned int ECAPRead(void)
8 c: r H# v' j& w
{
9 ` E. F2 O2 w" K3 ?/ K0 V
unsigned int capvalue;
% J5 ?2 s# q2 `& a8 n
unsigned long frequency;
3 N. Z, H( ~4 l) |5 \
+ s# P* ~! u" ~( o5 C* n5 J
// Event1 中断标志
( T7 J. n5 u8 C& Y0 ]
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
8 z& k: _3 k6 f3 a. R# S! y
{
. I5 V% O+ ]* M" C7 V8 P9 D
// 取得捕获计数
) p9 m8 t. B( j" X
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. j4 k. w9 S. l$ W
capvalue = ECAPResult.cap1;
7 R/ E% G* E( Z# u# Z9 t6 Z% m3 Y
1 }! ?% K+ Z8 ~
// CAPTRUE 模块 228M 时钟主频
" E* @# N' E) t1 i
frequency = 228000000/capvalue;
- R7 N! @/ n) p
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
5 Z8 M3 I' I5 T$ N' u8 T
: ^6 o. o( L# q/ X. ]# o
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" \5 m& j' `" q. p; e- e1 W
// IntEventClear(SYS_INT_ECAP2);
. n+ p1 q& e4 f# C, M/ g
}
3 r; G: n+ q6 G$ @" b
return frequency;
$ ]# C/ c6 M- s1 d" v- c5 L/ e
}
! M2 F1 }; }. @+ C- J
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ q* l! E4 @& U' d0 r
[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