嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
( g/ O9 m' R) ]! Z# c
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
" \; O5 Y9 b- y3 b r
/* */
2 H. ?4 j) s0 l2 e# p& \- s. Z
/* 宏定义 */
) s6 b, I" i$ h
/* */
u$ H5 K; i( T& V
/****************************************************************************/
5 j* f3 q( C2 q* W8 k, N. g
// 软件断点
4 B: |5 A1 u+ U. _
#define SW_BREAKPOINT asm(" SWBP 0 ");
. u) O6 y/ b4 t4 u* L* _
1 h. M, }- t D/ Q. w/ |7 H
// 时钟分频
- |, O) R" {9 ~8 c7 }
#define CLOCK_DIV_VAL 228
* Y7 R! A* ~. a; Z
; p5 z H2 H1 Y/ n O
/****************************************************************************/
$ C7 r a$ a8 P M
/* */
9 b9 |$ K$ ?* M' ?
/* 全局变量 */
) R6 {2 `, R* b5 e+ Z
/* */
$ P/ T7 @% B- y0 y$ {
/****************************************************************************/
- N! N' w7 Z* X9 n( v' Z( v
ECAPCONTEXT ECAPResult;
8 Z; X; }; u) F+ j+ P5 T% \1 N
& X* v. A- B3 j. V
/****************************************************************************/
# y- r! B- a) C) R- p
/* */
9 P6 C- }3 ` s7 H! o7 A9 G5 ]) M
/* 函数声明 */
% ]( [; c2 e0 y0 Y. H/ u
/* */
& `" q3 V- \# U
/****************************************************************************/
+ n1 a' U; }2 E
// 外设使能配置
z% b5 L# [, Z- S# \0 y! P
void PSCInit(void);
7 S1 f; y- g% q6 D8 r# B1 m0 |7 | E+ Z
; g* U& I, P4 v
// GPIO 管脚复用配置
9 }3 A7 x5 U/ }9 O9 }& v
void GPIOBankPinMuxSet();
$ G; C3 i( t0 t x" T) L0 r
% m- E2 j& |9 v: v$ D; a a: n9 U
// 产生波形
. C; z: v5 T( Z9 y5 f& E/ v5 u: y4 L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ w* p$ Z7 _4 j0 U) e. I- _# m
void ChopperWaveform(void);
, ~- G4 Q3 n9 h3 s8 r! b' l# b+ [' W6 Y
. V g* P4 V4 Y
// ECAP初始化和读函数
6 @, M+ ?- o# w1 s0 ]* V
void ECAPInit(void);
1 K% t! b b8 z: C
unsigned int ECAPRead(void);
! b5 @! X- d9 z4 O
5 G& p+ ~+ q9 S$ M
//ARM 中断初始化
. s6 N& p1 Y7 t; M3 U3 f
void InterruptInit(void);
8 Y) x5 j. S! p! } }8 ^
. i1 W* P6 u; `+ V+ }% s+ g4 ]
// PWM 中断初始化
9 C$ ^1 V9 |- {5 W- o
void PWMInterruptInit(void);
! Z9 b6 h4 t1 m$ o3 c
// 中断服务函数
$ Y2 z% {8 T( o3 c9 o$ I) g
// PWM 事件
% J2 L& Y, Y; Z
void PWMEventIsr(void);
; V$ @/ f, l6 N- `& b
// PWM 错误控制事件
+ _8 N; f; e& W1 r
void PWMTZIsr(void);
4 U( s+ b# J9 s, p$ R$ c
4 f8 u* y) d: n7 n
/****************************************************************************/
' n6 F% ?3 O) d. T
/* */
$ @% |$ @& ]: e; @+ \$ o. J8 P* H8 `
/* 主函数 */
8 B* d: r4 b$ U" |
/* */
k4 K1 F+ I* l( Z: G6 ?8 d* p
/****************************************************************************/
' K2 E6 @1 E* n+ M9 H9 r) G+ [& A( t
int main(void)
% @: b9 T x4 K6 Y' T0 v5 T
{
% e4 f2 \; z9 Q
// 外设使能配置
& _9 p }2 x9 t6 Q
PSCInit();
5 s6 ^4 ]- q& a0 C& Q
: K4 [, K; K# _* x1 p& K
// 初始化串口终端 使用串口2
$ ?9 R2 b1 ?% r, H+ k
UARTStdioInit();
$ k; D0 }& L1 ~3 m" T9 o
a" F$ Y. _: J) ]# X# Q$ M
// GPIO 管脚复用配置
) e; b0 b# i8 C' ]3 B
GPIOBankPinMuxSet();
& u& U' b; K3 E0 b. @
8 p3 S& q( P( b3 w5 P
// ARM 中断初始化
z% j8 {( F" t; k: a$ _, v% x
InterruptInit();
. k/ E) Z6 z9 D8 y
' V3 _) h7 b/ J: Z1 o
// PWM 中断初始化
0 h( Y4 @8 a. [# a3 n
PWMInterruptInit();
8 C2 Y& D* s$ K0 s& n* Z* e( T- c
, H$ C& e% R- K9 t( x
unsigned char i;
* G; s2 c9 ?7 P6 O! y. B, ~
unsigned int j;
3 J: J1 d8 U4 h1 t1 \& y7 O/ J
7 x" C. ]% ^: [: Q/ `
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( s8 L+ y' `2 T' ^, |+ z; J
UARTPuts("------------------------------------------------------------\r\n", -1);
7 j7 `" N$ B9 M
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. p' S' }. k$ l% i4 H
// 产生波形
# K& V6 x" ]" S# I4 v7 n+ K. U
PWM1ABasic(25000,50);
3 {" c1 x* u9 H' f
0 d0 |: u4 |5 R3 a6 f6 H
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 c$ C6 w1 v3 k% b& s
UARTPuts("------------------------------------------------------------\r\n", -1);
* C4 P- |: D7 X/ s# {) b8 b5 Q
1 c! y9 I+ @7 |" l' \ m
/ m* p: V& z7 G) i
) z) g& R) W( D* l0 s8 w
UARTPuts("------------------------------------------------------------\r\n", -1);
. B! |, x3 J6 d) r
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 |( w2 [9 p1 D0 A5 m% Q
// ECAP 捕获初始化
9 a3 [# o3 M2 Z; U& Z7 a
ECAPInit();
/ J* \$ ^$ B6 u8 X
UARTPuts("Initialize ECAP.......\r\n",-1);
) S: T+ a- _: E5 F
for(i=0;i<5;i++)
% {* Q5 C' D$ q( c% b2 [# i l
{
) X% o4 z' d* y# b4 x* H
for(j=0x00FFFFFF;j>0;j--); // 延时
2 U. R& Y. q* ?9 d; I5 y$ s- U
ECAPRead();
7 f; M U4 w$ L' x- D
}
; V, Z' O- ?4 v7 L5 e
UARTPuts("\r\n",-1);
3 A# y3 b4 H$ l
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- i+ c+ `% K+ X$ A, ~: ?4 A$ ^
UARTPuts("------------------------------------------------------------\r\n", -1);
1 D3 u$ K i7 V0 J0 T$ {
, S/ u5 T2 B2 e% X7 `% S
// 主循环
& L; w8 ^! K6 ]
for(;;)
# T5 C* x' e4 y$ S8 ]( M' u
{
9 E% U: O8 j2 L/ ]/ C `/ O# x
/ P+ [8 T$ Z# M* ?
}
* o1 B$ g6 C) O% m/ z4 e! P* F
}
' F" D% ` S( E
q3 J; |9 _8 R! p, a7 M5 j0 U
/****************************************************************************/
8 i& g/ d5 B! L2 J7 k E. b! E, r
/* */
7 D( j% x" z% \7 O7 N7 i" T m
/* PSC 初始化 */
* Y) |# {1 M, T5 q2 y& y
/* */
4 q: { s6 t0 Z) Y! k
/****************************************************************************/
. P6 Y/ s6 {, m# ?
void PSCInit(void)
2 @3 n2 j3 E6 G; N7 \$ z
{
9 i! k- v& }: H5 W) q9 n2 e5 H
// 使能 EHRPWM 和 ECAP 模块
' T, G/ v8 u0 C" Y9 g
// 对相应外设模块的使能也可以在 BootLoader 中完成
- t& @+ w$ ]/ {2 q/ U; w6 {! [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, N; R9 v- d9 I% q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& G7 u- a* n& w/ q9 \: n
}
0 q7 Q+ r }: b$ `& _
+ T0 P* p" `: Z) ]
/****************************************************************************/
I& S7 J9 }; q: r
/* */
/ y! ]) ?) l. ]2 I2 J+ `$ A' @
/* GPIO 管脚复用配置 */
# K* O4 D3 [- q. w u8 {# d% k
/* */
# u. F/ ~' H4 F# y8 ]7 a8 K' E2 y
/****************************************************************************/
: v" \7 d4 ?* Y9 g/ c# t U2 _
void GPIOBankPinMuxSet(void)
; m M. m" X5 t
{
" y' N( N) N* m! Y6 e3 a6 [
EHRPWM1PinMuxSetup();
. A( ~$ O$ B! P
' K" v9 Z. E: T n
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& U3 L; I+ C. }3 Y& i `
// 作为捕获功能时管脚方向为输入
: j1 I3 a" i4 d/ Y
// 作为辅助脉宽调制时管脚方向为输出
, V/ {5 U! F7 }
// ECAP2 / APWM2
4 W: T% X- W1 {: H
ECAPPinMuxSetup(2);
0 q. a; B. @. |9 B2 g. M
6 y$ r( Q+ T# U
// ECAP2 / APWM2方向设置为输入
' Z! B0 x8 g |0 M j* K0 e" Y
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( ]& R. e. N/ G( }% ]% B
}
6 D) \/ v% Z ^* i! c) K
: V8 F1 C' x' V9 {3 U
/****************************************************************************/
0 V, J$ V5 Z) J
/* */
( M# v/ `( T. G: Y" h4 T
/* PWM 输出波形 */
' u- M3 i6 D' w! v6 s% m6 k5 c
/* */
. e, i9 U7 u4 W0 @& P' }
/****************************************************************************/
- q1 z# ~3 g. [+ Z* O* r: E
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
8 j! n2 ~; ]. R% [5 e& @7 P2 v& C) |
{
( s) S& g& g1 y' \0 h% |
// 时间基准配置
( g: [% U# h% m. D8 |; M, @
// 时钟配置
2 X* Y! Y: P. k- Z/ q
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
9 `) W! ^2 n0 J6 J. E) E; h! ?8 L$ N
; j1 q v1 ^% u. O7 {# t
// 配置周期
& l3 ~. ]* p( l! j6 y
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ e* W2 m8 T' E& s) t0 e
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 p) O# i% [& I* t, K
5 t- e% a! E; a, ?# w1 Z
// 禁用输入同步信号
6 j7 Q1 ~; D7 G% z/ i1 u: Z
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
- e, M0 D7 y) O0 v0 ?% t
- [6 }) n" b/ B4 V- Y
// 禁用输出同步信号
- C8 l! Q' u7 `4 {0 O
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# \- M% K! L- J1 {
; \% P5 D0 I1 j
// 仿真(DEBUG)模式行为配置
) f2 [% {, P1 k$ O# x
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* S0 p; f8 L& o' ~2 `! j" o8 g
7 M1 f( ^2 Z1 b. w
// 配置计数比较器子模块
; i, M# L4 B; g! k9 E
// 加载比较器 A 值
% D' `% c- g! w8 Y% \$ p
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 G8 P& h E2 K+ c( C8 O
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ i/ n, S4 G: \9 w# V; ^' y
$ m& j- u3 T0 x# V
// 加载比较器 B 值
c2 Q- B# a9 S& y: K! P! z* K
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
) }1 L' a9 Q+ V7 G0 @
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! B& K. m/ x4 b, T% w
( q2 d/ F' d3 |; m3 Y$ V
// 功能限定配置(输出引脚触发方式设定)
/ A1 B$ q' ], y0 L9 u3 ?/ C; Z& S
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
2 c" Y- ^% Z" c! T2 R E2 I
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 n% V$ l F& m( {) G
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 [9 ?4 C% {, E
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
) @) r2 q1 K: p
7 J# u0 n) j) r3 d z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
( ~- l4 ^# I2 M+ ~, k
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# p4 D, z1 _2 }
# W$ i: @3 z; p7 Y
// 禁用斩波子模块
. p% t) \2 W; {' q8 p
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 _3 w% a1 B6 p: ~
& i2 h* h# Q0 d, h6 r/ h
// 禁用错误控制事件
0 j& I, g5 W" R8 r1 s( s5 u( _
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
2 Z6 Y' a$ W1 f3 N6 U$ Q
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
3 O9 M) L! Y( g$ t
' j- [! S9 d/ F" K0 H; C) d: C
// 事件触发配置
! o7 C) G6 W5 W Q
// 每三次事件发生产生中断
$ d; v, i) o7 J8 a5 Q# W9 f p
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
; N. v5 N4 V- }6 P: i" Z, I
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
" j2 L% y0 Q- t
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 Y" n, ]3 y c. B9 G
// 使能中断
/ n- q; }9 h `7 D2 U. J4 ~
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
# R. t& ]" i( X. L# E( W
% z0 n) \. t/ U( q; _
// 禁用高精度子模块
- N1 d" l; A# z1 q/ F
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
8 }5 E7 g7 N1 f* _0 n
$ K& a8 Y, Y! ~' C* X
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 N7 E, t7 _& m: A
}
) j! k. w. n% k9 ^& `9 [% t. g
- j, G5 y* G+ k7 v9 a- U& y' f
void ChopperWaveform(void)
6 l/ V5 q2 W* x( W, I7 x
{
9 m9 ]# L, E+ K3 n4 Q/ l
// 50% 占空比
& s+ `6 ?2 e {8 I
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
/ ~, I g' X0 F% b) f& r
// 4 分频
: F- Q' }8 F9 k- U1 j+ s3 D
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 C( d4 f1 m: e" j& d2 h
// 单个脉冲宽度
- q& y0 P5 T: H! k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ K3 `+ I/ A2 @/ W5 s. ^0 p
// 使能斩波子模块
# \6 J% ?, B2 ~6 c: x
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! f! F# g- E% v$ i" u' s6 X# M! U
}
1 g/ b$ U- N! i5 q6 \; y; M
8 T/ g8 k% |% v; q1 H |4 Q$ C
/****************************************************************************/
% D" ]3 p' ?& _( ~# [
/* */
0 c# y" ]9 e9 ` X
/* PWM 中断初始化 */
* O# n. ]8 a) `! U: [
/* */
: }0 j X* x5 F8 z8 ?8 v) Q
/****************************************************************************/
8 v& v: T [* C. ?$ U4 Y
void PWMInterruptInit(void)
. E3 F% T% M4 B0 {1 T: ]
{
. e% f8 k; x" B7 i4 I# g3 m
// 注册中断服务函数
7 _' H2 T* b9 E* `$ p! @8 `+ A. j
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 a$ N+ K3 W( b* |/ {
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
l% F/ W- v( ]! x! w! _' P% n" ^" e
; t l# n. C' d" u8 x
// 映射中断
2 ]% a# y" c, ]$ n
IntChannelSet(SYS_INT_EHRPWM1, 2);
( w3 t U$ o$ d
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) e2 B/ U8 M: Q+ g7 W8 @; S7 F
, d7 O; {! M @0 O7 \! D2 g
// 使能中断
& ]5 S! N- Q7 K+ }: O& G5 i
IntSystemEnable(SYS_INT_EHRPWM1);
9 w' O; V9 i$ r( A: S( U+ A5 w
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 Y; l$ i) R, {! @! e9 e. n) z
}
4 a; e; h7 v# T
) F+ G9 n& o. _9 l' V
/****************************************************************************/
- ^1 n5 a5 ]% B9 r0 A9 v( t
/* */
0 t7 J/ M9 U$ [- z
/* ARM 中断初始化 */
( w; x* }9 K9 I6 ]7 o
/* */
* q- j8 C; ?& t! A8 N
/****************************************************************************/
: o! O" y3 s2 r) G
void InterruptInit(void)
: V! b% E5 k, h
{
2 X' ^( S) Y/ u, A, ?1 ]. y9 O9 q
// 初始化 ARM 中断控制器
5 T5 `+ m9 ?; x$ q |1 t% t
IntAINTCInit();
J: g @3 n/ i2 ?6 ^" n; U* ]# f9 X
) V; w T' |8 i2 C6 c- ~
// 使能 IRQ(CPSR)
" H! [6 ]1 X% w! q; l. c3 l* x
IntMasterIRQEnable();
$ r: f$ T; p$ ?7 `( l- q( m
1 d+ r1 l% E! \* T- y
// 使能中断(AINTC GER)
" J. a0 U6 r( m
IntGlobalEnable();
$ |- ~( p f: j7 m+ x- j
6 |& k, G$ N6 A5 E# {6 R0 @
// 使能中断(AINTC HIER)
; \3 V5 B+ Y- V1 ]
IntIRQEnable();
0 Z' H( ]4 m9 S9 c; n- ~
}
, L8 t5 H5 ^9 o# ?( A; m
& X0 f. r) o8 Q* @ i$ w, z2 F) Q
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
+ W; Y' B) E0 x
/* */
% K1 t# p, }5 V
/* 中断服务函数 */
+ _# R! m' x' J
/* */
9 A, Z0 T9 _( B9 ?1 R
/****************************************************************************/
% a8 T) a U4 D, w/ I% I
void PWMEventIsr(void)
N9 ?$ n5 y3 ~* C
{
4 g3 t q6 V* S: l, M
IntSystemStatusClear(SYS_INT_EHRPWM1);
! [( t) z: H% n4 r- o
; r: n# H2 \- b/ Q. ^' a% Q% c+ q4 L
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 X, k/ X4 V# ` ~, g5 M% r0 Z* {
}
3 Q4 }/ w2 r/ O; ~) ^ ^
K% Z& ]; X% Q9 n% i
void PWMTZIsr(void)
5 B% ~& O% A! i5 W/ v4 w2 J5 {
{
R$ u8 O0 I: `) F
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 k# p1 U& n3 w, O' {* \
8 ?5 J/ |$ s( P7 A
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# y9 T( @4 {5 v- o9 |9 d" j
}
8 v2 n/ r2 c9 ?
- ~1 V0 b; T/ @& o
/****************************************************************************/
: Q4 d+ p+ m4 E, }, E4 z6 A
/* */
; Y d5 u X4 X3 T
/* 初始化捕获模块 */
5 }' e, n; w$ [1 M: A
/* */
[# M' p% G$ W, k
/****************************************************************************/
3 s" I2 g" H D% L7 ~: X
void ECAPInit(void)
4 f9 g) E6 c: e$ f, A
{
( L3 i7 T* c- |" B+ B6 n$ E. H! g
/*-----设置 ECCTL1-----*/
t2 F7 P! H, Z/ g2 N2 [- b
// 使能CAP寄存器装载
% i6 D3 ?- F* P+ v, t% w0 U n1 {- K
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
9 o6 p: _8 p# o6 C
// 设置预分频值.
" f" ^, p1 {1 F* T) }+ L
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
0 H/ I! W! ?/ j- y4 M0 v5 D
// 上升沿触发捕获事件
6 b% S- w7 n4 L# s2 S) |
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
! t, L [) h+ ]& b4 Y6 ^* g, t
// 输入捕获后重新装载计数器值.
5 q+ b7 {4 B: D+ K7 m
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 D2 H6 J& J7 ~9 S( K# @' g
" O ^0 T" S+ s" x
/*-----设置 ECCTL2-----*/
* m4 }9 d" P: D9 P
// 连续模式
) I8 i4 T/ [! B& B j( w
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, a9 S+ v5 b7 I2 m5 h
// ECAP计数器TSCTR持续计数
2 \5 a0 r+ v: o% q D, k
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
P+ r2 L7 Q9 D& ~% Q3 ?
// 禁用同步输出和同步输入
% j2 B3 [3 P4 j6 ^! {
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& p+ Q. W* y; P6 o1 }4 n
// 配置 ECAP 2 为 CAPTURE 模式
: x" F2 _3 e6 |" n/ J1 [# b- }
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
3 t; X0 {( ^" j* n, |
1 Z F8 q* u. c% F' g
// 使能中断
D3 E6 H; ~' x/ B$ q* a/ r+ M8 W
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
8 u5 w4 B1 E# ^+ k
}
* a. d0 y$ ~6 k8 l
# A. X8 L) \, A1 D
/****************************************************************************/
+ p+ Z- w" r; A+ w8 z
/* */
7 W% G9 U" R7 V9 O
/* 取得捕获结果 */
2 H, K* ~7 Z3 G; p% h& p7 f& O
/* */
, `, G" L& t# [2 Y
/****************************************************************************/
$ Y# ]" G: c0 N/ d
unsigned int ECAPRead(void)
* I, m" |" u. H2 t# C
{
& V0 E' E8 j' ^& m" i! I5 |$ S
unsigned int capvalue;
) [1 R2 C; H6 G
unsigned long frequency;
- a" }2 f+ b1 |5 _9 Y1 p+ _% [7 q
9 {& r( H. v5 @' A
// Event1 中断标志
5 \! a( a& Y3 C. W9 K1 d: R
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
* H/ [0 Y( e" d. l" u! s0 G$ f
{
6 |' ~: P2 n9 M i6 ]" s
// 取得捕获计数
5 s. Z) V. E. t" N- f; i- c
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( a5 n7 q* H% m. v7 D+ {
capvalue = ECAPResult.cap1;
9 D' _1 K6 n- s" L8 @
B% ^2 M H' J& ]: p& [
// CAPTRUE 模块 228M 时钟主频
: H/ m2 w2 L. Q" ^( a7 Z
frequency = 228000000/capvalue;
, T4 ^# x* g9 q
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
3 @9 S' n' f- y7 r; D6 n. n
" t6 s( C% U) V5 \$ y7 b& u
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
! b! ?7 z: A7 u6 E; }" l2 n
// IntEventClear(SYS_INT_ECAP2);
m: L" u2 m6 d( d
}
- v' f' [ g$ o9 A/ o) s9 I; S
return frequency;
/ ]5 G {2 ~8 e; x; F0 n
}
# ?% s/ {# x1 n5 j
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
# G5 `6 l3 P7 P
[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