嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
) T3 T3 i) [; U' o8 h
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
" l9 C8 X: Q7 Z
/* */
$ Q/ L2 ?2 \. G0 v0 s$ U
/* 宏定义 */
! U! W! ?, L5 q& F. S3 u
/* */
. ?7 X0 M, W4 F8 g7 n2 l
/****************************************************************************/
! X4 y S8 {* E+ R, K3 H
// 软件断点
3 O Z; ?' T. P9 ^
#define SW_BREAKPOINT asm(" SWBP 0 ");
: }6 U9 k: w2 g, i; I9 m
7 @) |' S5 H5 s; Y
// 时钟分频
3 x L6 ]* c5 B+ P& |0 Y8 x
#define CLOCK_DIV_VAL 228
% m; m: T ~9 M+ Y; X; c$ j0 ?
. h$ e9 H9 ~$ A/ S, t$ s
/****************************************************************************/
( ]) T8 \8 X8 ~1 l4 ^$ }
/* */
% `, I0 K1 G* I5 g7 t
/* 全局变量 */
5 M! [3 z* p0 U* q! d
/* */
' T0 t2 Z' p" c6 r4 Z3 e! ^
/****************************************************************************/
1 @* V& j4 n; S; T4 }6 x) [
ECAPCONTEXT ECAPResult;
' l- [6 ?# ~% ?0 K
! s# g/ k; z6 I8 _# L; J; m
/****************************************************************************/
. H+ F1 k& ]$ T9 ?! s, _/ z+ o J
/* */
0 A* c5 x' d7 X2 r* b m1 z5 i
/* 函数声明 */
6 R5 i$ ^8 |; I! `" p: N! {
/* */
# L8 \ S: L2 g- U/ m" ?
/****************************************************************************/
9 Y. R0 G1 V9 S9 ~1 g
// 外设使能配置
/ G; P" [* g% T* a2 p" l0 C
void PSCInit(void);
# i9 l V- M) Q# z
2 c: A4 E6 j0 A. u; C
// GPIO 管脚复用配置
8 | Q0 e. B4 f: j7 R$ K0 H5 L
void GPIOBankPinMuxSet();
3 Z% s: w- K9 y
) X! Z! Y0 w+ [- ^( L, H9 u
// 产生波形
! g/ M* F* o9 [) y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 W- ^0 `: k: ? R7 h* V
void ChopperWaveform(void);
# s# [0 f+ `" v4 F* K
b# H( S! J& s1 |
// ECAP初始化和读函数
2 w' T$ R& I2 \+ b. Q
void ECAPInit(void);
; i% @ s; y5 q5 C8 v
unsigned int ECAPRead(void);
# F7 S, T' R6 f3 |/ f1 `8 x
, l8 _6 I0 s! g& _
//ARM 中断初始化
4 J* K, t9 c# G( S- `
void InterruptInit(void);
. W% n: t5 F, K% |
( V4 P/ b p2 }8 e/ `0 U" X% ^9 A
// PWM 中断初始化
1 r5 V' L% N% G. `
void PWMInterruptInit(void);
6 ]( L) a' _. j+ `2 Z
// 中断服务函数
$ U6 E$ j1 i7 ~' B5 V
// PWM 事件
/ ~2 {8 q! m* m) ]7 R' U6 m3 R
void PWMEventIsr(void);
. S$ n$ f7 C: b% t8 g. z1 a
// PWM 错误控制事件
/ @ s1 C a" Q; L/ E5 M1 L
void PWMTZIsr(void);
( E' U& O( |" M; I" j
) h/ o( S. k5 T) y8 Z0 Z) n( F0 n8 K
/****************************************************************************/
1 R5 @+ p# A! I, y% o
/* */
* ?) w# O/ ?% }! [3 J/ I( W
/* 主函数 */
8 S1 k5 R% D, a9 m8 ^# E
/* */
0 S' n7 x$ S5 {
/****************************************************************************/
7 y0 g. ^1 Z K
int main(void)
" j, H6 Y0 F ]. |# o6 Y; ^- v( H7 U
{
/ ?; g: b1 Q/ c8 x
// 外设使能配置
' `) T# K/ D/ b K1 X/ k
PSCInit();
0 h5 K" H. s" Y0 I4 G* O
4 W) Z$ m, X# X8 j
// 初始化串口终端 使用串口2
/ b/ b& R- L, W4 J) `8 H
UARTStdioInit();
5 H& S) ]: g* R. \3 A
0 G; Y+ ]7 x+ Y! K
// GPIO 管脚复用配置
! Y# I3 N3 x+ z
GPIOBankPinMuxSet();
m, C# p' Q9 w/ `
6 T) M' @% ~' A
// ARM 中断初始化
/ z/ ?. W4 C2 } }; r6 J
InterruptInit();
* ~8 `8 I+ C1 i5 {% r4 Z- O3 Q& [
7 _ r! R# D8 K/ E( Y P
// PWM 中断初始化
* X/ v7 j6 Y9 j1 X) a- |2 s
PWMInterruptInit();
( v4 p. p/ Q P# B- ^$ o3 \' Z; F
! e; g& i4 q1 z- |; f$ i2 ]
unsigned char i;
8 U# V1 y% H9 a4 M
unsigned int j;
4 V" U/ |+ p: y
- {# g3 P5 |; |0 u
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" ~/ Z- \2 f( z" E* n& ^' @
UARTPuts("------------------------------------------------------------\r\n", -1);
1 L' A% C! J' J3 c
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! X" v3 F. t- y' c W. o: f
// 产生波形
. S7 k3 x3 h+ [" v
PWM1ABasic(25000,50);
( l- j8 |1 L+ {2 u$ [" M
8 l" ` j* D& c% r4 w, [: [
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
8 N% _( w6 |! Z
UARTPuts("------------------------------------------------------------\r\n", -1);
# e' n5 @- F+ l3 O; c2 F! f
5 Q* K0 ]$ e6 y5 s0 y7 m# N3 r7 h" S1 k
' [5 y- m. l* @2 E* P
: X2 h L- _) n) n
UARTPuts("------------------------------------------------------------\r\n", -1);
" ?( Q5 b' O, T {3 S% P5 @/ }
UARTPuts(" C6748 ECAP Test\r\n", -1);
: Y8 ~9 @: g) d0 M) h9 A" J
// ECAP 捕获初始化
# v0 P( N' l8 e- K
ECAPInit();
0 H, A6 _6 G+ ~6 |
UARTPuts("Initialize ECAP.......\r\n",-1);
) H+ | E: b1 v$ X( c& `* @) @
for(i=0;i<5;i++)
: _/ e3 ]1 X2 k1 {/ p% j
{
+ t* y0 K [0 K: e% C
for(j=0x00FFFFFF;j>0;j--); // 延时
4 I0 K3 k- {, J- Q9 H, P- H
ECAPRead();
" W) ]7 O" @- v& a1 U7 f
}
0 J$ \2 P" _ x
UARTPuts("\r\n",-1);
. i' F& v5 f# C, B/ n. Y
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; m2 }( e0 y) H+ s+ j0 Z/ C; u7 v
UARTPuts("------------------------------------------------------------\r\n", -1);
]: n1 T+ O5 ^: W+ J I
) @, g6 L3 K" `( Z9 T
// 主循环
: P2 }3 D* ?: c3 J9 Q# ]
for(;;)
. p" l9 K }1 Y B. X3 r8 Q
{
/ c' o8 ^! ?/ J" H; s6 t
# n/ ?* B* N/ D! u; j
}
* I9 i8 ]. g$ ?% U$ p# N7 E
}
$ C) E; b- i0 t x7 k" y7 B
4 H3 T- t( @- {2 I, R7 U$ W( c
/****************************************************************************/
: I2 [8 [2 U" w1 p
/* */
. S3 X2 H% C5 l& ^" n+ w$ e O7 C+ m
/* PSC 初始化 */
3 d5 n" E6 P. g3 q0 w* N: E. {
/* */
! k. u9 k* O8 P- w
/****************************************************************************/
4 I7 c) y! R* Z6 m8 [
void PSCInit(void)
2 H, O0 v+ t% L6 n
{
e9 \8 Q) E" H! |7 O* y3 m
// 使能 EHRPWM 和 ECAP 模块
+ }6 w+ \8 r% f& Y
// 对相应外设模块的使能也可以在 BootLoader 中完成
9 N, ?( }& J- V! Q- b2 m2 x8 t- O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% H$ g" F% ^! n! l! L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% \2 o" H4 G& ^2 U/ ?5 E! } f
}
7 h1 `3 Q- I1 b3 e4 [7 W
0 R) g) B2 ]2 { d
/****************************************************************************/
1 O* g' Q1 U% v. a1 e2 R, {, I4 M
/* */
) a# v4 @" l' {- _; t' L* C @
/* GPIO 管脚复用配置 */
! z3 P i- J0 m8 J1 Q5 y( @
/* */
9 E4 T( _+ e% O$ e% T1 y) {
/****************************************************************************/
& r) V! T* ?. o. r' q( `
void GPIOBankPinMuxSet(void)
$ I- y" Q; J) d* @( x8 n
{
* Y, Q8 v, ]' ]9 E" ]9 N9 u
EHRPWM1PinMuxSetup();
* P i9 Q2 t. \5 X& n2 W: V4 H
" { Z8 w' z! |
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
; K0 ], }& r$ p8 G* V! O
// 作为捕获功能时管脚方向为输入
6 W) G/ K7 ^+ O; D% ^+ I* O
// 作为辅助脉宽调制时管脚方向为输出
7 }! u4 U' l& ?" K; t8 O
// ECAP2 / APWM2
# _6 l I) C9 Q2 e# S
ECAPPinMuxSetup(2);
5 _; b8 f- z( }: {+ r
! W- `4 q( U! @8 T J2 s
// ECAP2 / APWM2方向设置为输入
; D# b" _/ o4 g9 s, w* @+ r1 ]
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
5 \- h+ w' E* j+ |
}
$ J7 V2 Z- {! p3 R" H
# E v: X* T6 z l
/****************************************************************************/
# S: f3 B4 H( q( z( c/ D
/* */
- L9 d) _! f* v3 F$ p( Q8 j2 P7 @
/* PWM 输出波形 */
6 _9 a; { q* [; L! G" N
/* */
9 S6 _' n' j" W$ |2 l
/****************************************************************************/
4 d/ _; k2 ^4 ~1 ]/ I! @5 s4 _) C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ G1 [, \( k( ~6 J
{
: G' Q6 e5 @9 H$ e. n
// 时间基准配置
/ f7 c4 H% R/ S" t' L& [% x9 h% Q
// 时钟配置
% |7 B i6 o9 _, U$ P8 s/ `
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; \# S0 K5 v: o% J0 n
8 T' P4 L3 q1 U6 H9 G* }
// 配置周期
/ ?. x- x' ]6 r7 i0 e
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 k% J2 W* I! b) R
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) D" v3 m$ L6 B3 G& `
2 l) z. F _) g8 k
// 禁用输入同步信号
/ I N0 R. V! b- g; l+ t# P, j; i
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 ^5 S! J, ]* c4 x
, R# D. O% v f2 b# J, M
// 禁用输出同步信号
7 B, h4 a+ l9 x5 r4 J& p
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
; K$ P1 I- K Q
" I; s. L# L4 Q6 M
// 仿真(DEBUG)模式行为配置
, Y' e( x8 q- \* D& F* [0 k: O
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
7 `. ?. b! V) T( S- V: T# J
) K! T/ i! x" S' V- R, n! B
// 配置计数比较器子模块
0 B! p' Q+ e( ~: _
// 加载比较器 A 值
" _, i; _* U/ A6 Z" `$ a3 ^
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( w5 m1 ?9 J& G0 y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! b& Q; l/ F9 Z8 ]0 v) p
% @* v' r f M8 L6 J+ g& w) b
// 加载比较器 B 值
) ]6 h. k$ j8 ~7 u; b( S
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
. ]# p3 k: H9 ?' N
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' K9 O& u- }; F% V
$ M/ X: `3 k: x1 w. z& ~
// 功能限定配置(输出引脚触发方式设定)
2 o" e! u+ y) q% g8 C5 D
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
5 N, g# C- ~8 W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# G; J Z/ Z7 R d5 T
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ a- v* Z9 c( J# E2 w; e
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
* U/ |5 s z2 ~0 I
" x( u2 o g( s) N: y' Y/ k
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 Z- Y$ l5 z: I1 m/ l' \
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 o, C( y, f+ G8 X) L' {6 J
; d4 s! M7 M3 N" r8 G5 k
// 禁用斩波子模块
v( }' M! Q1 _& x2 J5 ]8 O2 \
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
# I+ u9 N$ ~6 v3 l5 h$ C: y6 K! _$ M
$ t- O6 F# n) U
// 禁用错误控制事件
! d: q2 m1 A: O; X
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ C' i/ _1 S! T# `% U b# [0 L* z5 u
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
" u$ r6 V* W5 D3 n
5 `3 o4 ]6 a+ a. M" f5 |1 W: [
// 事件触发配置
, f% j9 v' {* K7 U
// 每三次事件发生产生中断
) q9 C& Q5 s0 s5 W; N1 E
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 z- s, t; |: ~+ Y* i$ g# i
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
" t ~2 ^) H* d9 p3 L
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
0 g+ b* Q! V- l" i) j
// 使能中断
2 O u1 l2 U& \; Z8 ^4 S( W1 ~
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% u9 r5 p/ `3 P+ d
, I! V6 M; m6 f* H% ~
// 禁用高精度子模块
' a7 N+ \, S6 \3 h1 z/ J
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& L/ f( @$ [' }2 p
' K) E k) V/ U) W$ Y3 Q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
; C4 T- T5 K0 C* \( _5 r6 ^
}
) z4 Y& J$ e8 B5 u- L
; W: A3 W1 A* V7 M
void ChopperWaveform(void)
y- ^/ C8 i: g
{
* i3 `7 l) r; E2 V
// 50% 占空比
) H, i2 `, d, J
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, u9 M" A/ j0 Z" c2 z* ^) h$ p# M' e" Q
// 4 分频
4 Z: {" f" @5 C) I9 Y1 m3 U
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, _% S0 V# O2 W1 Y; p
// 单个脉冲宽度
) j! X! I7 U6 w! ^
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 s# Y, A. v+ i+ n- S
// 使能斩波子模块
9 u: N' T7 P, k3 C3 _9 v1 {
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; Q9 ^7 [+ l) |: t0 ?) V( ]
}
3 i' ^( X9 F3 g$ U+ ]4 i. y0 U
% u3 d5 W5 f- b; x* @/ s
/****************************************************************************/
- W3 g- s& E% c) {7 W2 b/ I
/* */
7 ?' ?" P* u* w3 L& O* @( K
/* PWM 中断初始化 */
- B0 |; {: K" y# X' K! s% d
/* */
% M/ K+ b& ~& f, U
/****************************************************************************/
4 _ W; h+ x2 n3 |
void PWMInterruptInit(void)
) k. Z7 D+ P9 B' H
{
, k; s+ m: H/ a" W
// 注册中断服务函数
& O. ]+ s+ _+ k8 L& v) H4 V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 s4 O% x# w" M8 ^3 ^
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 n% a4 h) p$ [
6 ]3 A+ ?6 o% N% {8 d$ x8 \
// 映射中断
8 d3 m; u ]' D7 q5 c! ?- D
IntChannelSet(SYS_INT_EHRPWM1, 2);
! {/ C/ V3 Z! p& H: H) K' V1 F6 W
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
' G' ?+ g: l Q) l
4 m2 q8 r# L% L- J y
// 使能中断
/ L0 c Z' N+ y/ Y3 r1 i# C
IntSystemEnable(SYS_INT_EHRPWM1);
5 B! i9 R' m' U+ u7 J0 m0 ~
IntSystemEnable(SYS_INT_EHRPWM1TZ);
& [- H* H2 o/ C& g T- p% J- B
}
) w4 b& g5 A5 z. M7 [
& f1 f3 S, e! ?
/****************************************************************************/
. @$ r! k/ Y% P
/* */
, G, k- G6 w# L5 n
/* ARM 中断初始化 */
! n6 K: y. w2 s) D X+ _
/* */
5 S( V8 _6 @" r m: F5 O
/****************************************************************************/
. \! ~$ Q% \- i4 }3 @
void InterruptInit(void)
2 J }4 z7 q# V7 C
{
" G: Z8 |& L0 a! m& j6 C
// 初始化 ARM 中断控制器
& M# t8 S3 r" ~& p* D% U) t
IntAINTCInit();
& A; B0 {) `" d
2 N6 h! a4 x4 Q- `$ h
// 使能 IRQ(CPSR)
# |# m% ?: ]: k' X9 Y
IntMasterIRQEnable();
# y8 [" _6 E6 x/ Y9 a, X
5 P, C2 l3 i [1 R4 I6 Q
// 使能中断(AINTC GER)
; _% q' P" D3 @% E: t7 [, H
IntGlobalEnable();
4 ]( u0 g$ H: ~( n5 A F; } b
: _% }# w; [0 F
// 使能中断(AINTC HIER)
0 `8 e5 {* Z3 g9 h
IntIRQEnable();
j6 S7 j2 U* q: z
}
4 q; b$ g& Q. Z9 a, @) q8 h. k4 P
. P/ b2 M" A1 v1 m: L* z
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
8 X: ~8 [# }) s6 A) t4 S8 O
/* */
, ?& Z) j8 N% ^4 L, j! P
/* 中断服务函数 */
" S# s" @% S. `4 [$ }/ u4 d/ I2 E9 `9 {
/* */
2 T+ q6 {& k- @) w* H0 W% g
/****************************************************************************/
! I8 T" z) c( q) t/ h
void PWMEventIsr(void)
5 F* H( N' N% E5 p) i5 Q; ]
{
8 o9 u% N2 q6 l; _3 Q& @
IntSystemStatusClear(SYS_INT_EHRPWM1);
5 V$ ^) g+ O/ `/ k) [; {
9 Q, N, C( a( S2 v+ h- U
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
* [5 X1 K0 Y8 |! P# y7 V
}
^- _. e! a$ b4 V& }6 U" |
1 S7 D" V" N( c! X, A' X/ v
void PWMTZIsr(void)
# Y5 A7 j8 T* k% r
{
{1 t) o4 c3 J0 ^9 z5 P
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 Z' t4 q8 X4 K" t8 _( ]/ U/ `
/ @& r! j' E# Z/ p S; X
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ b6 F7 v) V# y+ s o% B
}
4 Z: H9 c" U/ m& K
* r9 J4 O, f y; ~8 h
/****************************************************************************/
) U, s5 W: B2 |% C* v/ j
/* */
8 q9 g3 S8 p3 F) }
/* 初始化捕获模块 */
% b- O4 q' `: _2 [# O1 u$ K& E+ J+ ]
/* */
' ~& b& K0 x6 q. G& e/ o% T; R# I
/****************************************************************************/
/ Z! {& @- L7 C7 T
void ECAPInit(void)
9 {2 T5 C/ y+ q
{
. m4 M* X' B' N
/*-----设置 ECCTL1-----*/
: @8 Y. a7 G7 ^) w, M1 ?4 R' o
// 使能CAP寄存器装载
$ j8 |: e5 x& A5 W+ J, z* T, ?
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
+ ^3 |7 u6 s1 i8 G% x. i: X" b; D
// 设置预分频值.
9 @" k9 L( |0 M
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
6 T! n/ t2 M* L6 x
// 上升沿触发捕获事件
, T1 e2 i% k( ~4 O2 V, ^7 c9 X
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
$ B" D7 _& x1 V
// 输入捕获后重新装载计数器值.
% z7 m9 u& h6 K2 K4 r6 l4 Q/ s
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
' I# p3 M8 y6 W) ]5 O4 @/ f
4 o2 {: l- q2 S: @: u
/*-----设置 ECCTL2-----*/
@3 E! W- v9 I
// 连续模式
" y. H2 S* V0 J
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
. e; b& N1 p1 [; ]7 Y
// ECAP计数器TSCTR持续计数
: q5 [, v. Y% C
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
& v- b1 A/ g4 H
// 禁用同步输出和同步输入
2 i) k1 I! A; q# O! S# h# O3 D
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& v$ ]* U8 Z/ h4 r! O# e0 b4 G3 p
// 配置 ECAP 2 为 CAPTURE 模式
5 @/ E5 S$ N2 h1 ^7 @
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ P0 k! z- |2 y8 i; V( |
- S% t1 l. k& |+ u7 U" p# @
// 使能中断
) e4 D/ x% [" f M9 M, l
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
6 G& ]7 x% _2 t# h9 L: D
}
3 P! g* V3 }8 ~+ t( y8 j
3 O* P0 m1 |# U, L; U6 C
/****************************************************************************/
, }1 c6 P: J8 u% y+ L9 E7 T- \& a
/* */
2 s. K, M$ c" E; y% g
/* 取得捕获结果 */
$ Z+ U; N' u# }& e% Q5 @
/* */
7 c3 y/ _0 c+ V+ j V
/****************************************************************************/
: a2 R; ~. D7 X! L/ J
unsigned int ECAPRead(void)
' B% M! a' M1 e, T5 h! C
{
- Q z9 G1 Y8 {" w4 [# d5 I
unsigned int capvalue;
0 w+ K w1 m% K1 J& K: |
unsigned long frequency;
/ U) {2 W# T, l& r) ?% E
7 M& f5 {+ T$ k: E9 L+ w/ K9 h. v
// Event1 中断标志
, R0 k. J8 Z! x1 W4 m v4 l
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 x- P" C% K# Y j1 l: Q
{
, ^1 Z. Q! l6 D4 e# F- \7 I
// 取得捕获计数
% f+ N5 i% K+ Q
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
9 R8 V2 O; M7 W9 |& T; e/ X6 k
capvalue = ECAPResult.cap1;
/ O Z' \0 w3 Y/ O {
" n8 Q" B0 p+ D" g* x$ t0 p7 F
// CAPTRUE 模块 228M 时钟主频
' e! t. K5 D: f0 h
frequency = 228000000/capvalue;
1 G8 \2 q3 ^% W8 L2 t! |/ h
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 y+ [) f" K& n& F
+ a( G: v9 I* @- T% _* |
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ s+ r s" F) A* i/ {4 B3 N4 h! J u7 J
// IntEventClear(SYS_INT_ECAP2);
( o" B# i0 p2 w, b' R
}
. m% @7 t9 j& W) `8 l, m) F4 T! f$ Z$ [
return frequency;
0 [" Y# L& J5 ~6 H6 m3 q
}
6 x. N, d' n+ w0 @5 T9 V- k
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, W! J5 I* ?' 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