嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
7 s9 T+ |$ e# @7 x {. M
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
( g5 Q! R# B0 {+ U! l6 I- u, K
/* */
. B% ] C( v9 e! h. l
/* 宏定义 */
' {( S- @* k% T& ]0 b( X: k9 ^
/* */
/ X1 A# {2 k9 F$ e p
/****************************************************************************/
- B; y( u( j6 t8 y5 |8 N
// 软件断点
8 f; \6 |0 G6 x, r+ Q
#define SW_BREAKPOINT asm(" SWBP 0 ");
% p1 J3 Q3 U7 Y% s2 I
U L ]$ ?3 c
// 时钟分频
: B2 u* w' J7 _9 f, L$ B g6 y
#define CLOCK_DIV_VAL 228
! T& Q; {& W1 @3 k8 G$ L
/ {- m) K; t& a+ M" z/ Y
/****************************************************************************/
% V) n: H- A _& {
/* */
4 f3 f" m* A2 e7 ^8 }
/* 全局变量 */
5 D# N5 \2 D2 Z# u' _
/* */
0 y ^ |* J/ j) g; `# s' M
/****************************************************************************/
( C4 Z) i- j* B( B. k
ECAPCONTEXT ECAPResult;
0 q$ c& o, ?5 |" H' e9 _6 s
3 J+ a! s% ?( P
/****************************************************************************/
" }: d3 F2 M: r6 K
/* */
* r$ q) Y4 p$ g; P3 Z
/* 函数声明 */
, g4 n* ?, _6 @
/* */
% D% k; N o' _* `. s6 q
/****************************************************************************/
8 |# h0 N2 m1 M$ a! K
// 外设使能配置
% p" H2 r( s( W3 ]
void PSCInit(void);
+ u4 i$ l, @5 D- r' z! c" m
M D# C& ^- y
// GPIO 管脚复用配置
! Q. z) G) {2 f! b, c+ |
void GPIOBankPinMuxSet();
+ H6 Q" i4 d8 u; }, `/ K
9 j$ M# L* h( N
// 产生波形
9 B; T, o- P* J; t( t- Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
% J) G9 ? G6 ?
void ChopperWaveform(void);
& j0 _6 \3 i4 a7 v
" w% t7 \+ B- K7 }
// ECAP初始化和读函数
" c# w0 k+ A; Z3 M9 e
void ECAPInit(void);
: R8 b5 X! ?; F' W) t) `) H; [
unsigned int ECAPRead(void);
$ h8 N: r; V2 ?9 E
" D, }/ p; e7 o8 l) }8 Y
//ARM 中断初始化
% y/ c" ~3 c3 R/ k% z
void InterruptInit(void);
/ h% @7 \! M* }2 \- `# u+ D4 o
$ N0 D( }' W) T9 |* u
// PWM 中断初始化
3 C4 ~2 {8 a0 P7 l6 N
void PWMInterruptInit(void);
/ V* W; W2 \! r) U
// 中断服务函数
! f6 ^$ I2 D8 ]4 d( I; g5 S% W
// PWM 事件
: l8 Z5 o$ `2 {) W" ~+ g4 ?9 ~
void PWMEventIsr(void);
! L# }/ x, h& W, \0 o* `
// PWM 错误控制事件
' y# w7 n6 f6 t: w8 b5 r/ t
void PWMTZIsr(void);
) L, m, i5 ?# s" z4 f# N( ?( z
% N: V; v9 ?/ Z/ g- e8 m* [# d
/****************************************************************************/
; a7 Y- N1 S6 ]1 ^. F
/* */
3 R) n. e, y& I0 h, O7 B
/* 主函数 */
8 t$ D% d2 w3 x% p1 K
/* */
( b. f- `# F1 E( O$ J+ K( ?3 P
/****************************************************************************/
5 F1 a. ]7 Z# l) d; N
int main(void)
Z) G* P7 }3 N4 Q+ P
{
* _+ S, k8 w. e2 s6 `
// 外设使能配置
Z! E% j0 ^6 e+ n
PSCInit();
0 H6 n9 s: V! D1 T& G. h
, k. e0 ?7 \" R/ T; f: t, J
// 初始化串口终端 使用串口2
# ~: p3 s0 q% N$ V
UARTStdioInit();
% o) {+ Q) J& N i% s8 m& c2 n S
( @1 ]7 m+ }2 x4 e* {8 Y9 ?7 W5 F
// GPIO 管脚复用配置
. G" r, v1 G3 |' C
GPIOBankPinMuxSet();
1 V! h3 \: }+ E4 C; H6 ]7 R5 [
8 y; d) {% N4 a, w
// ARM 中断初始化
* ^7 h0 |: b6 f' L5 U7 W, Y; o
InterruptInit();
( J' \7 W8 r P! ^# _
1 w& ~9 R8 t8 f! ?7 D8 [7 o6 `
// PWM 中断初始化
5 y# G$ B1 j( u- i& Y
PWMInterruptInit();
) @ V( J! `, S5 A* k* w( W
5 h- F: ]- D0 }! k
unsigned char i;
& ?7 A* q8 ]: [
unsigned int j;
- b# z+ G, v) r1 n% R0 y, y8 O
$ s9 ~+ b) k4 Y
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: q, _, Z1 a$ l& _' C7 }' K9 l% [5 q
UARTPuts("------------------------------------------------------------\r\n", -1);
+ V" F9 w7 b5 @/ t8 b4 H" u4 z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 f( j- t. ] V+ D0 l: j; P/ {
// 产生波形
! X1 M2 K& |3 R. y L
PWM1ABasic(25000,50);
9 X/ q1 o# ^* \ T# x- x2 w* y
1 J! p$ t9 Y C+ x% o0 ?9 d f
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
( c$ ]& \+ W! l
UARTPuts("------------------------------------------------------------\r\n", -1);
5 h- Y. y; p: e5 n/ J9 T0 p1 b
) I, Y- ~4 |4 y; \( r5 o, j. F
# M% O" F7 ~& Q- Y7 g$ Y7 N
7 l7 ?$ f& h7 @. S, G I
UARTPuts("------------------------------------------------------------\r\n", -1);
( ?7 q8 p; A/ E8 T9 J1 t7 Z$ ^
UARTPuts(" C6748 ECAP Test\r\n", -1);
/ y$ G, t7 P* A2 f5 I) Q# @
// ECAP 捕获初始化
4 k& j9 r7 `2 b: a! ^" B4 s
ECAPInit();
2 b4 I6 M6 Q+ P
UARTPuts("Initialize ECAP.......\r\n",-1);
?0 @- w4 l0 D# b1 ~& V
for(i=0;i<5;i++)
7 Y6 O. v$ M: H3 q9 p+ L. h
{
P# s$ @% b, [
for(j=0x00FFFFFF;j>0;j--); // 延时
$ E; T& _; h% S. o: W. p
ECAPRead();
/ W9 ]$ h6 e* ^: Q& N
}
' A. ]( x9 \- B8 ^$ h8 u$ V
UARTPuts("\r\n",-1);
7 z$ \! v! i/ z2 L m
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' ?/ } c9 r5 l7 p
UARTPuts("------------------------------------------------------------\r\n", -1);
% {& i$ Y0 p) v" W6 M) o5 z$ g
! m2 i8 {1 T0 N: `: Z: w6 V
// 主循环
7 Z O) L' i& r
for(;;)
3 P8 z4 d' Q( t' x
{
* r% E5 B$ ?" O
, k7 V4 i: E" U& x) k& L. u
}
) Z% \1 |! _; u- D& i
}
! {1 E. O; X) l/ c( P! j* }7 z8 ]8 u4 V
, Q* f6 ?" C3 c' a/ U
/****************************************************************************/
' t/ a0 C9 W4 t- n* L: ~# ]- c
/* */
" \' A, T5 R. d% g' V* [
/* PSC 初始化 */
* _5 @2 R0 z' h9 ]/ U7 O
/* */
! i; p# w/ F- S5 i3 U( U+ ?
/****************************************************************************/
/ X, F i' x& l, c) v2 ~3 i3 C" @
void PSCInit(void)
' O: b. M1 i8 K9 j9 ]+ D) j2 h
{
! ]% {6 [+ u' G
// 使能 EHRPWM 和 ECAP 模块
: J9 E, F! Q7 Y; w7 n7 ~7 {
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 `$ {2 n1 x8 w# j- W6 o
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* L& i! U. k" J) U0 z: \( D' C1 ?& w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: F% [! m$ D9 }! i, p3 O
}
9 R" Q. D# e; [& Q2 e
' K) J5 f- ^ W$ |9 n
/****************************************************************************/
! m+ m! W5 {# G0 X) m
/* */
( ?' l, i1 B3 ?
/* GPIO 管脚复用配置 */
& N$ w- M0 _3 x9 e2 Y
/* */
' n" p( [ {+ u' x/ q2 {
/****************************************************************************/
$ W& e! y5 k: D6 y- d
void GPIOBankPinMuxSet(void)
6 [% P+ p) w- K3 o! U0 Y* L- |
{
, U) w5 @0 @ \ Q* B) y
EHRPWM1PinMuxSetup();
2 \$ C2 O2 {8 F# a7 \1 I; f
# Z% h r& J) G7 |4 k( e% u
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 a& g- J; M. ^, w! Z1 F
// 作为捕获功能时管脚方向为输入
) M- M# }9 W3 ?) x) C4 y
// 作为辅助脉宽调制时管脚方向为输出
6 Q# B- y! _8 I) e% F8 `; c# I
// ECAP2 / APWM2
' E& J8 B: [% @! M5 n; I& G. s
ECAPPinMuxSetup(2);
& o. Z( g; o- G+ Z, a9 r- s
0 ^, I% ^: t* c; {0 `. C
// ECAP2 / APWM2方向设置为输入
/ i$ g2 h6 [1 b, a
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: v/ {$ O- e8 b+ d, n
}
$ u% [4 _1 e+ j C# x, i F
9 i9 M" t. F |2 C7 t* v
/****************************************************************************/
% _0 F1 y$ q. }; `
/* */
# g) z0 O' {! H
/* PWM 输出波形 */
$ t) n5 P. h2 X5 g7 j# |5 O4 C
/* */
! g* y$ ]3 c* L+ B- D
/****************************************************************************/
2 x: t% M: V" c/ G( N# i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
6 c1 o5 g6 X9 w K; l
{
9 B3 v/ \. r% N
// 时间基准配置
8 W7 } W# |# s0 R
// 时钟配置
& g& c! W/ t* i0 }$ H7 S
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( [: g* M4 S/ V# X" s5 e
, } l% c) w* F9 F/ c7 i/ o
// 配置周期
" F0 c' H: R5 ?! @
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& Y# x# h( J4 U9 J L; N) j: Y7 O
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, Q+ X" C0 w! S8 w
a. o/ ^4 Y. f+ Z3 E# c1 O
// 禁用输入同步信号
! C* w% h6 m) H n2 b
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
; ~* n0 q% L/ T8 v2 x3 j
" L" y3 ~7 U% l! m- F6 ?
// 禁用输出同步信号
7 ?6 K6 {) u8 `& l- p# S/ N
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
/ l8 q: ~. c; M+ I4 p
0 s, U' H5 v; c2 I* u* Y( \: `
// 仿真(DEBUG)模式行为配置
" X( V2 |% E1 I5 Z: j) s9 ]
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
% }5 O; v9 V* T
8 K$ X' s% _# r; G
// 配置计数比较器子模块
( Z8 S0 J$ X8 h4 n) |5 {6 u1 S
// 加载比较器 A 值
. b/ L! K7 E8 a! Z( i5 ^& q* O
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; Y: \: C$ v. x: S2 c T
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 c$ A& A: p, p5 B: _
" S x) ` e& x3 Z4 u. i+ L
// 加载比较器 B 值
5 h+ X* ?& r! y+ }0 q! p* }: ?6 X s. M* _- ^
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 p. }$ F! _2 E' H' e9 P5 G
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% G5 Y4 f: p' r3 T3 g6 x
; E1 E7 d) z. x2 b$ I/ {9 A
// 功能限定配置(输出引脚触发方式设定)
0 s7 y# x$ A7 Q# h# A3 t& y; f& {( Y" b( @
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- Y j# D! ?/ F- s0 j7 \0 D
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 i) x5 Y( s, g. M. i6 F
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
0 C: t* q1 z2 c3 O
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
4 }4 U. N0 B1 p' }. b# w
, C5 [; N% s) Q. @* r: K
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 N' q8 M& h* `# |* t: M
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 U$ O9 R, a0 w* l
. h( X: `# D& h7 v3 K+ p- n! U/ V
// 禁用斩波子模块
' T9 N) \( M8 C9 J
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 p4 o7 o2 B8 r( N1 r7 T2 \9 @
8 G5 o4 k: H( T7 y
// 禁用错误控制事件
$ d8 n. k' j% i6 U% u) p
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ c- e6 b/ W8 H2 c$ p/ g- F( q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
9 X8 W' W- F s4 O: y
+ K1 {& G+ @ e, c3 q6 z
// 事件触发配置
5 P9 }; @& b1 w3 x+ G, X( y( c4 J
// 每三次事件发生产生中断
* x7 o3 J8 k, A, V
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. [' I/ @0 }3 \3 w. T5 q
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
3 w1 L0 \) K; B5 v+ n
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# H$ v1 i8 ~# g, p3 t- K
// 使能中断
8 i9 c- F2 V" @1 Z, g) z( U
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 a& j2 e' S& d% C2 J/ u2 G
( z0 E+ `1 _% B, N; s2 N
// 禁用高精度子模块
?7 k( e0 x( b7 L! }
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 B% `* M( H2 n& C
0 Y) ] I+ G& N7 O/ F. ~! L
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 L* X' M" f$ _5 o# Q$ d, e0 H
}
7 |$ Z1 e& e6 a6 ?6 [+ D3 q
3 z& {) S9 a$ _, {- |4 a
void ChopperWaveform(void)
5 `- z* J: D5 s) J
{
. R( y7 r& j. d
// 50% 占空比
. ^ O. l: L- f# y: d. V, {
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
( R3 C& r2 H, v8 {7 s4 E# ^
// 4 分频
+ F- F: B* q2 n
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 f$ T; |1 O4 j) U3 V3 p
// 单个脉冲宽度
- b% A( e9 F, T
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
' Q! j; k" r) v
// 使能斩波子模块
4 W9 }3 J; B& b. R; ~: ]* }
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& p0 R( {4 x# T! Z# @2 R5 _6 W( w
}
! q) I9 y( ^* j$ p6 p
% t- f. U3 n& q1 p1 _
/****************************************************************************/
9 i6 s# f$ \7 ~& F' w7 ^" q
/* */
3 C$ Z# \0 s$ S, s! E
/* PWM 中断初始化 */
Y# t0 u: |) c
/* */
- s3 e5 ^+ j2 r: D* V& ^) o+ G
/****************************************************************************/
& s1 o- {7 y! O& @8 p
void PWMInterruptInit(void)
$ G9 d: }0 W @% i! ?' j! n
{
' Q) R' y5 a0 _' `& m5 g1 v/ g
// 注册中断服务函数
* b) A, G( P1 Q8 \; Z" m/ F% F, J3 o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: v1 ^% _8 B8 x& K c3 o3 q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 U9 }, g N* @4 Y( s; y
# Q6 I# ?( w+ V/ H
// 映射中断
7 J% x. H; R. o) W7 { w* m) G2 y2 H7 A
IntChannelSet(SYS_INT_EHRPWM1, 2);
- }0 V; v5 s+ U; U! W; I
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) ]; ^0 w# O9 ~( a( `1 c
; Q$ k8 M/ _7 H6 n& r6 |7 H
// 使能中断
; E7 m7 Y3 o$ v3 H
IntSystemEnable(SYS_INT_EHRPWM1);
( p* {2 v$ H* e6 W7 z1 P
IntSystemEnable(SYS_INT_EHRPWM1TZ);
# f" f4 |2 V, K+ B
}
5 T& c- r8 O4 r, b# ]$ ~* v# \7 ]
, N2 A# L" y: w; X$ r- ?
/****************************************************************************/
+ y/ z ? d3 u# |8 E+ k% \
/* */
- S" i& P2 P# }8 U
/* ARM 中断初始化 */
% F. [% |; F B: Q- c
/* */
6 ]" ~* [1 |( j# A4 x: x
/****************************************************************************/
' `: S9 Q! `7 o7 q* v0 [
void InterruptInit(void)
% X1 h7 h: ~" @8 P7 l
{
9 b4 v- c: F! Z" y' o4 b7 J3 M5 ]
// 初始化 ARM 中断控制器
( y; m' g- ^8 l
IntAINTCInit();
6 q1 y% T8 s" W" d5 l
4 t. H y6 k+ @+ s
// 使能 IRQ(CPSR)
) N$ Y* [/ M2 f( r: g
IntMasterIRQEnable();
F; b$ r s1 B& Y4 v, A8 G6 e
# T* U* X+ W, T, w4 j
// 使能中断(AINTC GER)
. X. L( |! Q3 D' l$ e: {
IntGlobalEnable();
. y; U6 I/ D3 w/ e' h$ j- n
5 p" M, Q0 s* j& B5 M5 X
// 使能中断(AINTC HIER)
7 {9 b8 Y+ Z) O( \- }8 l
IntIRQEnable();
0 ~& U8 R: J' B2 b5 B8 o
}
0 Y m1 j4 y- J7 ^6 |$ g
s4 k; \: h# k; _) q) ~
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& }( _/ U9 o0 [
/* */
$ l" |- e: V/ R- G6 K' n
/* 中断服务函数 */
* V$ ?$ ?+ E3 f" o5 K7 ?+ H
/* */
+ X5 _0 ^* ]0 l5 t( x$ r- i3 o! C
/****************************************************************************/
" r, ?; V- e9 l1 h6 J! b0 _
void PWMEventIsr(void)
+ a$ T- Z! C$ v2 x* J& f
{
% p3 M8 [" D- s1 W! @' M0 v x$ f' Y1 ^
IntSystemStatusClear(SYS_INT_EHRPWM1);
" V/ D+ o$ @' k! }
: }& ~. d0 h4 Q+ l9 X5 l6 [
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' v5 S; ~3 Y! M* R( i
}
]9 S$ Y& U0 O- g' \
; O1 o# J7 b: N$ f2 G& |
void PWMTZIsr(void)
, ~0 p6 x& ^+ Y) O/ B0 D$ s
{
+ A8 S' H) R* H* h
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 |% u$ C" x1 Z: W& B% F0 O1 @ [; L
, ]) i0 l, r* u' _
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# n; D1 w/ }: ~# w- N
}
& X% u7 E. g( u. n: D& ?
! N$ S! _" Y' Y2 y; ]
/****************************************************************************/
% a6 w$ u4 {; f" O
/* */
: N b' C' K* g; F4 a1 E" a/ e
/* 初始化捕获模块 */
8 L; j4 e5 [" Z0 @0 l7 V
/* */
# o+ H5 i! n6 v S
/****************************************************************************/
; l7 ]& {1 C+ ~
void ECAPInit(void)
4 d# u. R: J# l: e- a x) M
{
5 u( M/ a% ?& T$ K- L J- I
/*-----设置 ECCTL1-----*/
- L) u5 }. R: `3 O
// 使能CAP寄存器装载
7 l l- Z2 c: j9 G" E" V
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. y. i1 u4 `- F6 L: D& {, [
// 设置预分频值.
/ y* }+ {, {) H! e) |1 n/ l
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 i9 ]( K+ B( w. }1 s& k7 ]
// 上升沿触发捕获事件
: w4 _* l1 U' |0 n
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& j" g- e* E: Q( R" \7 l. n- K
// 输入捕获后重新装载计数器值.
7 T4 T# \/ r _; p
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 Z3 _4 {. M7 @; W9 k2 H
4 z# ]0 T* l6 Q& B- I* J P5 G
/*-----设置 ECCTL2-----*/
. p* h: v$ L' t
// 连续模式
9 m- J, j N/ ?0 y: `$ t
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, B% @7 J2 i7 D: C- ]9 J8 b
// ECAP计数器TSCTR持续计数
+ A6 L9 B# x& ^
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 k) s: o$ B8 C' \: \
// 禁用同步输出和同步输入
) Q" g, J" I5 \3 J, q6 S8 G7 F
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
- n8 @9 T) c" n; U- @
// 配置 ECAP 2 为 CAPTURE 模式
* x3 ~! s+ @' B% c
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
, V" t6 g h o- M: x% U, D
4 {' m# O( Z. P4 p) P
// 使能中断
( g ?% [+ R0 {; z5 [4 D
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( M& p2 D2 s% u7 a3 e
}
& [# Y& w4 N0 C! [1 d
% r& s* ~7 g5 a" K V" L9 v3 K
/****************************************************************************/
. U; l6 v2 A% @/ g, r, S- r* p
/* */
# z7 B+ c- Q' H" \8 R) j
/* 取得捕获结果 */
5 t; J0 A$ v- U
/* */
1 |9 k: ]6 O. l' t \8 q' L
/****************************************************************************/
7 h2 @0 y4 R, q6 D! J8 N7 W* j
unsigned int ECAPRead(void)
0 Q% ` w3 |+ g
{
" r6 [8 L( O$ ]# y0 h* D% X
unsigned int capvalue;
" t( J1 x" K) u& a
unsigned long frequency;
( d8 c3 D( V* l% _- b! B2 g
/ d8 K, j" E. n
// Event1 中断标志
: S; o" X. o9 ~4 x; e8 c, c& G
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
, F( Y ?" O: d0 @' p
{
% k0 ]$ m8 v- H7 U4 V$ V3 N& V
// 取得捕获计数
7 {5 Z t2 w" B [* u* e- ^
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
) o$ h& _, u# d4 s
capvalue = ECAPResult.cap1;
! F& A; X4 t) T
! e# e" p! ?. ~6 B5 u G
// CAPTRUE 模块 228M 时钟主频
- @& H& q! Y2 i( z; a( b- q
frequency = 228000000/capvalue;
5 Z% `7 k8 i: c5 i9 Q0 {. e
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
4 v9 N) @( U& k" h$ F1 d9 d
$ e& X! N1 I5 c; j
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
& m' T+ W- _7 T, @' ~ U
// IntEventClear(SYS_INT_ECAP2);
5 X3 g+ w# Y: W5 N, O0 _
}
' N& ^) X3 P& J1 h# ` C, e
return frequency;
" l& q# n) [& B/ y3 p3 y
}
! [) |& H7 R1 r
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
2 v; U5 I" o/ P( ^8 e+ D
[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