嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
! z' s$ h, P7 N. }
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
, Z/ _) c6 w3 x2 u
/* */
" E. ?/ {5 f3 V, B2 P1 C; [; g
/* 宏定义 */
+ A! w5 P; w+ y5 q
/* */
; M) |: Z$ k2 M" K5 }* X1 }
/****************************************************************************/
, y% i: N# @5 l% n7 B2 h
// 软件断点
2 n8 L! v, A% t# [) d8 I
#define SW_BREAKPOINT asm(" SWBP 0 ");
* j/ a; r2 m/ v. _6 O7 i
' f F4 ], w) m5 N" h' I% L1 k
// 时钟分频
* b9 l% L5 p+ X0 D
#define CLOCK_DIV_VAL 228
" y( ]* _: H( t, f+ N7 N w
* Z. M# Q) Q# P, y% @7 ^; g
/****************************************************************************/
; j3 e5 b( L* O+ @0 `# y4 r
/* */
! r0 b( X, X. b1 S. r6 t+ e0 h
/* 全局变量 */
5 d6 f! r' j7 A5 u
/* */
# G! J6 j% `* [. j. m9 V
/****************************************************************************/
* J3 j! e$ s, H
ECAPCONTEXT ECAPResult;
7 i$ j% r+ U/ V$ u2 s1 K- @
$ F4 y! {7 j/ L. [
/****************************************************************************/
- Y, }3 H4 D5 M m( x. o( S r a
/* */
/ v9 R( y2 Y: e/ T9 c8 g
/* 函数声明 */
% j- R! c9 X" n
/* */
! m4 y" O; S: U6 h+ f
/****************************************************************************/
- d: n. S) A4 X6 j& B
// 外设使能配置
( D0 v8 w3 D7 R# \; L- |, R
void PSCInit(void);
7 X; `- r4 k/ _
/ M7 w+ D; ]: G: J
// GPIO 管脚复用配置
) @/ l8 O' }& m' A$ G( `
void GPIOBankPinMuxSet();
$ }" X" d0 r- ^- p3 F, l! C/ C" l
: [9 o+ K1 w. M! D* @2 X
// 产生波形
, O. E5 m7 W) a, [! c$ y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 Z a9 D6 x, o& S. A
void ChopperWaveform(void);
. C- A- _& T6 d2 y& i, [
2 v) \. z5 C+ O) k( c
// ECAP初始化和读函数
; L7 h: k1 a( O, _
void ECAPInit(void);
5 b' h' ?% w& y7 k& q A
unsigned int ECAPRead(void);
% B1 `7 g9 J3 b" {, ^3 C8 n
2 O2 @+ N) m$ V
//ARM 中断初始化
% I0 x+ s6 V$ e8 {( ]
void InterruptInit(void);
4 w1 c/ t; t* B3 r; j: F
! y7 k% i4 F3 e) N" j& V
// PWM 中断初始化
; L! }6 K2 z" E; T
void PWMInterruptInit(void);
3 ?4 Y* N+ O, m7 M8 m
// 中断服务函数
H; F9 W" y3 H
// PWM 事件
% W5 Q! a8 ?! b* J, S) @, }% `# }
void PWMEventIsr(void);
' |; q- U. Y' }/ ?( w! Z
// PWM 错误控制事件
8 C6 k8 V5 r: i3 i
void PWMTZIsr(void);
2 c( h. X5 j2 R( X5 J
4 N8 O* c) G8 G1 x/ E' A& Y/ J' _
/****************************************************************************/
1 k2 E7 X# w4 |
/* */
: z" Y ^ F3 o- }: j ~0 K) [
/* 主函数 */
/ s1 l6 P8 p' M7 a/ p
/* */
4 B2 C) h6 I# g0 q, D: \
/****************************************************************************/
, H3 ^! Q' {, @
int main(void)
6 `# f4 |* I" Q4 }
{
: F7 M7 n, ?1 B4 D, U4 u
// 外设使能配置
2 R7 p$ h* o4 G4 R: o" } S' g* b
PSCInit();
& W, E: x3 Z) c; g% ^
) j/ j9 G. N: C# A2 E9 [3 e
// 初始化串口终端 使用串口2
, |: ?& c! ]$ }% u4 w. d
UARTStdioInit();
' R6 Q+ D5 F- J; I) `, l
8 D: ~. R& u# O0 \' T7 g+ |
// GPIO 管脚复用配置
: N6 R, k* O2 S
GPIOBankPinMuxSet();
( C3 h1 R: i1 F* Y
! b/ V; b/ d9 g* e, a. K$ P% s
// ARM 中断初始化
! _4 \6 i7 \: O
InterruptInit();
/ d' [: A! R. ?, n$ Y
, F9 Z- ?% {* N4 O: _: y
// PWM 中断初始化
& n" g6 G+ M/ O4 R; |' H- i
PWMInterruptInit();
3 v6 c/ s5 d; C) j4 o9 y; v& ^
5 x g# g; J6 _! D1 A
unsigned char i;
4 u8 e1 V: A( Z7 X' k, T
unsigned int j;
# o* Q/ Z# g9 [+ C7 _( O' W
* T( f k: B' f
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 w! s Q7 o: F0 v1 K
UARTPuts("------------------------------------------------------------\r\n", -1);
: _8 [' ? K! u; R2 ~/ A
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
/ S( a+ h. } Z* [! {4 t
// 产生波形
c B5 E0 h; d( N
PWM1ABasic(25000,50);
0 c& _5 W$ k' M5 u! C3 z% J4 J, F, }
1 j- s6 P4 ~! ^8 K9 v9 o8 U
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
6 C1 K, ]3 n0 j; s
UARTPuts("------------------------------------------------------------\r\n", -1);
# A2 h, x4 i: a% C; c
* x ?6 h% j% \/ @2 ~! e
5 X" m# j* n h
/ `& V8 n) T3 ^- A2 @5 ~1 [% u
UARTPuts("------------------------------------------------------------\r\n", -1);
) h0 T# l/ }7 T L4 Q, X
UARTPuts(" C6748 ECAP Test\r\n", -1);
' w3 V7 F9 R1 s; \+ M9 K& y
// ECAP 捕获初始化
; m4 Y# b8 }! C2 S
ECAPInit();
$ N2 R' g9 R+ W" P9 f% R
UARTPuts("Initialize ECAP.......\r\n",-1);
' i2 K: i3 e& i% u" R" H9 S5 Y
for(i=0;i<5;i++)
+ y0 a. j! X) U: } D9 J* r
{
4 ~5 n8 n, @' {/ C- u
for(j=0x00FFFFFF;j>0;j--); // 延时
; O3 L; Y. x6 G
ECAPRead();
7 L; ?9 S7 k9 F' H7 I
}
0 z$ m( [4 h( h7 e- W
UARTPuts("\r\n",-1);
' o7 P- T# Y t$ O
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
% b$ ~" G. D9 w: j- t T
UARTPuts("------------------------------------------------------------\r\n", -1);
. y( I7 v2 n( l. n) V: V1 B1 Q
" I: g f, g" S* O" f
// 主循环
+ s/ h$ x( l$ W) }/ L( f' @/ B w
for(;;)
0 K/ g0 g" u# d, z4 e" `
{
; U T- x# }7 V0 P* Z
" r1 P' B2 Y1 ^$ i& O- q3 g
}
/ w% n, N3 [# A
}
! _7 ~1 v N# W0 v, B/ B) J
A, y3 W5 M4 s5 P$ z4 o
/****************************************************************************/
" j/ p( ~& Y( J X! h1 c
/* */
% W: r( L1 i& H
/* PSC 初始化 */
! Z; [ t0 E& P, C2 `
/* */
4 W: h5 x9 |0 A6 [3 H
/****************************************************************************/
5 B/ _3 H/ d! o3 M9 p
void PSCInit(void)
9 H( h9 |5 r, }" s9 _+ @8 K' ~
{
& |6 [" `/ ~* ]0 e* T- |
// 使能 EHRPWM 和 ECAP 模块
* U0 F9 u2 c6 Q) D
// 对相应外设模块的使能也可以在 BootLoader 中完成
|2 t8 j+ {) R8 |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
) V/ I' ^7 R6 H+ T. p3 f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; ?3 ~( w, V A3 y1 t6 v4 z
}
7 [$ E* g' T, G- q, T5 I- D1 m4 m
- y/ o. K' F4 w# \* @
/****************************************************************************/
- @: z+ C+ [# E6 ^5 G
/* */
2 b, a# c7 O' h) Z
/* GPIO 管脚复用配置 */
" [0 z: d; s9 ?' D0 ~
/* */
1 ?7 i. `8 [+ [5 f6 J
/****************************************************************************/
+ [3 H4 f+ l" {' I4 ~9 A( D- n
void GPIOBankPinMuxSet(void)
3 n" S( p, Z, a8 u3 `
{
' L( K/ `$ u, G: ]( v2 R/ c
EHRPWM1PinMuxSetup();
& T! A7 r3 c3 y1 c! a
; G1 E3 ?7 V- K. v+ w' O
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
4 t- N/ M7 A/ |" m+ H1 Y
// 作为捕获功能时管脚方向为输入
! S( H3 z2 c$ y; K1 G2 i: G
// 作为辅助脉宽调制时管脚方向为输出
4 @' i" E# {/ y2 j9 Q) v
// ECAP2 / APWM2
9 l/ u' Q0 B7 z( {7 P: x! A3 R* n
ECAPPinMuxSetup(2);
9 @: r4 N8 U7 m
. s" i7 c) _& ]2 d! g4 ]
// ECAP2 / APWM2方向设置为输入
( t5 J& k7 S8 P; i5 Q) o
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 s! V4 q' y+ b8 Y0 y3 v! |
}
/ Y6 Z g, b1 |# u1 h5 k
% M1 x) r3 j0 Y. C* U# x p
/****************************************************************************/
3 b& @+ z& N1 Z7 x0 N: G
/* */
/ Q3 P1 y, ^, M7 X1 B
/* PWM 输出波形 */
4 m" x$ ^0 \& a4 ^' J8 l% C
/* */
$ S$ d1 ^$ z" A' }# ~* h1 o
/****************************************************************************/
6 R# t; M# B9 m# E: ^9 J2 N T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
' y) h+ i$ E! C. V4 a
{
0 h- U; n( N0 p1 I9 ]+ J! i. q
// 时间基准配置
/ X: a* m$ H; _$ O
// 时钟配置
, z0 j. D1 j" D' k6 _; `
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
, c: f, V. y3 q, N# |8 O
, u1 h2 M0 a' [; n, b& g `- G, S
// 配置周期
5 Z) f$ V' w! P% Z e& k/ _
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 I+ g0 o2 z6 G0 E6 k
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 Q9 I A0 |, \1 S
3 h& Y! s) B9 S! @9 K
// 禁用输入同步信号
3 Z v$ V; r8 k$ N
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ p1 x( B+ y$ ~6 |6 t. O0 [
. N, Z: _! p( \$ ^1 B
// 禁用输出同步信号
3 D& ~# C6 O5 j j* s. K
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( h' i1 j) G6 V P; `( u' o
7 `: P ]3 {/ Y' f
// 仿真(DEBUG)模式行为配置
3 O8 z$ P; t( g
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( |5 W( a1 k% R( a
0 b$ e. M0 \' s2 H
// 配置计数比较器子模块
0 `* c% W* L4 I( K
// 加载比较器 A 值
4 g# _' Z& g' F: H4 B: }
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
`$ _* Z; D1 d2 i
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 K7 ~% A5 _+ i( t9 j
2 ^; z t* \9 z. ]
// 加载比较器 B 值
8 N! |/ d% D7 N; }
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 B& a- C, ?8 u
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 w' @8 U% Q; l
$ c5 v/ F6 g3 S5 G Q/ H
// 功能限定配置(输出引脚触发方式设定)
1 U; G7 D+ S7 d" n; \
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# } M" L- d5 N3 K2 p
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
( ]1 ^. W4 ^( x9 o
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 d5 H2 g5 s1 |4 Z3 @6 E; N
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 r/ c: S) t- y: B
5 _4 ^; v# ]$ w: ?2 K
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 K. S$ }$ c9 m5 C0 U
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 s# ~" @* ]. ]2 L2 X
) u- y& r' Y! ^; n
// 禁用斩波子模块
3 v# }6 c; C3 |* x8 k+ e
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, G( B' @" N; S# d- t( ^
* t$ d: k& V% }8 X5 [
// 禁用错误控制事件
% K1 B% w; ~) b! ~/ M6 `
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
) w) y2 t( b5 }% Y- C1 [: p
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 {7 w8 `7 r7 \" J- U2 l! B
) h* x l) T( M6 J+ K
// 事件触发配置
: Z$ V: S7 O9 B6 U, K4 I: y
// 每三次事件发生产生中断
) F9 a- O$ M& b6 ]+ A0 ]
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
5 h. J6 [6 j4 Z, \$ g
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) ?: r0 T% \' h, I" S
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 X5 H; k# j+ J+ S. V3 Q. j
// 使能中断
+ R! J6 U6 |* K! C$ N; V) g- ]
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
# u* d# ~3 |1 y7 b
3 L- h5 ?9 B& T! S
// 禁用高精度子模块
) I+ X8 S7 P- Z* y9 Z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( V3 P8 C$ i& P I
" w& z5 @/ T k K0 r
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
% Q* J% ~1 S$ ~! O4 I1 I
}
2 i- H( t( i. ] N# d# c1 f+ p
. }" f& b2 s$ r! f( Z5 b& F
void ChopperWaveform(void)
0 V. i+ @5 A3 ]& t
{
8 |+ F, m5 E: Q7 o4 b
// 50% 占空比
. J# |0 ^* L4 X( f
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
) u7 \' W# ^: C8 z, k
// 4 分频
$ j% {3 j6 U1 p; s% x
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( m7 Y+ H: W5 [; c3 e
// 单个脉冲宽度
0 T4 b' u7 d0 Q) p# [
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
) u3 b3 @+ F$ O" S; U* N- X
// 使能斩波子模块
$ {; R+ g, M( q ^
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
0 X2 K3 W5 k4 \; U6 ^
}
6 @$ ]3 Z, y7 ?% y- ^
3 S: i* o4 Z- ^" g
/****************************************************************************/
; q2 X5 V, e5 n/ K: r. m6 B; \
/* */
4 z7 W3 f5 U5 s% O* S9 t+ d
/* PWM 中断初始化 */
! w; T9 u' A% n2 l( l
/* */
5 H j8 }, T) P( N6 u
/****************************************************************************/
, `9 q, }" @& S5 V' v
void PWMInterruptInit(void)
9 j2 ]: X# ]$ k/ ^
{
$ k) J9 U3 ^7 z' ?* r
// 注册中断服务函数
# b7 z! i0 I2 C0 B/ \/ `
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 F) K6 ^$ b. ]* ]" H ]" _! `
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. M; ~- h, I! M0 ~* _8 N) Z
. @; b" v0 |- A; `4 m
// 映射中断
% w0 `$ k2 F" N5 L+ q
IntChannelSet(SYS_INT_EHRPWM1, 2);
6 t) a) B4 N+ r9 s
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
+ `0 C8 t9 q: `7 P6 U/ V
W# {4 B, U* k
// 使能中断
3 n4 v/ M2 d9 n
IntSystemEnable(SYS_INT_EHRPWM1);
- b8 Y* z3 N% Q6 T3 F- V/ p; Q
IntSystemEnable(SYS_INT_EHRPWM1TZ);
) T; T$ {0 z2 ?7 y" j6 \( W! X
}
+ g- r. c/ J. @ ^+ k
! @$ a8 i& |9 A( H5 {
/****************************************************************************/
( F2 y- Y. ], }, G9 b
/* */
' i' l" s6 w* H6 [* N
/* ARM 中断初始化 */
% R* ]. B- `4 [* x( T
/* */
; ]4 H* n* @, Y- Y/ P0 ^% f' |
/****************************************************************************/
( ]: b! \ F# G7 W& X
void InterruptInit(void)
! ?1 @: {% O3 I" D+ X; v
{
, X1 q; o' x2 P9 P; h* h1 O9 x
// 初始化 ARM 中断控制器
) l+ n3 n( d L# G, w* L7 B$ \
IntAINTCInit();
0 r" L- i& w, T' `* T* D: E; _
3 I8 [. N/ C. A) e" n4 v8 P7 M+ a
// 使能 IRQ(CPSR)
' A- ]; e7 P. G5 l( A" _" A
IntMasterIRQEnable();
) s4 e$ _0 c% X
3 i u$ f1 ~/ l3 Z( r& ]* J ]
// 使能中断(AINTC GER)
# u3 F" O4 L* v7 I; z2 p' A$ Q
IntGlobalEnable();
9 G) Y }, ^9 B2 y* v0 Z" [
' E! O! P4 y) M0 Y& u
// 使能中断(AINTC HIER)
) { d$ b1 Z9 Y# ^* U
IntIRQEnable();
; y& N4 o8 ~ c: f; s# @) n2 {
}
0 v7 e1 K; | x( ^) d
! P+ M% e% v9 u' W
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
2 Y& s5 a1 b& m1 D7 u
/* */
+ _ E" J! y4 ^2 }6 ~% ~
/* 中断服务函数 */
. J( [3 C$ }* b' a
/* */
9 \( f( Z8 o0 h8 t, {
/****************************************************************************/
) i0 ^$ k' g- e) Y4 ]
void PWMEventIsr(void)
1 q. O- p, y1 @) E4 t
{
, k6 I: i; N6 k: o$ j9 h
IntSystemStatusClear(SYS_INT_EHRPWM1);
" X+ ^: k% N' y4 X; w
6 h: q/ y$ o+ }% Z- H& J
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' ^3 U( r) ^8 X* z
}
$ c+ x) P% `8 K0 t/ I1 c$ t8 L( p( F
# Q6 i" u4 n9 B( K
void PWMTZIsr(void)
, L* ]8 }. P2 `
{
3 z3 `5 `0 e9 W3 g# Y9 I, |
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 y! [0 S' F, K% Y
9 {" W, v8 Q& c' v: D# t
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" B: k: k4 J% G! p9 c B/ W
}
2 C `. j* r9 m6 f7 ]' y% U8 G1 g
0 A' A; O) `6 s4 @7 b6 M
/****************************************************************************/
( \7 P: ?$ Y4 h7 o Y! u
/* */
. z0 t4 r- C& \( f
/* 初始化捕获模块 */
3 C- [( z! I+ T& H. j: b, c
/* */
' t3 S+ G3 D1 t- w9 }) C% e- @$ E& |
/****************************************************************************/
- w |9 } H0 u( b9 @% C
void ECAPInit(void)
" e A4 w9 R) |
{
; b9 p6 M6 i ]' M! d) Z( b3 w
/*-----设置 ECCTL1-----*/
8 `# N0 W/ \4 P
// 使能CAP寄存器装载
3 t# ^& M2 K# T$ m
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. ?6 Q) Z5 r7 S0 `
// 设置预分频值.
m5 L% o. z* w
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# ]9 Q! o/ O* y x, I) z/ D. k4 ^
// 上升沿触发捕获事件
3 y8 [+ E: `4 ]+ H7 V. G% Z1 q% E
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. f6 {3 u* f/ d* N
// 输入捕获后重新装载计数器值.
! }5 P8 l6 }7 m3 u/ B
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
/ z! _0 l% C2 T
1 h& s6 @# l U( D5 ~: `; I
/*-----设置 ECCTL2-----*/
+ F& |7 b. s, A* M( i% t
// 连续模式
! r* L8 v5 c1 d/ G8 f* l8 T: w
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
4 p5 T/ c9 c0 {
// ECAP计数器TSCTR持续计数
) |3 d1 z8 ^6 {8 d$ `- R4 z
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 u2 I9 E$ H0 C$ S5 h( f" D
// 禁用同步输出和同步输入
1 M! f" y) v4 B: p1 n
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
$ a# W) L7 R" C# s9 q9 s& K- `
// 配置 ECAP 2 为 CAPTURE 模式
% T1 ^0 R/ f8 R) _2 \! i( H: q
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- E) s& v; j4 ?6 o; R
, ~" w* @3 o2 V7 T7 B# R3 d2 k
// 使能中断
, n2 y B$ }6 U* f' k
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 j L G/ n- A. i5 n; O7 K
}
G+ A. ]- M5 z, ~5 d
$ Y' F/ p. w5 f O
/****************************************************************************/
; u0 H- y9 k6 L0 l8 f+ L. V
/* */
+ R0 L1 a5 g0 X+ |
/* 取得捕获结果 */
/ {/ q5 r: ?) d1 [( C% s- v6 U G
/* */
* I D0 v& R1 @' p) _
/****************************************************************************/
& _5 _- I9 s1 i# }' h( Y
unsigned int ECAPRead(void)
9 X: z* f- Y0 O8 L5 g- I8 N% }/ c
{
: F( u+ h5 X1 H* _2 q1 f! G
unsigned int capvalue;
* R, i9 V0 w: f9 C0 g' {
unsigned long frequency;
! _+ s: r8 j7 Y: ~+ C) C# a3 m
: O3 d: c! L2 W# l6 {3 i3 H
// Event1 中断标志
, ]; f6 }, ^0 [6 A$ p4 S
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
`! y+ `4 e( `. C/ {6 ?# q
{
; i. {$ g8 F2 `
// 取得捕获计数
7 y4 X$ {$ [ I4 e! m! k
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
' o# i* @8 R9 B% S
capvalue = ECAPResult.cap1;
9 _- t( a4 K, k1 v9 ~! ^' C
: O- ?! M& Z+ ^% D
// CAPTRUE 模块 228M 时钟主频
$ V; W" |2 b/ y
frequency = 228000000/capvalue;
' [/ n# H( {$ c
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
G4 R0 Z3 ~2 R8 B0 j o1 L. w' K
# D# S5 [5 o! L$ p/ O
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
( C$ b8 I8 }% h, j' k% w3 z: U7 \
// IntEventClear(SYS_INT_ECAP2);
+ ?1 i' {0 Z5 c! ` p* p
}
& @8 N: \ `9 {# @' ^/ ^
return frequency;
6 Z) u; W6 C4 u# u3 |4 `& x
}
. y* [7 e' P8 P$ c" N! o- x
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% u+ ^$ U) _. e! ~
[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