嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- f# E' b0 y/ p; a0 o
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
: U, _5 s+ Z T \5 K. `, d
/* */
L6 C( @8 |+ d$ V' @
/* 宏定义 */
* i7 n% w+ G. o/ D2 X# V! d
/* */
2 l3 b+ K# f! N9 A) s) u; f" F
/****************************************************************************/
1 w/ b5 w. W$ i4 I- k# ~4 v
// 软件断点
1 |1 K# G2 \& }1 s% i% Z
#define SW_BREAKPOINT asm(" SWBP 0 ");
" q" j* L$ ~! l4 d: B4 v, r
! }3 ]. d) @7 d- f
// 时钟分频
f) ?/ M" c; ^2 F; o: ]. N
#define CLOCK_DIV_VAL 228
0 I9 P4 B; ?! |% F
7 C: v3 A& S. m5 o9 s7 a
/****************************************************************************/
6 J1 j4 S' H' e8 Y Z. ?
/* */
- `% U% f, K0 a: J1 b6 `3 K9 Y
/* 全局变量 */
2 O% o4 U4 f# k" {0 y! S5 g
/* */
! Z! c9 f- t" U. |5 T" M
/****************************************************************************/
. a6 A1 V- u/ z
ECAPCONTEXT ECAPResult;
# l* ]: O3 c: l `# K: ?; `- \
9 d0 d. o/ Z% i; t% t1 f: \
/****************************************************************************/
% a& }8 F, H: ^$ u! h9 R& {
/* */
/ j* |" B2 p; I, c: a
/* 函数声明 */
* ?- l" z5 ?- H2 j
/* */
* k6 r4 X2 X0 \+ U) J
/****************************************************************************/
/ f. W% t2 f( a: {
// 外设使能配置
' i7 Z! c, M; v2 s
void PSCInit(void);
" g$ U4 Q! [: [! C; g
4 k, f5 ^- S L) g" s0 O4 V
// GPIO 管脚复用配置
) n: Z h5 j4 \1 B
void GPIOBankPinMuxSet();
' g5 `, U; K& `$ P' N, w5 `
2 \) C6 ]+ e# r. x# ~
// 产生波形
0 M! H8 L d/ s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 _: @! E1 e! N1 V
void ChopperWaveform(void);
1 f' h( x5 F4 z* B
3 [" w: G4 R) `5 d" w" Y: E
// ECAP初始化和读函数
5 J6 T. w2 [5 P* E. S/ j
void ECAPInit(void);
+ U- x- I( G, o B
unsigned int ECAPRead(void);
2 r1 Q, Q R/ y' p% b1 j
- U/ X# Y$ w! T# `/ ?1 A( g
//ARM 中断初始化
* q1 n& D Y% H
void InterruptInit(void);
p) e2 `+ ~/ Z
3 l8 k0 l' ]% \$ i% Y# `
// PWM 中断初始化
, ^* \' [4 Z: G+ K6 s/ Y5 b
void PWMInterruptInit(void);
/ D* ~' s; a' z1 f3 T4 i
// 中断服务函数
% f! g$ n; @: L9 a: p
// PWM 事件
. c+ ~3 Q# A, R, S
void PWMEventIsr(void);
* i+ _/ z* v: Q) C
// PWM 错误控制事件
3 S4 q+ y& e) I1 S
void PWMTZIsr(void);
# S3 j; p: R$ T q. |
( w8 ?6 [5 _% }" T7 G
/****************************************************************************/
: V1 W5 Y; N2 ?, A. \# T) l" \
/* */
( _$ O- O; M# Z: \7 {
/* 主函数 */
( e, c# A- H6 u* I3 P
/* */
! ^, K; b! D6 s+ z) ^2 q
/****************************************************************************/
4 U3 ?' ]2 o4 ?7 n. L
int main(void)
" v7 q, Y6 [# N, D" P0 ^4 l
{
! s' I" |6 J; m$ s2 |
// 外设使能配置
$ T8 h2 [/ ]* W4 @/ e+ f
PSCInit();
" P' d& C. V1 I+ s
! R2 d+ g9 ?& Y; b8 ]8 |
// 初始化串口终端 使用串口2
4 {) _ X3 I) |' x3 ?
UARTStdioInit();
/ M' D$ w9 {8 c* m4 |- v
# U' v, C7 @! H% ]' Y. H
// GPIO 管脚复用配置
, a% D2 n: k$ P7 @) U
GPIOBankPinMuxSet();
d, Q# g) l& D& m% X1 v, w
) V; P$ p3 n: @9 O: K
// ARM 中断初始化
" j7 n" V8 M, k' H) f9 Z: O7 d @7 L
InterruptInit();
+ K5 c2 f$ Q8 w* U' l6 L
6 p" a2 {% w4 ? N# B$ v; e6 C
// PWM 中断初始化
) V# v" X3 \0 R3 d |9 m- d# p
PWMInterruptInit();
' o2 q! K( T: [; B; ?
# Q, v- Q! w3 n0 i( Z
unsigned char i;
7 a! p) G! f; E; r$ k
unsigned int j;
8 _; T! k6 _. d# K% b
$ x2 u/ _7 p& v( C
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
- I2 h* z* |' E3 x
UARTPuts("------------------------------------------------------------\r\n", -1);
0 u" c* p, G& h" a
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
3 z Q3 s# B. W2 y, O
// 产生波形
S( Y7 d5 G e
PWM1ABasic(25000,50);
; _0 Y# I/ R' O8 x/ `8 J( i
/ N; K' U/ F3 _& t; Y* D# N
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
1 O9 r' v( l$ |$ E2 \. ^
UARTPuts("------------------------------------------------------------\r\n", -1);
$ a! |" k1 K) }) ^9 G! p3 X
3 N2 L! M5 b7 a9 Y- `/ M
) R) Y2 }: r/ _1 V+ d0 X
: V$ L. ^* s3 Z+ Y, C
UARTPuts("------------------------------------------------------------\r\n", -1);
`# x- p$ K7 I
UARTPuts(" C6748 ECAP Test\r\n", -1);
0 w- u7 I0 V; `+ \5 @; a
// ECAP 捕获初始化
* t5 a! k7 I" B8 U# Q6 F% i& ?
ECAPInit();
! }2 ]4 g7 c( v; x9 ?
UARTPuts("Initialize ECAP.......\r\n",-1);
* o0 V+ t9 j2 Z2 [& J$ o3 D
for(i=0;i<5;i++)
; h! N2 I% Z- W- g4 H
{
; t) k: c$ B, ^+ m
for(j=0x00FFFFFF;j>0;j--); // 延时
: s5 H, U C/ I0 d, Q
ECAPRead();
1 ~, W; o& d- N# U3 j
}
# Y: w4 J/ x/ D5 f A+ y# M
UARTPuts("\r\n",-1);
2 b" x' ~; r% A* x. z
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; x1 h; Q! ~9 z
UARTPuts("------------------------------------------------------------\r\n", -1);
H5 n/ C8 `! X* P: y
7 M. V5 B. p% h, }1 Q3 B
// 主循环
+ |+ X* m$ I% P1 J: V. \0 O$ O" W
for(;;)
( W8 x7 }8 N6 ?
{
; z' c0 j: E; O7 r
- y) }( f5 O) G- c8 E. ?
}
& {+ p$ S2 n+ }: P2 J( p
}
: u" \6 E% J5 e, ~% O5 T
' W1 ~! L$ n8 ^) Q, V: I
/****************************************************************************/
, F( c) q! V8 x# X% `
/* */
3 q6 h; K7 T; z1 W$ V8 H
/* PSC 初始化 */
! p1 p4 s- V! C
/* */
& g$ H! B# _' b3 i
/****************************************************************************/
; B* q- }* z; m2 T7 A% ]
void PSCInit(void)
6 w. I+ Y; D: Q
{
+ s4 y& G' C9 r" I: v4 L
// 使能 EHRPWM 和 ECAP 模块
3 d) ?" F/ |4 f3 ]
// 对相应外设模块的使能也可以在 BootLoader 中完成
: Z( Z4 B% Q' U" I% ?, ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( X8 d6 N. u2 w( U& X8 ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, O# y* l' T/ H5 P9 [( L/ V
}
4 F& E$ {) L9 X
* ]# T* r& \( B+ f" j7 f& J, b2 y
/****************************************************************************/
/ k/ z% K: n& Y4 q: ]2 C
/* */
& G" U4 P- M' x* m' Q7 Z
/* GPIO 管脚复用配置 */
& y4 r$ \& C% _% i2 z
/* */
0 {+ `3 }/ Z6 N6 Y0 O$ ^/ \
/****************************************************************************/
7 u& h* S8 _3 ^8 [/ F
void GPIOBankPinMuxSet(void)
; G1 x6 F9 E; v/ R. H0 q$ Q; j
{
( k$ `! n& ?, A6 Z# T
EHRPWM1PinMuxSetup();
3 F3 \. |, Q" j5 m( y- q: B/ i
* x7 M1 N. C; D- `) _7 s
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& ?- K* M, ~0 e5 Y
// 作为捕获功能时管脚方向为输入
# A/ B$ U# R' l; ]' z0 y) T. {
// 作为辅助脉宽调制时管脚方向为输出
, i5 {- h! q5 l9 a3 {
// ECAP2 / APWM2
7 x- r' O9 ~6 d7 n2 p( R* q
ECAPPinMuxSetup(2);
' H6 O" O" F- I/ E0 ~
5 |1 A5 ?7 w' |) C
// ECAP2 / APWM2方向设置为输入
0 u/ s% f7 v; m$ ^* e6 q' s
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
5 F& _, Z; m9 I; X
}
0 Q6 j7 n3 f$ c) y, Y! ?2 e
5 Z% y& f4 @/ P9 D' _
/****************************************************************************/
+ x# u# |. S# ?! ~/ K
/* */
, e4 G. x5 l, X% |' f" R6 h8 [
/* PWM 输出波形 */
, \ c8 R, {& }* W2 q0 [
/* */
. N, b2 L3 }/ Z$ r; X+ O6 ?
/****************************************************************************/
( @- Y5 T4 G- S5 b/ h5 R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( i' _- Z6 ]' x- q/ x
{
& X3 ^+ Y& y/ L! m3 A1 l" G* d
// 时间基准配置
# p9 C- I# {! `/ M! h/ p# K
// 时钟配置
' {7 r# b9 t/ M# |1 q6 ^
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 P1 l+ U4 W+ o
3 f1 n' x% j5 W9 ^" I- o
// 配置周期
: d+ H+ |+ t, o- B
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
& U- S/ n; P) s/ }; ^
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 u5 }/ O8 Z4 s6 e7 o
: C! |0 d6 K8 J+ J- K
// 禁用输入同步信号
+ }5 y) H1 }) c6 K# p: W
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 G% W0 ~7 A% N) q% R$ K& ]
( }5 u! g: x1 ^ {8 u( S' y6 B' D
// 禁用输出同步信号
9 \" U& d1 l, b% q" I3 P" @
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% k" C4 v9 d. w- |' K; o
7 ~" P- q/ `# C7 ]$ e+ A5 M
// 仿真(DEBUG)模式行为配置
8 t( j# C: b3 @# o2 C/ Q
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 w- L1 R- \ K$ l
% A: {, d) r8 m9 _, h8 B9 o' A3 `* b
// 配置计数比较器子模块
$ g" u: X7 t8 H: |" j% P
// 加载比较器 A 值
' p9 ~7 d& r8 ?- c, Y' U$ U* p. \
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: H' Z& q3 w* `/ d, p# a
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! {( m- [4 P {3 s9 u5 n) {: A
& S# q, I' a+ v7 l3 m" _% Z
// 加载比较器 B 值
) _+ f q4 n( n, X
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ M4 t+ e) H s5 f
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 }( }5 {: k* k. R& O* e% k+ m; m
" I) }! @2 |7 N$ o
// 功能限定配置(输出引脚触发方式设定)
' l% E6 i- Z: U" o
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: u' h7 \4 P. N4 @# X- D
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
% R/ @7 `* x {( H& V+ j
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 {, K8 K$ b' _2 A% g7 u4 u2 ^, q" H$ }
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 k, h8 \( ?8 c
, P. F% [8 e5 l' }, o& e: S
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 U# X) A( h% F' q
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 l9 T" q+ L6 ~5 K# j! n% ]
2 q+ D3 T! S. N6 q! _
// 禁用斩波子模块
# k) v* U) S) a. i8 u! |: @. C# k7 J( n
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; l4 f `( O/ d5 X- c; Y. H
+ ` n/ U/ q O9 ~! b0 w# i
// 禁用错误控制事件
( X1 D1 M# z6 Q! P+ a# Y: G
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- ]$ a' R. M- z6 m+ @, e
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- i1 j7 q8 A! F/ C
6 B$ p6 F% a2 y2 o( t2 A
// 事件触发配置
$ j8 y7 I% g4 s Y
// 每三次事件发生产生中断
, I# N& ?2 G% f& f' N
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# _4 N( b6 R- v( ~6 d& }0 `5 e
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* {( M% K8 ]' \
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 U h* l w9 F+ x K/ W3 L, @1 n
// 使能中断
8 p0 {( ]- F( s: l
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) A! G% J( p" D/ U8 ^( i* N; i5 C' s
) H* u( z+ f/ A/ E: ~( s
// 禁用高精度子模块
4 U7 f9 B: U9 d/ q
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 }: ~3 m6 w1 }8 |+ n- s+ t
. ?% D( I+ R1 t+ A( ]# g' W
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; u( s; y1 ~+ [ }! U
}
) x8 |8 P4 h0 e5 ]) b! ~- h
, U" _& I5 h. c
void ChopperWaveform(void)
, H% d; q- U4 C/ T+ s) J
{
6 [& {$ }5 i5 L0 s
// 50% 占空比
4 @+ j' g8 |* D- l
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 W6 d" D( p5 _1 x( X3 H
// 4 分频
3 p( q' L* v- |" D8 E
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 Z- B1 Q1 N! ]; A2 P3 U4 |* {, U
// 单个脉冲宽度
9 ~, R4 S2 ~/ s2 x3 _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 ]5 P1 v9 [/ X
// 使能斩波子模块
' Z8 I7 ]) a" Q' X! V* |
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 I6 D% u: e b% V
}
4 v1 ~3 }5 I4 e; [; u! ?4 m0 A
$ B' ^( {/ s1 D, {* Y$ J2 \
/****************************************************************************/
1 s8 o3 g, w1 `* M
/* */
; @8 |& t( T7 ~1 N
/* PWM 中断初始化 */
3 E; f) W) [& n2 K |0 w
/* */
; A; A4 |( V V& J2 Y+ a
/****************************************************************************/
0 h: c5 ], c, f
void PWMInterruptInit(void)
, A$ E8 ]# e- @, n( \4 F
{
, A! ~# H" u4 [) F* o
// 注册中断服务函数
. y% r! x7 E3 z. R9 N* R# D
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* G5 \8 m" }- H" m, |
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
, D; J4 U* C5 P
- r$ m9 j& T8 z1 f4 L% R" R! G1 t% W
// 映射中断
9 b9 ]5 M2 v7 U# i- H7 V
IntChannelSet(SYS_INT_EHRPWM1, 2);
7 T* Y. \2 f5 }7 ?2 h* U) F! v# q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- L& u5 Y( \' y% }5 p
1 J0 c0 Z- ^' U
// 使能中断
6 Y: s' C# ~4 K/ u2 x
IntSystemEnable(SYS_INT_EHRPWM1);
# S, G2 v" T& {3 S- M
IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 a2 f( L) M7 p, c6 f) c
}
z9 z0 d! M V- A1 z
! Q2 F7 g" V0 L5 k1 g! Y
/****************************************************************************/
2 {( e. V0 Q! |0 ?6 D1 a, `7 y
/* */
# u0 ~3 I6 c" z! K+ p- W
/* ARM 中断初始化 */
1 k$ k% t" y0 O) u
/* */
+ |5 C; R d0 E
/****************************************************************************/
" Q% `+ J& s- y* J4 E/ J* `" J
void InterruptInit(void)
( d l' n9 t4 A& Z! I
{
0 W1 Z+ k, i. ~. n/ X' d9 V' K
// 初始化 ARM 中断控制器
+ I( g3 }! u! y, B+ \
IntAINTCInit();
# x' C% H- Y" y# X+ U
) W+ K' F* @9 K/ h2 P: T
// 使能 IRQ(CPSR)
; y9 O( a( h) _6 a
IntMasterIRQEnable();
/ }. I0 ^/ ~0 D. g
$ b8 O; r3 u+ i+ d" A# I
// 使能中断(AINTC GER)
! V3 Y& @1 H1 H5 t5 b
IntGlobalEnable();
7 t6 ?- Y- U. M+ x
& a1 m1 `1 a8 C/ J
// 使能中断(AINTC HIER)
; c7 y' U7 t6 ~' d/ W! n: j* l
IntIRQEnable();
9 D0 U8 K% N2 [- u) s
}
0 u- f& g$ u& }1 b3 |
6 l5 ^, P* ^6 O. K- m H3 Y' v
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
7 b+ Q+ m% ~/ E: x
/* */
6 f1 Y" a, h' ?, L, A
/* 中断服务函数 */
) V6 J x ]6 p6 j- p A
/* */
( G6 P5 l' h* p$ d
/****************************************************************************/
7 ]0 z6 l, p2 A; o- k0 ~* b2 s
void PWMEventIsr(void)
& Y- [6 ~# G1 ?( h2 i
{
" m# l3 _1 r3 \; I3 i( q
IntSystemStatusClear(SYS_INT_EHRPWM1);
: Z' m/ |, q; [
! L) W6 y& h+ e) J8 d
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& k' v4 C) s1 B! ]
}
. k$ s& C8 U$ ~5 O9 }0 P! R5 k( @) y
' m0 E& d6 n6 v; p
void PWMTZIsr(void)
, _& Z5 B d. }1 I1 j% H. g
{
- R4 X' b8 e* \
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
- h. B% L* i% I
9 T# F- j/ Q* P. I& {" {4 J3 ^
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
3 @, ^1 R2 D" j7 m v# a
}
; Y/ ?4 q# D0 }3 A( S& o3 o
' B7 n* R* Q" _1 e1 E# D
/****************************************************************************/
4 K8 M2 s( M; X/ `& v9 m
/* */
) s2 q9 f6 k- X1 ]& t9 P
/* 初始化捕获模块 */
$ _5 V" q% a$ y1 }' {; a
/* */
) b+ B: ]: G3 y3 \5 B" w
/****************************************************************************/
/ |; J# I5 o4 a
void ECAPInit(void)
5 H: T/ w) u1 j9 F
{
1 o% D( v6 t- j* t) J+ y
/*-----设置 ECCTL1-----*/
" E( H: a, e( B# a
// 使能CAP寄存器装载
, Q: k& r& x! |4 U; o
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; |0 G' Y- V+ q: v
// 设置预分频值.
& B% |0 O& k. Z1 Q* D0 Y) d: p; m
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
' ~2 P' S( g3 R' \$ f
// 上升沿触发捕获事件
& m: O5 }# h0 w3 B
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
7 K, H: O7 }5 X0 P; N5 i
// 输入捕获后重新装载计数器值.
6 z' e3 V$ y) ?7 H
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
$ g1 K+ a) y% V: W4 Q
" W* ~! t& O$ e) v
/*-----设置 ECCTL2-----*/
) E6 _" \$ U; S* I$ k
// 连续模式
- D# V, b' F1 G6 v3 w5 b
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
) b: e, D8 ?9 ^) f$ e
// ECAP计数器TSCTR持续计数
$ j4 ?2 B/ T {) {2 j
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 b T# X# q6 M/ \
// 禁用同步输出和同步输入
1 R) ]" W) l+ R# d( f% H
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
/ p1 J8 n( m! I8 P$ Z' @- K6 A
// 配置 ECAP 2 为 CAPTURE 模式
7 X+ N# d8 K' C; v" ]* ?4 c; {
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
8 X9 A \" d( A! O
: D0 u) f& | f* I& Y4 W5 p0 {0 Z
// 使能中断
0 y( F% B; u; K. D2 f
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ d' v3 M, W, F% b: S
}
/ r- s( W( m# O2 E' t
" i! j: a! R9 e; z' k/ E
/****************************************************************************/
. ~3 R) V: F0 X" L, j
/* */
/ ]. X( K* G% D* c8 J
/* 取得捕获结果 */
" Q8 E5 k/ ^, _
/* */
2 F5 M5 `( m$ T# Q% b; F
/****************************************************************************/
& v, z4 [# O4 s2 J1 A
unsigned int ECAPRead(void)
6 d& a' q6 V) ^( b6 e3 M# W
{
* \# y5 B4 h" c* @, e8 u" j
unsigned int capvalue;
+ R- g7 a4 } F7 a9 S+ j# x
unsigned long frequency;
0 {9 @; T% w: a- U; x' M" I1 h
2 A& Y' e0 e7 [, ^& {6 e. w5 o
// Event1 中断标志
& C4 T& {: a! l
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
7 `$ [/ Q# G. X, [1 T9 f7 B
{
) k7 N& ?4 a7 O+ S# k! f" |/ m
// 取得捕获计数
# ~6 m( y3 n9 `
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 l& I/ [2 f0 c4 G1 N
capvalue = ECAPResult.cap1;
6 C# b6 o, e3 v8 [- ^
0 v0 j6 w) n0 w, S$ M& A; \& c
// CAPTRUE 模块 228M 时钟主频
: b& n# n+ e* K {3 M3 P
frequency = 228000000/capvalue;
' ?% I' V& F0 v5 \8 Z6 M2 \9 L
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. n. r7 I/ }3 i. Z% l
7 A; Z, u, k! d1 \( f O
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
6 S$ s) @# F$ |7 G- J4 B
// IntEventClear(SYS_INT_ECAP2);
0 U5 z# Y5 k9 O4 }7 k
}
2 ?/ T) I: {1 h: q
return frequency;
9 o' `, [' G$ A8 \8 k1 R
}
. T6 S* I8 h9 Q+ ?5 m* T M9 A3 o
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
/ [6 H2 C; ^8 X8 X9 Q; [+ 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