嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
& c+ [, ~ |# x/ p2 K; T; R" C# N2 \1 n4 H
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
2 N! ]* o9 E- v' V
/* */
. Z' F- ^' Z2 R* e: l$ y
/* 宏定义 */
# {# j, j- u, J
/* */
0 c/ M: G2 j. Q0 y
/****************************************************************************/
& N! Z% w) \+ o0 N5 w
// 软件断点
* I! J5 s/ ~8 W4 ^
#define SW_BREAKPOINT asm(" SWBP 0 ");
* C3 ]. y: \" p
1 W: a7 V m. h9 D
// 时钟分频
) q7 f# r" c6 l" `% h, N
#define CLOCK_DIV_VAL 228
/ r" G+ i5 C/ N: }- v B
( e# ~* R; e! k7 _+ V) @" a% k
/****************************************************************************/
3 I; }) Y0 J$ k" G& t& C
/* */
+ Z _7 b; O9 @: ^' T
/* 全局变量 */
) Z) {* m- w( y z
/* */
$ ]2 x" K" V0 j
/****************************************************************************/
0 T+ u e3 T5 z: E6 L
ECAPCONTEXT ECAPResult;
. @2 P/ I2 f# b1 e- ~
5 z; P$ Z( t, R& B( Y7 ^
/****************************************************************************/
P+ J d0 y& H/ |0 c9 k) U
/* */
6 G7 Q* ]: i5 E Q
/* 函数声明 */
{4 c4 ?0 c' p; R7 q
/* */
% ]7 z5 O8 j% ^% X) s
/****************************************************************************/
8 N; X; a0 `( a
// 外设使能配置
% f+ b/ `& O* s; R% d$ d
void PSCInit(void);
, y7 D& z/ W. n+ P; w; b+ P
; ^' I* m4 f6 v+ U1 c. v
// GPIO 管脚复用配置
- D- g2 [/ J7 J7 t# r0 F
void GPIOBankPinMuxSet();
5 e9 b- P9 q& W$ l. e3 ]- S/ Q
0 b; |- a, g5 @) q2 h- h. O( j* @
// 产生波形
+ C4 E- _$ d3 ?1 O1 G G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
3 [% W6 C# G7 P$ d9 }6 p. I* Z/ y
void ChopperWaveform(void);
: t3 ?# e9 ]1 m; f+ s
# B0 H: v+ i" c l8 y
// ECAP初始化和读函数
% z: l: S4 u8 b1 B
void ECAPInit(void);
/ f( D1 K) a- Z
unsigned int ECAPRead(void);
2 H5 B9 O& G/ w+ ^( O2 f. P8 i
) C) C6 o+ ^8 J6 F- S
//ARM 中断初始化
0 J5 c2 R- X) o; c: [: ]. H0 [+ S
void InterruptInit(void);
" J% \" r* m$ U0 u& l
+ K+ v& i$ H7 d+ m+ d# `
// PWM 中断初始化
* M$ Q0 k& a2 Z: X5 C8 T
void PWMInterruptInit(void);
9 w! J. f6 V4 g" I
// 中断服务函数
3 n6 K& `/ E9 K$ ]
// PWM 事件
2 X' |7 ]8 C- [ {
void PWMEventIsr(void);
/ ]& [% q2 U1 t2 I; M6 L
// PWM 错误控制事件
; R$ j/ D" `: S
void PWMTZIsr(void);
) b" W Q, \* {4 s7 X& e
8 s' k4 e/ U5 K9 o; n
/****************************************************************************/
" s' w9 Y7 h/ y# o. t# k
/* */
6 `2 Q, \7 p, k1 J) r1 Y
/* 主函数 */
' S Y3 F7 ?* I/ b3 m
/* */
3 J- [0 P& T) U( ]% |
/****************************************************************************/
e& x' g6 ~; b2 N& ]
int main(void)
$ j$ J+ E3 \/ N$ ]9 H. |, a% d+ k
{
2 t) g1 _* }6 d7 M" i. l
// 外设使能配置
( U: f! u7 \; l" c* f, S( N
PSCInit();
+ o; Z% U' P0 @/ Y( H% M
& D7 H! q% a( @1 q9 w" e
// 初始化串口终端 使用串口2
! ]# a8 G: q) l# o
UARTStdioInit();
5 c+ x$ I- g! N( ?% W
" W3 E) t3 V/ m+ r6 f! V6 ?* x
// GPIO 管脚复用配置
* K r' N; ]. ?- e9 \ {
GPIOBankPinMuxSet();
) p0 M6 {3 q6 t: G7 Y$ i( T8 `
7 Z6 V+ W3 |4 M8 V' s/ T9 Z& L
// ARM 中断初始化
9 Y5 |& V+ K. T- r! }
InterruptInit();
) L3 G. z9 x: ~: V- J) S( u% {: }
+ t! ~, T, f8 m4 d2 X* O7 s
// PWM 中断初始化
. T: X- ?& U) n6 I1 L! ?9 F
PWMInterruptInit();
2 \' P/ w! U1 Q' ~
& T$ k" D, d& D
unsigned char i;
" ~8 A/ M- A' [. S
unsigned int j;
0 s/ e h* g9 c6 I9 v" @4 `
# y) _4 g( A; R0 ~$ V
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 s0 E3 J# q3 H2 ^7 o; J
UARTPuts("------------------------------------------------------------\r\n", -1);
* l8 y4 N; o0 I9 v) b# p+ L
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
; ? ?. m6 @9 W
// 产生波形
3 _5 J7 X0 c- ^6 N' x3 H
PWM1ABasic(25000,50);
3 K( Z! h! ? a5 u } f
! o# B4 k: X7 {0 m7 V3 W$ v, m' f
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 }" L7 k6 d* n5 D' I% }
UARTPuts("------------------------------------------------------------\r\n", -1);
5 m O: B. ] r5 c- _) u o F
7 H" Q- J, V6 R. A
/ y( F; v& i5 \7 h2 y# i0 o
+ R3 g7 x2 [7 F( a! g1 ^
UARTPuts("------------------------------------------------------------\r\n", -1);
9 I# |6 c* t1 |
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 O# N2 Z; ]% p
// ECAP 捕获初始化
0 N* F1 B. d$ e5 O
ECAPInit();
* J" ^$ V* y( y1 W4 @
UARTPuts("Initialize ECAP.......\r\n",-1);
" J% C; z h) P6 p: _# P2 e
for(i=0;i<5;i++)
$ C. I) o8 O6 Q1 O( h. P
{
3 ]1 Z& Q3 v" d( p
for(j=0x00FFFFFF;j>0;j--); // 延时
6 r% W f- W/ R% g
ECAPRead();
) ^+ f+ c$ n% w8 @+ n0 p. U
}
! N" w3 l# @" i/ V+ N
UARTPuts("\r\n",-1);
5 N5 {. L2 f( m1 a8 F" [. x0 c) \5 t
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! Z5 F0 m3 E2 X; T! H3 h4 i I! G/ m' t
UARTPuts("------------------------------------------------------------\r\n", -1);
5 e X8 K, D- m8 a, \
B" c. i* o6 D7 c
// 主循环
3 Y; ]+ p8 n/ M& \4 \* x N' d
for(;;)
7 ~7 f1 u+ B# V7 R$ n7 E
{
+ \5 W( t1 J2 \
; \% d; p( K4 i+ | s) U5 w% C( w
}
% u5 g% V/ L/ i4 _# w' B* L3 e$ |
}
& n3 S+ f5 F8 K+ ]3 X3 c0 Q9 I' {
( H s# E7 h; p5 j$ K: ~, V+ ?
/****************************************************************************/
* S9 n0 K4 e1 f' q: a
/* */
9 ?! C7 }% O7 S8 a3 Q' O, E7 L, x
/* PSC 初始化 */
3 V# N4 K) |% d8 j- E# `/ T) H# Q/ @
/* */
( x8 Y* m$ I) Q' w% ]7 y4 V
/****************************************************************************/
1 c3 s) \1 G) j* H% }- ^0 F
void PSCInit(void)
) p* j6 t+ B+ G: z8 \! k( _
{
2 ]- T0 N5 ~ A6 j, a) b) g
// 使能 EHRPWM 和 ECAP 模块
+ ~$ k4 M7 T5 I2 G& \ [
// 对相应外设模块的使能也可以在 BootLoader 中完成
, [/ H1 O3 P% y D0 p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. B& w4 E y" d
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" {6 P* y7 y' q8 J% k% C
}
5 E) {3 J1 J- H, ^$ j6 ]6 L
$ c' ?: {: D& E. Q ^
/****************************************************************************/
! H% e1 n y( w* N; a; N5 @
/* */
, x* L* ?8 m1 b
/* GPIO 管脚复用配置 */
+ L) ^. N( |; }2 x4 I6 C
/* */
6 |$ G A0 w% W% B" t. x( y
/****************************************************************************/
& L! \6 @" ~* B4 v' i' ?" I2 k
void GPIOBankPinMuxSet(void)
. g! V$ O( n! \6 D) m- u! k" n+ c
{
. n. \6 n+ }+ R: E; A
EHRPWM1PinMuxSetup();
% T0 d4 _. i7 R, v f
# R" f- S, ]. w' ]/ I0 l
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- @+ M8 Y% A+ C1 v0 W4 G9 w2 b
// 作为捕获功能时管脚方向为输入
' a7 H/ J: R: f: Y7 @- M
// 作为辅助脉宽调制时管脚方向为输出
; F8 b, [/ x# H( [- e
// ECAP2 / APWM2
* E& ~8 g6 I1 d# z
ECAPPinMuxSetup(2);
/ W& x2 M+ Y) i H
! |# P. K A8 p+ @' D0 ^
// ECAP2 / APWM2方向设置为输入
' Q/ G8 @: o* A$ t5 U
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 x: |" d) N6 L$ x9 Y8 H+ w
}
: j" v5 p7 ^" Z4 n7 E
1 i" V3 l: @1 P& J# S
/****************************************************************************/
: N$ q, {+ C' e5 h5 C3 z' y
/* */
* I4 {( W2 p; T
/* PWM 输出波形 */
& T, L& O( t4 T1 ^9 z, q3 _2 U
/* */
& Q9 Z/ H! t8 S# @; R5 ?: A
/****************************************************************************/
1 n z @6 L( m' A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. W6 r! l! B1 D. O) \/ f) A
{
% D5 R( s( p8 @2 w' T
// 时间基准配置
' U8 y2 \$ J& O/ c
// 时钟配置
( y/ i- D, s, O
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; `$ A: V- i w, d) Y
$ N# m( J- t! d( w
// 配置周期
: }% D, `! t- [3 t
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: f! S I1 y# t; f: d' K, n
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
/ X% |: F# T. ^2 f+ Q" U6 `
3 o' @8 t( @$ Z1 `' t/ W
// 禁用输入同步信号
$ [) l5 n r! R; E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& C6 S& A3 }! {1 @8 F0 L
! P2 o n1 o# `; r' F# |
// 禁用输出同步信号
' n1 e* v" _, c4 Q( p: l* A
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) m2 J0 Y- d" ^
8 O Z# N4 T* F
// 仿真(DEBUG)模式行为配置
4 P4 @) i# Y6 k- e1 k* Y! ^1 \' g$ z' c$ V
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" r, z( k# ?, Y, v3 `6 {
! v: k6 R" n/ ^) D
// 配置计数比较器子模块
# j: A. g9 {8 p5 j" G( b. g
// 加载比较器 A 值
, Q! V& C( q" W7 P0 [6 A
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& [% ] U. e' R9 ?8 k
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 {% N& S+ O' F
5 y3 W4 ?- y% \# j: o' j
// 加载比较器 B 值
; I/ V2 Y# q1 d8 e& a! k0 [5 l. Q( ? b
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" _, c+ K4 w8 M# W/ @6 W
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 v \& e/ q( y' L" }+ n" n; L' h
; }; ]- h; S; K1 w
// 功能限定配置(输出引脚触发方式设定)
6 N( M B9 W, j, s1 h
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
3 U8 x! G& R% \) ]+ K7 W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 P: J- a a( R- J, c+ Z K
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
- V6 f7 y/ P5 R9 X
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
r7 f% u: b/ }8 ^/ ]+ S: p: ^
1 B3 _9 ~* B( E$ f- }
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 S$ b# x( O, `9 W
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* X- @8 q0 S# A5 X) ~- C6 _% ?
: w- `$ C3 g. W* I/ b6 \
// 禁用斩波子模块
. a& N* q* T+ d0 Q5 y
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
% a; [9 s8 l/ w* ~
4 G D& e5 B7 ?: |3 f: U$ A0 w) C
// 禁用错误控制事件
1 L$ D& l0 [3 R
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: Y* n# R# {2 w4 c' N' l
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# \* |* t+ h+ X
7 m/ F. g7 |) @' |& k
// 事件触发配置
& M4 X# x3 ?4 m
// 每三次事件发生产生中断
5 q' G& h. ?: M& A* ] p3 F
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
3 C! T+ {- G! ^1 `9 q$ d
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 J& c4 c, J1 P" M+ }6 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 S: m8 B' j" m0 ?
// 使能中断
; h, c1 a6 _2 P3 y
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 J( M) T2 e2 X
6 L6 i5 k+ A* }3 ^5 Y
// 禁用高精度子模块
5 @. H1 j: D% G
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
4 V3 Y; \7 D' N8 K! W3 \# O
9 S2 z1 Z% z9 S' U; P
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* I6 {. L0 W5 z3 B0 y9 t/ O. z
}
3 M1 m) K/ P% y4 L1 J. @& X
# O5 w/ A: P# {% p2 V9 Z
void ChopperWaveform(void)
6 D! f% E; i7 W. k
{
! y$ H$ x, [7 {3 L
// 50% 占空比
( N8 s7 |& ^" A& Y/ j. W
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
: n7 g) I" [6 O; ]# G
// 4 分频
* X9 ]8 S. S# D- _ ^) v+ _! s
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ ~ V5 N8 l3 S) G( M
// 单个脉冲宽度
; V$ @, a% s( ?1 s
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- \' V- _& B% W$ ~2 G% D* T# ^
// 使能斩波子模块
8 a0 S+ K* l, i/ n
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 n1 D' B6 d2 b5 K8 w1 N# O
}
- x) C' @: q) g- _" w& S
3 s# h! x+ b# T! K- \ J0 E
/****************************************************************************/
. q5 c7 p$ E8 z- g3 D* X
/* */
# q. A# \4 ?( l6 D5 X- Y
/* PWM 中断初始化 */
# T# T9 P0 y" R5 r6 A, P* U) v0 O
/* */
- ~+ m; J% R4 e5 d( L3 h4 J
/****************************************************************************/
% }2 h8 w0 B- _8 m
void PWMInterruptInit(void)
/ i6 p9 c3 H) F W: K
{
6 x5 c, H0 n' ?, q! W6 b3 |* G
// 注册中断服务函数
0 v) d4 @. u9 W/ ]4 ^& B
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; i+ A$ O3 p6 n- J7 e' ?! o6 c
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ X I* b, W5 `7 R
5 C1 R k6 a O: d% D. r
// 映射中断
1 o/ J" T" R/ J2 U. |, L: A$ @6 p
IntChannelSet(SYS_INT_EHRPWM1, 2);
# ^) M' h4 H f1 w
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 C0 n1 B6 c" d
# X- \6 m, _1 x& z5 U) C7 v, ?
// 使能中断
) ^7 e" t+ q7 D" F! J
IntSystemEnable(SYS_INT_EHRPWM1);
/ @) r6 y8 d( ]; `3 K4 |2 E( ^
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 B7 p G5 a$ p
}
: v$ ]& Y+ K7 x. v2 r4 Q
1 p' A$ A- \3 Z
/****************************************************************************/
! m9 x) @: D8 v8 b% @
/* */
& o4 m! p5 a4 n6 U: d
/* ARM 中断初始化 */
0 ~% y, @! [+ x; R- |" P% o
/* */
$ X; n$ N/ \ S
/****************************************************************************/
" E7 P* e0 D# }6 D3 F, `3 T; I
void InterruptInit(void)
( _2 [' T! A$ B2 b0 }/ s
{
- i6 D5 K4 U8 f" V
// 初始化 ARM 中断控制器
' K4 f, j' l3 X6 u8 G9 `
IntAINTCInit();
7 L" j: a5 P. f$ T7 Y5 E
$ P+ Y9 M2 o0 j' p# v) E3 T
// 使能 IRQ(CPSR)
2 [5 X7 y4 `! L
IntMasterIRQEnable();
# }1 N$ [' k1 q8 p* f
3 d) v& S& ]8 \" S# q1 J9 D
// 使能中断(AINTC GER)
' |# i9 r8 [- G R% _
IntGlobalEnable();
! {# o7 h4 i3 k/ O6 f
2 d3 r8 Z! S/ G6 G- \; H$ u
// 使能中断(AINTC HIER)
4 S& A2 H( X8 l! A
IntIRQEnable();
! J8 F8 Q. ?7 `! K; @$ D
}
( p: P/ U* O3 O, Q) S: l# l4 \
) X4 l" F P: a7 k% H/ W4 | j
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
7 q$ C9 i* k! @# ^: H
/* */
1 r6 X' u/ S" }$ T$ R! ~$ q8 P
/* 中断服务函数 */
" E' K: W+ n" k! p, x, L; s
/* */
8 |: O" b( C8 Z( b' `$ b# r
/****************************************************************************/
H# }% g$ E. o+ `5 @* n
void PWMEventIsr(void)
- V: H" F% B' v5 w
{
7 b7 G: s* @. K7 C3 d. k, \
IntSystemStatusClear(SYS_INT_EHRPWM1);
8 ~$ v4 F: z6 s+ [7 O/ s
3 \' I0 ^5 O$ h8 Q! r
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
+ Z/ q ]0 M/ n) {- e9 i
}
& ]6 `/ T$ N9 I7 i
5 G/ Q: S6 {( C. B C2 Q* S
void PWMTZIsr(void)
6 b: m0 P% e7 y6 q
{
& j) l8 h; {0 ]$ B
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& K! h: F- l; c5 V7 l0 P8 \# N
+ |4 g: |4 a& g+ }& d( `
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 _+ \6 a* ~' v9 P+ t9 \
}
' W7 J% k* D: _- Y' _
9 ]2 ]: D. A( x3 f
/****************************************************************************/
& s& Q& Y0 s7 R( W+ H, Z8 g
/* */
% M3 x& e8 t3 Y: M. ~% u
/* 初始化捕获模块 */
3 c: o) ]! c0 S8 s. Q
/* */
* a8 m1 @% u! F/ k! o8 _
/****************************************************************************/
/ m; q7 _1 a, ^4 ~
void ECAPInit(void)
3 T- q1 [7 `# }9 B9 @$ Y
{
6 z! h* i$ K- [( t
/*-----设置 ECCTL1-----*/
`' {* n* O* \. _& b) L; X: P
// 使能CAP寄存器装载
5 D. p( U3 q9 @* M0 I# Z- j( z
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# o/ \) c# w, i2 L" a
// 设置预分频值.
$ \, q+ d8 w D. `
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# |* X8 Y1 E4 T0 s
// 上升沿触发捕获事件
) Z7 |; z4 A, L1 E
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
2 F# D5 `4 ?5 n t: V
// 输入捕获后重新装载计数器值.
+ G1 ^2 a% Z! X) ^ z1 u: L, u
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
* X# v' \' H0 s" M% w* J, F7 n9 i
# W9 d: m) ?$ w0 e' }
/*-----设置 ECCTL2-----*/
' a' A$ V/ e' J$ Y8 E5 Z
// 连续模式
# ?( R% c( O, G' _, _9 I
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 \, e3 _) K- u; h
// ECAP计数器TSCTR持续计数
2 {9 w% a; y; K9 P
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: |0 R) l! }1 o5 s
// 禁用同步输出和同步输入
2 E6 V' F6 o8 o
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
2 _5 P9 a* B% k5 D$ d
// 配置 ECAP 2 为 CAPTURE 模式
( \6 m# R; G5 ^; |6 m
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
: X, ], [: a* b: f
% h' ^- I4 @9 R
// 使能中断
% d# _9 W/ {$ p
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
1 ~" F" N/ J" t# b
}
' @+ ~8 n- m3 c! H; k# e
# Q7 G1 Q* t( \0 d0 L
/****************************************************************************/
( _. L/ \8 ^* ~+ ?' ?2 G
/* */
+ Y3 ^' E, l r4 Q3 P/ f
/* 取得捕获结果 */
1 \. b& }" X6 X/ \1 R' f
/* */
( g4 { [9 L* e1 X
/****************************************************************************/
" U, f9 m9 R) h* ~3 t U2 s
unsigned int ECAPRead(void)
* L! B; S% v) |3 t: Q. ]
{
( [6 R* p4 C4 D: ]) _/ \" y* M4 V
unsigned int capvalue;
* z& s5 U6 P4 g/ ?0 v
unsigned long frequency;
! q8 | ?! D+ N' v" i% [! G# b: c
$ h$ C% @9 z/ d8 A a" u! N
// Event1 中断标志
* T ^9 N7 @$ ?
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 C' E% O2 ^9 a/ e
{
5 o2 }! X& y" E: S+ O4 L
// 取得捕获计数
3 a: B. p; ?1 j
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( V$ r d# J9 I( G' n) e- C' M
capvalue = ECAPResult.cap1;
* ~% {: u2 }6 t x
$ y! s" U+ K, j2 r7 ^
// CAPTRUE 模块 228M 时钟主频
, n- b- Q0 i, o9 ^
frequency = 228000000/capvalue;
) H3 c+ F3 x* W4 R& o5 U. E1 N3 H+ c& L
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; V4 E. R0 r, b9 ^
- x0 R0 g# x( M2 a( `# t; H# N
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ G; r/ D% x: L/ _/ f
// IntEventClear(SYS_INT_ECAP2);
8 H8 Q _0 s9 F) s: Q$ e
}
0 S& f! h8 s1 u8 @4 s( |8 X) o
return frequency;
4 n; b# l# G) q$ m5 p
}
+ v6 Q- [/ K: v4 w+ `+ ^& P* S' T9 U
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
. P2 t6 `+ u+ b+ C+ T
[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