嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 Q+ x* S/ y' T
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
@) T( m9 |! G9 F3 O# w
/* */
% x4 }6 c: L+ Y3 X% S: D3 b9 C! Y
/* 宏定义 */
3 T! Z- e/ a( m# t, a( V
/* */
0 ?) f' M7 ]4 I* X& f5 E' B
/****************************************************************************/
% T( e5 X4 b& L( v4 z* d% u, Y4 Z& ~: V
// 软件断点
* j8 @! _+ Y& {. y
#define SW_BREAKPOINT asm(" SWBP 0 ");
; ~- L+ ^& A7 K/ J
: S1 u: _$ I2 d# @
// 时钟分频
5 n' O! l, I3 V# Y5 x) |
#define CLOCK_DIV_VAL 228
e7 d2 p* F: U0 E, M) {
3 m+ k/ [! L! R9 P( P; t
/****************************************************************************/
2 a' @- _2 w5 q' X; h% k
/* */
+ j& [" P" g' ]) Z. ?
/* 全局变量 */
; h0 p, r, r( ^5 p7 Y+ c+ ]
/* */
1 o8 t, Y: A# s& w5 x
/****************************************************************************/
9 L4 C; Q7 Z# C2 s$ n2 c
ECAPCONTEXT ECAPResult;
1 V2 P% o5 N5 c* ]# p1 o1 }+ z
& o% q4 t% s0 w* H# L$ ^3 p% h
/****************************************************************************/
) { {1 T. j+ l
/* */
- X; f6 W) I$ K0 [- p- w) g' W3 Y$ E
/* 函数声明 */
+ e: y0 C T9 s! Z; n
/* */
6 f7 w9 ?) H4 r. C0 A; A& A4 x
/****************************************************************************/
* E; f1 y9 e6 c5 W3 q
// 外设使能配置
) \3 ~* M1 M2 I6 i( I6 o* K
void PSCInit(void);
% g9 w8 m7 G" t- n
+ w7 a' i5 y6 \# \, e- d
// GPIO 管脚复用配置
: r9 w5 l% A) @8 j) \5 h- j
void GPIOBankPinMuxSet();
* {9 V K/ O% M. ^$ B" ^1 t9 N6 C2 x
) W+ A; Q6 T1 h
// 产生波形
/ j) \+ B/ b3 s4 |0 |6 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; G" k# p% o/ z' e& h# {
void ChopperWaveform(void);
6 ?0 Z- v, G/ {' @# l4 T: {
5 A- B3 K+ j1 G7 K1 J1 A$ I7 w
// ECAP初始化和读函数
. K' |2 x& `# r' z
void ECAPInit(void);
8 Y5 f7 @0 M4 p0 z0 F# y: L
unsigned int ECAPRead(void);
) v0 z5 ]6 i! U+ D& t) _9 k; Z- ^
" \; V, o8 q; O6 O" |3 l
//ARM 中断初始化
( @; X* l7 R1 d
void InterruptInit(void);
' o& h7 c4 ^; G8 U- G1 z
* S+ p: I" w; D! _6 b
// PWM 中断初始化
1 X! }+ d- v& m4 |, Z3 o
void PWMInterruptInit(void);
. _; X# C# K, |1 w/ z
// 中断服务函数
2 k2 l# j) n& a1 y2 a$ I0 {" C3 V
// PWM 事件
2 q& X5 y$ r6 ~' {
void PWMEventIsr(void);
) m; Z; Y9 G9 s' {7 v5 P# b& s" R/ s
// PWM 错误控制事件
( A/ B8 ~3 j% Q
void PWMTZIsr(void);
1 r/ U7 t; g" |" C5 b# x2 m
0 c: d1 B* `: F
/****************************************************************************/
2 z" ?' ~, E% a+ p( o! o1 Q
/* */
" B& w6 n: q3 e( E
/* 主函数 */
" {: `1 v6 K8 C Z; U2 U# q) S
/* */
1 g# B( O5 a$ L' F% A7 ^" U
/****************************************************************************/
+ y! Z/ |/ p5 o$ x$ O; k
int main(void)
) Q; z$ [' ]+ v, _; T* H& D
{
' c& ]# B0 [/ ^7 K
// 外设使能配置
S* t- b( x0 h& |! v: K G* q5 M$ }- a
PSCInit();
" Q" U! x6 ?0 X! p" k: ^- w" V/ H
1 ?' [& C& o! ~5 `* w! ^
// 初始化串口终端 使用串口2
; I4 `, Q; r4 h# z7 }2 ~+ U
UARTStdioInit();
& l/ T+ s0 ?' h1 ^0 g3 l6 A
, O% p! _) T0 \3 W. o
// GPIO 管脚复用配置
( P* m. V8 \! Q" W3 J6 b6 t8 _/ t
GPIOBankPinMuxSet();
# o! l* h7 Z2 _4 P& O
1 a. O' K& ]. L4 m- X1 u1 K
// ARM 中断初始化
- Z7 B0 [3 T& G
InterruptInit();
1 K8 Q- _/ U9 p, X
3 ~5 O8 w# d2 t& o& o% x H, Y6 y
// PWM 中断初始化
% @( U; ]0 Z. ?) d0 v# v
PWMInterruptInit();
! s/ o* I! h" ]4 @3 p4 N1 P
% `5 t% Y# H$ ]) }1 E& ?
unsigned char i;
- I& m# b% ~/ R* s
unsigned int j;
1 \2 M1 @/ Z. O/ t
# _' G+ ^) k1 L& p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( `8 Z" r% n$ J- Y
UARTPuts("------------------------------------------------------------\r\n", -1);
+ N# g* a+ u8 J' S$ j- z. i% t6 K
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
* a" ~2 E3 v/ B+ }+ o4 c! D+ k3 x' m
// 产生波形
( p& j- T7 U! o) E- r" R' l9 _3 B
PWM1ABasic(25000,50);
" H( S" E& V' K) O
9 G! T' ]7 ` j% q$ z4 R
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
5 X* R- p$ h& t9 j& m1 y: p, I
UARTPuts("------------------------------------------------------------\r\n", -1);
* p$ Y8 q) m' H5 f/ ?
- p3 a% L1 o5 i1 { y6 C3 h! G. D
. _4 q2 i+ d) V r9 u
4 X' q, v1 _: R# o' @ _; @
UARTPuts("------------------------------------------------------------\r\n", -1);
+ G& Y+ n2 \0 M4 v- ]2 k
UARTPuts(" C6748 ECAP Test\r\n", -1);
( {$ R( p3 o' B/ N$ Y
// ECAP 捕获初始化
5 f- I" H4 L6 ?( _2 r4 J, o; ^% j
ECAPInit();
. C& W0 r9 L% P) Q5 N
UARTPuts("Initialize ECAP.......\r\n",-1);
+ G+ D4 w) E. _2 v
for(i=0;i<5;i++)
: u2 y- e# f* ^9 X5 K
{
. c b: T: j2 Q% A. \# F
for(j=0x00FFFFFF;j>0;j--); // 延时
1 Y- b. o8 Q9 E( ~2 l1 K
ECAPRead();
8 {0 Q: F/ G& b! A; ]9 H
}
0 g* n) I0 D* t) f
UARTPuts("\r\n",-1);
% m& h: u6 s5 F
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! Q7 z5 g/ Y5 f2 x8 I
UARTPuts("------------------------------------------------------------\r\n", -1);
3 e' x: l4 Q, L
# {4 \; Q/ [. t5 S
// 主循环
8 ?/ Y0 k8 ^& b1 e$ j1 O) E
for(;;)
* N* Q/ t' N8 a2 G- { W! R2 Z2 u/ J+ P
{
1 A) C) T: A5 F& h. U$ @( R
+ @& u$ q5 ?3 @
}
+ j; o" X2 R5 f$ L+ Q5 ^( X8 W1 K2 i
}
* F! h5 I: h9 O* Z0 i! y# A4 i
, z9 y R2 Q1 A8 \$ S
/****************************************************************************/
: |9 W" R- a7 F! j' L0 Z0 d4 M, }
/* */
; A; L$ N( {, L
/* PSC 初始化 */
6 T0 |4 B- Y/ S% a, M3 C8 H1 ~+ E) M/ e
/* */
. e( t R+ O: ~% Y4 ?- f, |
/****************************************************************************/
4 e; [- r5 e) E0 ^! E: u2 z
void PSCInit(void)
/ @/ }! S1 _' e% s+ a- E
{
6 q" d; N! T/ a* v% |& _* Z, ^
// 使能 EHRPWM 和 ECAP 模块
( i$ \( T+ |5 r: l& T4 l
// 对相应外设模块的使能也可以在 BootLoader 中完成
2 E! |) c- Z+ R) w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 R! @% b O6 e- D S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 Z/ c. f4 _* ^
}
h( Q c e3 R$ m
, o& R9 ?" n; n( a" a9 o
/****************************************************************************/
# J: A1 ^2 h! w. f& i
/* */
& i& h9 C9 O6 |/ q4 a6 @6 M
/* GPIO 管脚复用配置 */
! d( [3 K: D" f- h, \2 p
/* */
. Q! l! K+ k/ K" x3 C7 A( U
/****************************************************************************/
, a9 H; ^+ w6 \, ]
void GPIOBankPinMuxSet(void)
$ q( ~+ R. B+ J# `, V9 o
{
6 H% ~7 k/ R A
EHRPWM1PinMuxSetup();
6 c6 B$ o) Y3 K# K; E+ W0 @
3 C0 k3 g6 U0 I9 u
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& R, \6 }4 L, N
// 作为捕获功能时管脚方向为输入
7 }; I; j+ q$ C9 f, \5 ]
// 作为辅助脉宽调制时管脚方向为输出
; ^2 X! `. d7 E1 m9 {3 W! j
// ECAP2 / APWM2
- p6 o2 E) N4 |" x
ECAPPinMuxSetup(2);
- l7 U. x6 {/ K' _( O
2 W9 u8 a% Z& g1 u$ s* N9 ~/ T
// ECAP2 / APWM2方向设置为输入
1 v3 u$ A* Y" w5 s
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
# N! D: R" i/ n7 ]: W) j
}
- f _2 F/ p2 _6 C5 _" u- d% W
( ]3 r0 i$ T0 Q3 u4 `
/****************************************************************************/
5 x3 `- B7 @. r% p
/* */
7 o' d, f4 w) R1 i$ P8 z
/* PWM 输出波形 */
- J# Y$ E( @3 a+ ?# Y, v3 z( ^
/* */
# P# O4 X5 L7 T8 D( Y. h. d$ l, D
/****************************************************************************/
3 @* A4 M5 n1 z# e# L. r6 _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* i c: A9 [5 X4 F% J
{
7 _. f$ A" v( _6 O
// 时间基准配置
* u5 p# D" V2 u
// 时钟配置
/ C( g$ O7 |# A
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" ~/ p: Q6 j4 u
% P8 r/ d: A1 }" J7 `: K1 e J" q
// 配置周期
8 \+ H- ]; O* r( x$ }
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 Y* }% [* A1 b2 S' m; K
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 F! ], z( z+ x. S) ^- F9 b
( p O/ M* K! g) X( B
// 禁用输入同步信号
5 t( H/ `& m3 l0 E+ Z- w. `
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 l7 f$ s* Q) P7 C. d
# p0 D0 ~. B6 B( e
// 禁用输出同步信号
) |; r4 P T1 D) T! N4 k4 Z7 R
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
) C5 Z) |( m B( U
$ {' c* u9 z5 A
// 仿真(DEBUG)模式行为配置
7 M! o- |( J& `. l7 B/ y6 n6 [2 }# U
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, t# C7 p. C! W" X5 V
/ {0 `& n6 q. x# v* m0 v. f( Y) x0 E
// 配置计数比较器子模块
, A6 G j0 `; w2 [; C
// 加载比较器 A 值
% e& G+ |, t. a; N9 U: b
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( m* k5 l: [2 `, M3 J' Z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. z7 s- ^' l4 H# o+ d
- _0 h1 @1 Z0 L: U, v# W: ^
// 加载比较器 B 值
( F9 O6 Y2 Z, }/ Z7 f9 H
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 e. X& e( }3 Z7 f# n! G9 i
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 R q# |" {. F( R) S. k4 M
# G) g1 m% ~$ B1 B z$ u9 T X$ m
// 功能限定配置(输出引脚触发方式设定)
( c* F$ `4 q5 W; L
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" K* c' D8 n. f+ V8 J8 w! y+ z. o T5 N
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
# q7 X. a0 {5 t* E f
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* j( e/ h! N4 c6 _; M$ n
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: @8 W$ I; Q& j0 ^) `7 t( T: c
4 e9 E8 a6 ~4 T, O* K) U0 _" R
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; o- ]; M" R. x- k' K' c/ y
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ B$ s( x, G; {* O
6 R( [" y6 G9 p0 a
// 禁用斩波子模块
7 H1 u: g/ D# q
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) H8 C$ T/ C0 R
6 l& M K6 Y$ O. p* [2 k
// 禁用错误控制事件
( I; j5 C5 @, }9 |4 g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 {# J+ d" U5 C" k8 H7 a% p1 y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
# ^( ~; w( l |# M! q' |# N6 F' t) P
6 s/ E( s: g- C
// 事件触发配置
8 v- o3 d X4 ] }' V I0 K
// 每三次事件发生产生中断
2 q, \# o- y9 E
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% r# R8 Q1 @1 F7 S0 w- Y2 m, m7 v
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( Q- t7 A+ c, S3 S" e7 A u
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ i; X4 N+ J# q; b
// 使能中断
& \% l0 O: O8 |7 S4 n$ S
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! X: B% m7 w5 @) j4 Q; [
! M& z: F. C! ^5 _
// 禁用高精度子模块
: Z; u8 ]' T) I0 b
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ a& o# x8 @) K, ]
* }( d3 I% q$ M" i% Y: |
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* p# u4 s$ z9 L4 s9 j$ Z
}
3 B- ]" Z/ f$ W4 K9 p& _$ O
3 B% S8 N1 a( p/ ?
void ChopperWaveform(void)
. y# v% B' r, ?" Z9 {9 i' {
{
3 ] D- R* c0 |( Y7 X+ s
// 50% 占空比
$ F* j' _" `. F3 p- f3 Q/ U+ E( `
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" x0 q* R4 d0 U% N
// 4 分频
) Z E2 N, ^7 }. P! }; s, A3 Q
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& W0 B( x2 }* Q4 J% e5 D9 @
// 单个脉冲宽度
. K0 U2 c. w' I( M) f1 K: X. V' M
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
) s% g4 D. k" h7 z/ ^$ T3 h
// 使能斩波子模块
4 b& u+ u+ M+ z! l
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& o6 a5 @0 I; M* [( E
}
" y0 g, Z1 M q8 ?8 F9 X( x+ Z8 J
3 D5 [: |$ I& E7 e, z, \- a
/****************************************************************************/
7 a4 S, ~/ R& V$ Y9 t8 y
/* */
9 i( E% P0 M/ D( i* E, J+ h
/* PWM 中断初始化 */
; y" d. P# k; k& F
/* */
- G$ N5 x$ ^8 e% e
/****************************************************************************/
4 x" T9 E2 Z% @8 E% A6 ~- H
void PWMInterruptInit(void)
6 u0 n* g X+ z( q& g( \
{
3 Y+ a1 Z. J% v) _) L
// 注册中断服务函数
" X4 @, v* ]# l" V; @
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 @- \, O4 e3 C/ u2 t: ^
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ r* E' v! t& \+ U0 h6 \2 }" H# x
r$ x! B3 k2 [* [
// 映射中断
1 V! V0 z ?6 J9 _( p+ M- M
IntChannelSet(SYS_INT_EHRPWM1, 2);
& y: l. w: t. N! K- I9 {! O. ]
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
" H& b8 P! y" W8 |
- |, c: i; z x* \; ~) [/ o
// 使能中断
, `- G% ?. s$ _. H
IntSystemEnable(SYS_INT_EHRPWM1);
5 D* ?+ k4 |. n0 U* A1 |
IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 B# w/ x- `" } t
}
0 o1 Z, }# F: L8 d
" r R0 i' ~! j- ?& v
/****************************************************************************/
2 o) k# T0 G3 B4 T3 x6 u
/* */
$ t, i; H( y* F& c6 J8 G
/* ARM 中断初始化 */
" I$ v2 J6 Z/ @4 a
/* */
; t# q2 d# y. r8 q3 v, H
/****************************************************************************/
; {2 A; y/ s: v3 x
void InterruptInit(void)
" k, y+ v$ b2 ?9 |
{
' U; S- e6 [" o0 V( c2 x" `
// 初始化 ARM 中断控制器
5 s. M7 t$ a2 d0 {
IntAINTCInit();
5 a/ I" `- p+ d
- ?/ B5 K: D+ k7 S
// 使能 IRQ(CPSR)
+ R& J9 s6 }- f
IntMasterIRQEnable();
1 j: J" N( I* a, ]6 |9 U+ R
5 _% e! H0 V5 p5 q
// 使能中断(AINTC GER)
9 V& Q* w1 ~! E5 Q/ [0 o
IntGlobalEnable();
0 b7 G6 M7 I4 C; V" @9 s/ Q
9 Q# H+ r% W, ]9 V
// 使能中断(AINTC HIER)
/ C+ T- v. c* s7 V
IntIRQEnable();
2 E+ X% c k2 F6 q9 j
}
3 ~: U% L1 W. ?0 S
0 ^" M: v( x% x6 X. U' F5 \6 G
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
A0 w1 [4 ?3 N$ Y- m( }& O
/* */
; C, M: o( U/ t3 k
/* 中断服务函数 */
7 `! p; g3 V. M2 A: \. Y+ A8 o
/* */
8 g+ y4 G$ }& p- n) K3 w/ m# ^
/****************************************************************************/
, L7 D, g# p2 @/ t) ~( ]2 T
void PWMEventIsr(void)
/ y% w; }9 z+ Z- q& ^
{
/ U3 |3 N# f6 O0 _7 V
IntSystemStatusClear(SYS_INT_EHRPWM1);
. @) ?+ n) p& [! S
* Z3 y# J" u- f" Y, E: G9 J G
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ ?4 K/ }/ A: E9 ^7 {
}
# E" {* t9 p5 a! m: f
5 J# ?1 @( S* w* e! O9 H/ c" g& S
void PWMTZIsr(void)
4 V- z- T) Q1 |* M3 M3 g
{
7 D, V( t3 y& L, e# K8 _
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% r+ k7 }9 n) S. u# L, ^% G0 r' o
6 T9 x, ^- x- `* O
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
. M: M* p6 P$ Y8 e2 w- \! @
}
2 \! E* o! O7 n- j( [1 b1 |/ q
; f$ G' h6 Z& m8 L; T$ T4 W( B
/****************************************************************************/
& a2 ?0 b4 ^5 u5 t/ } [
/* */
! m, |& W# b& o% J% I7 y8 ?2 `
/* 初始化捕获模块 */
; U& c& g7 j1 ?/ U" z
/* */
3 f' {/ ]* K( m; p# @) h; ?$ t
/****************************************************************************/
; i/ B9 t' `) I! ]
void ECAPInit(void)
2 Q, O, m* m! `6 X/ I
{
2 I0 p, X/ l+ B( k9 Z5 p" _
/*-----设置 ECCTL1-----*/
* N# }3 Y6 o: {
// 使能CAP寄存器装载
9 |! U2 Q5 u$ I Q) q. }
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
6 K$ I: S. a1 m8 s' a; L
// 设置预分频值.
4 L/ P* J4 H* S v3 F
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; D1 E! a& L. I
// 上升沿触发捕获事件
; W N0 k* h) A$ Y0 a$ M: l
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
+ k4 z+ K5 y% T* d# L8 b
// 输入捕获后重新装载计数器值.
7 i. a( D! x0 f9 q8 \3 X# e8 m+ E5 [! T
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
# G% u/ v* \6 R+ n0 w |
& A# V" O* h( V+ f
/*-----设置 ECCTL2-----*/
6 O. C; S/ S# q0 f1 ^& E2 c
// 连续模式
* I$ s: E1 P( Q6 X3 K- U% p4 k6 K0 e
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
* n# x/ |. C* a7 M0 l4 O" s/ s7 C5 H
// ECAP计数器TSCTR持续计数
+ M7 v/ Y4 S& `) A
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
7 o% U! ?6 T" M2 j
// 禁用同步输出和同步输入
6 @+ x8 c0 ~& e0 p- b& d
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
* d/ @# q1 X$ D
// 配置 ECAP 2 为 CAPTURE 模式
" g7 F! g3 o2 T! r$ d- L$ `
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
) E& s3 {0 q' T( R5 d8 M) y
* t. X6 v# ?8 L. E! ]
// 使能中断
, r! W4 K2 X5 S i1 S1 e
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! @/ o% e I5 W4 N; H' \
}
/ o6 [; L: \' h5 \ v! N# U
% h, o* _: y0 o6 { ?
/****************************************************************************/
1 ]0 `5 L! o6 U' \6 i' G4 w* F$ q. [
/* */
8 Z {* K2 v, e" Z" Z
/* 取得捕获结果 */
* ^. f$ _( p5 e+ K% E) N/ \
/* */
7 G* o- k8 {7 w$ N3 }/ m
/****************************************************************************/
. C+ P( ?( ?8 h+ Q( q* A
unsigned int ECAPRead(void)
- G1 {" j: k. q/ J" a7 `
{
1 K/ N9 a2 k+ g" i2 g, `. D! _; W
unsigned int capvalue;
' o1 K( x$ T0 N0 z1 \7 M
unsigned long frequency;
/ V+ C: }+ L/ k' t. S, ], `& x
0 J" W3 R* z) l5 `1 U4 \* T
// Event1 中断标志
6 }$ K8 z3 @/ z# I( g
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 L" S W4 h X
{
1 r, P, X& q% e2 q/ v0 g% T
// 取得捕获计数
3 U1 B$ A- A4 q" ?9 X O# h7 L
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
* V/ O* G2 u/ j# T2 t, w
capvalue = ECAPResult.cap1;
: Q1 G0 t; t5 S* W. N6 [
, ~- J" D) U/ A, X: ?
// CAPTRUE 模块 228M 时钟主频
; S3 O- a/ D, r$ T/ A( {- t
frequency = 228000000/capvalue;
( e2 C J2 {' Y6 S$ e
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
5 K8 d1 a5 C# G3 O& I3 A
+ r& i( i' H0 n7 |+ x7 i$ q+ W
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
$ b( F4 Z( A/ c" n. ]
// IntEventClear(SYS_INT_ECAP2);
3 ~+ I+ P+ @ M! ]3 K
}
! |, I+ H& c7 V* i( d
return frequency;
7 Y& _# s% |3 Y( x2 u
}
. I Q! Z( a; x! Y+ w$ ~' E) G7 Q
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; ]' |" F: y, R# [5 k
[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