嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" o. f7 }0 ?( J; x/ U
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
. Y7 l9 F/ s7 ]! G5 o3 f
/* */
& M, u* I2 Q \; u8 q
/* 宏定义 */
: E2 }3 ?; P9 B/ {6 `4 v/ ~* @! D7 W* b3 @
/* */
7 n }" ]6 W* N. x! P0 m* _ B! l
/****************************************************************************/
# X+ ]' b7 N' d8 u0 a
// 软件断点
+ B ^7 ~* I- a& i
#define SW_BREAKPOINT asm(" SWBP 0 ");
4 f& a! h3 F4 a) Q
, x+ d" m: p) L" C& R* a
// 时钟分频
; u0 z% u; d2 v, p
#define CLOCK_DIV_VAL 228
; K% Z/ _5 _4 P$ J- |) ?3 H& k6 G- R* \
3 d- p: u! d. g" J) m$ t5 Y2 u
/****************************************************************************/
) w2 q" j: V4 |- L/ U
/* */
" i% a5 [6 `* @' A( w7 E1 F
/* 全局变量 */
* `1 p) _! C/ t& p- ^! {
/* */
1 B ^( ]8 c; m
/****************************************************************************/
* {& U1 V; U7 W
ECAPCONTEXT ECAPResult;
% x* j% g" A7 G$ Y
+ j. d9 P+ u) Z3 K% b
/****************************************************************************/
( }; t6 x& M) `0 i
/* */
3 j/ v( c% G; k
/* 函数声明 */
" D8 I4 b: {/ ]3 K) Q
/* */
& f+ F4 ^! q2 R3 J1 l, e" P A, c, m
/****************************************************************************/
: h5 U4 G+ k4 ]4 g9 w* G( l
// 外设使能配置
6 E H) C0 X+ v4 I7 J$ w/ ]
void PSCInit(void);
' X# E2 }7 C$ w J: i; D: X) z/ e
2 F) b1 D% b/ f) F1 P) }
// GPIO 管脚复用配置
u9 a7 k; @! ~$ k) I! B, J
void GPIOBankPinMuxSet();
+ \ |: l) k% O$ _
8 b- m n3 I* p* ~$ \, z
// 产生波形
! T0 ]6 @1 h3 |% Y7 \+ R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
( Z8 e) O6 W+ j9 A
void ChopperWaveform(void);
' K4 r2 ]( z3 v0 E, _) p8 s# n% P* ]9 U8 A
7 C1 F8 a, r. b4 `
// ECAP初始化和读函数
: }4 \$ Y+ W# ]) a9 n' V: P
void ECAPInit(void);
) U4 X2 c$ Y& l* |/ u
unsigned int ECAPRead(void);
5 c3 }6 W3 K* \" E
/ ?- A" }0 `. Q. ?* }
//ARM 中断初始化
- l0 Y- A/ l/ s
void InterruptInit(void);
% f. Q2 Y' F2 J# w. t9 n" m
, ?4 C+ D& S9 p& ^4 S
// PWM 中断初始化
" N; B& X9 x1 f* M: ]; i
void PWMInterruptInit(void);
7 Z" @: v, U- C/ m, }/ I0 ~
// 中断服务函数
! X* ^ {3 a: }7 N
// PWM 事件
& _4 A8 a7 V9 J
void PWMEventIsr(void);
, S( n5 s- v; }
// PWM 错误控制事件
3 Q) e6 p5 W% K' C$ i# j/ `
void PWMTZIsr(void);
7 w0 J b/ C' l- ?% I
, H3 J/ ~: N$ N! k& @# B% y
/****************************************************************************/
u- ~' c% N% G
/* */
# I7 h& m( }* m5 o& v
/* 主函数 */
1 v1 \+ W- J6 W4 \- @6 Y) F
/* */
5 u: H; w. ~" P, z, r
/****************************************************************************/
2 w, g3 ?! u/ Z; h% l( m
int main(void)
) M4 e7 v2 X. t5 h! b
{
( c2 _5 X. k! Z% l
// 外设使能配置
. }9 k0 p. O/ \
PSCInit();
+ f" O4 h' [/ H( @. g; u4 o/ J, `
: W& q. ]2 P$ v+ X
// 初始化串口终端 使用串口2
6 d* k+ X/ l2 G5 E1 S
UARTStdioInit();
. ^" T; h: i* `3 r- x
N+ n8 m' |# b
// GPIO 管脚复用配置
9 D1 a" @6 C( B+ L0 _
GPIOBankPinMuxSet();
, y9 @1 ^; i7 I ?8 z+ s' ?
7 r1 ?. U% a7 ~4 T6 A
// ARM 中断初始化
, a# `/ r7 N; U
InterruptInit();
3 }+ k) Z9 ^3 Y! J
/ }: q5 S! r9 ~; G1 k& B# E Z; ~
// PWM 中断初始化
; L! W2 H4 |+ I8 O3 b: f, T& _6 h
PWMInterruptInit();
5 S D8 I- R* S& D; d9 b; \* P
: H( ]; `+ ]" {3 ~1 ~
unsigned char i;
, w( |% ]9 H; u/ k6 t2 M: Y9 S
unsigned int j;
6 Q% I& e9 t- @
& t+ g6 d" u4 ~ H3 u" V: z
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: {5 Y# M% j9 d! j3 u/ y C2 m
UARTPuts("------------------------------------------------------------\r\n", -1);
0 H/ S/ T+ f; b0 e9 M
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
; i4 d1 ]. j% L
// 产生波形
, h& t; J: n6 F' U# R+ @) R
PWM1ABasic(25000,50);
) _7 {) K. l8 U E* [. ~
: D/ k7 j( Y4 l; P. O
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
' ^7 w. y+ c. f# N% d
UARTPuts("------------------------------------------------------------\r\n", -1);
! _: ^: v+ S) b* r% S9 X4 G! s5 p
5 d4 a$ f0 ?" }) e+ l; Q$ @
& [) M# `- [2 m4 O
# w4 R @8 B, O( ~- W
UARTPuts("------------------------------------------------------------\r\n", -1);
- u8 o& @; _. [+ ]8 Z" x3 D; e) W
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 W5 L8 s: ?: { S5 K
// ECAP 捕获初始化
! S; r7 Q" E: g
ECAPInit();
1 o4 ~9 [, [1 z* i
UARTPuts("Initialize ECAP.......\r\n",-1);
* ^# K) s1 s- ^
for(i=0;i<5;i++)
/ Y# e, Z. I4 n1 f0 [, o
{
" r, M/ T) X% r1 ]/ }3 C
for(j=0x00FFFFFF;j>0;j--); // 延时
3 I* ~1 c0 f8 m5 ^+ h4 W8 z- V: L0 j
ECAPRead();
& M# e) j* U8 r/ C
}
" F6 U# G8 [) b8 k, @8 {" h
UARTPuts("\r\n",-1);
5 M1 W4 r5 t2 c
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" |1 ]. f, t4 M' o/ c7 j# L4 t
UARTPuts("------------------------------------------------------------\r\n", -1);
. x' r1 D0 k v" z) c; E+ E
% J) E# R- p$ v+ k0 w
// 主循环
1 v. O8 k3 e5 j/ n+ w v
for(;;)
+ V5 A9 l" J& V2 Z
{
: {. K8 d/ Y( N9 T; A: }# M) q
8 V' Y/ J+ I/ l0 T& j- ?
}
/ r. L: g- w$ I2 K5 v
}
" @+ ?4 Y: g3 S8 Y! E |) ?' l. O
9 w, s, [& A- w; |' }
/****************************************************************************/
7 ~8 a) i! d' G; n! w1 `
/* */
! m" w/ i1 ~4 d* D& j# b
/* PSC 初始化 */
1 U, |/ J( X) S$ h" d( f
/* */
' I6 r m/ l) A8 G; o$ M+ ~4 c
/****************************************************************************/
; n4 Q$ v" C" S# y: p) N
void PSCInit(void)
: G$ V6 m* g* ?2 p4 n7 A
{
/ v( o7 E/ I6 T2 l. p
// 使能 EHRPWM 和 ECAP 模块
$ o3 m1 ]/ z( n* W. z x6 I7 |8 ?
// 对相应外设模块的使能也可以在 BootLoader 中完成
# b7 Y) G1 ]; y( F2 A9 k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 T# u" c9 v, F& x# s6 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ s0 n e9 c2 a3 ^3 d
}
1 l O3 O, M$ K* Q; @
) R* u, Z2 |' u0 @) J! O
/****************************************************************************/
% L' {/ b, ]* }/ S
/* */
) O4 E+ K% i$ H- D& E, t
/* GPIO 管脚复用配置 */
2 c) K: N$ I+ Y6 |5 r; Q4 k
/* */
# L0 [9 y% G V* ^
/****************************************************************************/
0 C$ `: m& N0 m6 P- O
void GPIOBankPinMuxSet(void)
3 Z" L' I" {( Z, ^ P5 Q5 {+ e
{
( e# v0 ?* h5 L' h z3 P% [
EHRPWM1PinMuxSetup();
- ?) V$ R0 }8 u, p; d9 |
. K" h* h: _+ w* v- C5 t9 I
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
" g- f5 B8 h- d8 p2 s8 n. X
// 作为捕获功能时管脚方向为输入
6 D/ p& A5 y% U$ P q$ {
// 作为辅助脉宽调制时管脚方向为输出
( Y: V; ?& A8 I, N
// ECAP2 / APWM2
# S p( Y$ h9 u( M, X
ECAPPinMuxSetup(2);
$ q. W" a$ `! k/ S4 |9 N) [$ ~
2 ]# Y- j) Z' g
// ECAP2 / APWM2方向设置为输入
: Q7 c- M/ t; C/ T4 o J0 A" T: y" p
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( z! X1 t- ?! _% [6 m/ {% B
}
; n4 t" v% f8 {3 r5 {/ e+ Z
; d) X5 `8 \2 i4 T
/****************************************************************************/
( w8 U$ x/ u2 `2 @( Q
/* */
9 S! P* O) B8 e& a; X6 _
/* PWM 输出波形 */
/ \" ]; o4 l2 {
/* */
; F: Z. Y6 W# A# b2 z0 Q; ~
/****************************************************************************/
$ O. l5 }- i8 J' ~- ]. h; e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
" f( @% x' K+ T$ t I+ o; X3 |
{
( c& d ~, N- O7 ^
// 时间基准配置
2 K T, `3 t- r
// 时钟配置
& } L) h# ~* U6 E. ^
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 j/ }0 j$ @# I# x- w% h* E
( B! |! j! P1 E* J# U
// 配置周期
( e0 T7 u* i( M/ {7 R" Z+ c
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 `3 e$ b5 I. ~5 z
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 u, r1 i2 d8 a9 i" G- ?
( z* G- N5 z; C7 ]7 r& M' @
// 禁用输入同步信号
% e* Z. a/ I6 J# j Z
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, r, [8 [1 \3 e$ u3 e0 J. Q) o$ N
% _+ d- y. I0 T! P
// 禁用输出同步信号
+ R; G1 D% L9 I& t1 t
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
' c: D3 v. A5 g9 `/ H
* w6 b# X1 X8 `% R1 u: g& z0 ~) T
// 仿真(DEBUG)模式行为配置
( \; e* ]2 M4 O& ]9 o! u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 }( I4 Z7 Q# Y" k
: K: |( J+ ~9 U
// 配置计数比较器子模块
2 R* T, q- t+ d" a
// 加载比较器 A 值
3 J, I1 E% ~5 }# E
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; Q$ T7 `8 n" S( B; I
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# M: w. |' x6 X9 j8 B+ Q$ \+ g
' L* E& R- ?( C$ {! y, S
// 加载比较器 B 值
! c/ C9 O- g. h/ j, \: O9 \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 \; I# E/ ]& h1 ?8 n6 k
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ J1 O+ q( Y/ o8 M
1 g+ s7 r, n$ _( `
// 功能限定配置(输出引脚触发方式设定)
W& n5 O& u/ }1 T& ^: m, W6 Y0 V
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ {8 D. P8 G4 |. \# d
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 E* n0 O n; R1 p7 s9 f% x
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ p6 ?( x3 w: n! y7 B3 K
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
! g4 O1 d8 ?) |% w2 W
, W" k2 l( J- K* T; U
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
8 S; |, x* x' P/ a" L; O8 w9 z4 e
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; l5 r f' h, T9 e2 D
# |: `5 E* [" O M; ~# k
// 禁用斩波子模块
% v. N# Z+ P& G- c8 k, T2 o
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
4 P9 Y# E& C3 t' u) U7 [. c: D# l
3 f5 O% ]2 \8 u y: s7 y+ g
// 禁用错误控制事件
* q& k4 W6 _1 \* j. [" g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 C# o/ C& P7 e$ S/ F: N
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
U" `3 G. y# O; d# i' U3 X# }* V
$ ?' v& _; p# l# S9 P, }) }. Z
// 事件触发配置
& R$ a2 Z6 W9 h0 e' Q) O" x
// 每三次事件发生产生中断
% i3 ~/ f8 O8 i
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) B8 v) _ u8 P
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* {) z8 J: e' ]2 H& q c
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 ]8 m; _# d* i' q
// 使能中断
0 c. W' a) ~8 n- E* s
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
: _5 ^2 y- u, R: n( b, q
2 ^7 |1 }& M' O0 U+ b
// 禁用高精度子模块
9 u4 l8 j! B# m W9 S5 l
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
3 X: P! Y$ ?4 q
+ Q! R) k9 w* A, H- H" [
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* t+ C: I8 {" w2 C
}
6 ?- j0 |6 \* n5 _. }4 M5 Z
: n$ t5 {6 e! W8 ]4 j! |
void ChopperWaveform(void)
- s% v5 ?4 W4 f2 ^. i4 m
{
9 ~; z5 X: W; X2 q9 p3 O v
// 50% 占空比
3 R: V" R- |) G6 ]' u
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
- X( `5 {) [! M: u0 l- a2 L
// 4 分频
$ l' D7 c* V. K# D+ |( v5 E
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ `: [, L- N$ `$ [0 o
// 单个脉冲宽度
- b1 p2 n3 L0 c3 }" L: Q, }
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 a7 r7 O* f) A- d) k p/ l
// 使能斩波子模块
2 u0 }5 L' @0 k4 F% v1 v) Y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ ]5 C0 N/ m/ |- n: i$ U& x
}
) ~8 T; i: q d0 A$ K2 V) x9 U0 U
, {7 \3 c) D( v* _
/****************************************************************************/
2 m' x6 {1 O9 r' t! s# ^7 J% ~, p
/* */
( B/ `8 w+ `! [, {
/* PWM 中断初始化 */
/ e1 Q& n2 a3 E2 S0 V. Z* ]
/* */
$ C# j9 f9 H, _" [" J$ O
/****************************************************************************/
$ E) ^$ W5 e+ O# A
void PWMInterruptInit(void)
9 I4 A6 H$ I) _, j% t' k& E% Q
{
# Z, C; k3 U z# g4 G
// 注册中断服务函数
- m1 E5 j" \) ^9 B
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
7 i+ h( [- h. p
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" t( _/ |1 P' h |6 [
3 t' E5 R- P) }1 W# q. |' R" {2 p
// 映射中断
: o% N: I1 w. B j
IntChannelSet(SYS_INT_EHRPWM1, 2);
4 U& I# U" Z2 M
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
w: |& y, Y0 h6 L& x6 U$ V5 N: P
5 @. w6 ~) F u3 o
// 使能中断
( I9 U6 n5 t( ^& f! Q( J
IntSystemEnable(SYS_INT_EHRPWM1);
, M3 v8 y( T3 u! Y) \: M* }1 P6 [
IntSystemEnable(SYS_INT_EHRPWM1TZ);
. O$ J: _6 ]" u1 K
}
, }5 i2 c: p! M: j: {: ^* [
: E9 v6 x& a5 w& z9 G
/****************************************************************************/
6 _6 ~2 [6 [8 Q* h/ @
/* */
2 F6 _- n( |& {5 ]
/* ARM 中断初始化 */
7 O/ Z: q6 e' U8 u! W( U
/* */
6 K- H& K, @4 m+ I
/****************************************************************************/
$ G! Z _/ E, k) n
void InterruptInit(void)
+ ?5 |& J# o" \$ \) j
{
s( m% r8 K3 c% L ^% D7 L
// 初始化 ARM 中断控制器
; k3 U1 \) S9 k- u, A& I/ Q e
IntAINTCInit();
$ K Z, S" r- |" Z
# n; x# S& z( {2 w- m
// 使能 IRQ(CPSR)
6 E$ u9 J' ?5 g7 Q/ d
IntMasterIRQEnable();
( y( D6 S7 ^+ g2 {9 l. Q5 e
. w Q {( u8 `9 X9 Q6 h
// 使能中断(AINTC GER)
2 \% N- S5 N$ v4 q, J
IntGlobalEnable();
6 l5 n" W# X7 N
6 _. ]! m) Z6 P7 P! W
// 使能中断(AINTC HIER)
. T [$ p8 H! \ Y8 c3 p
IntIRQEnable();
5 s' z- J9 N( U+ @
}
" G* d; Y# P' W2 S$ z0 x
4 T/ ?/ h. d+ N- V3 ^# Z8 u
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
! r+ i) s9 G* k! ~2 j
/* */
' M* U* @; [2 [3 ?
/* 中断服务函数 */
2 W$ P. ~0 {# r+ x6 W1 j% t# G2 q2 V
/* */
; M e2 ]' Q4 Q! U1 U
/****************************************************************************/
* f# B$ d9 s2 h! B7 S, I9 d. e/ \
void PWMEventIsr(void)
( K+ v& v) k3 @8 H% B
{
9 R* x9 q# J& a( }9 ?
IntSystemStatusClear(SYS_INT_EHRPWM1);
( s) h+ v8 K/ k% N, d% b
. H9 w' G9 F( P. b k- V4 R: l, B
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ d5 T6 @; e# L4 p0 i5 S
}
9 A9 C6 F$ |* i; W
5 g2 O. }7 N* s; z
void PWMTZIsr(void)
, a U8 }1 N! m( b$ G. p
{
' h' T- T# ^7 r- n4 V- T
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 [: a5 F; m* @- x* X
$ Q* E5 X+ j% t% Y8 c( k
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' Y3 t2 h7 l5 T& L' \7 z" k% P
}
& C. I: ]4 ~% @: @2 d9 M6 w
8 _# d0 C+ H# u0 `% |2 ]; m5 e$ y" A
/****************************************************************************/
) z8 _( `, i" L- l- ]6 C2 Y
/* */
, t0 m8 k1 ~! e8 S
/* 初始化捕获模块 */
U1 z9 Q4 d4 a/ `' ]2 Z; [
/* */
. `3 m8 \7 b; G0 D: C1 s7 E
/****************************************************************************/
7 i$ N0 L. q! M+ u
void ECAPInit(void)
* l9 s' k' e6 W4 v" Y1 H" B( @8 _
{
, Z; V$ R3 {' z0 |5 Y l2 u! M* M
/*-----设置 ECCTL1-----*/
; O/ h8 O' F. y: z( a
// 使能CAP寄存器装载
9 V7 W: x+ f3 i
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
& N* y+ V; U1 }+ f7 [8 k2 }2 P* w! u8 S
// 设置预分频值.
0 u. s9 I& H- J; P, P8 L+ R. Y' g
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 C* K( c+ `" F- B5 y; B4 \; @$ Q
// 上升沿触发捕获事件
2 d8 @6 @1 H' d' k7 O
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
) M$ z* d! u6 x' d M# P: P
// 输入捕获后重新装载计数器值.
0 Y2 M8 a, P: w6 e* E
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
! [# \" Q1 ~9 n$ Q( ^
* R4 u0 g8 v% T5 ^3 ~; f( Y S
/*-----设置 ECCTL2-----*/
: c' c5 J8 j0 h8 E# R+ [
// 连续模式
* p4 b0 h; ~) j4 S9 G, ]
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
+ z. a1 u& i R
// ECAP计数器TSCTR持续计数
$ P% `+ I7 \# ~5 p1 Q1 A- I( ` W
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! c5 f) Q! N* F7 F$ y. z! O& b
// 禁用同步输出和同步输入
$ Q" g @, X, q9 C1 l2 k
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
# Q; B' |/ w( `5 \
// 配置 ECAP 2 为 CAPTURE 模式
/ D* t( Z. S0 ^ b
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
2 ?0 w' [# [( x
8 T; P' _& k3 B
// 使能中断
9 S: l8 i6 O( R5 J2 ~
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 K% }7 x: Q# A6 I
}
4 s! \, X! h8 E- ?8 V
, K( a' _6 R' f+ N& U! y0 w
/****************************************************************************/
$ f6 g) e9 t' s T: Y
/* */
2 B2 Z+ r/ X4 Y$ t5 V2 e0 u. z8 z
/* 取得捕获结果 */
! h+ s$ Q( G m Z2 s
/* */
" g3 Z- M# h4 j6 Z6 @* O: ]
/****************************************************************************/
7 |4 i6 X/ O6 c+ V7 @7 d* k
unsigned int ECAPRead(void)
. A0 y" G8 K* r4 W1 E9 \% j+ C L
{
% {6 g9 R, a* U9 K7 m( W/ O
unsigned int capvalue;
0 X+ L* S3 S) Q8 L+ l
unsigned long frequency;
- m9 r% G) I6 i. p( I3 c
6 y, T0 z, @3 s- V7 \0 j7 l2 I
// Event1 中断标志
8 |& i& p4 j, C; N# a% }
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 c2 M# \3 n. @* \
{
( m( v; f3 H& F7 d f, N) }) g
// 取得捕获计数
1 f9 E! v+ g& A3 N$ O. @( G i
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% f! ^ j0 f. t2 A1 k
capvalue = ECAPResult.cap1;
$ U" S' C3 z" A& o' g: T4 `
7 Q# |" ]. ^" c2 q$ i
// CAPTRUE 模块 228M 时钟主频
. }- C+ k" u) H/ R' E
frequency = 228000000/capvalue;
$ y* o2 S- U- U+ c$ K# A: f1 |4 K
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
- k8 P; G. m& ]7 I3 p i, L6 k* ^
' U0 S3 Z* C( h- v! n
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
9 \2 D' |* E" V# k* Y; X% {
// IntEventClear(SYS_INT_ECAP2);
$ D c0 l* ? d" \( y
}
) e& e# f4 N7 D6 ^6 d2 a
return frequency;
+ w9 t e% |3 z# u t5 J
}
" e/ `1 V) T" ^% m# K
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
8 O1 p7 n# P |! o
[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