嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
0 \- a$ s) L" d& r
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
x" p+ R {4 u6 Q6 O) f% q
/* */
; v! f% l* v8 R. h5 ]! B
/* 宏定义 */
; e& A. N I& u% _; _
/* */
( V5 q3 v- I2 f
/****************************************************************************/
c7 y* R4 @$ w$ L3 L/ O( ?
// 软件断点
' A1 M( w Y- Q1 \( G+ A) d
#define SW_BREAKPOINT asm(" SWBP 0 ");
) w4 V! C8 O; t7 B/ v2 }/ N
: z( d- O1 W) ] d T
// 时钟分频
4 o( y/ n6 U) L5 G6 g! q1 K
#define CLOCK_DIV_VAL 228
& {* \4 Y" ~7 h
- M6 G( n( N0 }$ k
/****************************************************************************/
0 _8 L: d) l' _5 Z( N( g- G7 s
/* */
+ u8 ]% x! J( G+ Q
/* 全局变量 */
2 G- @& P- t' u Z, w
/* */
) X5 f/ ?8 Y- ?' g. J
/****************************************************************************/
; K2 P3 U. Y: _" O& u; Q. O
ECAPCONTEXT ECAPResult;
2 k4 H- I( ?$ ^& X" a
; y3 p/ t2 B1 \5 Q4 v
/****************************************************************************/
2 \4 I6 ^0 w0 |: f
/* */
! a4 W& d% S* G, ?
/* 函数声明 */
3 d7 A7 D( m% x" U+ m- D
/* */
) m! j- j8 I# T+ f& V+ v
/****************************************************************************/
& j/ I; ^5 @. J9 N- ]9 z5 a$ F' a5 M1 m0 I
// 外设使能配置
8 F8 a8 ^3 |5 H: h
void PSCInit(void);
/ k4 e1 i. L/ X' `9 c
9 ~) W; t) w6 ^' Z9 H+ g t) X8 n
// GPIO 管脚复用配置
6 ]/ y) ~) a' G4 g& I
void GPIOBankPinMuxSet();
9 Y/ N& }$ i1 n0 ]+ i+ q
6 P' P B6 w( c0 L
// 产生波形
, E1 a: \2 r# j J
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 R; d: E/ O$ u. W* F
void ChopperWaveform(void);
( N& l/ A# C1 u9 J% D
6 v, @# P0 E+ s+ ] O$ d1 K
// ECAP初始化和读函数
, B* q+ |, R0 Z
void ECAPInit(void);
# l) m! P" E5 A% s
unsigned int ECAPRead(void);
4 O8 o5 ?- S6 g/ E
) o1 V7 c* X, X3 w$ h2 i) P
//ARM 中断初始化
" ^; t c2 Y* b! C* j
void InterruptInit(void);
E3 I( m5 K6 F5 n* z9 y5 z) i( i
. T" _/ L$ P, c, w1 i' ?9 r
// PWM 中断初始化
; Y, c$ f R0 {7 Z* ~
void PWMInterruptInit(void);
8 u" }0 t# O( |1 R4 m- M- o# F
// 中断服务函数
: C( n8 q" B' i. X! B E6 A
// PWM 事件
1 r( @0 M) @) @; e
void PWMEventIsr(void);
3 g8 ]4 ~( l. A- M1 B
// PWM 错误控制事件
$ X& p, L/ } N+ G9 ~2 A9 I. p7 ?+ _
void PWMTZIsr(void);
. ~8 z( z# \9 f7 m$ M/ Q8 ]3 r
/ a4 R; l K7 @8 J) v1 x( x
/****************************************************************************/
& S5 c+ V8 e: O9 B7 J
/* */
0 t# I/ X1 m- o' P
/* 主函数 */
. a1 s/ a7 @, p2 g
/* */
[6 n9 M+ l% H1 g* ?) D6 K
/****************************************************************************/
' t, Z# X0 ?, L2 Q% ] s
int main(void)
- A6 U) A# ^8 t. ]
{
1 [, S& {' v, p$ v! ]9 I5 X u! ]
// 外设使能配置
# P6 T8 J# H) Y
PSCInit();
, z( f) ^$ }2 n' R: }$ i$ x& a# T
% c- ]. Z* X% F: [; b! a
// 初始化串口终端 使用串口2
( w, i/ M- }5 U" x
UARTStdioInit();
. I4 |) [+ m9 G9 b6 }- C* \4 T
; ]8 G. m% K, Q
// GPIO 管脚复用配置
& K) c7 G! P$ H! b |" ^
GPIOBankPinMuxSet();
9 s" ^+ a4 P; g, o2 ]5 `1 D
6 Z! L5 @' O. w, g7 o6 d+ ?& X
// ARM 中断初始化
. r H- k0 H* v h
InterruptInit();
8 w; e% N5 K5 D- ^8 B6 A
H- v' U& | j3 h' M
// PWM 中断初始化
( c) B: M. d" L5 V t, U
PWMInterruptInit();
8 d3 C ], F2 i
A8 u( ]6 I% Y+ g# H% |* C4 w
unsigned char i;
0 y1 H/ L! p' b$ w: n6 X6 F7 F
unsigned int j;
# G) ~* ] V+ O/ r" ~
+ x9 a, u& O s4 H' g/ t
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 ` [. {" M: q$ w1 Q, n2 `
UARTPuts("------------------------------------------------------------\r\n", -1);
" N% G5 k" L5 o1 f( o; ` Y( Q$ a' N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% r5 h2 \9 M. ~5 i( z
// 产生波形
3 k3 j8 X/ E4 S& e% p
PWM1ABasic(25000,50);
% E w- q: j. ^3 [: n9 {% I! r& x9 R
8 M( s' o c" U+ }% i+ C I
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
: V7 a' \# a j9 P9 K+ }+ V `4 x
UARTPuts("------------------------------------------------------------\r\n", -1);
% K& d0 n5 v- `) A! o
% D0 i2 ^. A! d/ u
# |. \" c# E& w% I9 \
' Q) i b" |& d( j9 ~0 }
UARTPuts("------------------------------------------------------------\r\n", -1);
& i/ ^5 P0 D' e* U9 ]2 d! [
UARTPuts(" C6748 ECAP Test\r\n", -1);
* ?& m$ {5 S- n1 b
// ECAP 捕获初始化
6 j8 c1 @: W* }. k; p4 X' q
ECAPInit();
( ~( Q/ w X; s4 W
UARTPuts("Initialize ECAP.......\r\n",-1);
! Y6 z+ Z a5 Z" E
for(i=0;i<5;i++)
: ?$ V9 [5 `& z, ?# h \) E j
{
7 }2 D W1 Z' {7 V+ ?6 J5 b
for(j=0x00FFFFFF;j>0;j--); // 延时
7 w8 [! @& g' A7 G5 Y& J
ECAPRead();
2 L, T1 _* `! _6 u* \/ ]8 I' K' Z
}
8 [2 c$ w& P$ G$ o/ \
UARTPuts("\r\n",-1);
4 s* X' l! H6 n* @5 n) {9 X8 C
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
/ T. X ~; z7 ]& d
UARTPuts("------------------------------------------------------------\r\n", -1);
7 c, q" e# y( e, M8 O- h
) f; h# C i7 p2 ?6 z- P
// 主循环
G+ Y* ` L# c
for(;;)
4 x2 p# k! s7 R4 p
{
3 q) d% Z% Z: T
. ~- I! S2 e9 }9 I; y
}
8 V% O6 B- U) t+ \3 k. c
}
6 W: I8 T0 Q6 y/ N' M: z3 b8 f1 W
; j( z* l: v, y; v; R* a
/****************************************************************************/
# {3 F' D8 C; m' o6 R# f9 k
/* */
! d5 r1 j2 P. r& h
/* PSC 初始化 */
! k [, @- \& J0 ]6 a9 N r
/* */
( m( h, {# Z5 s/ Z$ z( N0 {
/****************************************************************************/
" U, ^, p4 p: u9 s! \) A. ^( l
void PSCInit(void)
2 ^) X8 j; O. G& {( m! g3 g' D& e. Q! p
{
! u4 Q e: a: G% `, c0 C
// 使能 EHRPWM 和 ECAP 模块
' U3 @* }; h$ J% I
// 对相应外设模块的使能也可以在 BootLoader 中完成
0 z1 r% d4 s* `3 W0 I) o8 @4 D. ]/ m
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' a6 {8 Q u- q" {9 E) v2 M+ n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% Z9 u9 q$ R$ c, {, R* X% D
}
; y# h1 L6 g- `- n% x% D( V& F' j
6 t% S+ e1 h+ o: E
/****************************************************************************/
\. g8 k H' l% M. R: b
/* */
# A2 Q# Q: `5 d% R; L* E$ K
/* GPIO 管脚复用配置 */
& Z3 R& s: u" O: V s. g" i
/* */
+ ~9 E/ f2 T# W
/****************************************************************************/
: \" {* T8 o1 [+ M& T- g
void GPIOBankPinMuxSet(void)
' I x& g: V8 U9 l E5 Y
{
3 X+ u1 q$ b8 Z
EHRPWM1PinMuxSetup();
5 T2 t: S2 y( b8 A
. g8 ~' J9 I9 p1 A! ~' O4 L
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
' c2 X% O) w b8 r
// 作为捕获功能时管脚方向为输入
3 Q- R& Q a9 H
// 作为辅助脉宽调制时管脚方向为输出
, }* n/ e& H' Z( O
// ECAP2 / APWM2
7 F9 M$ t1 y5 d5 Q6 G
ECAPPinMuxSetup(2);
. Z; u2 B6 q5 L; O" I- H9 W' a5 S
; f) G" U' s7 f
// ECAP2 / APWM2方向设置为输入
, ?9 m/ V, ?5 [+ ^
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 w, s& b J. S+ x/ x$ [
}
p! f) Z- g5 ~9 S* o, \& c& _
, [, p: v" ?( e0 c
/****************************************************************************/
8 U" W3 W3 M& j2 c) z6 {; q
/* */
0 H7 u* S; D4 L
/* PWM 输出波形 */
- y2 @4 u9 G. f& f J5 |
/* */
- w+ i$ {4 Z; C3 s1 J0 l( G
/****************************************************************************/
0 k) v6 F& d0 F, C6 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* L6 S2 R2 }- H6 `
{
1 J3 Y! M5 ^7 ]) w
// 时间基准配置
' W4 ~& u. u% K: I) ^9 y2 \7 e. \
// 时钟配置
7 d8 y$ R' v' a
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' Z+ ~; f4 Y3 {( t. U3 O0 e
" R+ _ k( g( e" ~( k: E
// 配置周期
U$ j) }9 K: n3 ^1 D2 w5 }# J
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
$ o8 R0 W4 h* m. K
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: V" x7 g8 A- }1 F8 }
) | z2 F. b2 {, ?" I6 h r
// 禁用输入同步信号
9 ^: t' E- H5 U! c
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 X$ r7 G' n, j: d' {- J
2 ?) d7 _$ \& i1 t# I4 h3 G, v
// 禁用输出同步信号
) u$ G6 s- t2 @& i3 k8 k3 m
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
0 j8 x6 D' i% Q$ p$ n( o3 |
, W2 a6 v1 N: s! D( d
// 仿真(DEBUG)模式行为配置
9 k- W, ^) f: Y9 F/ e0 v
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
R+ ~+ C& i$ \( ~9 V2 |
* f, n$ |; A2 p1 K
// 配置计数比较器子模块
& y9 k" z7 k |1 v1 T1 C
// 加载比较器 A 值
8 G) y, F& G& Q: V, O4 B8 z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 K2 e6 g' |" n7 u0 a5 G" k+ m7 Y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& G7 N* \ I: u; ~) I
5 q7 s$ V& U1 {' g& D
// 加载比较器 B 值
7 @6 B$ D+ \8 z* p
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 D. Y' {9 E% J; x) R2 J
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! H8 k- D" g* R4 |4 M: C' F; M
& w4 x# f# ?$ `) Z
// 功能限定配置(输出引脚触发方式设定)
}8 U6 B5 u9 G4 B$ X5 m7 L: N
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
3 |( D) b0 h; L0 y# @/ n" F
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 U/ {8 U1 z2 h
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
" r$ x3 ^2 c9 r5 w
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
4 `. {% t- k/ N# @% H+ E- F
3 _% n. l* \ ~4 m% c9 M$ P
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 j( r0 X; K( D
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( w9 y$ n0 b7 l; G6 ^/ Z/ j
& ^6 Q+ W+ _/ V: n
// 禁用斩波子模块
$ X9 G5 L. @+ U2 u/ b
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
: b; W" e" W6 D# K) H
9 d' w2 J6 D ?% ?! T
// 禁用错误控制事件
5 z2 r. w5 G& w7 @0 P2 y- C/ W7 Y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 ]: @/ ~0 f# @2 x. W. h8 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# F7 n6 Q" {& C
+ g. G. T& a2 x/ P8 |1 F
// 事件触发配置
) M6 n: w% J" f# C
// 每三次事件发生产生中断
& s2 L2 ^/ y) x
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
! }9 | ?( |2 w9 ]8 M2 }! N: D
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 P2 O7 h! B+ F i: ^5 s( [
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
& Z# ~ x8 l5 ~* Z* Y* {* r
// 使能中断
# O. e2 e# M& ~1 g& d% W0 Q" {
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
1 c; m2 C" s( u0 K9 H7 z
+ D( z/ i, p/ f1 t0 C- A# s
// 禁用高精度子模块
7 g- A- w; J* c- M& B' `) F- g
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- K& n$ a+ X A4 @2 D0 @ [
$ y$ h$ |6 b% H1 \1 k+ D; @# q/ g( M
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
/ E1 B' m) M1 j8 }, s5 c9 r
}
; c a5 K% b8 ?/ N- U
( Z9 y( @" d h, g& r7 H* r4 N( {, \
void ChopperWaveform(void)
5 s( K+ M, _+ N" f8 _
{
$ C3 e: C% I8 _4 e' _/ m* N% O
// 50% 占空比
3 B7 P1 Q! R `+ t& b! T" r
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" H; r |* @8 ?( u: C
// 4 分频
3 l Y0 n# f L5 o
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
7 W+ R( L$ b3 [) A( u( x, _9 r
// 单个脉冲宽度
. J' p# s9 b4 P& t; [! P3 t
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
7 k" _5 D9 J1 {$ E# m N
// 使能斩波子模块
9 S, Y- k$ n% X G) N: G1 W( m
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 C& C" S' T5 I+ c
}
' b" a: S% g$ w3 o @' c: D. R
& a3 e- L# n; C
/****************************************************************************/
2 `4 _* p" X7 F# h7 c8 k
/* */
6 M& N! i4 @! D N9 t
/* PWM 中断初始化 */
3 K+ c( w3 C& p: j7 X/ F
/* */
! n# o6 G7 \. J9 m+ ^) u8 ?
/****************************************************************************/
$ m2 |1 I6 h- l3 J
void PWMInterruptInit(void)
, A, v7 a% T8 s) ]. m O
{
0 A# r+ ?# B; l4 D. q e
// 注册中断服务函数
) I- h2 c2 a3 W% i& d
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 L. F: w" m# |3 ?
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* z6 E0 o! A3 ~8 S
3 o5 A) }# ^/ h. }5 d g; O
// 映射中断
: K' J+ Z, ?+ h% }" q; ]5 e$ {
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ D5 b6 k2 P3 r5 H$ f
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
7 h* n: V4 i: E( ?1 L, G
4 L( V+ q/ Y3 P; E
// 使能中断
; g$ R7 m; w3 z: _' g
IntSystemEnable(SYS_INT_EHRPWM1);
6 g: {4 B) b0 K0 ^' y% E
IntSystemEnable(SYS_INT_EHRPWM1TZ);
" g O M' Y2 n8 F
}
4 |, H8 @+ O& ?7 u, q( f4 O- E- @
5 E% k8 Y9 k |* w4 x+ k
/****************************************************************************/
' x5 F# Y" J; r8 D. ? {$ r9 [
/* */
: X6 n, N+ E3 t5 X" ?1 u& x# }
/* ARM 中断初始化 */
8 v$ K3 I y$ w" x' \! F% B+ ^
/* */
& z/ q' P) }2 }* U n
/****************************************************************************/
7 [8 g' n0 f$ ~7 b5 ?% n0 w
void InterruptInit(void)
' t" r; d7 ?6 s- e2 G% W* h! p4 {
{
/ l6 x" K y3 e- u. t4 ~: G7 ~7 t: O
// 初始化 ARM 中断控制器
5 f. L' d; ]' ?6 m
IntAINTCInit();
& S6 U0 \9 l b e: _, _
# V! k. U s7 P! Y7 B1 @
// 使能 IRQ(CPSR)
4 K* t0 Z/ N* u# n2 c8 Q" n$ D
IntMasterIRQEnable();
' n9 f) f/ ]: K% a5 i
8 ]) W! S* e) z
// 使能中断(AINTC GER)
R# J$ R8 J& p8 y; j- R
IntGlobalEnable();
2 X7 ^$ g: b. q2 B
* f$ ?- \5 b' w. @/ g, z
// 使能中断(AINTC HIER)
9 @& ?$ n5 k: h9 S% o2 e5 e" G
IntIRQEnable();
9 k4 g4 N- `: ? H9 H
}
( @ A% t1 M# u; f
8 V" |1 a2 `* n2 f, u+ z% `$ }
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
3 e+ t0 ~5 D6 R* T
/* */
/ s8 f% R0 g% r, D, f+ K
/* 中断服务函数 */
) j9 \6 [8 d" E: [
/* */
% H# y1 Q# y/ u+ l) J
/****************************************************************************/
4 C6 M: _0 n3 U' G4 T& f! p
void PWMEventIsr(void)
! J0 Q+ Y6 D, K& z5 z
{
7 d, Y) D+ O3 v+ q* u6 A' U l
IntSystemStatusClear(SYS_INT_EHRPWM1);
7 r+ y( j+ h- w4 c
$ O; n. q8 l: i9 _& r9 R" e% p
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
( w+ u2 o8 x b* L9 `3 `' I
}
5 O" z( s# o6 H: j
4 n- a! O% J* Q5 R
void PWMTZIsr(void)
* G3 v9 K9 {4 @9 g: E1 o
{
/ Z1 F( j. @. J, F7 ~* N1 H) H
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
3 }4 U2 G1 U2 ?/ V8 v. _1 w
; [$ `6 O# C8 u. x: E
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" }$ o) h1 o4 f3 {4 Y9 J
}
, \' Q Z, k q4 e# L+ z6 [& ]
- N) e( R/ b9 X r) p, x3 m5 c
/****************************************************************************/
9 r+ C0 R9 I$ s4 {6 P
/* */
- v3 r3 G+ K/ ` [5 T c1 p4 a, p
/* 初始化捕获模块 */
( ?9 ]; t9 Z" o; G4 U
/* */
i; y4 x! L: f9 h% U% m: G
/****************************************************************************/
: Y8 w+ D" a- L0 V* c A
void ECAPInit(void)
; c/ z, s% R3 g6 v6 h9 j$ f6 w
{
7 O( A& b g: j Y4 B' G" X
/*-----设置 ECCTL1-----*/
! b; f+ Q; l& v4 ]+ H. p# f
// 使能CAP寄存器装载
5 h8 E. w' j2 M0 R) h1 ~
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 @: E D7 n1 l% o+ {
// 设置预分频值.
9 X& Z' L* _& W8 f5 T, _
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 H3 V2 P% I$ P5 p5 x5 L+ O4 G
// 上升沿触发捕获事件
; ^+ s# n* o) R9 L* y
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 N: U( J# s- p
// 输入捕获后重新装载计数器值.
& }: d9 C9 j2 {" }( R" q @
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
* z* x/ @4 m, F+ v# t
4 {6 |. d& O1 B0 j$ \ ~) o
/*-----设置 ECCTL2-----*/
% h6 X8 D+ Q9 \' D! N
// 连续模式
$ R# F& [$ h' k, E8 z1 [2 g, {
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
3 g z% A: b. `4 w, Q
// ECAP计数器TSCTR持续计数
' Q9 e/ ]) P; ^4 b
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ s1 u* x6 I- ?$ j) I7 }
// 禁用同步输出和同步输入
, U4 l0 I9 r- T- I2 @6 a
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
: @) u+ l8 \& i' _! O/ G6 d
// 配置 ECAP 2 为 CAPTURE 模式
9 T; P- u# L7 X' ?, }
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
9 S# _% @2 ^% j ^
8 j7 W; \- X0 V) Y! H
// 使能中断
0 d5 {% m. g; y% o0 W
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
0 V' p# @" A5 i+ Y7 F
}
+ \1 R5 u/ K; S# o, F, h+ `
; W# K4 ?3 x& \9 C/ |" W/ m
/****************************************************************************/
2 p! x; x, t6 |3 Z6 Q% R
/* */
" z3 R/ p5 W; W. ?4 ] q0 m
/* 取得捕获结果 */
. f, z6 O \5 g1 H
/* */
3 M: i( b! q( e9 I
/****************************************************************************/
! z" r8 ?' V& Q1 A, s+ ~
unsigned int ECAPRead(void)
2 j- W* J E6 Y1 [$ ?* e1 Q4 n
{
$ J8 h& ]* X* K( J, {
unsigned int capvalue;
, c( n( g/ p8 J$ A' ^
unsigned long frequency;
" S" D( X2 g" ?
" u6 ^1 q: u8 G2 m) |
// Event1 中断标志
& u3 X4 @1 E* c$ G4 C. h9 Y) T1 C
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& z3 R9 p$ z+ G, `( X! e
{
, v8 J$ q. ^' t* I: D
// 取得捕获计数
: V2 W( P; d% }3 v0 [
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
" U6 x) R3 z& W7 q+ m, V
capvalue = ECAPResult.cap1;
" {/ d1 u: J1 K& V, ?* C
) t) W* E2 ?" w' @5 f+ A/ ]& M
// CAPTRUE 模块 228M 时钟主频
0 [; L8 m1 Z5 Y: A/ |" ~& s0 i
frequency = 228000000/capvalue;
; `! G! P6 L! q; ~4 c0 \9 ^; X
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
9 F7 P! r+ ?& {, g/ q6 }) v( e
4 w" @- ~/ {7 i
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ C0 C0 |9 N- x5 u& s
// IntEventClear(SYS_INT_ECAP2);
5 y, P8 ?% g3 u1 l$ c7 n( K7 U
}
, s' x: y( M n# U4 z; C
return frequency;
3 F+ N" x' ^$ N8 s7 G1 `
}
% o, @7 U/ ~2 b7 x; |
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ r4 e' B# k& `0 s, a" {
[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