嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" X& A) s5 e0 H6 c- v. d
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
' d2 h9 ~' ]5 S' P( @
/* */
- M% j- M. K$ v) Q
/* 宏定义 */
4 e# z: ]( c9 j: L
/* */
& Z5 ^1 c# S4 Y/ b% I8 a
/****************************************************************************/
3 U: d0 ^( r7 C6 n& \' z
// 软件断点
+ g, c, d9 }9 M0 k* o ~
#define SW_BREAKPOINT asm(" SWBP 0 ");
+ @! n' K1 i, u8 U, c
* u9 A" t8 w M# T
// 时钟分频
* j( Y2 l9 w4 U0 a. z/ y: _1 Y
#define CLOCK_DIV_VAL 228
% L& H2 p& p" S4 q% l$ _& e
7 a7 e( l$ y P% J3 g3 y3 A/ q! a
/****************************************************************************/
5 Z) d& w$ z4 j3 n7 l5 T* t4 l: e+ f
/* */
) U0 V0 I& H' f* N* u9 c! y
/* 全局变量 */
( g$ L# U7 d* {* F) t( Q; m& W
/* */
1 t, B3 x: Z, Y5 x9 S
/****************************************************************************/
% j3 L& l" @3 Z9 t9 _+ Q
ECAPCONTEXT ECAPResult;
4 K( X. i1 g, r5 f
1 X1 g. ^" f1 C3 Y9 e8 M" a2 {0 C
/****************************************************************************/
( G V1 I3 `5 T# M% p% h& n
/* */
0 u$ O: Z! l* j' {: C% q S/ n7 N
/* 函数声明 */
, C1 n5 \8 F. B- e4 ?4 Y$ H& C
/* */
& h: O& }+ m S! q
/****************************************************************************/
2 m4 {" g5 W$ Z# T
// 外设使能配置
5 V3 u# v% f) S8 c
void PSCInit(void);
. A/ {+ R" v5 E1 C9 n
2 e$ {% g. K& Q6 f5 X8 l
// GPIO 管脚复用配置
' Y& Q# P+ P2 y) J2 ~, b
void GPIOBankPinMuxSet();
7 b! b6 P. e5 w. H h% B
; m/ \) L% l; Z5 P/ z
// 产生波形
9 |+ b) Y( @. a4 @ f! V3 B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 O% w" }4 q% _6 G1 o: e
void ChopperWaveform(void);
5 N: N( i. L. @, K% P
$ N6 D# u6 ~5 p/ ^1 F- S
// ECAP初始化和读函数
- @# Z# Y1 [9 u1 O3 l2 u, r3 y" E$ X2 ]
void ECAPInit(void);
' X! {% l7 [4 J$ b
unsigned int ECAPRead(void);
' C. K0 _) h( T0 z! G1 T
! m L4 J9 T+ H1 D3 d! H1 }
//ARM 中断初始化
) S4 A, Z$ S8 R/ y. H( P
void InterruptInit(void);
4 y0 v/ C1 [6 L# g8 \, R2 ~
, V7 N: m' n8 f0 G1 ^3 q9 |1 l
// PWM 中断初始化
) D6 ~- X- W" G$ Y3 D. g
void PWMInterruptInit(void);
8 L! m. @. Z% p, z. `6 ^
// 中断服务函数
- ~3 o1 T2 i7 T- V% w/ g
// PWM 事件
1 D, g' s' ]5 O8 N' K3 e" D' G z
void PWMEventIsr(void);
. ]) I5 B2 B1 M
// PWM 错误控制事件
2 H; o9 [/ i! n0 S6 m
void PWMTZIsr(void);
6 J/ m3 d& H1 D; @) s' G- R
% W7 u& v, k% d+ R. X' N
/****************************************************************************/
]8 M* a# A2 F* @: d9 k& A2 I9 H
/* */
. V' H( s* z! z6 l
/* 主函数 */
% _/ g* h9 T* i2 ^0 ?
/* */
4 _: G) f5 F# s, R
/****************************************************************************/
8 ?4 x$ h/ c( T6 f1 c
int main(void)
( g* l- v7 t0 m' a7 ?
{
2 Q- o4 U# d7 @& l! v
// 外设使能配置
9 e/ _; g: r: Q4 l+ P
PSCInit();
. f4 X* X/ @$ F' o3 t+ ]0 s
5 f2 Y; |; |# e. p5 [4 X
// 初始化串口终端 使用串口2
" c. D X( S9 G8 p
UARTStdioInit();
0 H, J: g/ L* O, G
0 [0 L: S. h# N l; o
// GPIO 管脚复用配置
0 T+ Y2 ^& w/ y# u! t1 @* b3 v
GPIOBankPinMuxSet();
6 K# i" D/ u. l, y# o. |
! u4 T; C* |% y' x. B6 _
// ARM 中断初始化
: A3 Z; D1 E% U
InterruptInit();
1 [1 i D9 `! C* z$ |
2 e, m- T* |. A4 C
// PWM 中断初始化
$ O1 A" i4 `- r2 \) K
PWMInterruptInit();
/ K' a8 {9 e9 ^
+ a1 s9 Y/ _$ Q
unsigned char i;
$ v3 d9 O) D. b; n8 i% M
unsigned int j;
6 Z; e1 C7 _: T0 o0 q
" _1 A) v6 F% c' T
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. e+ f: S( v+ N, R/ ^. [
UARTPuts("------------------------------------------------------------\r\n", -1);
5 V' u! u8 \! V/ J! p$ |' i
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
- _0 W; J8 J7 i- }: N" J+ W+ T' a
// 产生波形
" t3 S9 O( }! n A
PWM1ABasic(25000,50);
7 s$ T7 x# f- E6 S' a8 ?
$ I. z& m# U, {0 ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 I z+ }2 P% v( Y
UARTPuts("------------------------------------------------------------\r\n", -1);
* O; |9 a. s5 l( z
2 ]- h8 {" W1 F/ _$ ]
! `& c2 U! i$ ?; N. p j( X) u6 [
0 q/ y) d5 ?/ h# G' W
UARTPuts("------------------------------------------------------------\r\n", -1);
f$ ^# ]. V/ U' X
UARTPuts(" C6748 ECAP Test\r\n", -1);
( N s4 x- Q) N7 d$ w' }
// ECAP 捕获初始化
8 J! t+ q' @2 a4 g; ^; k4 ?
ECAPInit();
$ L3 l$ W0 z7 M- n
UARTPuts("Initialize ECAP.......\r\n",-1);
- b5 k: e* d/ \. Z) |
for(i=0;i<5;i++)
4 O# \6 t9 S+ i- w3 `
{
" k0 j0 {% e" ^; b( C# j. S
for(j=0x00FFFFFF;j>0;j--); // 延时
# ^* [, a7 A. l) B2 f6 s/ ?2 W* G
ECAPRead();
3 I; ^4 O% K5 a
}
6 ?7 V( Z! [' F! K" n
UARTPuts("\r\n",-1);
1 K+ p; l* f1 A {
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: N/ x5 v5 ~( C7 e# c. b
UARTPuts("------------------------------------------------------------\r\n", -1);
4 P8 q2 o" W: `9 G8 X: g6 c' Z
2 r) m9 x, D+ {+ \7 m
// 主循环
, M( y, u: d) V% v) k: V% {3 N
for(;;)
: W% i# L8 B0 [+ H
{
) M( j% V# q% I6 t# d
# C$ I( n+ K+ S: }$ ^2 @8 X+ U
}
% i0 q8 j. M: p' ~, f
}
1 b4 q1 x% `: x7 ?) L/ w w5 J1 f) X: A
' w. h7 G( f' K
/****************************************************************************/
5 A$ S; z9 I% o; |6 k; L' I) y
/* */
2 F. f8 Y# A$ n& J: H) K* m9 C# b8 T
/* PSC 初始化 */
9 l: Y/ v' y1 u( x+ ]# U5 y% S( H
/* */
! o* T6 [" d( C) _, e/ n
/****************************************************************************/
* j3 h+ h6 V7 v3 J0 ]/ \! W
void PSCInit(void)
$ A! H( [( z1 o+ Y4 x8 I
{
: h l& m% g8 s* Y
// 使能 EHRPWM 和 ECAP 模块
8 f( p1 l) k7 v, B }
// 对相应外设模块的使能也可以在 BootLoader 中完成
+ d7 _1 @ t/ h M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ k, Y/ G4 ?6 i, f0 i' T8 o
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 e5 M6 b( ]0 U7 Z- }3 b
}
0 _, O$ X1 E1 D7 V5 t% B' ?1 A
) N' {7 j8 {& o) R3 m% F. Z
/****************************************************************************/
6 ^3 I* D4 Q/ ]
/* */
, `% M3 u' x" p8 ^$ @
/* GPIO 管脚复用配置 */
) I7 R- p& e& u
/* */
# m2 ~' j" s& d: n% Z; x7 x
/****************************************************************************/
, w/ D% R4 j1 G) ]! w- z
void GPIOBankPinMuxSet(void)
2 e. q6 o B) v, m
{
* x- ~6 G1 h+ O- e$ D" j+ v
EHRPWM1PinMuxSetup();
$ i( T F/ V6 g* {
7 I {! j: h& S+ `6 U
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
6 {/ l; }" l5 ?- q
// 作为捕获功能时管脚方向为输入
0 Q7 H! c7 j$ D
// 作为辅助脉宽调制时管脚方向为输出
/ L0 t9 u2 k, H6 Z* F" t
// ECAP2 / APWM2
' ]7 X/ J: U e: i* Y {2 \
ECAPPinMuxSetup(2);
- }( [' O! t6 ]0 q
1 r0 R1 P# `2 b
// ECAP2 / APWM2方向设置为输入
" H2 I, P1 j! c
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) \1 c1 @# W0 Z
}
8 J* ~, S5 U1 V# \) `/ {( |+ o0 C
8 V2 b0 p- n2 u+ V. _9 Y# I
/****************************************************************************/
$ Z D5 L4 B. T" P$ o: e
/* */
) C' W8 V# g( D1 U
/* PWM 输出波形 */
! H9 V+ c) i. ?, L
/* */
( A+ c3 D- l: A
/****************************************************************************/
7 o' b" {: q5 e* Z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 u3 w: G i& H9 m9 _, x1 r
{
3 g1 W. q# C# H) F# a2 a# E
// 时间基准配置
* X4 ~, r! a2 l8 [: a
// 时钟配置
" V$ f/ B- ~- [+ L9 w
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- ^" c l% L0 d# a
# U) f7 n! i- w3 F8 }' e
// 配置周期
" y- T3 G4 R- v+ v" K8 f, x
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
0 }" P. P1 `3 F+ a5 ^. T0 G( S
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
! b9 ]5 B& ]/ H2 m q3 G- x) Q
+ C2 ?8 `0 k3 f% X: p3 R
// 禁用输入同步信号
9 c8 ^( ]) r3 A' z/ O
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ P7 d# C# i7 A Z8 w( A6 ^
+ u, h p/ ~4 i$ w6 G2 v( i
// 禁用输出同步信号
+ s$ u- j4 R% u: Y) n+ O x+ Z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
+ W4 [7 j* t! a9 `2 W$ ?
6 N1 t! l4 ]& G" Y: v# Y8 f* H
// 仿真(DEBUG)模式行为配置
" d( }9 P. v* `* i+ m! _* k
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
3 |, |5 i9 k8 T4 N
# S! w2 G1 i& B. e) L' \
// 配置计数比较器子模块
. K h% h/ C' ]' n& D5 H+ ]) M" d
// 加载比较器 A 值
V+ I6 t7 ?7 }% J- J' x9 d0 p
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- g0 W4 z* O# V/ J0 y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
G' E6 u. L4 Q( P! {* t# U4 `
- F" n* | ~2 ^+ E$ |) F
// 加载比较器 B 值
* I- D. B8 N" |; e! H6 r! h$ V$ }
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
( d0 r$ d; u( r6 C% T
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) z/ v1 Z) |' j- p/ w
* [ c* r& ~. Q& E8 J' M" L
// 功能限定配置(输出引脚触发方式设定)
$ t" Y, u/ J/ M2 F1 K9 B( r6 v
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& ]6 L% N8 X8 K
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 P1 w3 ^5 F6 M6 ~* f' z( ?# d
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
$ I z) I& f5 S- H
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" v2 R# P. T. I2 \, r* q; ]6 S
+ a7 w0 _! w; V! n3 V
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ x. W4 ]0 e4 h& U: R& C" z
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 I8 f8 L' f- @1 ~. O. r
9 u0 U- F! c: |/ T9 d
// 禁用斩波子模块
* |$ l" ^! k/ K' S4 U
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 V$ i8 R! b" K. ^' c4 O
) c& k& b {5 v5 d9 T8 D
// 禁用错误控制事件
; M- A4 y4 S5 o$ e8 P) }. M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
& ]: E( Z' i# w# c; k. n
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' q9 ]/ _4 ^: C3 w I1 A) [7 I7 a
# ?! x1 p! k! z
// 事件触发配置
- F8 ? q w& N* v8 T7 b) \+ v3 R
// 每三次事件发生产生中断
, G4 _+ Z9 [0 ?% q9 R! A
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 g% {7 F1 h9 A" P7 |
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
6 u' F$ r2 d5 u0 p- n g5 g
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ S9 n+ Y/ | d; N9 ?- R m& A
// 使能中断
+ P+ j9 G3 b/ r N
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
/ s/ t; ?5 U! i3 ?/ g' ~
/ g* Y, G) ` T: o6 U6 I- l
// 禁用高精度子模块
1 g; Q2 p4 d( _& k& y
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! C x# q% W! l# d3 z2 n) L( d
2 Q; ^% x/ I: A0 B) _7 a3 h
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 L( r6 A& A& G% ?$ U5 q: x5 P: }7 R
}
5 i+ S+ c) d- P* J4 X7 E
: E* O# ^$ q( ]( p3 x. _& t# _
void ChopperWaveform(void)
% Q2 A# s0 F p9 z4 O* p3 k7 A6 w
{
# k, d% q9 b o. c0 L4 D a
// 50% 占空比
; Y6 Q9 J+ g3 B
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
2 u& G# c W1 _- d: I" O Q z
// 4 分频
6 H) G5 P: P1 R, Z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* W; M6 _% Z! o
// 单个脉冲宽度
: f, i; T( j- u+ M
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 X1 s( t2 w/ t, L7 c
// 使能斩波子模块
6 u; \8 K; f( l
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# p5 f$ ^2 ?5 \: ^. M! d: y! \
}
6 v; I" M: Z; w% p1 a
5 y. h" @0 j) Y) G9 l6 m, c! S
/****************************************************************************/
1 x. f4 L, a5 {. T1 e
/* */
9 p8 |/ o8 }9 O! u7 l: [) v( Y
/* PWM 中断初始化 */
4 e+ U' k1 k6 q4 z$ e0 ~
/* */
# f: O, x5 ?4 p
/****************************************************************************/
$ _% Q6 G* m! b
void PWMInterruptInit(void)
7 Z* S# Z r/ F, J
{
+ ~& [* s( E3 {$ K/ j, M
// 注册中断服务函数
* q4 T _* ^% F, L+ f3 P
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! f1 F% U- T- K
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" K- E7 F! @9 [
$ x& S/ E! J; ]( n0 L( i; j" l
// 映射中断
$ B# X9 f$ r" o& B8 m
IntChannelSet(SYS_INT_EHRPWM1, 2);
: M$ r1 `5 Q. N! Q2 @0 E1 J
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: p7 q$ ]* j6 G; ^2 ~
2 b8 y/ W4 i- j: t. f
// 使能中断
7 t; s2 [" Y1 y' _) G+ B
IntSystemEnable(SYS_INT_EHRPWM1);
* m2 n" T6 z/ m2 t3 v6 a% |0 J+ d
IntSystemEnable(SYS_INT_EHRPWM1TZ);
5 x9 D& [8 z: o) K
}
; U' ?1 H7 M* M% a9 d: u6 J$ m
# x0 q$ {6 M. u- k% D. ]
/****************************************************************************/
! u( F- ~5 r% m; [' O" k
/* */
) I9 r- `: [" m; E/ \( s8 Z" @
/* ARM 中断初始化 */
- v9 i0 g5 V# h1 k
/* */
! @8 b3 G9 k, M5 C' ~- [4 P, R* j
/****************************************************************************/
: f4 }/ F' O4 B1 R% s
void InterruptInit(void)
6 ?* B4 A9 r1 j) ~- [2 ]. K2 r
{
( ?" z- v. S0 G
// 初始化 ARM 中断控制器
8 |" J! B$ K5 {3 N1 A7 F! S
IntAINTCInit();
: W$ v) Z4 H' ?; W" w* a V* G
! w6 _: G, W/ o |* u- r
// 使能 IRQ(CPSR)
3 i4 S# {0 r0 e* e3 z- G
IntMasterIRQEnable();
5 U, Z) B0 e! {$ x6 H
/ I* ]0 |& S% Y: E& b4 m# h1 j
// 使能中断(AINTC GER)
& P% o$ ?- \0 d
IntGlobalEnable();
O; J1 ~1 M' n. b3 _
+ @* L% _7 A7 ]; n
// 使能中断(AINTC HIER)
' W7 |+ |/ e8 A0 `) K1 e
IntIRQEnable();
* V$ T6 u$ o) s) U- P; Y( t
}
( B1 g2 J0 u% _5 Q
# j4 e) F; T& M% z
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
- t# H; A1 @7 z( E6 {, ~4 z
/* */
# Y* a; W- k. G( E! z
/* 中断服务函数 */
( f$ \* }1 {4 G# M
/* */
4 l* g R4 C7 _) L
/****************************************************************************/
8 j- Y+ M0 w" X5 X6 `4 \
void PWMEventIsr(void)
4 h) R+ m/ V- J; Y$ w5 x. P$ ?. x0 P; C
{
% U( z& Y1 T1 ^6 d; W9 f" \
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 h2 x( l9 G1 A, ~$ t9 B" o* d8 W
: ~. n4 T; l# B; @
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
7 k5 X8 P1 N7 _9 t
}
5 i( R% c# M8 E, [9 e- \- ?; ?
2 V+ E$ F- V) \
void PWMTZIsr(void)
. T/ G6 C; x# [" d
{
, q! G* q( H) d: Q
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# q, k) J( M: w- r) C
. k- x6 E& q. |1 L3 f
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 \6 M4 Y# }4 i7 c* h; B( Z8 ?7 L
}
6 }" l& W, ?# z5 i. f
2 v1 d, c+ K' N! @
/****************************************************************************/
0 O" I/ Q( J3 m! B% H' F1 T& j
/* */
4 ~& M! d7 a6 M3 o8 x8 p
/* 初始化捕获模块 */
9 o; x% v6 t ~& A- Q5 r0 G. J
/* */
9 E( N+ D% p: G$ E
/****************************************************************************/
/ X$ }0 z5 q9 `' N( S' s4 J* R
void ECAPInit(void)
9 B+ ?6 L0 I; l
{
0 H f8 q2 j9 [" [- U2 @
/*-----设置 ECCTL1-----*/
- u/ k8 m! y& A* x0 M) H5 [9 j7 ^
// 使能CAP寄存器装载
" ^' Q% }/ d8 ^8 ]2 Q5 s
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
/ d& h+ r. O M+ B1 x: B4 X8 q
// 设置预分频值.
9 p1 R3 }# g+ t& F- u
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
- P# a! w% v: \
// 上升沿触发捕获事件
: `0 y2 X: w2 N( f$ W; Z' Y! x( ^5 r
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
8 ]: @, q/ P7 z, d, W
// 输入捕获后重新装载计数器值.
) J3 i" Y" A. v$ G$ {9 n& I% }
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
0 B- j: ?; e/ a$ i% Z( q" r: `
2 c6 L% ]8 P! A
/*-----设置 ECCTL2-----*/
- [2 d( ]. r8 s1 c5 b
// 连续模式
! S, `4 T1 {, P6 A U: O
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
4 j3 n- X( i9 X4 _& f; s
// ECAP计数器TSCTR持续计数
) A; c( Q$ f2 X0 `
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 L$ V' @1 n; n: y! c
// 禁用同步输出和同步输入
8 t$ m% q9 \, J
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
3 a& o0 t9 x- C w+ w F7 z) L
// 配置 ECAP 2 为 CAPTURE 模式
* @. C) h5 d: K1 u* E/ [0 w
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
$ C! W& R+ H# _, P4 j: i
6 h8 U, x7 ?6 F2 G
// 使能中断
* e1 n% z7 j. f6 M2 Q* r1 E L- I
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. P9 x. ~' R. W# c
}
5 z, y: g( i3 _ `. G" f$ A
+ D" X- U, G2 N$ ^
/****************************************************************************/
2 T% V; n8 K# }) F: g: _4 Q
/* */
# ?7 ]' f# k: x6 H
/* 取得捕获结果 */
5 l2 J; E4 J& G' @, L
/* */
! Z6 C9 n+ M5 s
/****************************************************************************/
, P* ]) Y+ r8 Y$ W! p) j; ]
unsigned int ECAPRead(void)
$ O/ U: F+ m, \4 b, H
{
" {( s3 y+ t$ H% N* y6 w7 j2 b
unsigned int capvalue;
8 C! H1 p1 V* Y. q% L, x9 e6 k. \7 D
unsigned long frequency;
. g0 x$ s/ h, m) R
, ?! ^( A* u, l# ^9 N/ J) I. u
// Event1 中断标志
- `- K0 I! d, m4 w, {; n
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
: h% q2 }" e0 s' W+ T! [8 Q
{
% l' h6 Q& [4 `: `' F2 ?0 l
// 取得捕获计数
; J2 q9 q* k& n% D. K d* M9 `
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
1 G" g# |8 w, s: q, A
capvalue = ECAPResult.cap1;
0 B' h) d& Q/ U1 Z A# h
! K& g& m. M- Z& H4 O
// CAPTRUE 模块 228M 时钟主频
3 n7 Q6 s- U/ W8 T8 b$ v3 ?; H
frequency = 228000000/capvalue;
# j, l( K" ]7 `$ o3 B) S' b
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
* ]+ @, ?# B8 H' _
9 |1 C1 ^/ Y1 x& P+ F9 N
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
% q3 i0 D5 g1 `: q1 Y
// IntEventClear(SYS_INT_ECAP2);
1 s% R: r: X/ V. ]+ {
}
, H8 w' j& U) q+ @" A0 t% S1 v s- [4 r* P
return frequency;
5 e# ?; i4 Y3 [. m: J
}
- u. q$ N8 u' H4 H- r0 z4 f! e7 x
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
, O0 C1 }, ?# e7 c: ]' ?
[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