嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
8 d" V; @% K1 L: m' D: v
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ r6 y" ~5 E# A8 E
/* */
/ J5 h3 C: D# w K4 N" d2 k% z
/* 宏定义 */
5 R+ m! T2 N; ]0 P
/* */
6 L( u+ Y# P2 |; I7 t
/****************************************************************************/
7 N+ U+ _0 `- O% [) e. ^& v
// 软件断点
$ x2 N/ l+ H3 h, ~ Y$ t' Q- I
#define SW_BREAKPOINT asm(" SWBP 0 ");
2 S0 a6 z# o$ t
, i2 X5 e# ]0 b* _4 i3 e# |
// 时钟分频
# }; ]( z4 x8 j+ b4 s
#define CLOCK_DIV_VAL 228
3 e$ d, L# y: C. u3 l e% w
6 u8 I0 I6 _6 Q5 f( j
/****************************************************************************/
3 F* w% q/ G! F4 {% N% x8 J3 i
/* */
; h. W/ n7 H1 A/ |
/* 全局变量 */
3 \. b, y9 I/ ^1 [3 H: n
/* */
! m a% l& }; e) w
/****************************************************************************/
, |& \+ q3 r7 q2 V/ P' b
ECAPCONTEXT ECAPResult;
; I! }2 E) Y) r6 k2 H x% s7 k/ U$ s
1 w0 _! ~5 z3 v5 R
/****************************************************************************/
% r+ ^% N! \/ G- l& K
/* */
6 f, m. X2 c% q( } W7 Y
/* 函数声明 */
8 ]3 _3 V" g( ? n' `! S' t) R! e
/* */
" m: Z7 O, p$ r/ E$ F f
/****************************************************************************/
! X/ O$ Y; a* o G% Q$ }( N% c" L
// 外设使能配置
( b' P& f; Z H( R$ s; p1 x
void PSCInit(void);
/ k) {7 w, e/ M5 e6 B7 Y
: b- b2 P2 B2 N6 i1 P0 o3 c3 d
// GPIO 管脚复用配置
, F; I& ]8 \ F
void GPIOBankPinMuxSet();
- A d7 w8 O' r
. Y8 i8 C1 j4 M4 Z' N! [8 X
// 产生波形
5 n0 ?3 q n8 }5 v0 G- ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
' Z4 c& H; m' C9 T* i
void ChopperWaveform(void);
3 q, H* S$ A. d) \
7 s; K! t9 ]4 f7 N" q
// ECAP初始化和读函数
* [+ ~, o, X2 K3 u& l: f& e
void ECAPInit(void);
9 M9 Y( V* i9 F
unsigned int ECAPRead(void);
3 N) F8 w9 Q9 o" a; b% L7 h
/ E3 O% Q: a9 Z3 n, Q! [
//ARM 中断初始化
# d& H: l% G) Z0 V
void InterruptInit(void);
) |( W. R; [* h4 Z; T3 S
8 p" P3 g0 \. c( C6 o' Y% Y
// PWM 中断初始化
& s' z% Q) l# g* d% t$ m
void PWMInterruptInit(void);
+ h; e8 s& V) \. h- V7 ~. p3 }
// 中断服务函数
( I& u0 R c5 M
// PWM 事件
% w# N, @% j4 t/ z; U* s4 T
void PWMEventIsr(void);
- }. N3 O! U4 b% [
// PWM 错误控制事件
! Z. I$ Y% y; P, h; v- z/ a& c
void PWMTZIsr(void);
* z* F) b B& Z
9 E/ g$ S! d3 w2 @- ]
/****************************************************************************/
3 \* k$ j4 {% w% F( H) ^
/* */
7 L9 [" }" {- m
/* 主函数 */
2 I' I; q* ~, Y ~: L4 v
/* */
, L2 W% I* W( Z: B! w. ?
/****************************************************************************/
: f9 |; x7 X, x2 D i
int main(void)
; t: Q; A% Y$ I, ]0 z7 E
{
; u7 I6 c' s7 A" I
// 外设使能配置
& {; B. d6 u6 Q2 ?# o) R
PSCInit();
' g2 C* v l% i- \+ n
+ x1 D: ~% \! L V
// 初始化串口终端 使用串口2
0 n% U8 ]! K: B
UARTStdioInit();
, B" h8 t& j: f6 L M! E
6 \1 v- P6 {% t$ |# C# ^/ a9 r0 V
// GPIO 管脚复用配置
# s4 g9 S; y+ b
GPIOBankPinMuxSet();
% l$ }4 n& G6 |4 d* I0 X% `
2 q) I$ T$ \% l( p! w. o3 B
// ARM 中断初始化
! c( d7 X- O2 S9 w
InterruptInit();
$ ~: E, O' c9 C; g7 Y
- D& ~& a/ P X0 {8 U1 y
// PWM 中断初始化
+ [* b% y B. t) Z2 Q% P& T
PWMInterruptInit();
8 z! r+ `8 M- ~+ P! Q5 `
& I: z1 X' m3 v& k. p$ h
unsigned char i;
% ?! I, P* `9 J8 i
unsigned int j;
3 }. z2 T: \4 ^
/ {+ @* w: `5 Q- Y: Z
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' J# j% Y `2 q1 Y
UARTPuts("------------------------------------------------------------\r\n", -1);
* J9 p1 s( c) @3 L; P: ^% g X/ f
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% K& V, Q2 [7 {7 f( d2 ~; G$ K
// 产生波形
$ v ]- P9 a: g* l+ n j
PWM1ABasic(25000,50);
. R4 |" ?- C# n" O- A% I) E
- J/ v9 G6 V, s2 x, ?
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
/ Q0 _. b8 y! M3 r2 }
UARTPuts("------------------------------------------------------------\r\n", -1);
; O( ^' G, s5 Q4 c7 J
/ M: Y4 I' }3 ]0 B, p* `1 N' N
5 _8 W- `- _& C+ N a ~0 \
) W# r7 l& q3 F% L' y; G
UARTPuts("------------------------------------------------------------\r\n", -1);
! x0 \) P# N7 K: L* v: g. g' t
UARTPuts(" C6748 ECAP Test\r\n", -1);
1 e* A2 Z8 N1 a7 H
// ECAP 捕获初始化
4 c# q: R5 Z1 F
ECAPInit();
4 f" ]( X4 e* s
UARTPuts("Initialize ECAP.......\r\n",-1);
0 ?, R- K/ k1 l) L
for(i=0;i<5;i++)
0 W+ [7 K1 C! ^5 r
{
8 A D) Q- ^3 D5 ?
for(j=0x00FFFFFF;j>0;j--); // 延时
* N" A0 ^) v/ Y$ U! P$ p m: O
ECAPRead();
% B6 F' V5 Z: `1 G
}
7 y4 ~0 {( f x, T x
UARTPuts("\r\n",-1);
8 a+ g$ ]1 j8 V0 ?) f5 z2 F
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
i2 ^+ G3 j* w
UARTPuts("------------------------------------------------------------\r\n", -1);
. p2 a% Z8 n; [4 n7 s! N
" ~8 \, T. @1 \! o: a
// 主循环
* C K8 y; V, Y& |
for(;;)
& K7 T8 r; R6 Q( H' j3 k" l, Z
{
) J5 X- R3 G: z; T/ B0 ~6 ~
5 @. W, {9 K% i# Q& m$ g# G
}
1 }3 }6 e* K" e8 W6 }
}
4 ?4 \& K" r3 N& @/ E
9 d% x7 ]* [7 R
/****************************************************************************/
4 r# y o' K$ q3 r# E
/* */
9 h w' t* L& b) g6 c0 Q
/* PSC 初始化 */
* }7 A" o8 I% H# C1 l' {
/* */
/ l2 [& e, i$ {+ p2 |# \& M
/****************************************************************************/
# x* l! W& O% Z+ X
void PSCInit(void)
; P; l3 i( f- D) J9 |7 b% G
{
2 q5 a( E2 I5 l! j
// 使能 EHRPWM 和 ECAP 模块
( w5 E7 B7 _% D$ r
// 对相应外设模块的使能也可以在 BootLoader 中完成
1 n. D. v- g' t1 |9 I
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 |5 C2 P% h. v5 }- }. f7 G# g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& ~4 Q0 C. B$ n8 A
}
5 k: I- @+ J' u1 H" B6 U: X- i7 b7 x5 X
* F& o/ P" q( w/ S) y; W
/****************************************************************************/
9 ~! H6 n d5 e% F
/* */
, Y( h$ j8 T' M0 N9 K9 }, H
/* GPIO 管脚复用配置 */
9 z7 X4 e3 c$ f3 _" H3 G
/* */
7 B% T/ `5 ~5 y: g: Y( l/ s
/****************************************************************************/
; G* O$ o5 c8 r, `, C; ?- s* p$ u
void GPIOBankPinMuxSet(void)
( G; @ |3 L; A: o3 }' l
{
% Z" i+ b0 X! X9 P7 C+ s9 Z
EHRPWM1PinMuxSetup();
: |2 a; s/ r: P& P+ L8 b8 M
& U& Q; I' o! x9 X \+ j% c
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- W1 a, h8 k6 K( Z8 D
// 作为捕获功能时管脚方向为输入
9 o2 |0 B* v6 m, o+ n* U2 ?
// 作为辅助脉宽调制时管脚方向为输出
' D* G0 j N' e
// ECAP2 / APWM2
+ o( \/ c4 N& h5 W4 l3 @! d, r
ECAPPinMuxSetup(2);
5 a c# W$ ?, d
! X% j% P# p/ H; p
// ECAP2 / APWM2方向设置为输入
- O% O: `' [ V
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
4 W( v# S/ Q% t. @% w1 g5 {# ^. ~1 Q
}
! l& o5 Y8 Q7 ^; _2 \
3 B0 p4 R* h& p: l( N% c8 n
/****************************************************************************/
) j9 z" |" @' F4 |. p4 H
/* */
) h7 _ `$ r. v: g4 w- y/ @" L1 |
/* PWM 输出波形 */
7 O" Y. s$ z0 |$ |6 Y
/* */
0 G3 M0 h2 `4 z- \$ F w$ H
/****************************************************************************/
8 F- h1 K5 w/ }) i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
/ q# I% \0 P ^+ |5 `2 j8 G
{
5 |4 Z8 Z: @6 e7 I; `
// 时间基准配置
3 p+ _/ r, [8 N$ H, @) d% ~, p
// 时钟配置
" g" W" |6 R; ~* K
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
% ]! p+ m( s, I
) A x+ c6 }% U! `9 g# h
// 配置周期
' \# X: e& Y) e0 B5 q" y2 Y+ _, u4 K
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 x0 S, P% i8 F! [2 i/ W% _0 Y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 m- e6 u, ~. V: }
! k, g% M/ S3 a+ F+ g
// 禁用输入同步信号
) ?7 j0 w! f+ p7 o% b
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ p5 ]& m- C( b$ b0 R% ?- Q
! f4 i" J- D e
// 禁用输出同步信号
! I3 G4 I$ b0 }$ [* c. c0 w
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
c; w# }- d' ]7 u/ _- y( m5 C
" p2 d' v6 y, A" O7 ` X( l
// 仿真(DEBUG)模式行为配置
3 w+ A9 q! n5 I" a! T
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
Z e9 O1 B8 e# d" y4 Y( x$ t
/ I" P7 M, g1 T" { H
// 配置计数比较器子模块
+ ]* \4 F( \3 ]5 E" R; D6 b4 f
// 加载比较器 A 值
& T$ [4 d$ }5 F2 |5 X; @. F
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
) f2 I3 Z) ?2 C+ A( N' X; J
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" T D( @6 C: B3 H3 t
- u: w! r( R K' O5 h2 J" Y5 q
// 加载比较器 B 值
' B. a' h3 G+ G: b6 I V2 L, V
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
$ n6 t5 L3 `0 c0 L# {
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
( A0 l) R4 U# M1 s8 l; v- d. V
9 C0 W/ ?7 P- u' P1 W
// 功能限定配置(输出引脚触发方式设定)
8 M. X. l+ b n1 `7 J+ X
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ h% B3 ^' j. z5 `
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: I s0 {6 |% [1 c2 o
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
# C: n; A3 K% f
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 V# A$ W5 l* {8 {$ s* ~
' }: G) b5 T$ k$ V, h L
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 M% T! |0 D9 [+ A7 x8 J8 S
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( p% N& `1 Z( f2 A. O
% k" @/ v" ? F( i3 W9 a( F7 z3 X
// 禁用斩波子模块
' l5 Z: G; c5 {) B% V- O; W
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& U% W- h0 p/ X* p
- e6 w+ y q* `' |8 ?
// 禁用错误控制事件
; ]# C2 \5 A# a7 b G# O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 M; f$ q2 B% ?& e7 _" ]2 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 g- V/ @3 }! z6 {" C8 {- y0 s( c' H
. }) Y; d0 P k, U( V2 t* y
// 事件触发配置
9 o% o" {; q9 j- E
// 每三次事件发生产生中断
! j% H* |3 D' K1 \/ _# R/ F
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 c q8 K8 ]$ A' v3 E& x. D
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( o( Q2 ~/ }3 E2 l! o
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
5 l" [. I- v4 d% B
// 使能中断
% C! _/ _( i& t! |6 [+ R
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, z! `$ H8 U- |& X: X; C9 _, k
: e& z4 w8 i. p0 h/ I
// 禁用高精度子模块
7 A3 ^2 A* r6 ^
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
( X* C; u1 S2 b$ n' U- o
. ^1 J1 O$ D5 v7 {; s
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
' F& t" m: [/ o% C& |3 A
}
$ Q0 S% q3 h; y t& H
& ^; S0 F/ Q) T' _; [* a% u) m
void ChopperWaveform(void)
# f: |$ L5 M7 L8 x# ?% M- g5 j
{
+ a0 N% K5 \6 i
// 50% 占空比
1 ~9 d6 ]7 F/ W7 }& @
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
# `* z% d+ r7 u2 l9 B
// 4 分频
* t/ M; o) a* i; ]4 `
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& M8 R& c7 e6 ^- P: t
// 单个脉冲宽度
6 v, n5 M! w8 _+ j4 N7 ]) v/ B
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
t8 o+ \) Q2 G2 }
// 使能斩波子模块
- n6 j0 n6 l( c4 _) \
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
) }# V4 z9 U% |( o3 P
}
; m' b% U1 a1 L% v. r z& e0 H, n
3 S7 x: t2 X" j0 w }, O
/****************************************************************************/
! W! u1 x Z: L( i# c T
/* */
$ H+ J. `( G* t% w( V6 h. @
/* PWM 中断初始化 */
- z1 @$ S' y/ M) Q; d) |
/* */
9 V4 U) Z9 N+ m3 N# u) a. `2 g
/****************************************************************************/
7 y* }# ]3 {# `, S) i
void PWMInterruptInit(void)
z5 l! W* o- m" u) K. I
{
% K5 @8 X9 Y9 C5 \- ?6 |
// 注册中断服务函数
- t4 O4 v3 u! K" r8 r/ E
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ b# ?/ K& J+ q) ^7 f' b
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
# \/ B: k" |/ S4 w
( c: B$ D. _8 o; D. K. J
// 映射中断
9 ]0 `9 a- v3 p; P! Y0 r) m
IntChannelSet(SYS_INT_EHRPWM1, 2);
$ J1 n4 T/ a X. Y; C
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 A$ T9 E8 g( ?" k) ?
+ i: {0 c7 `2 N: l" _3 O' a
// 使能中断
. a+ S8 H; s$ p! l! o" \& L
IntSystemEnable(SYS_INT_EHRPWM1);
: V$ R( ]+ F. u1 e* ~) P. C
IntSystemEnable(SYS_INT_EHRPWM1TZ);
* m# f, Z9 b9 M5 t8 A6 Q
}
8 ^! E( S" B: G- f9 V
# K. `/ \" H! ^+ r
/****************************************************************************/
5 d$ y9 g; z7 r9 F; T1 t
/* */
, o- X" m5 x* k8 y
/* ARM 中断初始化 */
2 {/ p# |; K2 B; [. f
/* */
; k" K7 ~) s/ I/ T) J
/****************************************************************************/
0 x6 d) u/ C# C4 W
void InterruptInit(void)
/ U2 Y' B3 H' e K
{
2 ]; r, ?- g# b, n x" J O3 K0 m
// 初始化 ARM 中断控制器
% Q4 h/ J/ S" @2 I+ I
IntAINTCInit();
) e; h8 h' k" w3 \
' S2 Y# }# Z; t2 ~; H
// 使能 IRQ(CPSR)
) J! }' B" [7 V `* Y) M1 H
IntMasterIRQEnable();
3 U D5 r1 Y0 [9 f' H/ @
8 J4 i6 ^2 U" [6 R
// 使能中断(AINTC GER)
: u. E/ g. Q9 N! b% B
IntGlobalEnable();
) a q, ~5 p/ c$ d- O& B
' h0 c% M7 @5 n* V6 l6 }
// 使能中断(AINTC HIER)
" Y; t' w3 I' S6 K8 ^. ]
IntIRQEnable();
* m5 f+ B) ~: y" S2 ^+ e: ~5 O
}
$ _' m8 [& y1 z4 V
p& _+ f' n0 n# d/ O
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
& I! M& ~ G9 ]1 Y8 n, s/ d8 i8 W
/* */
' X5 X: s, f+ Z4 U0 C6 ~0 [
/* 中断服务函数 */
0 T$ C; o; O3 f9 t4 } i
/* */
+ o, q0 }" ^$ p, F$ s7 N. w
/****************************************************************************/
1 I" p+ F; P- ^0 `! S! Z
void PWMEventIsr(void)
# p% |5 }0 O" f0 D- t
{
0 J+ M( B7 S7 A; |
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 G& n+ g! O. a6 W# e% z
; O5 A( ^( s- K4 l% n
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
4 E" J0 \+ ?# F0 u* S& }- D
}
5 z% M7 z1 z1 T+ p0 C: J8 i
! Q9 Q& k7 ]* D) e
void PWMTZIsr(void)
* w; a5 W& _! Q, k
{
\: N% o' g' v) e$ I! V
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ g! F+ m& A( l/ Z
% h: M: \, S6 z8 F- b
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
; Q6 Z V$ q2 [7 D0 S
}
0 z* U U' D) ^
* M& ]& Q+ Q4 y6 T: T) P9 z& D
/****************************************************************************/
& p: g3 [! _2 B- K+ i
/* */
- S. q& v. ^: o: {" b# f; z
/* 初始化捕获模块 */
) }1 s- ~* ?: t, J( z
/* */
" V" R4 z/ v& [! l. Y1 _+ H
/****************************************************************************/
0 |% q, z% G x' r1 m6 ~) N7 i
void ECAPInit(void)
+ z" U5 C1 `3 t- R/ }0 _5 ^
{
- f2 E6 h; D$ E2 Q4 t7 P9 B
/*-----设置 ECCTL1-----*/
4 j. m+ N' Y& o+ _& T# M, P. U# L
// 使能CAP寄存器装载
. p. }; h+ {% [, d, k! A4 U. [& q
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 O& N0 {! t, u9 f( ~* [! ~
// 设置预分频值.
/ {4 P5 N$ J& |& }' E3 A8 L
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
" M+ U6 l: n" r
// 上升沿触发捕获事件
2 Z2 p, m% q8 |. f8 ?
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& @3 R$ M; N; t, N1 X! M
// 输入捕获后重新装载计数器值.
& u$ p# V/ b; z& k
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
- H, T& M2 R3 k1 t
$ x; W7 u+ y1 u# r$ q( A5 l
/*-----设置 ECCTL2-----*/
$ L! t" C' n* K7 @
// 连续模式
2 [! J4 E: Z; l; E
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 i q7 s% E, A* f
// ECAP计数器TSCTR持续计数
# Z" |% d1 k' C
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
) T; |0 C5 i- e0 U2 r
// 禁用同步输出和同步输入
) h/ n5 F5 i/ I# T
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
6 H! a" q& C _/ U+ d9 O
// 配置 ECAP 2 为 CAPTURE 模式
8 {3 s# ~! _! o! w: J; ^
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% e l- Q- Z$ N( d" C2 f
. T( \1 Q$ x& I: A/ q
// 使能中断
* R% q4 v9 J# W# W9 K+ I' {
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
" b4 W) d3 A. Y/ @
}
5 T U9 _: @8 ?+ n
% g8 v# Z r. |
/****************************************************************************/
3 @- c0 q- Z8 I: n! @/ g$ ?$ w- ~4 R
/* */
: p$ n$ E) l* i% _/ K
/* 取得捕获结果 */
" c7 y2 J7 W/ ~- j1 ~* I* G, y
/* */
5 |( Z4 z9 \6 s9 v/ O
/****************************************************************************/
) J9 V) s0 ^+ V4 r
unsigned int ECAPRead(void)
# x0 W9 I+ X8 B& @1 e
{
0 n2 J( g# L8 O& B, X
unsigned int capvalue;
9 @8 V0 X- M& V5 C
unsigned long frequency;
6 l2 G; S2 }) H
% |' |3 M/ \% r* Z
// Event1 中断标志
7 t" i0 O. B. J: a
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
, W5 Z O+ w- y
{
- Z# n. F A4 R: S Y
// 取得捕获计数
0 r" J5 t- r2 v" v
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
, y# B r/ y7 N9 `
capvalue = ECAPResult.cap1;
K1 f0 ?" G( t& C$ `7 `
' v+ K% ]8 O# P' C, h- n* H
// CAPTRUE 模块 228M 时钟主频
7 S \- Q% d& s
frequency = 228000000/capvalue;
5 ^6 k9 r3 R# u
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
% D: `/ Z$ A# F$ C
* K! d3 W8 B* X' c9 V9 Z
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
# x/ j: Y# W# Q" j! r" r7 N. Y; {$ r
// IntEventClear(SYS_INT_ECAP2);
: A$ d; u% |6 z2 C& C7 e( k) L
}
0 w9 @0 d; r' B$ a8 o/ X# Y; x
return frequency;
1 P& _( v2 R2 T6 E$ h0 |
}
) c+ p' @" S5 s! ?7 Q$ |- W1 ?
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
8 x% b0 J% r/ z& R6 {
[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