嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- s5 k T0 e! I
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
% V+ i" y. i" l
/* */
7 G6 a% Q% n) E) J& ^
/* 宏定义 */
' ~' R6 V5 f- A( ]
/* */
- \7 T# h6 Q& F# m7 O
/****************************************************************************/
; _7 n; G- P5 E c8 c
// 软件断点
* n; F# l; o L1 E: E! n. W
#define SW_BREAKPOINT asm(" SWBP 0 ");
) _7 o' [( |/ Y$ F
$ G" W4 p& D) v! s
// 时钟分频
6 [/ `0 ~ e! h; A" r0 ?+ {; q7 l) N( b+ t
#define CLOCK_DIV_VAL 228
$ ?4 p: H6 G# c$ K0 }+ w [% k4 J. R3 g
) ^: y1 c e z% c+ V
/****************************************************************************/
( W1 ^3 q1 c% v; ~" R+ \
/* */
4 X! P: E7 c6 u9 n% g. G' x
/* 全局变量 */
2 W5 Y9 ~. T5 i1 ~% n7 s v6 h9 F+ B
/* */
; h/ A' Q3 D0 p: ~2 S! S# Y# u2 n
/****************************************************************************/
) P9 U! }# t' [! @- N, Q8 R5 }" i
ECAPCONTEXT ECAPResult;
* W! {* s) J" d5 o
3 Z& J* s& X1 a/ z: v. O/ |
/****************************************************************************/
' i: o' d4 J6 f4 v% M s
/* */
" L6 h" J/ {8 P; I) k9 u% v9 G
/* 函数声明 */
7 o1 i. q" E9 i0 u5 r
/* */
+ M$ K7 A, d5 Y$ z6 q" a8 E R
/****************************************************************************/
2 r. r: G$ ~" ~! G5 R7 M
// 外设使能配置
6 i* z% Y, A, _ X! R" T
void PSCInit(void);
9 o* i% g* a+ w) I/ E
. a9 A6 [6 h3 e4 k' m1 r
// GPIO 管脚复用配置
4 H( N( `7 @. j
void GPIOBankPinMuxSet();
3 U3 D. }( L; R( n8 h# ?# ^
3 h9 _1 `/ o @8 L7 x
// 产生波形
* y* z7 U4 X$ p5 b1 W1 E
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 }9 t' G( d& h2 ~/ E
void ChopperWaveform(void);
7 K; q. @+ ]) W& i% F+ f7 R8 R
; S9 C. Z1 j! h
// ECAP初始化和读函数
6 m6 M% r+ m0 a% ]
void ECAPInit(void);
4 H! t3 q3 c9 l/ B: \4 F
unsigned int ECAPRead(void);
' `+ w( D2 d7 s. M( v1 H% r% O
* e1 _9 Q d3 Z4 F) R, L
//ARM 中断初始化
% ~* P4 F. _, x# Z1 ^( B: Z
void InterruptInit(void);
, S; s& ~, {0 @
, @2 f0 i9 h7 T3 i. Y/ j; W
// PWM 中断初始化
4 a. s4 H- H* \5 A' K
void PWMInterruptInit(void);
, M/ T1 Z y8 P4 l
// 中断服务函数
" W* x4 x7 J( P" ~
// PWM 事件
1 l* Z% K* w2 b/ Y: t5 \, y/ c
void PWMEventIsr(void);
: V* g+ c3 {5 a: E F( q- F q3 u
// PWM 错误控制事件
% m1 i V6 x. ?
void PWMTZIsr(void);
& O4 T. E( \- G) v# ^
, Y Q2 }/ a% O
/****************************************************************************/
; y+ `4 T! z$ j; {, f
/* */
3 y0 ^ m: w9 W& P2 ?1 d, m
/* 主函数 */
/ m$ ]/ a; s* z6 x3 \: d4 D7 u2 {3 H
/* */
j5 r$ `, W! F4 o5 N
/****************************************************************************/
" n& @6 L4 S% h" H+ j: S
int main(void)
. S( i- Z/ y" p! n" d3 J
{
$ h: S( Q( Q3 d( |2 B+ j2 q) E
// 外设使能配置
: l! e( |9 \" {- s
PSCInit();
. I5 Z! C, ]- w3 t
- h) D& Y2 @8 ?3 J* p( y5 H
// 初始化串口终端 使用串口2
2 w- E9 v3 J, q3 [; o
UARTStdioInit();
# F# h4 {! R& H D) N% B* d* u
3 ^: L; K0 I. ~3 X" J. A/ k; t
// GPIO 管脚复用配置
4 ]8 t6 c1 m- s- K$ |, t! F
GPIOBankPinMuxSet();
: i5 N1 K5 i3 u& e% `' c
6 d: B, c5 R$ ?6 H8 q/ L0 E
// ARM 中断初始化
7 f6 k- [5 R5 ^, r
InterruptInit();
! K! n# m# n/ T$ Z
/ L* F$ b9 ^! _2 t! J- G( W b
// PWM 中断初始化
* ?% g Q3 m6 O( g( D4 i8 u
PWMInterruptInit();
( t# l$ H5 @. g* d" X
5 X3 d% F# P- U) q
unsigned char i;
, g7 w0 X3 A' b4 j: F2 C- G
unsigned int j;
1 z1 N; X. v5 F) M3 F6 F
( I3 b4 P/ o$ w
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ }0 Y7 k% l" X& @" @
UARTPuts("------------------------------------------------------------\r\n", -1);
& x7 \8 ^; a1 q- m9 c
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
; {( A3 i) I( n6 D+ [6 w4 T+ q
// 产生波形
8 I+ D6 w8 K& W/ W9 l
PWM1ABasic(25000,50);
, N) t& S; s+ A& [: i
4 w8 r/ v |# ^
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
! T" O- I7 V( o. G/ R
UARTPuts("------------------------------------------------------------\r\n", -1);
" ~8 I" \" H6 V) T* ~2 p
; R0 ~- ]( `' W/ b6 x
8 A3 Y# h% n" _* |
9 M1 }0 q* ~3 F
UARTPuts("------------------------------------------------------------\r\n", -1);
, a0 g5 c# D$ ~
UARTPuts(" C6748 ECAP Test\r\n", -1);
; Z3 u* E( S: z$ @7 O" k- H
// ECAP 捕获初始化
5 R7 n) W* K- H% E
ECAPInit();
) C' O( f0 X; |2 @/ T
UARTPuts("Initialize ECAP.......\r\n",-1);
& C$ j) _, E! B8 s
for(i=0;i<5;i++)
8 q1 ]% Y! o, I! R: \! x
{
/ v" S9 Q, k8 R( X, ]2 t4 H# W; {
for(j=0x00FFFFFF;j>0;j--); // 延时
5 n" t4 ]7 h- e' [
ECAPRead();
; L1 e3 U9 o0 d& v' a! P
}
+ M# u' O7 [ E4 O
UARTPuts("\r\n",-1);
! U2 Y* \9 S0 _$ `; S
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- V$ V* u, W7 a* i$ w
UARTPuts("------------------------------------------------------------\r\n", -1);
& E. H2 |( s) U$ Y6 E& C, R
: ?6 {+ l& h$ r9 E/ N8 h
// 主循环
- j6 ^! x1 v! A, }
for(;;)
% u3 k# C5 |7 J
{
F% K! @+ n' k/ |$ U5 h
2 U. ~7 d P" i% \' e+ M: h( p8 W
}
: t8 R5 o/ I; m' k Y& N! _% ~& X
}
' j# Q V2 J6 |4 s7 F% M' {3 I
% f- Z- \. u- I; e/ c4 x# \% g$ m; l5 b0 i' \
/****************************************************************************/
1 V8 `. v/ ~6 X1 P# j0 _! E0 Q
/* */
4 [6 ?% O" L# x# i5 a; C z
/* PSC 初始化 */
1 o% Q2 x8 T2 R& u ?& \
/* */
3 z. O0 Q0 Z- m1 b C) R
/****************************************************************************/
# g4 L6 G5 I# k) T5 D I4 [1 f
void PSCInit(void)
. Z2 b3 K! V, l) }! I
{
+ d$ G! X/ H. R3 F- C
// 使能 EHRPWM 和 ECAP 模块
' M; Q# J9 u5 J6 f
// 对相应外设模块的使能也可以在 BootLoader 中完成
$ [% T" `/ ^4 w% b5 N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 C d8 y" r7 r7 `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 I* h5 m. f& `& u5 W# } J+ K
}
# g! V/ w: i( I% g1 M8 A3 N7 S
4 W! k w# \ l" I6 ^7 X; q
/****************************************************************************/
8 W! ^( p1 M8 A5 l0 m/ b7 d
/* */
, \3 s2 |( o' ]0 i* q$ C$ v
/* GPIO 管脚复用配置 */
2 d) D# k5 a: s! t
/* */
4 N' a# A4 n% k
/****************************************************************************/
0 ^2 q4 p2 I9 T8 ~. S
void GPIOBankPinMuxSet(void)
% C* ?! v7 h, q/ s
{
* T3 @3 o& ]' m+ r% M+ m
EHRPWM1PinMuxSetup();
. o. g0 i: Q$ t8 k: l" `. @
! J/ b: C0 q' N; z0 x- ]5 k. v
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ P& \% ^& R7 j$ g
// 作为捕获功能时管脚方向为输入
) Q7 a3 x) Q9 I
// 作为辅助脉宽调制时管脚方向为输出
: T4 Y. E- K$ k% x* p* P7 i
// ECAP2 / APWM2
- `$ S! l% Q) @! I1 o
ECAPPinMuxSetup(2);
* T8 {+ l, e6 q2 v' R( a9 S
; w+ U" e2 n- ]- l) M
// ECAP2 / APWM2方向设置为输入
2 J6 k" j M3 ?& B& G4 \" R
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
5 o+ \" Y; J a, d' S4 n& s1 z
}
6 [" F, J2 k8 ~- Y$ N3 \) @
; W+ ?' o/ p: S$ R! X( C' I
/****************************************************************************/
/ U5 U! R5 \& K# x- M
/* */
: O2 j" a7 S& x2 w _4 e& D
/* PWM 输出波形 */
$ ~! n0 p7 y/ ?
/* */
x, H/ e; h5 b L$ C( }
/****************************************************************************/
4 v4 F k% ~2 c/ @/ c/ u- w& z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- l$ ?) h6 L/ F# ^% @
{
$ \ }# F3 Q: \5 q
// 时间基准配置
/ K+ x; T0 E* o6 R
// 时钟配置
! p, _ N7 z. c
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
+ Y+ l0 K0 p# t$ n5 X/ t
2 U( @6 E0 I, d4 g
// 配置周期
' g; [) R- @8 J, t( M+ A
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& g5 z+ F& n4 W6 C" A- q% X
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' ?+ w* N7 s3 h, K, T& f, G
. d; I& I6 | R# R3 \$ D3 z+ K$ a, b! Z
// 禁用输入同步信号
# E0 e5 p* f" y1 i& a. V- I9 q
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
4 @( x; o. ?1 h+ a& T* J
5 B1 z0 Q0 _8 {6 z1 @( q
// 禁用输出同步信号
; w$ C- l3 e4 } y3 D B
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ ]2 f6 E5 L7 B/ M. }5 G
# x) d( N5 ~2 O
// 仿真(DEBUG)模式行为配置
' G& ]; ^% {2 f% I' V
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- n5 ?) o1 `( n; L6 I+ [6 D* W: A
4 r- w; C; w5 z9 Q3 A
// 配置计数比较器子模块
, P7 o4 Q# O) u6 r3 E4 d+ m$ |
// 加载比较器 A 值
, q4 } g* l- V! V
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( M. w2 m$ g( {$ U4 H8 B
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 u: Y& k. y. k" V& p4 m/ z; Q
. m: G3 r( _# ]' k9 Y( F
// 加载比较器 B 值
! `$ q& Q* M+ {6 o4 B, I
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
- A; [: n8 k8 t6 a! l _6 N) r1 r
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 i/ h6 Q R: [. z' C
* w9 l9 q8 t* d1 K( Y6 j
// 功能限定配置(输出引脚触发方式设定)
; o3 p u- t. t
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ X, O. c- t+ @. ^( p" @: L) b
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
) T* @6 @1 A8 o6 D, B) g
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" `" } ?# T: R" a7 O& b
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& b" T* F$ x$ q& y# c; G1 z6 ]# `
8 n5 D) C& b; h
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
9 Y' Q/ x& Z; M
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 \' y' O( k1 X$ a1 E
- E' O0 z1 }# q
// 禁用斩波子模块
7 U' K; L7 o3 v- h1 \$ M, H5 E
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ z, i1 J; l. Z* q
% W! y4 p7 c! r" v" j
// 禁用错误控制事件
/ V5 s, Z1 `% o/ {4 W! F, S
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
3 \/ ?4 R G w0 B% a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) ?% T5 Z7 @ h# f) U
5 [1 u: v8 f; ?$ {0 X# T% F
// 事件触发配置
3 t. S+ `9 B, O4 R c' K+ u% q
// 每三次事件发生产生中断
8 c; Z, c* o, T8 ?+ w- a
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
( \2 ]' v2 k |* B. n0 m
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 _' P0 H i! V8 e! z
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( J3 L0 Q) r! g- @
// 使能中断
8 e6 g9 s/ B& b% s( D
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) W: M4 c$ P( \( w: i2 \
( B) d5 { C2 k Y" [( f
// 禁用高精度子模块
2 }* \! f2 z! Y6 u- P" C2 Z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
9 ]9 z" I6 ^& ]# N4 k V
6 k7 c3 k8 M; v0 L: n" U
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
# k {( O( b- A2 ]: F: j5 v
}
1 |6 I+ R! N) ~2 K
+ K& F0 ?& k5 k! m/ V; W
void ChopperWaveform(void)
7 s* _$ z Z* h
{
' m& z8 W* s& F7 X1 f" K& i
// 50% 占空比
: R w" @ r) U! v/ _# D
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 |2 ]" V; S% V1 J
// 4 分频
r0 l- L, e6 [+ ^1 c
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( ]% D7 g% N @
// 单个脉冲宽度
) f0 g9 z9 d/ u: O: b7 u# \' {
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 X( Z# t0 S5 S1 b/ P; `, Z) W \
// 使能斩波子模块
1 j+ ~ B/ L0 {, a, E( _4 F6 ~, R6 {
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 E8 P+ m5 @) u6 r4 Q
}
7 h7 w, M0 C1 i& V; `3 e# o
: E9 ~ {3 L" i0 L! I e5 s
/****************************************************************************/
( }. i1 v8 j0 `4 l
/* */
4 g. L/ X! k2 O% T
/* PWM 中断初始化 */
- R8 V) i; E7 g6 i( F
/* */
) t6 Q+ |, ]/ s; i0 }. i
/****************************************************************************/
7 _& L( X) V* W" I+ k4 D( @9 f
void PWMInterruptInit(void)
, }% z% H; f! @" k" t! s
{
, ~; k; r$ q5 ^0 t6 \
// 注册中断服务函数
{* o. ], T& A |/ q( d
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' A$ I( y1 D: i5 W8 k5 i( r
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
1 b3 R1 D$ Z/ m8 p0 s5 q- A4 B
7 b8 V* f9 x: S/ D: L
// 映射中断
9 M$ m5 w1 z4 e, u8 }# Q9 X# x
IntChannelSet(SYS_INT_EHRPWM1, 2);
" O- i3 y# ?5 R0 |% r6 v
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
. k4 O: Y/ L* {" G" D$ k h( N
z( t" c0 K) ?
// 使能中断
8 x! Y9 a& g% s" A5 ]+ s6 B3 r
IntSystemEnable(SYS_INT_EHRPWM1);
$ |5 X1 H% m9 r/ E. f' r8 {' t
IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 q' l# x1 r8 s. P& U
}
( d9 p7 O, Y7 H+ z ~4 U7 n5 b
3 D! {6 v2 K7 d8 {% p$ I! `
/****************************************************************************/
. R1 ~3 b& S- C* e& K# u: ~
/* */
5 G: X3 w+ p& D6 k
/* ARM 中断初始化 */
# G& J4 A! j' \- v9 P- L
/* */
- _/ Q% R3 l3 c1 N$ k7 d, r! g
/****************************************************************************/
5 W/ g! Z, m; C- L
void InterruptInit(void)
9 f. J! `% @* [
{
2 C1 y* \! L- o2 o
// 初始化 ARM 中断控制器
# J; Y6 D% `% Z F8 d
IntAINTCInit();
7 l _. z; C! J5 Z) P. e2 F0 U9 D( S
+ z$ n3 b3 w8 r) }- {; U2 Z6 r
// 使能 IRQ(CPSR)
# d& S1 R; `+ y
IntMasterIRQEnable();
# }4 @; R1 n/ o6 F/ D
9 i9 M' ]0 K1 I; l/ P
// 使能中断(AINTC GER)
' l' c% H7 p; r6 L* F: |
IntGlobalEnable();
& g2 p& u6 k3 Z4 j. a
0 G, P6 D5 q7 q% S5 }- N3 w
// 使能中断(AINTC HIER)
( E0 i% w2 V" ]3 \0 ^( `
IntIRQEnable();
, w3 [+ x( p6 w
}
/ a+ ?7 A; i% ^ W; [& w7 L
0 M) o1 l& Z7 |8 J
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
5 s# [5 m l0 R G
/* */
5 A* Z; ?* z1 U V
/* 中断服务函数 */
" o9 I' N- j! S3 b% ~6 h1 c4 |2 J/ j" e
/* */
9 Y1 z1 g& z& w
/****************************************************************************/
% |5 h* j& @+ y; ^4 L/ v2 {
void PWMEventIsr(void)
6 X. R4 A1 K: d9 }# `' ^: U0 ^: {5 j
{
" m6 F7 Q/ J% g: u8 L
IntSystemStatusClear(SYS_INT_EHRPWM1);
5 a3 { h! F! O3 B, [, {" {: v
6 w9 [3 S/ d: r
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
; E; w5 |( d# Z
}
. ]9 r5 B3 b6 f
1 O# R+ F& M) R' s- m C
void PWMTZIsr(void)
+ [1 e: W& ~* V7 ~
{
* A! _& S! z4 v) o7 P+ e
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
0 Y7 y; b3 E6 v% {
& ~. O3 N) {- l2 l3 S. c" H
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
J7 b0 O# |9 w/ [& R- i
}
4 @8 p* q( U* Q
" i7 N9 g: V' t) [/ g6 d
/****************************************************************************/
/ j8 a" W$ e( H0 y b: z' b" d6 ~' S
/* */
/ O; j. \# N+ |2 h& R R- M! j O! V5 ]- [
/* 初始化捕获模块 */
1 B1 F% `5 p5 b& o7 \3 f$ e% S& |0 O
/* */
) v5 l% c) `3 y4 ]; N9 M; G$ }
/****************************************************************************/
, @+ [& K3 y! h! h$ |
void ECAPInit(void)
9 G: N$ C7 y d0 ^
{
' U! ~4 `! ?$ B1 e9 c
/*-----设置 ECCTL1-----*/
. q6 ~$ ~% H0 N2 t# o
// 使能CAP寄存器装载
9 p' ~. s z$ y6 R) d' n2 f
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
: `; ^9 f3 n' G1 P* x" i& W
// 设置预分频值.
! i9 o" O, p- s; V* \- p1 ~
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 O: V# ^2 O# b6 s# F6 N+ U% E
// 上升沿触发捕获事件
' f" a, O' ^6 I- v$ ^! |1 ?& O$ a
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
6 Q J/ k" K) F+ z. ~
// 输入捕获后重新装载计数器值.
3 l0 E! F F% H
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ X1 K, O- N$ ]* H0 h6 r
# h% s( X. I0 f& z
/*-----设置 ECCTL2-----*/
' k6 h8 `" e; U. H) k& V
// 连续模式
% M9 @. I* T' C
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" A% h% a; w' C" H, Y9 f
// ECAP计数器TSCTR持续计数
. F# h# h* D6 V/ u' a% f
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
. Q5 `9 v) _9 u: I$ v7 Z
// 禁用同步输出和同步输入
. m1 z& d. r4 u5 j6 Z9 ~
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
/ Y. |* r2 }, v
// 配置 ECAP 2 为 CAPTURE 模式
; i. c4 Z. A6 c6 K1 x
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
$ \/ [; U6 _5 C) n X9 s3 g
: X& {7 ]- ?" ^5 y: X& y5 }
// 使能中断
) S" x, W( f+ O. L
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 Q0 @8 S# f) Q" I4 w, B
}
, q/ ?( Y: }% k8 U2 X$ l
* w" ~! I0 z" C3 a9 X$ u1 j9 K
/****************************************************************************/
9 `. \0 q; y5 H) x& i: x- S! v
/* */
: E$ Z3 Q, M* i1 r) w5 Z
/* 取得捕获结果 */
; e& c1 x2 ^! f/ y8 `2 ^
/* */
7 N9 Q6 E0 u: i7 S
/****************************************************************************/
* i6 D! g8 q! p" Z- f6 j
unsigned int ECAPRead(void)
1 Y4 v% |$ M3 b* a3 Z/ V i
{
; I/ N s4 X0 N4 _& z) Y, H5 Y
unsigned int capvalue;
8 i) Z1 y. }( Y
unsigned long frequency;
^. @6 ?4 @! m) M I9 F
8 L3 G) i% n1 W* [( l% c
// Event1 中断标志
( t" L* i+ @3 c8 p
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
; i- ` j0 G2 ]) _
{
6 n( i" Q9 x! B4 a
// 取得捕获计数
5 ^* g7 }; R- w e' J
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
6 `6 l7 J" p. K2 Y
capvalue = ECAPResult.cap1;
6 ?6 f' b; M7 C* [0 ~( t
6 ~3 k2 P' q0 {# S+ r
// CAPTRUE 模块 228M 时钟主频
) `) @! J! f/ i: t; |
frequency = 228000000/capvalue;
" P1 [2 R/ y' h K2 `6 e
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
5 u0 S6 J! i$ j. _
" O9 G% D8 E+ \- l0 L
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
, w3 J7 u' ~* T
// IntEventClear(SYS_INT_ECAP2);
8 {$ y t; v6 O7 p( B& n8 n# M
}
I% j6 H" q3 E, f9 S
return frequency;
4 X9 d; |2 ]' P% l! }& s
}
& `; o/ H/ q- {. ?; D
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 K8 y( T7 I$ W
[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