嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ [/ n. Y, P* k/ A
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
; y- h( T0 o2 {9 }6 L8 ^, n
/* */
5 j% x* z# U, P6 o: R
/* 宏定义 */
. g8 x6 D8 x/ n+ z2 [* [1 H( h3 @
/* */
5 O; B# u6 R2 l" Q' s
/****************************************************************************/
' ^( M3 l0 z& m7 p- ~
// 软件断点
5 W" S6 A5 {. V& Z" M
#define SW_BREAKPOINT asm(" SWBP 0 ");
3 K$ N( v |' v4 b3 K+ I' t
# s7 y0 _ a. y+ [0 h& F% u
// 时钟分频
0 r& m* o* H2 W! }- b; H
#define CLOCK_DIV_VAL 228
? X; q' P% \+ k
\) F! x" l$ e# K
/****************************************************************************/
2 j* w/ j/ d' o- o1 {
/* */
$ G/ r+ K" L2 S) Q7 S/ w
/* 全局变量 */
: g: A" F. x& v+ r( {5 }, g
/* */
/ P8 M2 q- b6 s, f
/****************************************************************************/
8 v" \( z1 h5 s8 m A
ECAPCONTEXT ECAPResult;
, b9 n% t0 d5 m& L' {
$ |( ]+ \0 Z7 q) X' ?" _* e
/****************************************************************************/
! c% y( t- i8 o' r6 [4 \
/* */
. E8 y0 N/ t8 U( ?5 e& f8 j
/* 函数声明 */
; ]1 h9 C; E, E3 O; Q5 o
/* */
6 w, P% f+ c9 ?$ w9 j
/****************************************************************************/
9 g- `5 E; O! d! {/ m% _8 a' P
// 外设使能配置
- g4 ~$ ?6 R9 j, |& G5 D% E) R
void PSCInit(void);
g1 V+ _, @8 q" X
. Z2 R- `* J& L+ g
// GPIO 管脚复用配置
7 ^8 I* @% g6 ?8 S7 ^4 V
void GPIOBankPinMuxSet();
) z5 T* G1 b: K5 v& F: o* S3 }. M) _- f
2 y8 X% w) I) r/ L
// 产生波形
9 l _, A& u2 K- q9 Z/ J* \: Q" _& i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# `/ D6 A, u3 x; O8 t* _' G
void ChopperWaveform(void);
0 I" [( D3 N X9 {
5 h, z# t. A. L: d2 E( y \, u
// ECAP初始化和读函数
4 U$ { Y6 a+ j6 }
void ECAPInit(void);
4 q u. `6 j& W/ k3 Q8 j- U- ?. A
unsigned int ECAPRead(void);
Q; X2 n8 N+ B0 N
: F+ v; Y$ ?( [+ o
//ARM 中断初始化
7 ?0 Z6 M$ G$ Y: s# g
void InterruptInit(void);
! o: f, H o; ~. i
0 W+ |& q3 ~" r
// PWM 中断初始化
, g. Y. u8 F% W- w/ E
void PWMInterruptInit(void);
/ ]/ R; [' ?' ^# ?5 ?' S
// 中断服务函数
9 m* q. K3 h0 p u2 {# D! h4 d
// PWM 事件
0 x J0 R! n2 Z- P
void PWMEventIsr(void);
, H# J& V! A4 A, v0 e# ?2 q
// PWM 错误控制事件
/ _. e2 T* }: z! E r% k
void PWMTZIsr(void);
% n1 {3 E0 e; d# n* z, ]
2 Y/ i/ M6 w8 A" T/ R2 O0 C
/****************************************************************************/
" k. ?0 k7 r0 b) D' F4 S) K: [
/* */
7 i: q) k) ]( p- s; B
/* 主函数 */
/ I. r% l# V. M1 h
/* */
1 I/ H& O) D, D8 W1 J, b
/****************************************************************************/
' S: D( ?0 g4 _! Y" h$ W
int main(void)
1 G& v8 B5 H( o" d. j
{
8 K0 u* I1 g/ o% t# I: V3 w
// 外设使能配置
( P$ L. x2 S. W' R: K
PSCInit();
" Y+ V0 V" L" b. O" n* n5 g; Z" z
) ~/ v. f6 R0 y* n D0 I8 ^
// 初始化串口终端 使用串口2
2 o9 w' {0 D4 J0 k, `7 A
UARTStdioInit();
7 f( E. Q' X% z+ ?" @; X
1 R$ U$ S! E1 y( ]( P9 e( X t
// GPIO 管脚复用配置
; s( t; x; u" I1 A% W) Z% l1 j
GPIOBankPinMuxSet();
G) n* g7 n" e( w2 n! H
$ T. l9 M; t( o2 u- X* ^4 X% M
// ARM 中断初始化
, t* m2 C; n, ?# y
InterruptInit();
$ B/ i" x- P7 C2 T) O6 w. L3 `
+ y0 m. \. K: z* M2 d) e* [
// PWM 中断初始化
$ o) ?, h9 U" o6 G, m
PWMInterruptInit();
: n L: K7 G/ a" U2 `1 h- P, I
5 Q0 n0 u2 m) ?
unsigned char i;
- c) i. P* Z: F% L4 c. ]! l$ h
unsigned int j;
. U% {/ B. W5 U9 n) A/ u- X' r
H' r" S# x7 J% {& E+ A
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 D8 K/ D- ^. O, Y- {
UARTPuts("------------------------------------------------------------\r\n", -1);
3 N+ f( Y: K' b$ y# L
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 ~8 r+ m q6 V8 Z" N% A% S( @8 ^
// 产生波形
4 X- m/ y" z' j, k3 Q
PWM1ABasic(25000,50);
+ O% f! v7 K+ _3 d% C2 j/ H
; X% z) ?5 Q6 |/ g. E
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 c, X5 A/ Q2 N' L& h
UARTPuts("------------------------------------------------------------\r\n", -1);
/ ^4 g1 v, m0 n/ ~) a8 T) V3 L
2 ^4 N8 N( i; o3 u
, ?* X+ }& M+ l
# m! t( V; o; z) Q. M, r+ R0 t
UARTPuts("------------------------------------------------------------\r\n", -1);
& Y& ^+ x/ u( X# ]* O5 f: C
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 ?$ ^( p3 r& V% |4 Z. o
// ECAP 捕获初始化
1 _" y2 ~2 M0 k R* f' G
ECAPInit();
6 [( M" [# D7 s, e
UARTPuts("Initialize ECAP.......\r\n",-1);
- z7 }2 O5 s+ Y
for(i=0;i<5;i++)
; P- w) B f6 O4 `! z: \6 |
{
8 X% y0 `4 u3 p
for(j=0x00FFFFFF;j>0;j--); // 延时
1 s) x. s' x8 V! A
ECAPRead();
1 ?& P, l$ U% n) M3 l7 W
}
2 b! j7 M5 [1 }6 o* {( Y7 S
UARTPuts("\r\n",-1);
+ E- u7 k( Z- K$ g& b
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
* G; c: j2 `2 x
UARTPuts("------------------------------------------------------------\r\n", -1);
$ z: s, B9 p2 v2 S/ N
6 h( c) T' c* Z6 i
// 主循环
7 w" z; g) v- ~8 b$ r6 v! C
for(;;)
, k7 T6 [ t3 C6 H
{
% h4 q% F" F, n1 L- R
# [1 G0 k+ `3 X2 B: O
}
7 [, \& ~& s2 A: Y( Z1 W' ]
}
5 x# q0 a$ t( `$ N5 t
( a0 z& }. R) p
/****************************************************************************/
8 j* P' a a* h, `+ X3 x
/* */
2 s7 g/ f( H/ o- ^( }" o+ l$ U7 L
/* PSC 初始化 */
/ {" [. y7 d, v4 w& R4 X1 i' l
/* */
v" h: P/ Y: J1 q
/****************************************************************************/
; f$ Q/ u& g' U" T# ] }: D; X+ s6 g4 d
void PSCInit(void)
3 g7 n8 q, o) T- Q2 m
{
( \8 x7 x- t2 \+ X% s
// 使能 EHRPWM 和 ECAP 模块
( c" `* s) K, r# U0 ^3 ~) y# G
// 对相应外设模块的使能也可以在 BootLoader 中完成
8 V* O' C: y& r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 s7 X! ?! {0 b8 {& n: P6 ]
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 J6 o% K5 V" u7 B; J) {
}
3 x( \+ P! F6 U- g D2 X
/ q R2 O- {8 L! Y0 o: U! a: h7 m
/****************************************************************************/
; |* c: Y! E4 I0 G+ S- {- E& e! ^
/* */
9 E; I, S" ]5 ?6 ~! o2 m
/* GPIO 管脚复用配置 */
8 F0 E4 O$ T3 u" g# j
/* */
j, S( V7 m2 q+ y& P. D2 M3 R6 @
/****************************************************************************/
/ `) U( l9 v9 T4 k
void GPIOBankPinMuxSet(void)
) Z( T$ L7 Y" S _
{
$ l; c7 ~ ^* d& l5 W! N8 w8 B" |
EHRPWM1PinMuxSetup();
0 l7 W3 v% i) m7 b/ n/ p, @8 y
( {/ O A) \, B8 M6 [3 ~: W6 L
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# E+ G3 b! B( w w3 Z
// 作为捕获功能时管脚方向为输入
- B3 ]# H3 M ~) u5 z: o
// 作为辅助脉宽调制时管脚方向为输出
. h! G! O# m: @: z5 w- I1 S
// ECAP2 / APWM2
' `7 B. C+ {' @$ T1 G3 M. U) e
ECAPPinMuxSetup(2);
7 l' X% k Q* j7 ^- \: T7 r7 m
5 R8 A w% F9 u/ R: @2 k3 C0 e
// ECAP2 / APWM2方向设置为输入
( f8 {: C# r6 Y" b1 a
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* @1 I7 R) @9 N' O( c/ V
}
6 }0 L* _9 U& [
, v ?9 j) [3 c2 C8 k3 c2 i! k
/****************************************************************************/
& ^2 {( \9 h% {8 C( V) `# [" Z
/* */
0 l1 `0 p W: P/ X
/* PWM 输出波形 */
' ~5 g& X" I1 S+ o/ z
/* */
0 R4 P1 V6 u$ R6 }' X B
/****************************************************************************/
* B* l7 y( Y/ g. }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
/ w; \; P. T. w6 Z+ K0 D
{
* @( ?' ~0 }) W" J( I, O1 c! B
// 时间基准配置
9 S# W O4 y0 s M3 f7 `
// 时钟配置
" D) f+ `# e: }3 `5 p3 X N
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; U( S" ^# B+ u: g# I; ~+ D2 D
+ h4 \" Y/ N" v* I0 ?3 O
// 配置周期
% E2 k8 W, F( Y9 d
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 U) b0 i3 o3 {& D3 U, E
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ s( a6 ^" C2 q) C2 K
0 k) O; H5 Q5 n3 W' u$ b O
// 禁用输入同步信号
" Z7 y0 O2 s6 M* W( v1 y4 y5 Z# }
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; g$ [+ ^- A2 e9 Z0 a
" A- B+ v0 G8 p. K) Z/ s d
// 禁用输出同步信号
1 N& V$ R% I# z5 \) R8 d" t# l
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- I/ b" @. m$ q4 y+ N+ i0 O" J
- x% x! U4 n, f' q
// 仿真(DEBUG)模式行为配置
- I, i* R$ E. g5 V
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* p. ?$ m3 M0 l7 \" q# d& g7 z
9 W+ F- {( @1 p9 ?* G
// 配置计数比较器子模块
; P2 l, b" y+ g. o
// 加载比较器 A 值
) n* ~8 O1 `9 a6 W7 s& b7 }0 z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
* ?# Q" D4 N' v( ~' x
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 R F) }5 Z( Q
/ v+ z- V. `- @3 j- Q+ g& H; `
// 加载比较器 B 值
9 l+ y# E8 o4 N! N3 \/ Q
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 C* M2 O4 x1 @9 L
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; ]: g3 J6 N! s- u% ~/ \
( j; _6 i2 C& W6 f. h J" K; m8 r2 d
// 功能限定配置(输出引脚触发方式设定)
9 O" r) T5 S( }
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" W3 @5 I' L# j3 a2 G2 p% a5 o
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
( Y1 q# {/ y! r7 |
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
/ k8 ^0 n, Y4 w$ G J6 _3 X# X
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ U$ s2 N/ p3 H) y! y* _; X7 k7 U$ k
& B# _/ j' @( F/ K3 B
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 t$ a; @1 U9 V0 o/ ~
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 P3 Z. q7 H$ f
6 i% t' Z/ n: |" s9 ]
// 禁用斩波子模块
+ y r M R( s- N" P6 `
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 [" p4 a8 I6 a Z
7 w& t3 _4 y( V1 n
// 禁用错误控制事件
) H) H- H7 v% ~# A/ {
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! ~& x3 g A+ `
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! C- ~: U# H5 X8 `
7 @, M+ A) s1 g7 T2 u, W: }0 h
// 事件触发配置
# N' Q3 |) O% c1 O2 n
// 每三次事件发生产生中断
( R- d9 f. H( E$ ~5 V
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( g6 g5 Y' Z3 P3 |6 d; K$ u
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
/ O' e" @+ o" l6 e/ _$ @. W
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) P: k& ^3 v/ L/ k8 T- s6 b/ Y
// 使能中断
) f# h; t8 ] h* F6 W
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
d6 c3 c& r' w7 E6 J
- I5 b2 t0 I" Y
// 禁用高精度子模块
" B( O! j- U2 X9 p5 b
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
$ d( {: U% h$ A9 W0 m
+ M! D) h {- Q+ u
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 c& j" B/ v" f. ]# q6 A* M
}
) I5 d6 Y, n; y. Q, C2 T
0 S# X. Q9 D. ?# w# E
void ChopperWaveform(void)
3 D# S1 t% C( z1 R6 T5 j2 g. x
{
! d$ A. z1 y5 t) Q! L- O# U! M; l
// 50% 占空比
+ g8 J$ z) }- ?% Q5 p% U1 Y
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
$ l8 ^6 ?( B" v$ B- r3 c
// 4 分频
/ g$ ]! g2 R4 b& k( W' t5 g; I& f
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
4 W: ^: R: m# `% C$ [8 ]( [1 {
// 单个脉冲宽度
# T0 E) X8 E S7 ^$ N* s
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 H v6 r& v: \- U3 a
// 使能斩波子模块
. X$ M. h$ o2 s4 K) T- R3 V
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% h r) x( Q% M% D8 w
}
% u# W8 x) C! f& x
( \+ N) X& t. L8 |1 Y9 t) {* D V( _
/****************************************************************************/
" Q- `% @1 h. l0 h
/* */
. Q9 l" t' |2 W7 {0 T* v
/* PWM 中断初始化 */
$ G( A0 `; f: s+ `, F4 I
/* */
8 [ | @! v& w/ O
/****************************************************************************/
) X3 a8 z- Y( I5 |0 d
void PWMInterruptInit(void)
c( R$ C7 P4 {
{
. d9 N" _$ p* o7 N9 ~
// 注册中断服务函数
9 _) z J* \6 R$ P, N3 w! q0 x
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* q- }$ T" k, x# @. u2 m5 f# S$ k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
f+ G/ {, @, L0 J
0 d, r: D, k' B$ Z7 e
// 映射中断
( ~! q% p, d2 P, b1 E
IntChannelSet(SYS_INT_EHRPWM1, 2);
* {$ I8 v6 {1 c0 Q, q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
! {/ c3 a$ [# h
* B; C' U7 T5 T7 V+ F8 ^! P
// 使能中断
& Y5 |3 M1 Y: h9 O6 h- ~
IntSystemEnable(SYS_INT_EHRPWM1);
+ C+ ^* J0 g+ u) |
IntSystemEnable(SYS_INT_EHRPWM1TZ);
: F0 S1 p" n1 y2 I2 ]" b
}
6 ^7 L, I, O- O8 Q. a# F; u- d w: N
: R4 n$ T3 k+ L* K$ m' S) c9 n3 ?- A$ {
/****************************************************************************/
5 @* `. M5 \* J/ h% ~4 ^
/* */
+ D5 j' B& L; _3 W
/* ARM 中断初始化 */
- {3 k, ], ~. V& E! l( a
/* */
! q6 }1 ` m! k! }
/****************************************************************************/
- [- ?. k3 T7 }: v3 |; V/ I! Y
void InterruptInit(void)
3 g4 r$ v% ^/ M: [1 _" y2 ^1 ~9 H
{
% z+ V3 _# C" r: ]( Q
// 初始化 ARM 中断控制器
, ^5 x) Q$ ~+ p* g$ i, @) j+ o
IntAINTCInit();
* {7 P5 r9 _+ v) u, i1 `$ c1 w& _
( G& Q: y( [1 h) O
// 使能 IRQ(CPSR)
% \3 j, Q- {/ ^$ j# l. K8 J% f7 j7 e
IntMasterIRQEnable();
3 g9 n* P& f( I: T- E6 L
1 ~2 [8 {' H& _
// 使能中断(AINTC GER)
4 Y, Y" ~0 h% h8 v- u
IntGlobalEnable();
) ?' @) t$ o7 I) Q
+ m. ]4 y, E4 F" a9 C2 i
// 使能中断(AINTC HIER)
& w# T) F+ e3 K G0 E v; M
IntIRQEnable();
3 ]; j0 |! M$ A: V
}
8 H# C" D" L% [1 C: |/ M7 ]0 @
" Z4 a+ ]/ _( y3 o0 q, N' T
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" i# R9 E6 H/ n
/* */
, ?+ P) b0 t$ f0 e8 M
/* 中断服务函数 */
$ o8 R9 g3 X$ ^! L9 y3 L% f/ y
/* */
" v/ e4 u9 p# k) a; z2 ^: u9 q
/****************************************************************************/
~" z# ~1 j9 C5 P
void PWMEventIsr(void)
6 G$ e& _+ q; t
{
* R6 n0 e6 c& t& ? m% _
IntSystemStatusClear(SYS_INT_EHRPWM1);
2 y* q; K0 ~* O7 L& b
3 a3 A% r5 R5 F- z
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 ~0 C9 r6 \0 X& X6 b" u
}
# r. N! y) j- w8 F) t* C
* e) n( {# h. `+ V( \
void PWMTZIsr(void)
* y. n/ Z& {; p- K7 o( O
{
, H: a3 ?: R* y; j, V, \0 w
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
2 ]: Q% H7 l9 O8 R& T7 {2 }
5 J7 K$ y i4 T( t# @0 P" p) v( v# O
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 {# U9 `# A4 T' k& ^
}
8 Y. ]4 }6 a& B" S F& r
( l2 u2 C/ L3 t5 M. }. F- n
/****************************************************************************/
- h. C3 C f: r/ z: F
/* */
9 j& C% Q9 _5 N
/* 初始化捕获模块 */
- ?( K4 v' |* h* V- [3 O
/* */
+ m! C7 @) S2 m: X) h1 n* F( r1 f
/****************************************************************************/
* M5 C1 V9 T$ g9 y$ E
void ECAPInit(void)
* t3 E- D) [; V* O9 l# o8 V
{
8 e' K* y- P) o8 U. U* ^. `
/*-----设置 ECCTL1-----*/
+ F$ q7 ^; r8 Q; p0 u
// 使能CAP寄存器装载
) F4 r% s9 y1 v& a9 R/ g4 u: o
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
4 d) s* e2 X d* B" d% Q
// 设置预分频值.
0 J2 S8 X% T& C& s2 Y
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
: Y4 L% W6 Q8 F3 f" c$ u& S
// 上升沿触发捕获事件
2 S+ m: p f3 c9 ]: A v: {
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 Y3 P6 k% y0 S. z
// 输入捕获后重新装载计数器值.
* U9 S, ]! `) z) H$ y
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 I; u4 q5 t0 y9 D
9 g, C: s. A; @; d/ e% B* s
/*-----设置 ECCTL2-----*/
/ S- b/ w9 E" u3 F9 q; {, e2 q
// 连续模式
! Z. C8 i" b9 }* W2 Y1 F8 M
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 V R' o" Z( f }: t2 ?! T+ z a
// ECAP计数器TSCTR持续计数
& y% Q' @) Q2 u( M9 h, Z
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
i. I4 X+ d: [1 r
// 禁用同步输出和同步输入
. r- F4 Q( l% F2 o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
; C" f2 D" E8 `1 s8 u% R
// 配置 ECAP 2 为 CAPTURE 模式
0 j3 `/ ?% ]4 h( _
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 l( N, x5 [/ j5 _' A7 p" i
8 l& S0 Z* Y- Q7 e" a# w: f
// 使能中断
u. {( Q6 L! u( k. x9 P
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 D+ o/ K* c' r7 z, s! Q4 o
}
; Q# U; ]4 V- s5 x. H
% \, v" Z; ]3 z, B4 v: l2 x
/****************************************************************************/
$ y. {. F, K) l3 ]/ ~1 p2 U
/* */
: f) F; R6 o! a# ~
/* 取得捕获结果 */
& X; _' j( D7 U0 ^, G
/* */
+ f* j% R/ y1 x% j3 f; Q0 ^+ l
/****************************************************************************/
) X! M4 ] y7 l3 R- ~; N/ t
unsigned int ECAPRead(void)
' J1 n0 P1 V3 K. ~, m2 ^
{
, s" n5 j |* f% b3 Z4 Q' G
unsigned int capvalue;
( _. n5 X* N( P% k9 M- t/ ?% {
unsigned long frequency;
. b# R) ?: q4 r. \, u6 N+ j8 [3 p
2 s. n! n# B6 t: F/ y
// Event1 中断标志
t- Y6 A2 r) D, B G0 P" l% g) u
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
( U* c4 K4 K% j# Y* L4 T
{
. j" Q" Z% S5 Q' E( Y$ j
// 取得捕获计数
, E" R) M* h1 S! ?" ?0 }! u# E
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ H0 M l5 A* K" u# q
capvalue = ECAPResult.cap1;
& N6 V( I0 U% c- b) o) Y
; [ `; S& } T, _$ U: C) v
// CAPTRUE 模块 228M 时钟主频
( F- I4 y- H* U5 ?! m, F
frequency = 228000000/capvalue;
) T9 R- m( I0 C
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. r5 U9 ~5 k/ k, {' m8 ]
/ n1 k3 B( x0 u# C' ~- O
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
& M& h5 h, v1 {6 o
// IntEventClear(SYS_INT_ECAP2);
; U' o1 S: }3 v5 z+ O7 f
}
, K' f3 P7 [8 C* @7 a6 c( U
return frequency;
# | r' Z" _$ F8 ]
}
; X+ A' P0 R9 S3 {
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- r8 u* h/ S* 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