嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
( I2 e' t. y- A- G# V, O/ ]
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
: X0 R; j! H9 N
/* */
+ P, h* [; Q8 |6 H3 }5 Y; @* n& o
/* 宏定义 */
/ H3 W- j+ c. F+ X; b: v: ^
/* */
: M1 x% J9 X( t: z. N
/****************************************************************************/
- \! M7 W' ?& B3 G
// 软件断点
) g7 w/ B) O: d$ j, ], \7 Y. ^
#define SW_BREAKPOINT asm(" SWBP 0 ");
4 w# ~" x- K4 X: m
: [" R" f4 Y q
// 时钟分频
8 _0 n! j: M. j, f5 r6 g8 Y5 n
#define CLOCK_DIV_VAL 228
! \- N, k" \5 U( U# M- O
. [. p6 z/ f( \- b& Y
/****************************************************************************/
$ _4 @! s' i8 }; \* p
/* */
* S5 Q9 J0 e) q8 K' ~) x0 ~
/* 全局变量 */
3 D& l8 ^, m: g+ N
/* */
) W) Q4 o; k3 Q2 X
/****************************************************************************/
+ w' J; F h( M; u8 K* b- X' J
ECAPCONTEXT ECAPResult;
! i/ O9 H/ k3 U
! O3 m- R4 Q1 F$ y# [' `' y
/****************************************************************************/
% n: {2 _6 _: G2 ?# J
/* */
, t J* _$ i+ z
/* 函数声明 */
2 ?5 ]+ G" G" I" Z# b4 P! \: u% z
/* */
% H% N) q0 M9 m) P
/****************************************************************************/
! R( D7 X$ p1 |4 P1 f2 F
// 外设使能配置
7 z; D2 b9 a5 s7 W
void PSCInit(void);
1 o. C+ M: {" V& F! q- |
$ y/ a0 D, {! V e
// GPIO 管脚复用配置
% M5 z$ R- o2 ]
void GPIOBankPinMuxSet();
* p% ] K. A% M6 l4 y
' |0 H. J3 E( i, w' T7 N0 m( k5 e
// 产生波形
0 p0 o3 y0 g* E3 b( ^& }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 {' e- m) w! g" m$ o0 V/ ?
void ChopperWaveform(void);
# T; R y# Z! G
( K0 A4 j9 ]/ j2 T; h% _
// ECAP初始化和读函数
, V+ [3 [6 `% E- d" |
void ECAPInit(void);
' d r4 t' B0 U0 v2 w d
unsigned int ECAPRead(void);
, ^3 `3 Z4 }& o7 ~6 i: R3 S
+ m0 D O* l! {8 T' _6 l' C! z# ]( V
//ARM 中断初始化
5 _9 ?; i( \" D( `: |7 D
void InterruptInit(void);
* \% x+ J. A* ?$ \8 L# s
/ y; v! u. L7 n. C
// PWM 中断初始化
* \3 F4 b5 ]# R- l# F2 C3 n% N
void PWMInterruptInit(void);
3 U& _) e5 z6 n& W9 `
// 中断服务函数
% {3 y& @( W$ X" B, Y5 v
// PWM 事件
9 C5 Z' C4 y" G/ z# Z
void PWMEventIsr(void);
8 i6 c3 R2 N0 m2 }; |! W5 \+ G" a0 U1 I. q
// PWM 错误控制事件
# d- \/ [( C( P
void PWMTZIsr(void);
! z: T7 h6 m( I8 F
; T4 d w3 O8 G- u+ h ]! _
/****************************************************************************/
5 Q4 t1 u2 e; K+ E
/* */
# X# n. U# e' }; r5 S5 D
/* 主函数 */
* ]& T6 N; Y7 `6 @. a4 A E7 [
/* */
2 O: O5 j$ j1 q- s, M. K
/****************************************************************************/
* O" X( e/ t# }/ ~: S4 a9 h
int main(void)
+ S5 B: V5 k+ Y6 z
{
4 B/ } ^% X, F0 g- n# f
// 外设使能配置
6 F* H4 a7 O# \
PSCInit();
6 R' H5 v0 j. R; M9 V" S0 V
) Z5 g) V% y1 E& k0 ~% Z& S
// 初始化串口终端 使用串口2
5 s! u* z; T% i8 n" x9 w2 o1 w- Y
UARTStdioInit();
$ V6 d- W8 m7 n( T( Y
5 H" K' p' e; O4 {" K( C$ L( V
// GPIO 管脚复用配置
3 p$ M; n9 z: O& h7 N& D8 E
GPIOBankPinMuxSet();
3 W0 j) w# Y- S6 d+ a
1 j- O& J" Z1 e8 d
// ARM 中断初始化
3 f1 Q% ?6 T$ l0 E
InterruptInit();
% N0 W6 ?5 C: H1 n! m/ B
& r0 B2 b* Y1 B6 Y: k+ `6 ?+ o
// PWM 中断初始化
7 p: n2 ~) T/ k6 M
PWMInterruptInit();
/ I! L+ M$ I$ X* {. {
& x7 c' U% D7 P6 u6 d2 ]
unsigned char i;
* N- o1 P2 Z+ T
unsigned int j;
' ?0 s+ p0 x5 |& \; }6 R1 c) C* n
3 _3 Z* b. d* i: v( I
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 R" B+ @) z' k/ l! Q
UARTPuts("------------------------------------------------------------\r\n", -1);
# Y# A! y% B5 A# F5 x
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
/ k( ~0 ^/ L8 S5 r, `/ L9 C
// 产生波形
3 y0 v$ J x& s2 e! l
PWM1ABasic(25000,50);
, G3 p2 I* i5 |) V4 z
7 _3 s7 l6 R! Z9 W! s0 ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
+ Y8 d. A' a. h' z) [+ l3 g9 T
UARTPuts("------------------------------------------------------------\r\n", -1);
5 A9 O3 d2 o: w' q; ?6 z8 d. |
( t% Y! y/ W- S+ F- i4 S
/ h# {+ g1 J# X" r/ V3 m% }
, q N6 [4 X, e1 ~+ H
UARTPuts("------------------------------------------------------------\r\n", -1);
4 H \3 g' k' p% n Y; w
UARTPuts(" C6748 ECAP Test\r\n", -1);
; Y6 e: u) P8 ^9 Y4 D4 |8 D9 s. Y4 M
// ECAP 捕获初始化
1 R4 p l8 A- [
ECAPInit();
& a) K# h0 |. n" Q% y; ?; W
UARTPuts("Initialize ECAP.......\r\n",-1);
& ]% T, m, `' V% x
for(i=0;i<5;i++)
( @2 m; T }& i; W. y5 j
{
# i. f5 j, L: k) J1 C% x5 I- i3 T V
for(j=0x00FFFFFF;j>0;j--); // 延时
]0 |, h; i* t
ECAPRead();
/ x/ i! n& b. G
}
% t- D, a" B @* x2 k
UARTPuts("\r\n",-1);
6 w, V9 O5 `1 q& O
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
4 V$ F0 q6 }9 C4 u" O) r
UARTPuts("------------------------------------------------------------\r\n", -1);
: g& N' Z1 h# z5 N2 u
- ^0 S0 }0 C. ] S
// 主循环
( H7 U9 |3 }& P; z) g2 r x+ P
for(;;)
7 H: r: Q U Y! E* F& a! e# b
{
# A) ]3 ~/ h5 r5 p
) ]$ L7 `$ e* u+ t+ M# d
}
: q8 C! X# D7 ~, q. z
}
' g) g( \9 z4 k9 y
# d5 |) U3 q9 n% x9 Q
/****************************************************************************/
5 ?, x9 ~) b( ~ H" n
/* */
& @! l4 k( J1 t4 w! D. u7 }
/* PSC 初始化 */
% d8 G4 R8 E; V0 z5 {
/* */
H, h0 }; s# W! ^
/****************************************************************************/
4 e3 k+ J: W7 E# w) g6 O7 w) t
void PSCInit(void)
: `' r- g, Q& v5 Z
{
3 ~$ ?! F, C& N4 f: A9 U8 f
// 使能 EHRPWM 和 ECAP 模块
2 R s5 x1 `; Y! B4 R
// 对相应外设模块的使能也可以在 BootLoader 中完成
! p. L* I- E( \1 W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; `! T: m( m8 Y9 h: g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& M0 ]" q& Y O) `' i- s7 R/ l
}
- l( L! A( t6 P9 ?' t: e6 e1 Z$ n
; v9 ~& w X# i( p: p- v8 ~
/****************************************************************************/
/ q+ u' U# t, Q4 {* c
/* */
) n# P5 r0 g: h6 E% s7 \7 x9 }
/* GPIO 管脚复用配置 */
2 M' n- v. m* i( o8 Z
/* */
. {- r+ \, \# c0 S- {: A* p
/****************************************************************************/
3 l+ h, s! O; r9 f+ a/ a3 ~' p
void GPIOBankPinMuxSet(void)
) [, L* G5 `; P' h3 {
{
( P* T9 d2 Z' o/ {! r
EHRPWM1PinMuxSetup();
1 T) D+ {& L+ i. E0 \
/ O, F- |+ X+ r' s4 _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( t2 ~# i* A, `# K
// 作为捕获功能时管脚方向为输入
Q' z! Y1 |. ]- ?, k
// 作为辅助脉宽调制时管脚方向为输出
& F* y3 w+ J% ^+ ^8 {
// ECAP2 / APWM2
Q2 h G8 L' v6 ^$ V3 o. Z' l
ECAPPinMuxSetup(2);
9 e7 e' s2 R9 i. A! }5 t' E
. n, j0 ?- W* V2 Z6 w
// ECAP2 / APWM2方向设置为输入
/ W A. Q& k6 U6 h Z! `
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: Z0 {' ?8 S1 _$ M/ c% j5 P# f, I
}
2 s8 v( h, ^/ K$ m4 S2 \/ i
3 J% G: C' Y1 L$ r, v
/****************************************************************************/
( G/ l9 ^' {0 Q6 s
/* */
\' C, c3 v5 H4 l7 b# z) x
/* PWM 输出波形 */
0 j1 t4 W% o/ |7 D
/* */
1 _2 ^9 u3 w2 k2 a& \
/****************************************************************************/
; [- Q$ v) y9 V/ z6 F3 j* Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* I9 @3 C0 F$ P7 [. Z) q
{
6 _* @. |8 g, k5 d. X
// 时间基准配置
6 E$ G2 t' F0 n0 z6 M8 t5 h
// 时钟配置
7 t- `+ @* h" A* F# `
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- ^. d( b7 S9 E2 P9 j ~3 x* d1 Z
1 j2 p5 q; U9 q& {/ G) _
// 配置周期
' F4 `4 p7 Q9 A5 j
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
, j8 m/ t+ G; c2 q0 J
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: f! H- x/ v% @. `# h
4 U1 j& A2 B* z. [4 b. O
// 禁用输入同步信号
7 |9 F1 A7 C6 q+ I& S$ |' E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 x9 {( g+ R/ b& V, {8 q3 ~. P
' Q6 ?: j& R0 F
// 禁用输出同步信号
/ S. J+ @. R, W# F- M9 H+ A
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 x6 b* A$ J V7 a# W
; _* e3 L6 P% Q+ g! u, h
// 仿真(DEBUG)模式行为配置
Z0 k. K0 }2 E- J% D
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- a) m \- z! g0 k
@) o- Q) A4 A; D7 a
// 配置计数比较器子模块
; y0 a. z8 P8 t7 L# M9 l* ]" N
// 加载比较器 A 值
w7 e7 i, a7 u6 ^' c/ |% @
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
7 f% ^" w6 X7 `- H; Y% }
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ b; _$ F5 Y7 U2 P' m& u7 ^
/ o$ p2 }% @ q: J2 S8 E: U
// 加载比较器 B 值
# j7 a2 J# [1 j* V/ W
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ ]5 @2 r1 q4 y& z! f
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 }1 B M0 T& m6 O! y
% S$ v8 |2 b1 Y- d6 e4 \
// 功能限定配置(输出引脚触发方式设定)
% k8 v$ g! q4 |! c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
0 m' {2 p% S" s
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! x/ Z7 D7 k6 s) R/ S6 h+ @' Z
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 M+ S/ u. @4 J( a: _0 N" R
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: g& m! e3 y( d% G
5 x% G; ?8 [! c+ c# @
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
+ ?" v S0 z5 M) ^3 h3 j" i
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 a6 i" s8 [- t' b+ h3 u- K" U. j2 X
5 i1 n; k# O" J4 ?! } [8 ~- g8 [2 s k
// 禁用斩波子模块
) s T9 n4 r% u* H' s; U
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' j/ V% R/ a$ w+ P3 d' K
2 ^% u1 [; I) A/ S& ^
// 禁用错误控制事件
6 Y) ?+ A3 O& B- Z
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
! T9 {: `. }9 q" p; N* ?
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
4 J* A/ n9 p' h& g; l% l- _% V
' S4 H. |" t4 _1 U" P
// 事件触发配置
8 p. b2 c1 A, x
// 每三次事件发生产生中断
8 u, t2 c" k6 {5 a0 A
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ V( e1 h( N, f/ V5 _2 l+ ?
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 r: v! _/ p" z
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
6 {; r& W! G! x
// 使能中断
" [9 T" \% t3 d4 C2 e5 `: n
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
`7 O# I4 T. d- e
1 M* }$ O% S( w* R+ @- S: q
// 禁用高精度子模块
- C6 u2 h$ |& y8 t/ w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- O/ l! U# q$ K' V( I2 u; j
( B: [% c- k% Z6 s. B
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- M% n p; x9 e$ U; }' k
}
8 _# i6 D) L1 ] Z ~
: E; \; n. V5 {0 m' e2 z
void ChopperWaveform(void)
" r# T* M5 E* f& X6 r" ^+ {
{
# H6 ? J( X1 p% b: r/ ~, p" M d
// 50% 占空比
% J, Q$ w! C8 @5 v% [
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" q$ S$ s- X, p+ u2 F+ h
// 4 分频
D5 A. }: Q z8 w5 b
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& {, @$ E) Z6 ]
// 单个脉冲宽度
7 o8 x( q: i& b/ V C$ r
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 M0 W3 c, _9 w9 M5 ~
// 使能斩波子模块
/ P1 H9 o. X! D' V5 Q+ `0 ~+ J6 R: b
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 W& G5 B. m! D$ N7 F$ P0 F
}
4 P' T1 W# I/ r
5 J8 a$ E& U# c( x; }1 d
/****************************************************************************/
: t- Y3 }3 b6 C u! A) o" {, V' E
/* */
, v: h( T- j3 c# x: c Q# R4 S
/* PWM 中断初始化 */
8 J: |9 l5 V* X( u# t2 J
/* */
9 S8 G X$ u0 j" C3 h4 E
/****************************************************************************/
' u2 V% A" u. {3 o# i
void PWMInterruptInit(void)
" Y' B# v! F- F
{
3 g. y1 u$ T9 Q* V
// 注册中断服务函数
+ g) n" l& R L! ?# R7 d( U
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 N9 ]% _5 R) V0 Z* J2 `# K$ z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" Y5 m0 @0 a& i9 z7 y, f! Q" Y- H
% U& ~& h- { J( n
// 映射中断
7 C7 p7 X6 S9 E0 S% T# W5 A
IntChannelSet(SYS_INT_EHRPWM1, 2);
( A) _: W* A3 f
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- j0 b; E- V0 m0 w+ S
9 O* b8 o- K9 |, G
// 使能中断
/ z# l3 {/ k1 _2 x% ~
IntSystemEnable(SYS_INT_EHRPWM1);
4 _8 Y0 }5 C6 f6 C) \0 K
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 K' ], d" O* m* q
}
% Z1 e c2 B& w/ n M) f% B( B& V& ?
! \" v3 N5 A: T4 a# ^
/****************************************************************************/
+ T/ C- T& x" s7 V! r
/* */
1 n, e8 ]. f; l' b4 j& \8 c
/* ARM 中断初始化 */
1 L" x6 i D$ a; c# v; R. F% b
/* */
! C( u$ ^7 Y9 H u
/****************************************************************************/
7 J, G1 C* d) S: A9 L! \9 e \' z& q
void InterruptInit(void)
- H* n* _( f) _# ^' p/ j& W
{
' u8 x9 f9 |! |2 m# w" I
// 初始化 ARM 中断控制器
8 ?# B, G! t% M$ B
IntAINTCInit();
" H0 A8 y% k7 I/ y; n5 C
/ }& l- _* M: |1 m! b: p S
// 使能 IRQ(CPSR)
& j% I8 d6 n( N" W2 Q6 Q
IntMasterIRQEnable();
- t0 X& M, w' d% w
! S |; x+ |, w* j8 n4 R
// 使能中断(AINTC GER)
( c/ i9 G6 h; d: w
IntGlobalEnable();
4 u# R/ G& P' }6 c# m5 t
5 i2 J7 {' M) s V# [2 R0 o
// 使能中断(AINTC HIER)
: G+ U4 Q8 q/ o& b- h* ^" U
IntIRQEnable();
) G1 _# `. |& R$ A* h' T$ ], M1 i5 B
}
" D/ C4 d4 v" w, O
8 H5 W f7 p8 v
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" o& T3 O% [% A
/* */
1 i4 s8 Q5 z `# n$ o
/* 中断服务函数 */
7 Z X1 q7 e" y6 U8 H( ^! ?9 m+ R3 X# f+ j
/* */
& `+ ]+ o$ P% |: p+ \$ E; e
/****************************************************************************/
" L c, g' c% {' j2 o/ l9 C- y
void PWMEventIsr(void)
( a y8 i2 s" C; I8 y/ B, K5 ^
{
+ d6 i2 S, \: h/ c+ d' p! a1 b6 r
IntSystemStatusClear(SYS_INT_EHRPWM1);
5 r. B6 Y) C9 A% s
% t' `: z# I9 a
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" W) Q7 a* s# R- Z+ l
}
# O/ }1 |' ~( P
2 M+ S7 j, v0 P+ o# o$ C3 Y7 H
void PWMTZIsr(void)
9 u* J1 B5 G- M5 r$ c: g. v& @
{
& H9 F8 |& S0 K# b* t: l$ W: c
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 I" |9 N6 e) k* ^0 ~
8 g: c& ^/ v$ l; {! s, s6 M
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; H/ ]& B! I% c
}
2 x+ j0 y/ j8 J3 Z
6 f; o$ P# L" }* t* h
/****************************************************************************/
7 W- W" T- ]8 G% h8 z$ q
/* */
+ m' w! }" ~& q/ [# f& u( A
/* 初始化捕获模块 */
/ M% j D5 |( |& w- M, n. r
/* */
# A2 |1 s: R6 ?# ^# r
/****************************************************************************/
; c) X# A% `, D# j e3 L
void ECAPInit(void)
3 S# T! o' M$ R3 v- O& R( g' e
{
( J/ G5 D* Z: o8 z
/*-----设置 ECCTL1-----*/
5 W3 W2 D9 V7 G3 s' F
// 使能CAP寄存器装载
9 ]" u' U: D, o" b3 L" m
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& F- ~5 W4 H+ l$ k8 u7 s# t( ]8 L5 [
// 设置预分频值.
' E9 j9 M/ d4 e+ Q2 d8 E
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
K! v+ F; {* q* S
// 上升沿触发捕获事件
9 e0 P+ J7 z' m7 @) d1 q
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
% M7 x* Z r, b% _4 Z
// 输入捕获后重新装载计数器值.
+ Y8 j9 n; s$ [! u# s7 V. W( K
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
# \ s; Y$ ^+ D& g% w
% p# x; u( W/ C
/*-----设置 ECCTL2-----*/
/ n/ _) S4 @9 {4 A
// 连续模式
1 r% S2 ?% m4 R+ w* s$ k
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, E u5 t1 Z. }& n' `. y
// ECAP计数器TSCTR持续计数
$ d, y/ X- _- d x" d) l
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 d6 S) ~' R8 n. C' [3 k' v* _/ {
// 禁用同步输出和同步输入
; P7 _ k% D& @1 W
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
# U& U1 q1 z5 C3 d
// 配置 ECAP 2 为 CAPTURE 模式
O/ B3 J5 D" M- E- \( w# P
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
+ h6 Y1 J; I* i6 k
H2 i4 k8 |. W* [- K/ a0 l- O
// 使能中断
- E7 \% o) M4 C, g+ h6 D/ \
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ f3 _+ `6 o/ ^3 j/ z: r6 R" I
}
9 C7 n0 V& Y: q) W$ x0 V8 ]
6 W% u% @) `- Q1 t5 i& l3 I8 z
/****************************************************************************/
K3 S( [$ x+ V
/* */
- {: {: ]* H4 }1 _% h c# u9 }& H
/* 取得捕获结果 */
2 B& V' H" G% Y7 z+ D4 x5 H
/* */
# G8 Z* \* B1 ~& C
/****************************************************************************/
, o1 y2 A" N, A! p0 |# T8 P% r* k! V' L
unsigned int ECAPRead(void)
% s' i, h4 z- }) Z9 X
{
. S4 g- U h; o8 o, a5 |
unsigned int capvalue;
2 m; m0 m; u% A' Z* v/ d: Y
unsigned long frequency;
. ] D% B k6 ]: J- n
5 G# E$ k6 E) K" b5 w r$ y
// Event1 中断标志
2 L. q2 z/ h5 B1 i! K
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
l' P* s3 t3 Q' T
{
/ b6 l& D n3 M8 I
// 取得捕获计数
7 u$ z, J G/ ]! ]. I% Z
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
3 K; S* {- w% r+ X E* p- O
capvalue = ECAPResult.cap1;
! T; |; H$ T1 h7 V
8 p4 c) T, r# H) e3 Q
// CAPTRUE 模块 228M 时钟主频
9 Y5 A7 Y# l$ o' _2 m: V) b8 g
frequency = 228000000/capvalue;
; A1 t% e1 R# o
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 M% E2 C5 o! R( w u
6 G# O: R+ i$ y& T, l, }: O2 M2 x' c
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
; M/ O4 C Z8 C$ k' j. o* I, s3 F
// IntEventClear(SYS_INT_ECAP2);
- f6 k! d7 U! N3 j7 x: m4 L' i
}
' {3 Y& a7 B1 @' J
return frequency;
( n, V, Q' p2 c) {3 q0 \- }$ E
}
5 q/ Z7 o; V* D8 F+ C8 d& a+ j2 p$ C: _
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 X- Q- q1 |! S) V u" J6 R; {) 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