嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
, i0 d. x4 x! v: g) T
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
# D$ `0 N6 \1 B" a& X' ?3 r/ v
/* */
6 d0 H" X& b! o: }9 m# v/ k. g
/* 宏定义 */
+ a. C/ j" v0 O/ R
/* */
7 C! K- q8 z- K s8 U# e
/****************************************************************************/
& C# K5 }# h( ^' |$ w4 M9 E2 S( S' {' H
// 软件断点
# S+ t9 j4 V3 X, \
#define SW_BREAKPOINT asm(" SWBP 0 ");
$ |5 X* }: [' s3 b8 `. O e( T- S
" o9 g+ B/ Z% J2 O
// 时钟分频
1 v, ^7 {; U$ R8 f/ E6 y- d8 m
#define CLOCK_DIV_VAL 228
4 U% m! L( ?: y
1 z$ {/ w4 y* W7 M9 g( L
/****************************************************************************/
1 |( ^2 u& g$ }7 `% P% P, Q
/* */
# O9 }8 ]# ~4 r/ {
/* 全局变量 */
6 d- `, j! @: i/ W" T7 l) p
/* */
: w+ y l) ]" L: h! Y
/****************************************************************************/
2 _' m1 G5 U) x
ECAPCONTEXT ECAPResult;
1 e7 h; l: k+ X
`. Z+ U, [' f3 I% E
/****************************************************************************/
' Y; q- t% G, S) O( V
/* */
: F l4 e% ~* s3 \9 o! u4 g
/* 函数声明 */
# G) h2 v1 a7 c1 w. p
/* */
6 U0 \8 b. P( C! g+ K8 x
/****************************************************************************/
$ ]$ O6 t' j3 a+ p( G: `
// 外设使能配置
' O, S& g& D& ?8 V/ q: d- Y1 E' B
void PSCInit(void);
: O* r1 E ]7 `9 v8 K; s3 ~( {! K
8 l! {# N% P( \( G5 Q8 E
// GPIO 管脚复用配置
# z3 S1 m( V5 ]) V5 ^! `5 Y( l) T; J
void GPIOBankPinMuxSet();
6 ~+ ~9 c) U8 A3 f9 }6 R/ `) M* {$ J
# X1 b( Q, i! |# v; e/ ]/ E
// 产生波形
5 ]' G& _1 s3 M2 E4 C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
& B w" g- u4 t N. I6 }
void ChopperWaveform(void);
2 ^. I: S3 ]; t5 n+ F( D
# [$ H. a% `# ~- O( q- L- r: _
// ECAP初始化和读函数
7 P, w9 @& q) n1 }3 T4 C/ M5 _
void ECAPInit(void);
' p- S* t, r; R3 {& F, d6 B' [8 ^
unsigned int ECAPRead(void);
4 |. \# i, x- Q5 Y2 O
- \0 H0 s2 c3 _9 c5 {
//ARM 中断初始化
( U0 k) P, T' p2 F( Z: b. m' p3 y
void InterruptInit(void);
6 ^( y- N k$ T
2 e" q$ O/ a4 d' B3 |! R- f
// PWM 中断初始化
- M( _" Q7 N' k4 F/ _& o- Q& a6 s
void PWMInterruptInit(void);
8 m: {1 ^) j. a/ l
// 中断服务函数
2 v( l6 @& f: `, w4 h% j4 f* b
// PWM 事件
# `6 d6 Q. x( f( ~) w/ x+ k. v0 h- L
void PWMEventIsr(void);
: V, @) i8 b: W( C, r& b
// PWM 错误控制事件
) W3 H/ m: Q- q+ ]% v; Z
void PWMTZIsr(void);
1 Q# ]* S5 N, j2 A' O' g( A, e8 y- J; u$ S
; L+ `* z6 e, [5 C
/****************************************************************************/
( k. l, P+ V# J+ ^; f
/* */
4 q4 B9 A5 I6 _! `
/* 主函数 */
9 U1 \& g/ u. b" Z2 e9 u1 Q
/* */
+ g; T, ^. d/ x; J, J m
/****************************************************************************/
- a x' O7 `+ f7 f
int main(void)
0 U$ X& r- Z/ d! \9 S @
{
2 n$ h5 u5 K. m+ p
// 外设使能配置
8 C1 z" [- l0 c4 A
PSCInit();
% o9 b( N) I2 A" R: l/ C8 R
4 t- t& b4 [8 J5 l X. R
// 初始化串口终端 使用串口2
- P' H! B: O2 `1 n+ C7 _4 ?: T
UARTStdioInit();
7 h( t3 ]* _% O) S# F; Q$ f
# f' o! v# a5 P5 T( `
// GPIO 管脚复用配置
6 i7 R$ G/ l4 c% b$ A8 W9 B: U+ f
GPIOBankPinMuxSet();
; U; H. E- k/ Y: }
0 A0 w: R& e& I7 o- T. T2 B# z* K9 p4 f
// ARM 中断初始化
( S$ f, A. ?' c$ z
InterruptInit();
3 `8 c# {- A! U! ]
% _# D5 M( i, d, j
// PWM 中断初始化
: B9 n+ N4 [8 h0 s
PWMInterruptInit();
2 y, ~* n; i/ i4 f
" n: L% Q* B2 T
unsigned char i;
3 F( S0 d" r. p' y# C8 _( q) O- J
unsigned int j;
6 ?" c' h$ |4 a
' L* K! ^3 q2 H. {: i# `0 x
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; N. v: O7 `7 T# t9 e
UARTPuts("------------------------------------------------------------\r\n", -1);
/ H( M/ _3 Z9 i2 H& G1 g
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
( w- U! ?: \8 Q" }, A1 K
// 产生波形
; O1 O* O1 }) Z. N
PWM1ABasic(25000,50);
4 I- o8 {- x4 u' v- y
4 H$ h2 G9 Q* f! u3 q7 z# A8 B
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 Z y: \0 k+ {
UARTPuts("------------------------------------------------------------\r\n", -1);
; w( `- u; h, [; B5 x
7 D1 \& o# j+ R9 |
. I6 B5 `3 {& b6 C0 s0 a8 Z) b
" N4 w# P+ c3 O6 L1 j$ L
UARTPuts("------------------------------------------------------------\r\n", -1);
) u9 K7 N) i9 X( `- i1 c1 ?( B. D
UARTPuts(" C6748 ECAP Test\r\n", -1);
' K- E2 n/ g5 a3 s$ o5 [
// ECAP 捕获初始化
& K( _' m. `5 @
ECAPInit();
0 Z0 s& F0 r3 v. }- Q
UARTPuts("Initialize ECAP.......\r\n",-1);
" F" n2 @" q* ~
for(i=0;i<5;i++)
. I5 e/ c' W- B( |. Q7 V
{
4 X8 h; q( h6 B6 H5 G. J5 i
for(j=0x00FFFFFF;j>0;j--); // 延时
1 v. b- a1 M8 c. S: {, e7 i, n
ECAPRead();
$ h# i- n& D `1 c
}
+ u; I" k$ j: D4 N
UARTPuts("\r\n",-1);
: R3 V6 R: c/ J: z- a
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; v0 [1 c/ X' |8 X
UARTPuts("------------------------------------------------------------\r\n", -1);
" R! N2 {( u1 S/ b/ p# ^; z- V
3 A& ~6 g9 {, \ r* s
// 主循环
( ]& y8 o1 g1 ^7 y0 @+ d
for(;;)
% X0 F: X2 J2 C7 }
{
" H( }0 n3 g. `: h
- w7 V4 b+ _8 R6 O' u! o. f
}
! E1 ?$ O. F) J7 ~6 o' E; ]8 B
}
/ e4 D% v3 X/ P" F
. d/ K: G8 D& m" v* G
/****************************************************************************/
3 n& w2 a) }/ O9 V6 h% Y; k
/* */
. F$ L. Y1 ?, c2 k
/* PSC 初始化 */
0 Y* z9 z+ d ^- j" ? @$ B/ T
/* */
5 N' n7 T; n) {& W
/****************************************************************************/
0 i8 V5 X- }( o R& d/ Z" a- Y4 i0 Y3 u
void PSCInit(void)
* ?5 z! l/ X! ~3 ~4 n* s
{
b) Q1 f" a% z( j% G+ y4 L: `
// 使能 EHRPWM 和 ECAP 模块
. D( [5 n5 r. r/ V
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 N7 y) `7 F) ]
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 }7 v3 N1 Q+ }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 h/ A- U! ^ Y
}
: D8 ?* f2 R1 c+ p2 s# \
+ S Y- R( c# p# W, p$ v0 P/ ~2 `
/****************************************************************************/
/ _; m( e* f, b3 I! ^$ ?7 l
/* */
. ]0 |9 `' C# H3 r3 g
/* GPIO 管脚复用配置 */
2 N$ U/ v. y) ` ]
/* */
! F9 G) n7 w ?, B" L6 Z- o, D0 d2 |, Y; O
/****************************************************************************/
0 e) t8 E1 W! T* w( y
void GPIOBankPinMuxSet(void)
* F8 s$ W8 j0 q$ m; `
{
' g7 M% p0 n' Z1 ?
EHRPWM1PinMuxSetup();
L' _6 d! A# d; ]: Z
( W6 {" M, M7 X/ V" ~3 z
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
! p1 y- x4 e9 S. ^& \7 I1 x
// 作为捕获功能时管脚方向为输入
7 I/ k* M& A W
// 作为辅助脉宽调制时管脚方向为输出
* C0 Z# e0 V% z1 ^6 r; `) a
// ECAP2 / APWM2
6 k/ u) A2 B" Z# E% p
ECAPPinMuxSetup(2);
5 v! @9 }, C6 K* Z; E* l
0 M0 m/ y6 A. H1 Q' D
// ECAP2 / APWM2方向设置为输入
5 f9 H! a; K* \- Y4 }0 m) C7 H& L; C
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* L; j( V! o1 O1 _* a. L& ~8 q
}
- {, N; |0 x& ~. [/ a: T
7 _2 c" b+ Z) S# @* s
/****************************************************************************/
9 `0 c8 i. \1 y7 Z6 ?$ a
/* */
1 J( A+ [5 t4 H: |- A, i) @0 B1 i* d
/* PWM 输出波形 */
9 g3 v! T. W2 X% V+ e. m7 x
/* */
, |+ @( ^, r, o5 ~% M! ^
/****************************************************************************/
3 d: n/ ~) @, L5 X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ a% V9 @. W2 U; s4 R
{
/ W/ ~+ t; d4 W: I1 V- F5 ^# n2 Z0 W
// 时间基准配置
4 C/ d5 S5 n) C! L+ b
// 时钟配置
; U8 ]1 ^, Y' {! s# P
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ a0 P. i& d% v/ q, e# e
1 N% Y9 |% F3 n2 n% v4 ]+ H* C
// 配置周期
; m0 T4 J( { K% z4 s' w u
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' z, e% j' F: f7 [# s8 G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 Z* g" j- r( S/ H+ ^" i
! A- P `) s! h! l3 s
// 禁用输入同步信号
3 u [7 Y* F |. j
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ ~) u4 p6 p$ g0 o0 t
) a2 d& H" S0 Y9 |; o+ {8 i
// 禁用输出同步信号
7 q5 H0 v0 b# `5 {+ Z5 h& E* b4 {
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# X# x, w/ [7 f3 { b) R, P# N
7 o" \" L; v2 X0 c+ e
// 仿真(DEBUG)模式行为配置
+ M; x9 f( R* a7 C9 k( c
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
. l. h, k2 h8 H6 }
6 ]7 Y I: v8 V. ~3 g! L: T
// 配置计数比较器子模块
; B/ A y. o. K5 S4 j+ x$ t
// 加载比较器 A 值
3 w% Q( w$ T- {5 Z. Q, @6 E
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
9 r/ N- y8 { ^8 {" I" _
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 s% |% b, I1 l6 C3 ]( o* f5 ~1 j
9 J: y" g" B* Y6 H3 Y
// 加载比较器 B 值
$ x$ z9 q; s+ F6 I8 N( s
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 n0 s; }$ K3 l+ o$ T" _
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& ]* A$ m5 |0 S
. X; p9 c# ~3 g8 C( i
// 功能限定配置(输出引脚触发方式设定)
) g8 [6 O- [( H
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' [* n/ N( K1 c$ b9 ?
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
& T5 A! P) J5 m( y8 R2 @ @
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* v$ _2 t) l4 s+ |5 V6 b
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ r3 Y, @$ ^1 I/ ^0 Z
% D R# S" ?' g" c1 I5 \ Z7 T3 Z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: V6 O N2 `& X" r' I, x$ }. p
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' [4 y' s6 `5 w2 H2 R
, W* o; _6 ~. C; {8 R/ Y. U
// 禁用斩波子模块
# W1 \1 ~2 C i& t! E
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' G4 I. |6 [# g: t3 X, {/ H; ~
# t' F! Y; |, I& U# E' ^, _. G
// 禁用错误控制事件
$ q: _. X* b4 L
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- B2 K% p) Q v& x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 M2 B6 x$ ?, i! z! l9 q: q
! I( J# y Q% h8 d( \
// 事件触发配置
+ }' S. U5 c* V' W9 Y5 G$ E
// 每三次事件发生产生中断
9 V1 b% Q+ C, l# M: ^0 I
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: K$ E4 F C7 ?, g! S
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
5 j0 p' M8 ^% e6 A4 ~% s. Q8 F5 k
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; g% A, I8 R, n
// 使能中断
7 P# g* ~! z# Y* S, e, m6 `
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
w" o( B* t% a8 \/ E( {
/ S! I+ A+ ` u& \. I
// 禁用高精度子模块
! u8 H1 p! h7 [, _" z2 [7 L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. `, ^2 V6 t( F ~1 w9 F- F. K" T4 s
: x, }, R0 |$ d6 \% T# N3 K9 \
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
p3 ^1 J; J7 m: t @, ^
}
* O6 ?3 s( a7 X* F' R6 |. J0 H: j6 t
* N" c0 ^ Q1 D7 h+ ?
void ChopperWaveform(void)
% E& Z4 Z' h9 l) C5 q' @) @2 N
{
& l; x& m( i7 K5 I- c
// 50% 占空比
" D# P) q( S3 S: ~2 J
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, t. H& p) t( q$ v& F h: v; y
// 4 分频
5 k# L7 v# L( b% J( C9 _2 k5 |; }
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 M, h: _, V' G' C0 V& m
// 单个脉冲宽度
5 M+ S" e# v) V2 {& P( H
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! }& ^) E, O' `
// 使能斩波子模块
. @/ B) p4 V2 w8 l$ V# V
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
A5 Z$ R2 T8 b* n- O/ I9 q
}
" [- m! w4 q$ E& \
3 A9 ~. W: A* _4 Y$ ^2 M$ z
/****************************************************************************/
9 G0 L7 R) j+ S e" f
/* */
, S/ J" E8 V4 Z- d n. k4 R' s
/* PWM 中断初始化 */
L. z* k- A) J
/* */
i# N- g1 ]0 K) j$ h
/****************************************************************************/
% k8 G/ ?$ z+ I! l* V$ k
void PWMInterruptInit(void)
/ Y# @. y- _0 J9 S
{
0 L- }* x( q$ R3 s" t
// 注册中断服务函数
( N9 Q9 q* p; K% d) J
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( P2 V4 b4 F% C
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; V9 r$ N1 [1 [' l" n: T8 @
`+ \. n! G2 G5 O
// 映射中断
) c: D7 N9 }/ y J \
IntChannelSet(SYS_INT_EHRPWM1, 2);
0 r* p, `! Q9 p2 C$ n4 w
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# S$ J0 t% h' L' I, X4 H
( V$ B/ _, i4 z+ n3 V8 T
// 使能中断
# G% N& ~5 l% V5 c; u" ~1 k
IntSystemEnable(SYS_INT_EHRPWM1);
8 @6 m0 N% V8 m3 e1 C* }- c, Z% X' }
IntSystemEnable(SYS_INT_EHRPWM1TZ);
" w ?" j0 u# P/ ~: u
}
7 F& P+ P: B/ S- `4 N# g
( k9 X& w6 }0 S" i- { ^
/****************************************************************************/
# o o3 O; C- `5 f) s$ |
/* */
' z/ S) [! P3 ?# ^ ?
/* ARM 中断初始化 */
* |7 b+ p& f' o$ q
/* */
; |$ G( Y. `" F2 T/ I3 c1 d
/****************************************************************************/
# |7 ]! _* u& S+ \
void InterruptInit(void)
- a& Q2 @: ?* ]2 `
{
' F! a' E4 {/ f: g' P) T+ H- b
// 初始化 ARM 中断控制器
( M* h( N. ^! ]
IntAINTCInit();
" ^! L6 X* ~# t
! b. T9 Z6 h9 y0 K4 {+ ]
// 使能 IRQ(CPSR)
6 B: ]/ j# @* O! w
IntMasterIRQEnable();
- N% v/ v- o, ^1 [5 l
) \( C& C5 F& R' m# r& H4 Z
// 使能中断(AINTC GER)
4 R7 V: ^# E+ h/ r
IntGlobalEnable();
2 D0 g- O8 w7 u, ^8 P0 W
2 x0 {) h h7 i+ f
// 使能中断(AINTC HIER)
4 B, p& |# q% y3 n3 q q
IntIRQEnable();
* X* m, W1 w, s) S/ B
}
# e3 H& ~6 f- ~' R! D/ m$ A
7 W/ K q) E7 S/ y4 x) Y4 d; r
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
9 ?) @0 A: u V
/* */
( U( g0 B/ ~8 T. k$ j1 w
/* 中断服务函数 */
/ n6 b0 F% Q1 t; U8 W
/* */
7 O* U2 c4 G! R* G) P+ f! L; J+ {/ ^
/****************************************************************************/
* w1 N; N+ `- e
void PWMEventIsr(void)
U/ o$ B2 T% q( J
{
8 V7 P5 f1 Y8 b1 \- |
IntSystemStatusClear(SYS_INT_EHRPWM1);
! J v* H9 D* N
$ J0 s: e' h. v' K9 C/ i
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- I( A+ `3 `. t
}
% ^2 q: w' N+ V- ]# F% C$ N
2 F2 l: x6 G9 Q0 O8 [; Q! v3 X
void PWMTZIsr(void)
( M7 E! n1 g- y( p- F5 H4 V
{
6 E4 s! x' X, a( W* N( H
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
d- w. E1 E8 E9 f S" k
3 ^2 O1 |" Q; n2 O
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 { ~7 c2 @( p: i6 P% [
}
: x9 Q* A' r( e% q, ?( P: p7 `7 S
8 S# y# M- m2 I
/****************************************************************************/
' w+ X8 |7 Q9 ^0 A
/* */
5 D6 c) Y% O8 h8 S3 D
/* 初始化捕获模块 */
+ X' n" L6 S0 A, c8 q: c
/* */
( M4 S& T! r$ {, y% u
/****************************************************************************/
; @1 E; }6 B; C3 H% c" z( q* u
void ECAPInit(void)
: \ e7 V4 y6 `1 T
{
9 {4 G, k, M; l: o/ R+ b% |
/*-----设置 ECCTL1-----*/
" F8 n6 O/ w& T
// 使能CAP寄存器装载
5 I2 B0 R8 ]7 r K7 d9 H' J L
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
! }- g# F) z9 ^
// 设置预分频值.
( R/ q& ]/ m8 n
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
/ O$ l6 ]/ c8 J! R; `( w! w' }7 I
// 上升沿触发捕获事件
3 X- w n; o% }
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
4 r9 T! m( h/ G( G
// 输入捕获后重新装载计数器值.
m- s. S. U) {: ` ^
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
2 C/ t k9 P7 X: M
2 D2 o9 N N1 B) G
/*-----设置 ECCTL2-----*/
/ e: ^$ t5 g* c: m. _
// 连续模式
. h' L$ [, S# J% w, l4 x2 ?
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
/ _* C7 d/ p1 ]/ ]) E* N% e
// ECAP计数器TSCTR持续计数
( k; ~; h5 Q/ Y) X' c
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! I9 i6 R4 M2 Z9 a$ L6 d$ C
// 禁用同步输出和同步输入
y# C; d6 D. j
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
# y# z9 O9 S, x k7 R
// 配置 ECAP 2 为 CAPTURE 模式
4 n4 k9 `7 M4 I2 l0 f k4 m+ U
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
! T' V6 O! Z9 C/ \
: S& F4 c3 m |& S
// 使能中断
. F! u) k% ?( `6 r$ N# ?
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ U2 C! c- r5 E+ f, r" Q+ y; X$ \
}
9 I! |% x, s/ [+ f
3 o! w) ~1 n8 d
/****************************************************************************/
/ n6 P- E/ _! f& B' I( a- w
/* */
1 G+ s, ~5 O o
/* 取得捕获结果 */
& d. _" x# F' u0 p C5 Y- c
/* */
/ a! Z$ ~1 v6 z1 \" u) x
/****************************************************************************/
4 T+ D$ x, O7 v V6 }/ B5 ?, D
unsigned int ECAPRead(void)
& t( M* F3 v' ?* G& a7 Z" i
{
' a& K5 m6 a7 e8 j0 F; `
unsigned int capvalue;
" {7 v9 ~+ i- Y
unsigned long frequency;
5 d& V6 `1 w, q+ T7 h- D6 ]
+ O; G; ^, k& S) S% ]* v
// Event1 中断标志
6 W u; g; P! j% ]; n" H
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
+ A+ f8 _# u' x' ]7 ^6 j, q# J. K2 T1 j
{
6 }! ^& A5 m* G
// 取得捕获计数
' d* O+ A, }4 ~ Q# T
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
! a6 L$ \8 r4 p- v7 Q$ _/ h5 Z8 h
capvalue = ECAPResult.cap1;
6 Q ^6 A, O" p/ M+ H
% h+ Y b5 q: B' m4 L ?! s1 Y: `' C- f
// CAPTRUE 模块 228M 时钟主频
0 x" {+ N6 `# c
frequency = 228000000/capvalue;
: o9 [' n: H* c9 e3 v. m# |# Z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ c# r) f/ ]0 [. l- ^" m0 e6 c
' c5 z% `; L# c
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
) I1 N8 _. D F8 Y1 o/ r, s
// IntEventClear(SYS_INT_ECAP2);
7 `: s* s8 ?/ Q. H" w# ~
}
( l M' g% f3 a4 W5 e3 V
return frequency;
% v$ L" T+ ]* N3 Q7 M
}
: W8 @3 z5 I* v& I7 S& Y3 x) z
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
' w0 l9 I' T# L5 n
[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