嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
: q. f" {1 F/ G
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
- g6 Q5 [' A9 Q6 J/ C
/* */
]0 o% n: [. ?/ ?2 X
/* 宏定义 */
; e2 c$ J. U$ j0 z+ y) Q
/* */
+ K4 |. M8 _$ N, ^; I4 z
/****************************************************************************/
' P7 Z3 [/ Q5 I( `4 m
// 软件断点
% N% ]+ ?& ~: R5 m) p1 Q$ l9 x
#define SW_BREAKPOINT asm(" SWBP 0 ");
5 n, _# Q6 o" ~6 M* r
$ e5 E- W0 e" b: W& P9 C
// 时钟分频
$ N& m3 f: S% @
#define CLOCK_DIV_VAL 228
; m8 k/ ]. H0 O8 ]2 e1 u
' n& S' ?8 _2 x( j% E
/****************************************************************************/
0 k' ]" Y4 U. W2 z5 a
/* */
7 f' e0 X# t. u4 P' k, t
/* 全局变量 */
A8 k& R) t+ s8 _
/* */
$ m/ Q# i9 o6 X0 N/ x$ d3 N; m8 }
/****************************************************************************/
8 \2 _5 X/ L% ]6 u4 J9 s5 {) L
ECAPCONTEXT ECAPResult;
% {* } {" | I/ A# X( Z7 f# l
# l6 O$ K' W& w4 t
/****************************************************************************/
4 c, s" t" H) W6 {: T
/* */
% ?: p/ Z. Q7 y8 v, Z& |
/* 函数声明 */
6 ~) S0 Y) h" R. @
/* */
2 [5 H; t" Q4 X, `) w) t6 o
/****************************************************************************/
1 j% e3 O' m6 i. A$ D" J D. Q
// 外设使能配置
8 R& `9 P. G+ k- J' K7 E
void PSCInit(void);
0 n& g. b' X; Y
" ^# k" D- o. r) ]
// GPIO 管脚复用配置
' S$ L8 k9 `; x! h
void GPIOBankPinMuxSet();
& Y1 g, X% q% F! `- O# {
% X/ R( w5 A. y
// 产生波形
3 P; X, l. ]* w9 @1 x9 p- V; D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& A" h Z; `8 w# V1 T
void ChopperWaveform(void);
# o9 v8 I2 v! [5 ?$ Q
' w6 X4 `2 y5 P! ~2 l. y0 Y- R* w
// ECAP初始化和读函数
5 K. U; R% j) S' J* C" u. i m
void ECAPInit(void);
1 k8 p; v6 T* R6 l% C* o
unsigned int ECAPRead(void);
/ j8 S7 W2 W4 }" u: I
0 d4 a, A D: Q0 t2 a2 X
//ARM 中断初始化
: ]- T. R& p( C5 [7 N
void InterruptInit(void);
/ ?/ z3 A, q3 L& t3 z8 T% W
U& Q( y9 D: _& F# f
// PWM 中断初始化
; {1 m$ \" I: ?& ~- i
void PWMInterruptInit(void);
7 U0 b% A+ f/ L$ l8 Q5 \
// 中断服务函数
6 P3 p3 U2 e- J( O( `1 `9 l
// PWM 事件
8 I3 [- j9 @. g( H
void PWMEventIsr(void);
, w, E% q+ r+ A4 _: r. C9 a) r
// PWM 错误控制事件
/ b& r/ h4 [5 C
void PWMTZIsr(void);
6 ~! [) N8 H& u# g# I$ U
+ M+ a. ~5 d# w, U3 W2 z* X
/****************************************************************************/
9 b- m( N' I2 e* e/ p
/* */
& }# ^' J8 A8 \8 f* w
/* 主函数 */
) e) x1 l; |! @9 n, u/ l
/* */
% n2 C" }. F! U5 ]7 y. C# {
/****************************************************************************/
* C; H5 e6 F; {
int main(void)
9 l* ?. Z- `' b5 k. U4 R
{
8 _7 y; X% X% p0 @- I# Q, Q) ^
// 外设使能配置
% i5 u) M+ k5 H, V
PSCInit();
' I( X s( [% J
! m b: g$ `% ?4 G4 y
// 初始化串口终端 使用串口2
|0 E+ G( T, s! L# t
UARTStdioInit();
i- S j& T8 D0 S
8 u( ?6 G5 j) U9 d: ]' Q6 w( Z2 k
// GPIO 管脚复用配置
. L; K% W: r/ K; Z) I! U7 c5 R
GPIOBankPinMuxSet();
6 Z1 p" r5 q( L4 H2 t
4 O9 Y& _( |0 w2 T5 O- j4 _
// ARM 中断初始化
. `* Q8 c% H1 p/ d5 P# }7 d! j
InterruptInit();
' X1 d- p3 M' N- g, w" p
& _, j3 v& d& B; Y. P& D
// PWM 中断初始化
' t' f, Z2 v4 c8 n$ w7 e
PWMInterruptInit();
4 | C( C) \9 `, o* L
/ `7 f& Z4 r% _/ d
unsigned char i;
/ I W a" [ \, t3 y1 b
unsigned int j;
8 A1 H7 M) {# u9 I
2 ?6 O* f4 u+ N ~8 R! `1 }4 B3 |' f
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; F8 V0 X k; J0 _
UARTPuts("------------------------------------------------------------\r\n", -1);
8 K6 O5 X' \ a1 s
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
" V+ C3 Y' u% a" A
// 产生波形
- a9 j" e0 X; U! G+ w
PWM1ABasic(25000,50);
2 I( Q! A: o" }: E- y) G
& ~7 [" v! v+ X
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
4 g9 j5 ?) k" T2 C$ |; S
UARTPuts("------------------------------------------------------------\r\n", -1);
- m5 F6 J- z- M) P
8 ~& C1 _. a( n( N
5 f- Y1 [0 X H
% d* k2 j; B$ l$ ^' P$ |; q
UARTPuts("------------------------------------------------------------\r\n", -1);
1 `. T) X T5 k$ V
UARTPuts(" C6748 ECAP Test\r\n", -1);
9 c2 p5 ~1 u" Y, H: t1 [- a) R
// ECAP 捕获初始化
9 H/ J1 {5 o$ u+ [
ECAPInit();
7 J- s+ D- F4 U0 u; h6 |; m
UARTPuts("Initialize ECAP.......\r\n",-1);
, O5 y) F9 F! ~. z9 Y
for(i=0;i<5;i++)
. o& n* l: R& M; Q
{
7 o4 i9 _* i! G$ X; a* k8 o$ ~
for(j=0x00FFFFFF;j>0;j--); // 延时
# g3 ]& U" D2 s& |5 [: U6 U, R
ECAPRead();
) j8 u# P' K9 u a
}
: r" z& `9 L% b0 Z
UARTPuts("\r\n",-1);
! Z/ {6 q1 |! E) m* x
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
2 y' J2 m7 z4 K4 |
UARTPuts("------------------------------------------------------------\r\n", -1);
0 [# p" D- o; }9 d4 X
& q( Y+ b; Z" j; F
// 主循环
9 o$ y- y4 Q2 e; V3 k1 L, d
for(;;)
) g4 z& y+ W8 R- h
{
7 Z ~( h* y1 H5 O) h/ q4 S
% U7 @3 C0 B! B! I' |5 x& A- i
}
5 E+ _6 q* \4 R& Y
}
# E9 h: q" a6 l8 G/ R
# V# _9 `9 @+ g6 w& v0 c# y4 _
/****************************************************************************/
5 c( `, V2 P4 s) E Y: L4 Q
/* */
8 o" {+ L0 a# W+ |6 R5 i& B
/* PSC 初始化 */
6 }) a" a- [. d$ W2 `, ?
/* */
2 V) d4 ~' c* F9 G6 [2 b& y
/****************************************************************************/
( M$ E7 d! Y& n! g1 u8 b5 H
void PSCInit(void)
6 a& S1 `2 l9 E4 ~( f' x
{
6 J4 G" z) t3 E/ G2 F: ^* \
// 使能 EHRPWM 和 ECAP 模块
7 R% p4 o. \7 ~, f& P
// 对相应外设模块的使能也可以在 BootLoader 中完成
; |4 `* T2 @9 F2 c) {4 r5 V$ _
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 N. e/ M6 j8 Y1 b2 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- W6 E) W9 O8 J: V: j
}
9 B& t: l- y# [) Z
( P8 F8 f9 W. W, ]" X" L, ^
/****************************************************************************/
^4 t! d1 j& b. i
/* */
. U$ T; B3 L( [0 ]1 x* i
/* GPIO 管脚复用配置 */
& O" Q3 W! E5 Y: O* Y
/* */
. ~" N- l, j% L( M
/****************************************************************************/
. I3 n) H& C/ H9 e
void GPIOBankPinMuxSet(void)
' T' `+ C; t& Q$ S, U
{
# `$ {! h) [9 Y' b
EHRPWM1PinMuxSetup();
2 B7 R6 {, y/ |* n2 G1 _; c
- ?# N& b+ J9 ]8 g
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
2 n% R' Y4 U) G" ~- ^1 M* j. @
// 作为捕获功能时管脚方向为输入
6 y: c7 D: t4 U! ]
// 作为辅助脉宽调制时管脚方向为输出
5 b! C: L7 K* e' U- ?
// ECAP2 / APWM2
. |; t4 I$ a7 e+ X5 L( ~; u
ECAPPinMuxSetup(2);
4 F3 Y2 M# K( p! i, P* ]7 |2 D6 `, h
6 A( ~ b- C0 \+ u& Z
// ECAP2 / APWM2方向设置为输入
; k" r! |, Y7 p' U0 s c( j1 c
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* H6 j6 O: T4 X( S1 {( c0 j S
}
5 @1 m# a! t5 J; Z
. B3 E6 H* ^, P" x3 b6 _+ }
/****************************************************************************/
9 \1 M# V2 J. F! {
/* */
6 ^, T A$ A( }$ [+ E" S5 j( \
/* PWM 输出波形 */
: Q7 i- n, u+ `/ T. N- U2 G. I
/* */
* n# o! X4 ^' ]1 I$ ~& T' i8 Y
/****************************************************************************/
4 U7 K0 b0 N6 Z, m* ^8 i7 d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; o7 [8 n5 u8 r0 G
{
6 R; B4 c+ Z3 d1 X$ C Z
// 时间基准配置
" C- Q& ]* c$ ^" l3 H. b
// 时钟配置
$ F: _& v+ W8 z) W5 L0 g( u' g
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* |' Y: {- m) M. t4 j' {
: m( S# l# d( F
// 配置周期
0 o7 l _+ N& G7 o. V
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ n) x( f( ^) h6 y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 D- u2 C, P: R
1 t% J/ \) A/ S8 Z
// 禁用输入同步信号
: I M) X/ u( c& \
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ o2 I: D( Z' L2 Q+ A
5 u# Y2 Y7 d( O6 \' \; G
// 禁用输出同步信号
- R! R% a5 q2 ]" ?" s' f0 M
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! l! n5 h* B9 g+ i% }
; t# U. ]7 s/ ^! M" Z H
// 仿真(DEBUG)模式行为配置
5 e1 {8 A* {: [2 j/ b
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
: r( K. t1 l9 u1 R
0 l8 n2 C! Q7 M8 P* o% g, h6 h
// 配置计数比较器子模块
; A& z5 Z) P+ T0 p9 a2 l
// 加载比较器 A 值
6 I! {/ P% D8 v# `$ N! g& j
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- P O" Q" w6 Q) k7 B
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 V' u/ _( [0 Y; n2 e' A0 l2 ^
F1 D3 V: d$ h
// 加载比较器 B 值
& @- U. x+ ]7 i C. y+ W
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
7 O0 M3 F6 z+ l2 s1 X* r
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& P3 x" t* A- [3 k/ b6 l% U4 `
8 @0 l/ V" |1 t6 x9 C+ o
// 功能限定配置(输出引脚触发方式设定)
. u8 H- b8 N0 W% j. M
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
+ y) Y% l$ F0 s& I# Q
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
h% r6 V1 r( w$ C, g5 l
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
( E: Y2 p6 ?# O; `7 q" B
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
^& x$ E& _+ u: x2 A
+ B2 R6 _3 L: @: I2 q8 V8 v0 ]
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
4 `" ^0 E! H( g3 a, Q- c. [5 _( O. c/ ~) g
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 `& ^+ K! i# k# X% v
+ I0 L3 k7 }& l( @% q& ^
// 禁用斩波子模块
$ s, E% O7 j: r( v! x
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
% Y3 n0 r4 t6 F8 H
" ~/ G% z/ `$ V% J% d& `4 K
// 禁用错误控制事件
: N( C' _' R+ P; M- w
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 F: n) J) [% ~' ]
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
; j/ N+ i9 P# D) i3 e
" p# k W' X5 q
// 事件触发配置
% P8 y( e- J/ {$ x! K; v
// 每三次事件发生产生中断
! e+ o; T& I6 l0 X+ W8 U, b& L! |
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
* u* L- y9 \' [( I2 j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 d* {# N+ Z* ^; A! X ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- Q; U; y2 H+ s
// 使能中断
5 y! f$ M/ e; u6 k5 d0 ]2 U" z, \
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. o& [1 ^* ~9 @6 d& w7 V/ B
" P& q, b5 a9 t9 q
// 禁用高精度子模块
. {7 a, t* T- d, `* L' a8 Z, |
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& p4 X9 x2 p$ V2 ]- W. S
1 n3 z6 T2 c! D" _
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" `% B# W) k3 r% ]0 A1 `* c7 R8 E
}
7 G$ w& @0 m- T/ g( p. v1 h2 _9 X
) z2 q! z( d& Q+ r* J3 E) J- G; w
void ChopperWaveform(void)
4 v5 W5 n" ]( }* H7 y
{
: X+ U' k5 r L% _0 Y
// 50% 占空比
# s& d& [! D5 N2 z5 q
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
8 {- `/ u$ h2 T% p2 `* ^
// 4 分频
; w: M6 g# r A+ Z* z' I) Y7 I6 ?
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( N* O6 a* {7 \* o
// 单个脉冲宽度
% a2 y; P7 p0 _ _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ Q. S$ Q$ Q5 ^" Y; F) G0 C
// 使能斩波子模块
- R4 |, {, G. z8 h1 G4 I0 Z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% j) B4 a- ?+ ~+ k& l
}
5 R; k' z) L/ w3 j
. e7 _- e' x9 J' x# m- t" \ y
/****************************************************************************/
8 a' `5 I) q! h9 h9 W N. [' s
/* */
" |( T: _, ]: [7 g2 b7 a
/* PWM 中断初始化 */
. [& q1 e! _( D
/* */
8 t5 _( ~ p T) d" b1 Q& b
/****************************************************************************/
6 I* @; \7 n2 `- J3 o
void PWMInterruptInit(void)
2 W) [0 s6 r1 E$ \) d6 I# K
{
4 ^5 F# k9 l$ U; J6 I8 \# r6 O5 a
// 注册中断服务函数
) w' k6 M8 N# x' n( f) o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 B- q9 r: g2 L+ e; H
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 E0 J# {$ i' n1 t
3 ?) U, I% h& z3 g2 {) d' w
// 映射中断
& B7 S e, w7 v0 W4 r' o
IntChannelSet(SYS_INT_EHRPWM1, 2);
! l, d% `8 ~8 E: L& L5 O& `
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
' {) V6 [$ w* y2 W
; I+ W4 j1 A4 j+ r2 o5 f
// 使能中断
5 Y, Z: {. j7 H" N' ]6 J7 \3 P4 k
IntSystemEnable(SYS_INT_EHRPWM1);
% K# Y! y* D/ s0 c( T' A. O3 h
IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 c& x7 p" ] X. p0 v
}
& o6 m/ }" U& a9 J
; }( m& S5 [% t7 h$ I* D2 X
/****************************************************************************/
' Z2 b( r3 P( l+ d6 k/ m( O# n
/* */
( K7 e4 S% i; n( {* p
/* ARM 中断初始化 */
4 A7 ?. K! h& j' {
/* */
/ F5 w7 h8 k: h8 R: L6 }2 O( c% I
/****************************************************************************/
9 g: W Z" _0 J- g: e$ k
void InterruptInit(void)
4 ?$ n. }2 Q7 ]8 S% g# T7 z
{
: `/ j/ j- _) ^$ @, ^
// 初始化 ARM 中断控制器
/ [0 ^3 t) H5 H; u" ^4 s# f5 W; A/ u
IntAINTCInit();
$ X$ ~+ S) j. w1 v4 f! B
9 U) w( t8 f. G
// 使能 IRQ(CPSR)
4 O& V( e0 P. X
IntMasterIRQEnable();
8 S. m2 U* D9 H T
^4 N/ a5 Q' r- |( c6 j
// 使能中断(AINTC GER)
3 s! M6 {! \ W4 E, _. O6 ]
IntGlobalEnable();
! B% ~& Q6 T* G6 K* `
& |8 }* T. f+ H; @: T
// 使能中断(AINTC HIER)
( i [( X1 t& v- Q. G+ f
IntIRQEnable();
, y4 n. C7 @+ I$ q
}
0 b6 ?1 [0 j( m9 H% m4 {
( w6 `6 x1 F; b' n# z% ~
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
9 _3 H; B, U7 E: }
/* */
3 C. |5 U! l+ _3 B0 N5 F
/* 中断服务函数 */
+ l9 D% b" R( z! D5 c z) @
/* */
+ ^3 r6 B2 x# s* u6 e$ `
/****************************************************************************/
$ N, a9 z2 C, A# c8 b& S
void PWMEventIsr(void)
0 b. R% g6 G& c
{
5 R, M. |( ` Y. s
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 [ p( P8 U' F# ?6 x
; Q" {* b+ r# F0 s- z0 F
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" D% H+ A" n- s3 \( ?3 b
}
7 e4 K! p6 {! v4 D& w! h
1 B% v8 o8 J; ~9 ^
void PWMTZIsr(void)
2 r( ?7 K. c! F, h9 b
{
2 S, G/ K% }' ]
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
9 U" e2 V8 u% Q0 S C
$ X' @7 `" W* L' T! W' g u
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
, D# T7 j" L$ @$ a, _7 ^
}
; U7 o) ~' ]1 H! X _
9 c6 i1 Y# K# k7 S2 |1 o& u
/****************************************************************************/
" c6 O6 d( T6 A/ B8 A
/* */
+ ?% S) K$ X; f$ L$ m
/* 初始化捕获模块 */
" L) |, [( J4 m3 d# r7 J/ F5 T
/* */
L0 b% l `. }/ G* C
/****************************************************************************/
$ Y, F+ ~+ F3 T
void ECAPInit(void)
" ]; ~' j) C6 p3 @: s2 r [% S, Y
{
W! n" S0 O9 X" B: B
/*-----设置 ECCTL1-----*/
* z" b# p6 ?3 N' p1 L0 W* o$ Z
// 使能CAP寄存器装载
Z( T+ H) b0 R) n- O
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( O' E: V3 I, \
// 设置预分频值.
3 `) F- t$ r( s0 i; x
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
9 Y* `- {# A5 P. F' \
// 上升沿触发捕获事件
# O% { n$ o+ b7 I
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
: \1 @8 K$ p" p! {5 m
// 输入捕获后重新装载计数器值.
3 `' ^7 C5 L4 G- `4 O
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
! W7 r4 ^! X8 x4 J4 x j6 B% v4 m
$ T: C3 Q" _ I0 D- X9 C
/*-----设置 ECCTL2-----*/
+ n, z6 d) d8 M" L2 U; D5 G; t1 f! c
// 连续模式
+ i/ U5 F) O5 d
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" ^( v" d O2 a' @* a
// ECAP计数器TSCTR持续计数
! }8 M! N! j1 W7 T/ i {8 n% @9 q
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
/ ^7 _9 p7 ]! X% j* T* C9 ^
// 禁用同步输出和同步输入
) h& j, p0 S) |5 V. ?4 K2 \: D
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
& h9 _; \9 q& ]/ K( P$ G$ l+ u7 b9 g
// 配置 ECAP 2 为 CAPTURE 模式
2 p/ f2 C' U& e) u9 l
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# }4 Z6 S5 W7 e$ Q
( v9 w0 v7 g. n
// 使能中断
$ H' q; ^8 I5 `2 w; l
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. ?2 \6 R+ y' _* Z+ d4 f
}
" J9 u/ G1 r9 Z5 _* q" n* G
9 I( j( L4 [$ C& }+ E1 ~ B
/****************************************************************************/
- [; b% w5 M& H
/* */
! f( C; u5 m/ x5 F. j! F
/* 取得捕获结果 */
1 E/ v1 W. i' y* Y
/* */
2 \ i( v) _9 [$ x' j' p
/****************************************************************************/
. m' Y0 K% ~/ c3 k/ m3 w2 E
unsigned int ECAPRead(void)
) `0 ?8 o; B. f( w( ~% H
{
# C' f0 v' `% x" s$ `
unsigned int capvalue;
* x/ b$ G- @) G% P) x* Z% ~! a: v
unsigned long frequency;
% O) p, d' p9 H+ U" f8 D4 x% G
, L: c4 N( x8 e; s7 X t
// Event1 中断标志
( Y8 r) Z- o$ z; S2 L2 b. F* y
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
* I$ S# L* ], w" v( O
{
3 N. q8 j' m8 E9 r9 v: b# q- @8 B
// 取得捕获计数
" F! x0 I$ Q+ q u' \
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 F( v1 a& \* W2 U, I; a' a3 |
capvalue = ECAPResult.cap1;
! p& ]2 o3 S+ V1 L$ l6 [( G- a4 `$ k) ^
1 `) o! Q: s. h. |
// CAPTRUE 模块 228M 时钟主频
+ q# s( S" H! q4 T0 W; r
frequency = 228000000/capvalue;
" m4 B/ ]& c4 E* z8 X9 O. N( M
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 l* Q& ~+ f* t) T1 W5 N5 d3 @- w4 i
, g' w3 C+ Z1 F1 z3 y
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
- D8 K- y) C' u! j8 r
// IntEventClear(SYS_INT_ECAP2);
8 B, j% J/ C- @; p
}
$ V% N$ |4 g% N4 e% @2 u
return frequency;
3 I5 @& T2 _; T2 |
}
5 g( U8 ^$ i! p0 `
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
2 x& ]; O, P/ N( I4 Z# 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