嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 V9 r* p$ r$ M) S' e
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
3 R* ^9 Y6 g1 H- j* x/ u# [7 I0 f
/* */
3 f/ g$ a- M% H/ Q
/* 宏定义 */
* f0 a+ L4 @! p4 s6 q8 O8 J- R
/* */
' D! l+ L- j( ^. O+ h# y
/****************************************************************************/
0 {" ^( G" C) a8 t6 E& D
// 软件断点
6 w3 e0 d6 `2 |9 u& w, S
#define SW_BREAKPOINT asm(" SWBP 0 ");
" H* |, x' h/ i7 H( c% f8 R# ~# R
7 m7 y! f: A c% ^3 X6 ?7 c- h& m
// 时钟分频
4 e l$ b/ F* i3 [4 y4 _
#define CLOCK_DIV_VAL 228
1 c, g; F2 [/ R2 R) n
1 X$ T2 ~9 E% M# d2 d, `; X# r: Z% Y
/****************************************************************************/
& x+ H/ P1 Y F
/* */
3 T# b3 z( a2 t2 x3 O6 g9 E( k6 [
/* 全局变量 */
. k" N4 O* n( q' ?, D) G: s
/* */
1 g$ V( q6 l- |" B; G* E
/****************************************************************************/
1 T$ z2 y6 S5 d4 U# } D. G0 N
ECAPCONTEXT ECAPResult;
, l1 j. f/ j; K/ c" ^! `7 [- W7 x
! U$ t8 f) }" \- ~# n* w
/****************************************************************************/
2 F5 V) t$ e! H* u5 y! m
/* */
! \" ]0 Z7 q* n( @
/* 函数声明 */
x' m& h- s3 p, u/ Z) |
/* */
, [$ P. O2 N' R, G" B) N
/****************************************************************************/
6 y/ A, p8 a5 j# ^
// 外设使能配置
: O: t% H% N8 J1 u( q2 @
void PSCInit(void);
3 g4 h4 X4 {; |6 f
6 D8 Z, ^0 v" G# m- O1 I
// GPIO 管脚复用配置
- i1 B# I4 k/ ^# {; ~/ L, M t! D
void GPIOBankPinMuxSet();
5 ]. q) W, Q; N* @8 ~) O$ ^
7 u- O m1 }& M; c4 m& B! B1 P
// 产生波形
' N7 B% |. I3 P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: v3 T; C. |; x/ p
void ChopperWaveform(void);
! S, ^$ _* e V) z2 B9 H
' ^* D7 o( ~# C3 F6 d
// ECAP初始化和读函数
8 M! _1 Q1 s& \
void ECAPInit(void);
$ ~+ P- b6 P) g5 |& D8 E+ a) E% _
unsigned int ECAPRead(void);
* M) a& { |$ ]
/ O) j: M) I- e4 A5 k
//ARM 中断初始化
3 C1 b- Z) Z0 b) J E) s
void InterruptInit(void);
$ e: z. q) m4 U+ Z$ V, a3 M
7 ?8 n- g) O* @2 d
// PWM 中断初始化
2 |0 o+ E" s% P7 B1 ~
void PWMInterruptInit(void);
- @: @/ K1 G1 l
// 中断服务函数
# z6 B, r8 ?* `% Q) o
// PWM 事件
0 f& Z1 _1 f2 I, \
void PWMEventIsr(void);
: {. `3 c7 u4 P; G" o* A
// PWM 错误控制事件
# p1 j, }) c/ F& j* |" q8 F
void PWMTZIsr(void);
/ {! T; f* {# T8 G
* _' [1 U, f3 _2 a, i2 F8 }8 k
/****************************************************************************/
) k$ u. B2 _( [3 B% {" y
/* */
6 }1 ~0 I t! B* g4 Z4 n2 H% C
/* 主函数 */
; }! u- I' R- _ c9 S4 w; C
/* */
; I9 e$ o/ u! @
/****************************************************************************/
, {: w% U9 @/ W X$ A$ O
int main(void)
- G5 X+ ^( u" | V4 {
{
2 |' O$ s0 D2 s5 j
// 外设使能配置
( W' l# ~8 v ]1 n2 }
PSCInit();
, R! W) M4 X3 {
* m% E6 i9 k: j$ Q7 E
// 初始化串口终端 使用串口2
1 S: a8 {$ H6 D5 N& N+ _
UARTStdioInit();
( X5 ~' ~2 P2 |" _% G
: @* q2 a. ?9 u7 N4 C4 `
// GPIO 管脚复用配置
! S3 s' e }! E3 x
GPIOBankPinMuxSet();
. m# ?7 A# x+ `/ a9 |) V/ X
4 q: X) \9 f& c! a: x7 S
// ARM 中断初始化
, N) X" B/ v7 p8 N/ U0 Z, l
InterruptInit();
. U- n8 Y! s! F
" J% j- H: B- X7 C& D1 K, h1 @ \
// PWM 中断初始化
, F, h5 y; p4 |# F1 t( ^
PWMInterruptInit();
, f* ?" P- G9 o$ J1 s6 q
' ~+ J- h+ {$ Y! U
unsigned char i;
9 l1 p4 p( b/ N0 ^
unsigned int j;
& g0 _ _, S/ E: p3 O+ b
( S" { l6 k/ O9 ~1 F0 U0 M( H
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
8 d( G x. e$ \' o: Y& i
UARTPuts("------------------------------------------------------------\r\n", -1);
: h3 Y) W: x; f; A7 a7 N. }
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
; Y; w& T8 V6 _0 P( Z& X6 C
// 产生波形
8 S, {4 K" P. I
PWM1ABasic(25000,50);
- ]0 w% v1 k0 A
4 P* d' o6 U7 Z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
1 v/ \& g; Q$ k! u' Y- Q! }
UARTPuts("------------------------------------------------------------\r\n", -1);
7 e1 X& S# q( ?& e2 ?, l# u, u
% U ?9 d5 V( ^3 V5 E
3 Q. u6 K! t+ h/ j; K: d5 e
$ X4 D$ x `, C6 F0 h
UARTPuts("------------------------------------------------------------\r\n", -1);
" X, D$ t+ ~/ e) |' Y$ V
UARTPuts(" C6748 ECAP Test\r\n", -1);
# L) N6 j% w& j
// ECAP 捕获初始化
1 o S" U. R# V- R) l$ r
ECAPInit();
5 I/ f1 s; O( ^2 W0 V
UARTPuts("Initialize ECAP.......\r\n",-1);
$ }. T( K' l# F6 ~! c z
for(i=0;i<5;i++)
/ L. W+ m- J$ f8 ]
{
: R4 {6 W y/ _) R/ S0 c
for(j=0x00FFFFFF;j>0;j--); // 延时
% e+ O+ t9 l9 q$ {0 J( H& I
ECAPRead();
1 {& S/ G, c& \$ X* E8 s# p
}
/ e( N* x% L3 M0 D l. O: E: h
UARTPuts("\r\n",-1);
6 w; e" S% @) `4 b- d
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; E. r; M2 M6 o# M! [0 E
UARTPuts("------------------------------------------------------------\r\n", -1);
$ p2 r. e6 ^' q! I9 \" l
$ Q' i4 _+ C3 b6 z
// 主循环
0 j. v; I; O) X, ?% v; h# Z& x7 X) e4 J) {
for(;;)
f' z4 V- g0 W9 }1 X5 r
{
9 ]" V. x, R9 O& a; F
}7 l5 e8 B& b1 d3 C0 Y& \/ ]
}
, T! } g: N U/ ?" y& e+ }& ^
}
2 ], h, h! i- e
& Z* L2 T- l8 }2 j }# z( s2 i
/****************************************************************************/
, L2 o- r0 C. J p& {
/* */
# T. _" }$ O4 M
/* PSC 初始化 */
# D+ k! _: Z8 U1 p
/* */
' G! r* y' [. j! g4 A; m6 B8 l" M
/****************************************************************************/
' y8 J4 ?- D. Q4 _
void PSCInit(void)
+ n; D: L; G( ~2 h
{
6 D) {( ^. I' Z+ Q. h3 ]
// 使能 EHRPWM 和 ECAP 模块
4 J) v6 Y. X2 b x; s
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ ]4 Q, U& N& o' i+ O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* r% a5 h( u1 s, m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
T' u; ~( A/ [9 n9 X
}
7 i" H5 r. l+ _. r% m
$ T0 @( f, T; r* ^2 {' C: P
/****************************************************************************/
5 z; B v& l1 L9 u @ J
/* */
/ r) a# v% \& x# u; I
/* GPIO 管脚复用配置 */
, O& \7 [8 e* f7 J+ O7 h E8 t, D
/* */
5 { m {$ A0 L1 J2 ]; Y
/****************************************************************************/
7 \ l6 w, U2 r9 @0 H
void GPIOBankPinMuxSet(void)
+ {4 B+ r4 F6 G& U1 ]% {
{
/ o! j/ \ k, U& B
EHRPWM1PinMuxSetup();
$ e; I7 ~' J( U4 \8 A
, O; l% i9 \0 c! {8 Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- h" C+ u- ~( S: G! t ]2 y; x
// 作为捕获功能时管脚方向为输入
8 d) P5 A" w# ^$ [
// 作为辅助脉宽调制时管脚方向为输出
3 H5 Y8 \8 a2 M8 q8 O7 o% W. F
// ECAP2 / APWM2
- I; C. I, h) c) d7 a8 ?* ]9 J
ECAPPinMuxSetup(2);
. c1 U6 n, v6 r$ L2 ]+ p% x
7 c8 q/ i1 n, h/ l- k6 X
// ECAP2 / APWM2方向设置为输入
% g M |: G B0 y5 L7 ]: Z
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
% {1 Q7 }4 I u! V
}
1 F# l4 r4 m* H) D4 s
) D) t {, ^ ]
/****************************************************************************/
3 N- n$ s2 `2 ]/ p; m2 W' ^" h! \
/* */
$ c- w: h/ e' {; d' V( S
/* PWM 输出波形 */
' A8 ` L" ^3 x, [0 M/ q6 c6 T
/* */
! `9 f* Z! y5 s+ L) F. W
/****************************************************************************/
% `& j8 I1 ]9 \% p2 N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
7 i+ j2 g; R. K) G3 |
{
9 L: h; L1 q" X( {) H
// 时间基准配置
0 J4 D4 S. K6 g' D1 l8 L
// 时钟配置
( L" ^+ t7 X: }6 H8 `
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 Y+ y" u5 y+ Z
& {+ `& e5 {' L9 y# n! d( d
// 配置周期
9 }: K" [1 N* X3 h; Q
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
) @/ s: i) u" d! ~7 x
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
, e; O; C; ]. Y" Q/ g$ j
" H# A- [, f* d( y: o7 y+ [6 d7 u: d% x
// 禁用输入同步信号
5 r! m" K" m V& L5 U
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ ^$ T ]/ R7 I
$ d% {! K9 L( r! z l# ]# h b) j
// 禁用输出同步信号
; C/ F5 }% E' A, M0 C+ Z* z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 t0 _% b8 `: m3 S2 {4 F
% S4 O4 `5 ^* j# i
// 仿真(DEBUG)模式行为配置
0 D' e8 o; ~% I) | h( C5 T1 E
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
: t8 |" f9 w; X6 \6 s$ I3 g
) ]( v' `$ x P7 e
// 配置计数比较器子模块
/ y2 H8 M a1 T6 l- f
// 加载比较器 A 值
C3 c+ q. }* J( a$ y+ {' M
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- L) G v' `4 n, R2 M$ s5 z' V8 g
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' P8 B8 U2 _3 }% m, A' c
" h" T7 ]; {: r; x+ x" C; M
// 加载比较器 B 值
* T5 g k* q7 d
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
: v R6 A) |% t8 M/ j
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( i; b5 G* g& l" _1 T3 l
. p5 T4 g- ~7 f, E" O' ^
// 功能限定配置(输出引脚触发方式设定)
0 l& S$ ?% l' w% T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 Z M7 Z9 Q! ~) I
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 L" w8 C: u w8 m, p
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 t' k2 u+ O+ H7 B2 ^1 Q1 f: v. S/ D
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- n* L1 y* i% z/ z r& I/ a) H/ |7 g
% W6 k y' ]- j! H; Q, A4 F
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 X! A; M6 K" v- _# C8 R3 B! z4 e
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
+ ~4 Z8 }5 b/ I o1 ]4 D
( n) C& d; i5 T( s
// 禁用斩波子模块
: E& F+ G6 s1 f' S v5 V# `
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
! q* \) C/ X% L8 X
; m2 ?% v! E. [* l( f8 K
// 禁用错误控制事件
2 i) O9 i& J. J9 {
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! e5 c5 p6 H) m4 S) s% h, O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' J4 q R8 a1 ~* |' t2 @! s$ c6 s
% h w2 f" Q2 |
// 事件触发配置
) ?0 q; H3 ?) i- r% Z
// 每三次事件发生产生中断
2 B/ ?; k0 H5 w% H, P
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- T/ G* t8 P; }" z. u0 u
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
$ Y( Y, ?" \! @- J5 ?8 P/ Z& g; _
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
: q; ^" O8 R! L
// 使能中断
. m: H4 H6 G$ O7 s9 m6 U
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
c- w( _. y: A8 o, `" _( L7 {
: S! u) [% Y$ G+ f6 \5 i3 P A
// 禁用高精度子模块
) D$ i4 k; i* U" _/ Q
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
; j# _. O) w0 x8 I& R$ {2 X
& d! s9 ]) Z! W! s7 L
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
% F+ {$ j, C! d- ?
}
7 `; ?+ g& d# \1 {' m
0 A: R* w o1 U; c$ R0 L* Z% @
void ChopperWaveform(void)
" d3 T; i. r, ?7 y- c: V8 @
{
5 T3 W, s- U h
// 50% 占空比
" E! h3 [6 _- X) P& S
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
. k+ Q4 f# v1 g
// 4 分频
! O! z1 v/ d8 b3 G8 q
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: j' `/ i% s. u3 y! Z
// 单个脉冲宽度
1 }3 o( j, [" w0 s0 M1 v
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 E: @$ e/ d' @( r! u1 z
// 使能斩波子模块
2 {0 [! f& v% C0 X# z' f, e" I$ \$ R
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% R' Z9 E$ }7 T7 q; P
}
; p3 \+ N6 a6 C3 v8 ^
8 v6 P+ P, c: j M* ^; m$ H2 U
/****************************************************************************/
1 _4 j, r0 a! B' H* Y
/* */
; u- S9 a1 J9 N q% L
/* PWM 中断初始化 */
+ l; q" ?. n$ Z$ ]' b4 _
/* */
; A& ]% n5 M/ |. O
/****************************************************************************/
# i4 F& K; D& j! ~
void PWMInterruptInit(void)
0 B. b& r& O( l* d/ S
{
6 g! b: h# F v
// 注册中断服务函数
) ^5 Q9 h' m$ } Z8 C$ r
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 g T' ?+ x d
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ L% w, j9 s, P5 h
& D: t9 w$ c: V; g; [* w
// 映射中断
, K3 @2 b7 ?7 ?1 Q% ~: O, b
IntChannelSet(SYS_INT_EHRPWM1, 2);
. s5 N8 L) l7 M4 e
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& W1 T% O1 ?# g' p- g" V/ k
5 X! @7 U5 z$ [+ T
// 使能中断
% p4 \( }2 I5 ~1 p0 q" d5 [
IntSystemEnable(SYS_INT_EHRPWM1);
& J- e; b+ L, r& j4 Z9 g9 S
IntSystemEnable(SYS_INT_EHRPWM1TZ);
& J7 g, i! E1 Z) _) }0 G
}
. m/ W9 p* }5 f( U" [
4 q8 d7 j2 o d# m0 y8 L- a
/****************************************************************************/
n! Y2 f7 k4 L. i1 t
/* */
# p- L. F+ |+ f; u
/* ARM 中断初始化 */
% Z, X [% C& O, T2 r
/* */
' R; O4 }4 g6 Q* X
/****************************************************************************/
& `2 Q, k% x, u3 k7 u) W. ^
void InterruptInit(void)
4 Y1 a3 c( C6 D2 ~
{
2 B7 b7 G- Q6 O
// 初始化 ARM 中断控制器
4 d) q8 K! `, ]& }6 i5 ^4 u
IntAINTCInit();
$ o9 A7 `& p3 Z) b/ R9 Q% {* J
6 R4 L) k& B" [
// 使能 IRQ(CPSR)
" t q+ g; W# e0 J# B; h+ {
IntMasterIRQEnable();
5 k2 Y- L6 ?" P
0 ^) }7 @6 A; p
// 使能中断(AINTC GER)
+ K' g' V u' K' L: k
IntGlobalEnable();
" Y. y; @; { Z7 V- p
]- ^+ T* o' @ w* J
// 使能中断(AINTC HIER)
- b0 r. b& z5 P! x; O
IntIRQEnable();
4 Y! O( I* i1 F7 x f7 }
}
1 s" ?$ c5 p P9 i/ W B- j) w
* H! i# `: O& y d( \; K. v+ q
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 L) \7 |$ d* L# P. W+ E5 S
/* */
* i v, x1 r# [9 r, ]6 d7 m
/* 中断服务函数 */
9 y4 s7 r5 v7 z9 Q; f
/* */
5 x, T+ @/ r4 b+ ?' q
/****************************************************************************/
- J0 P+ L& T' r) g1 x; h
void PWMEventIsr(void)
) z$ K' z$ E0 N0 p% a
{
1 R' z" w2 ?' i
IntSystemStatusClear(SYS_INT_EHRPWM1);
5 R' q% ^ X. O8 g( x5 E6 G1 R, s
( k! [7 i( H C4 ~" j/ ^. L
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- r+ e6 S6 }. u
}
4 q2 P) \: y/ [; c: z7 l
+ n- M5 i' y0 i
void PWMTZIsr(void)
! x* p% y. A- U% c: L$ x
{
' E+ L/ w( f3 ^! M% f( V
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
/ C' a; U' T$ B f: u" e
8 e; R$ ~0 I) \& o& y
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 e7 _" E, W, X" K' k$ m) P: _
}
, C0 o# r" [1 m6 A5 k
" g, U, Y1 R+ t" M5 z
/****************************************************************************/
" G+ Q$ \' v% U0 D9 H3 d
/* */
! n% C. X6 |' k: m
/* 初始化捕获模块 */
7 Q: A' q; u: T$ [' Y
/* */
; K* @1 R; j2 m9 }% V4 ~
/****************************************************************************/
- S# @1 G, |& W' i% |. R
void ECAPInit(void)
- ?. K( ]7 `/ I9 x( s1 _3 r
{
2 p8 U, n% n4 J, V% C8 I
/*-----设置 ECCTL1-----*/
9 N9 n8 V( `3 a5 H/ t. ~/ T- }
// 使能CAP寄存器装载
* Z3 p I: M/ U; }6 s2 i+ u. P
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& n U( L3 a: s, k: _
// 设置预分频值.
* D8 X: ?) b4 p5 K) I$ n% a% w
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' P" o9 `+ d8 \
// 上升沿触发捕获事件
% W/ z1 g! t- w* r% ~ q7 @. }8 h! W
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" u( t% z+ w7 { r8 q
// 输入捕获后重新装载计数器值.
- b# ]! Q: Z8 \$ s1 L" ~% _# W+ J
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- D' K0 o3 T& |. G- z) L
) O) d, i% H$ S7 {( c
/*-----设置 ECCTL2-----*/
, { X7 K" A' j: H) H6 z
// 连续模式
& H2 @0 _$ ^9 } G$ ?% E9 V
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 D! t7 J' g' H0 ?3 g: F4 r% }& `
// ECAP计数器TSCTR持续计数
: F1 e! V2 k6 d& j0 F# k6 [
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
. |) |3 m. q+ H. v( I
// 禁用同步输出和同步输入
" y+ r3 l$ R2 l9 z( D. { W* E
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
. ?" ]/ s' ?& r1 D) K' a& R1 w+ I
// 配置 ECAP 2 为 CAPTURE 模式
* _2 {; f% A7 Y& A
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& Z2 L/ [3 ]* H" M, L1 n
, ~9 A( T1 a, b/ P- y) C
// 使能中断
6 N) O1 i" T6 U' `
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
/ q9 _* _. Q# L1 Y: M9 k
}
) o; p0 ^" B. C u1 x. o, h
3 A" N$ u& e. D
/****************************************************************************/
7 e6 P' \2 I+ q) t, f# X" |4 ^9 F2 X; L
/* */
+ u8 ~( M9 d" a. q: I
/* 取得捕获结果 */
: O1 A7 p' G; J; \; h. l: R
/* */
) s* D! y/ k1 b8 a
/****************************************************************************/
. p2 {4 t- T. T* g# z4 c
unsigned int ECAPRead(void)
: W3 K% ?$ _- H% k' A* D) H
{
2 O# M2 ]9 }+ P* Q9 B: `" {
unsigned int capvalue;
5 J- l: C' A8 Z: l
unsigned long frequency;
) V' z8 H* J6 J+ H, m0 j% L
$ H* ^6 b' z: A0 K$ p; q' n
// Event1 中断标志
0 c- B! W6 t A% N% }
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 h, N+ Q+ c2 G% f6 A2 L
{
( m7 t P1 L5 p- a5 ^" p) B
// 取得捕获计数
' w4 r0 F$ R( t! ^5 v) r
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
& {4 |8 e$ h( F* e
capvalue = ECAPResult.cap1;
8 K2 Y/ t3 Z7 J/ H
: f2 _( l' \. r( h: n) o' l' G0 m8 g
// CAPTRUE 模块 228M 时钟主频
0 @8 S% P# S1 S
frequency = 228000000/capvalue;
2 g+ q1 ?+ J8 c& w- l
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
& t' R* J# ?9 ^' E6 i+ w" p# x
7 O: t$ r3 u n$ k
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" _" i5 I0 z/ X; ~" G; D/ b
// IntEventClear(SYS_INT_ECAP2);
: ]. i( A" b" u
}
& g/ y7 p4 ?0 ~+ P! {& I
return frequency;
8 w% a4 ~1 H! T$ j/ N2 A+ o
}
2 i! e, \0 y A( G8 h8 i m
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 G; c# z8 A# t! T4 \! g% e, E+ 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