嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
3 K* f# m; Y2 r: }& D) [# B
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
" ^. ?# k9 W) Q
/* */
3 t$ c9 c- P% Z. Z" `
/* 宏定义 */
8 u( Z k% @" |8 s! O& W' |
/* */
* h3 K8 R( \4 Z4 f+ Z1 j
/****************************************************************************/
- r2 u1 V; f4 }' ?
// 软件断点
4 Q2 D: F! o( u
#define SW_BREAKPOINT asm(" SWBP 0 ");
) l7 g+ ?" K) s' j8 W; {! ]$ l0 L
: w' q$ Q5 w( u, _
// 时钟分频
5 S O( r. X9 ]; n
#define CLOCK_DIV_VAL 228
, A- @; k5 s% _ X5 A- Z. @5 a
5 }! L# m' }+ s
/****************************************************************************/
4 A5 F' x; P5 \9 b
/* */
7 A& ]" K& l' o& N# O# u/ V7 S
/* 全局变量 */
1 }/ ]/ i6 w; c7 Q/ h
/* */
3 G, X% q0 D' c4 v
/****************************************************************************/
3 c4 ?7 P( F3 a3 T7 e
ECAPCONTEXT ECAPResult;
; M! x# X6 @) t
0 X& J) ^1 i% P$ u4 ]5 `9 u
/****************************************************************************/
9 P% U! D# }) c, P
/* */
8 H! X& Y& O v R
/* 函数声明 */
# e: L7 d! s q1 `8 u
/* */
& }, x5 P) Z" {$ p
/****************************************************************************/
$ o$ g6 w6 ~! n
// 外设使能配置
% `6 d. ~5 z" M$ o5 c% Q0 ?/ @
void PSCInit(void);
# W, D" Y" V2 B
" o- U, ]4 O& ~3 |. J
// GPIO 管脚复用配置
G6 \0 B2 [0 z" c. `* Q8 e1 t
void GPIOBankPinMuxSet();
6 u6 U% e5 ]3 G! T0 L( \, D% v
# q j! x8 R( |3 K2 X8 M- h
// 产生波形
- P; U5 c9 ~9 m ^) Y' Y- j5 T
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 |$ @: q/ w, `- t
void ChopperWaveform(void);
, e/ x$ _8 v" J2 G4 c4 i8 j% g
6 \, P1 \* C- |9 e, H, C
// ECAP初始化和读函数
( H) k# ^" U: L9 @% E( D
void ECAPInit(void);
. \2 K$ q9 y$ M$ Y0 Y3 S$ J
unsigned int ECAPRead(void);
& |; U. U9 U2 H+ ]/ W
" G- B" Y; p3 i6 s# U3 r- T- p% E
//ARM 中断初始化
% ~/ R* R3 t- v- |; J- R
void InterruptInit(void);
7 r) ?0 _& ?9 s8 `
6 \+ p6 ? b+ M p, \* ^9 d; A
// PWM 中断初始化
( J) M& V5 {0 f% a3 u- R7 e+ s: Y
void PWMInterruptInit(void);
7 j% V/ H/ t# V. d
// 中断服务函数
: j1 `" R! M% C2 p7 \: n9 Z; D* y. W3 ~# H
// PWM 事件
9 _6 \- v4 b6 ^! c/ a3 B
void PWMEventIsr(void);
8 l' ]# Y4 [+ c7 n
// PWM 错误控制事件
4 M* r# i6 y5 H
void PWMTZIsr(void);
1 l0 T* \: U+ F: O; a: N/ X4 }5 n
- [8 k" |$ Z. W; j/ ?
/****************************************************************************/
: I' C+ D* O4 M& M( `" s
/* */
: @8 ^9 x5 O3 J2 T9 J& ?$ x
/* 主函数 */
) j! e# @ M! c& y ]
/* */
+ p/ @+ Q V1 m* u
/****************************************************************************/
; Q* d' ~0 ?" Y8 v$ G# N
int main(void)
( z* a* E3 y. z5 @! f
{
# a6 h6 w' u8 X+ b
// 外设使能配置
1 {) Y% _; B# }" J# Q( |4 Z/ Z
PSCInit();
% u6 U, h# o2 m! ]
) c7 J1 c3 R1 q
// 初始化串口终端 使用串口2
; c% U: W- |" H# Y6 ^
UARTStdioInit();
4 g5 I8 t/ c& c- g$ k, e8 M" ^
2 a) O+ p# j2 O% V: p6 q
// GPIO 管脚复用配置
7 M1 {/ N( ~2 V: u, F, e9 Z2 b
GPIOBankPinMuxSet();
& c$ O3 n( B B) z' X
% b3 a$ d; a* Y# v' v
// ARM 中断初始化
4 m& l$ b5 N# i4 w: H
InterruptInit();
6 W) s) T$ v+ ?* R$ N
: f6 ~" |+ _& V' U
// PWM 中断初始化
' U) E3 l& C/ Y! A
PWMInterruptInit();
3 i, P) r- ~* D7 d0 _
1 Z9 {. Y2 ? E6 p/ |; M K; X
unsigned char i;
' L# s. k4 ]% o/ r6 F
unsigned int j;
6 C: Z! c( j$ \6 U# t
! {& `& ]4 [7 z# e
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
) A! B- E: q8 \! v/ I! S
UARTPuts("------------------------------------------------------------\r\n", -1);
4 P6 ?8 p3 U, r) Z7 P! o- j/ a
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& ?* y% @2 I; x5 D
// 产生波形
0 i* `. H7 I2 v; o; q& e
PWM1ABasic(25000,50);
, V) H( |% B2 l
6 |3 {+ L- Q( O
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
* U; a# k: T* w9 p# E5 d& X8 P
UARTPuts("------------------------------------------------------------\r\n", -1);
2 ]3 n- ~6 B2 q+ t
. L6 d2 W7 a) A, _
9 s+ X1 d% e5 k8 R2 R5 s
}) V: o$ n6 p/ f
UARTPuts("------------------------------------------------------------\r\n", -1);
S$ x& R+ H0 J$ T
UARTPuts(" C6748 ECAP Test\r\n", -1);
. L! Y* n# e* c
// ECAP 捕获初始化
% a* }! J r _% }* v
ECAPInit();
" a6 e- E4 ]1 m5 b# S
UARTPuts("Initialize ECAP.......\r\n",-1);
/ y2 ?3 H" y5 T, u/ P
for(i=0;i<5;i++)
; m- j# F. S+ f/ S) b
{
- [3 y) ^3 q! z% ^7 Z
for(j=0x00FFFFFF;j>0;j--); // 延时
, ]6 O4 z0 \: l7 W% M8 q' o* K
ECAPRead();
6 U4 I$ a2 f ^* U
}
; x5 k2 J/ ~1 L6 I
UARTPuts("\r\n",-1);
2 s3 M5 O4 g# d; h0 z* _4 m3 ?+ i
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
, z2 w1 c3 [2 M4 g! V" b& X
UARTPuts("------------------------------------------------------------\r\n", -1);
7 P# H. D+ l6 L" M( T$ U
( [( U& f! k. `! L- }; |) d
// 主循环
7 e. R: {( g' Z1 j- w- g: q
for(;;)
9 D8 |; p/ e8 Z; ]. Q; h* N
{
- i+ D1 y& a" P; d7 V: s0 ^+ u* \
" D& m$ _ P a
}
) N0 a7 J3 H, \
}
! X5 x! D9 [9 U- m" f) Y, N
' g& G: w/ `0 ]4 Q P$ i4 m
/****************************************************************************/
5 a# H1 ~5 `$ q- n6 K. W
/* */
. N$ p* s! _- g9 ~2 V- g3 I
/* PSC 初始化 */
}8 v. f, S9 u2 o& I9 B, D4 C# A0 {
/* */
4 X& p/ u, O h4 w0 b* L
/****************************************************************************/
, |; _* f- ~1 x2 ^$ S0 V% K7 M1 \
void PSCInit(void)
1 ^) z$ V: ~4 N% g5 D5 P+ A) z% ~
{
; O- H7 z e9 y' z
// 使能 EHRPWM 和 ECAP 模块
' S5 S" Z7 o: I8 j, Y0 |
// 对相应外设模块的使能也可以在 BootLoader 中完成
: Y$ ]# f& H' @* O3 D9 B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* v, D7 ~: V" U4 q1 c8 g" s
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 I ?3 U& ]8 h z, |
}
1 |9 |3 g6 E0 } W: q/ F
0 @6 q$ `) H' T
/****************************************************************************/
8 t; F7 B! J* |$ T6 S f
/* */
3 m3 S3 V1 E3 X6 w, Q, |
/* GPIO 管脚复用配置 */
) b# q. @1 Y/ F6 j
/* */
' Z, v6 P1 M% \1 ?) Y
/****************************************************************************/
! U2 a' R5 S7 a# B- \# K& [6 k
void GPIOBankPinMuxSet(void)
# m: k! v" @ p9 I& T+ r, j
{
5 t+ U2 h" J4 a7 C
EHRPWM1PinMuxSetup();
8 |- q& f! N0 {# \. v- y: \9 f
. }" h! ]8 A% n K7 B" U2 ?
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* a e7 q7 Z6 o0 U
// 作为捕获功能时管脚方向为输入
0 |, X& K0 q/ b* ?/ X4 v5 R
// 作为辅助脉宽调制时管脚方向为输出
( }* V7 Y; A( w) a5 O: L
// ECAP2 / APWM2
& K2 V- R; W1 F$ Q1 o) Z( Z
ECAPPinMuxSetup(2);
3 {1 w0 H3 U/ n2 v
& Z8 _# W( _4 ]0 w: M$ O1 w- M% V
// ECAP2 / APWM2方向设置为输入
6 h2 u: M6 `: w
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* h# Y' F8 e: F2 f% G( U
}
" {+ D0 R- V9 }8 F M( i0 {( G
1 w4 z0 Q6 x. j5 {- k( r
/****************************************************************************/
* Q. \5 ~: V P& a' i5 l# a, Z; ^. u9 Z
/* */
7 F5 L1 m& A2 S) x3 {) x
/* PWM 输出波形 */
6 \; E r9 {; _, O9 h: Q
/* */
, a3 |( `% J0 [2 C/ r) u
/****************************************************************************/
1 y" Y5 [# |$ Y7 I- p- i9 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- C+ F' e8 I4 [8 }
{
; m. R, Z; h/ D7 u
// 时间基准配置
' r1 Z" p7 Y$ O8 R1 Y
// 时钟配置
& t! [9 ~, I- _' A, t5 i
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
; t# y. l' e+ p1 f
" g; ]- U# Q ?
// 配置周期
2 H3 C8 R6 m9 P5 x' `5 y) ]
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- @5 v( r3 m- X+ u; K
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
* Y4 `0 Z. {8 X& X L2 R
$ Z/ _ I9 t; f& X5 {/ X
// 禁用输入同步信号
. G, A7 k4 }' H9 T& k X8 y+ D- P
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
U: S3 Z8 Y5 u6 u! v! _
: v- _9 U2 w& o$ E% ]5 Q
// 禁用输出同步信号
2 r8 N1 Q4 _3 w0 i. T& o, Y
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
3 |7 T6 Z6 e' w
9 i5 A6 w) p+ r& f' {
// 仿真(DEBUG)模式行为配置
) @, c b. r" i' o2 N7 h. |$ Y
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 w7 n- u3 A: N
1 [/ u+ G' w% |4 i& T
// 配置计数比较器子模块
! D( i, i2 `+ f( p- ^6 j
// 加载比较器 A 值
5 I5 U. i2 M. c: C. ]
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
2 U8 w# A' q& D8 o0 V. R+ C
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. e/ G+ a' X7 K8 B: @7 Z; e; E
3 ]1 N O i+ u/ d( Z% ]
// 加载比较器 B 值
3 f7 m. u; `5 V/ U# F' X: Y' @0 J
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 u8 g$ T4 [0 x" ^% v' z; k! l
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 U7 ?5 T5 W+ q0 T
' f* W" Q% T9 h
// 功能限定配置(输出引脚触发方式设定)
* }; V y: P: e% a% h; A
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: o. ^8 ]5 q) m
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 V) A$ Q0 s) }0 U& J
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: L& g4 H& V* l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 I+ C1 Q5 u$ g V# s$ S, N$ v
, m% h6 W% z& C) Q6 I
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 V0 h7 G. m% T7 z
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 l5 F {1 j( _( b! k0 O K
* j6 p+ E. N! ~( t% S8 {
// 禁用斩波子模块
/ P$ e; l, h; r5 `& `6 E1 [
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
" ^, t& Q/ t& H+ `* F7 q
1 U" J9 x5 H, ^; B* u: W2 w+ x$ {
// 禁用错误控制事件
9 [; `/ `& J( \/ i+ a( }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- W8 b' y) j1 _% j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
3 a9 f$ Y! Y0 |! n+ K( Z
" D8 h- }8 L/ f% K+ _. _
// 事件触发配置
. b* {5 q/ [% C! D
// 每三次事件发生产生中断
, x& X, I0 p4 T, C" h1 e' n; c
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ @' e6 ~0 c& \0 F7 H
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 `$ @1 l% [+ \+ o8 @1 F! g
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
8 ^+ V( y4 [( B+ J, N' g
// 使能中断
+ Q9 G; @5 j2 j- p
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 T& |0 W: Q$ J- z) l
: ~4 s/ r; a1 |. e' }$ Y% z: \
// 禁用高精度子模块
1 c$ N9 w! E P: |, F. q2 Y
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 _9 B6 S$ }1 [9 |+ t. U
6 D7 V- u# @" t$ P/ _! g
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
0 E2 n/ @5 u6 w% P0 B; o
}
, J( J( f; u6 B& U. x8 I
4 W4 Y8 _( {5 C; E- h
void ChopperWaveform(void)
/ i, R Y9 ?0 v7 g% Y0 ^) F4 b! V
{
2 }5 B& y7 \. ?& [5 o2 C
// 50% 占空比
8 n9 @' M4 |" r! M+ @
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; o- W0 x' J5 m# v* @& b7 r/ v; V
// 4 分频
2 C4 P2 k, n( `: ?
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 U: q/ S8 C; @2 |* c/ E
// 单个脉冲宽度
& E; ^0 r" x% v& ~0 P8 @% T& m
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, x6 C) G. s* t7 f, f
// 使能斩波子模块
! M1 Y' V0 F6 d) @2 x2 B6 A
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
- S# P# K2 {: \! i6 S
}
: i6 @% { E8 u, k
9 T/ I3 r2 @0 c" r! b
/****************************************************************************/
! O' t% _: F: h( o
/* */
`# I0 Z9 S! ]: S2 B& i% `( g
/* PWM 中断初始化 */
. \. ^) F$ K9 C |$ x, L
/* */
/ O, K8 o6 p+ `1 Y4 _, p
/****************************************************************************/
, H- [5 l* D6 b; i. d
void PWMInterruptInit(void)
) R0 A3 T- r) |4 u( {6 L) |; V A
{
9 f7 i4 Q3 R) z
// 注册中断服务函数
, s+ d0 L- K U' f* d6 ^9 ^
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' }& C4 H0 m4 d% P% b, ?
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 P) z5 w5 x8 x6 ]% p
* o) u; v) K0 L& R
// 映射中断
/ c( Z( O5 v. R, a( e `
IntChannelSet(SYS_INT_EHRPWM1, 2);
* [# Z/ @0 x1 B' ^3 j, i: k
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 b! k: Z! f. Q$ G) A* s
A: l" h* U' e( @4 N3 c: \' _
// 使能中断
* Q6 v0 g2 \$ r; e: o. r0 P- U7 |- X
IntSystemEnable(SYS_INT_EHRPWM1);
$ T/ x4 @1 U& }( a2 Z5 I7 I) D
IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ o9 W/ \* f+ f, Z& v* y! t. K0 j; Q) f$ p
}
4 t c. U, f- B0 B! p" a" m3 M
! p: s z0 | N* G; s
/****************************************************************************/
3 A6 V" N O) H) K
/* */
9 x/ \3 K+ U, k
/* ARM 中断初始化 */
( U! W. r- [2 z/ Z
/* */
5 N% {/ N; f) }+ U7 T
/****************************************************************************/
/ ]8 V6 v4 q3 z0 P: G
void InterruptInit(void)
- B6 p5 ?/ a$ @. I2 {* Y6 O7 h
{
5 I* u O" |, V; ]! F
// 初始化 ARM 中断控制器
" v0 }" }% }' W
IntAINTCInit();
. f7 U* Q4 A) \8 f0 K! P
! q* u! q9 w6 K6 e; h- Q
// 使能 IRQ(CPSR)
, ?* x9 U6 p1 G
IntMasterIRQEnable();
0 O/ n/ i2 p: [: w
! [8 ]2 ]2 m* i/ h' \6 w& s/ N
// 使能中断(AINTC GER)
0 [3 M0 w% k# G2 d& g
IntGlobalEnable();
/ g1 J" t* ]* A2 ]+ u) ~3 Y9 W* }& L( o
- ?+ H& b- I* K8 D2 ~" c. Y
// 使能中断(AINTC HIER)
h/ T" {% O8 n) m' U6 k, Q7 T
IntIRQEnable();
9 |. w2 g" h; ~# B8 h
}
" E& f: t7 X a+ G! b+ S
6 Y1 I8 Z" Y" W
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
" |. ?+ ?4 }% t- U4 Q
/* */
& _9 X2 S9 z) @
/* 中断服务函数 */
& F% J- |. L, E+ B1 Y
/* */
: ?& K6 }7 G0 V8 Y4 \
/****************************************************************************/
0 l- Z K7 ~9 K6 ]0 V8 D2 b- e
void PWMEventIsr(void)
6 s3 w% e, ]0 F/ D1 s8 i
{
5 _6 j( u, z+ O4 X W d
IntSystemStatusClear(SYS_INT_EHRPWM1);
# G5 N3 B c/ O! Q2 C$ i
! c0 C# Z3 p' ]! `% U
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" E2 L( j; I' t ^7 A! T6 V
}
) F0 Z; R. b5 n: m% w
& i# x9 `) o2 v! }
void PWMTZIsr(void)
1 _' Y' N& R# B. w- U* R
{
- i& X: c& } a; _3 D# S
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# ] r# h9 n- Q1 q/ F5 p
' k$ }: [: ?. W" M
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 l( J$ i# P! O( q% E
}
$ Z7 u( Q1 k I' j+ I1 ^& v' ~' [. z e
L8 u( ^. _: v
/****************************************************************************/
% [2 P, |5 ]9 k
/* */
- \4 ]; Z' g5 C, }& v1 N
/* 初始化捕获模块 */
4 ~6 W8 i5 T/ ]+ N( T$ ?& N
/* */
- A, N2 p% j5 }0 A: f
/****************************************************************************/
; w4 }! R% M7 @! [& {5 c
void ECAPInit(void)
- l( P9 Z8 H+ I! ~+ S, o2 j
{
, g+ _: b6 v: ^! s5 f3 ~) q
/*-----设置 ECCTL1-----*/
. Q) _$ n/ Q% k1 f* l
// 使能CAP寄存器装载
; \/ s1 W) u) v( i0 F: K- G% [
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
4 K) A4 ?& ~8 v9 z3 r
// 设置预分频值.
, l9 u5 {. D) r7 a; T. o
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
) K8 l3 S: r3 L1 U6 [& I9 m
// 上升沿触发捕获事件
7 g/ F" K J7 k6 @; \7 n( J% k, v
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
, s4 q% B. T8 N# E
// 输入捕获后重新装载计数器值.
( [% E% o/ y" i
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
l* O2 a) `' G3 t6 \, h, P
# S: ?; ^, G N h
/*-----设置 ECCTL2-----*/
7 U' F, H# C1 G' f$ }
// 连续模式
- Y5 y+ z/ h' j' I+ T- R" _
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
, w/ F. K {, q% Y* H( R
// ECAP计数器TSCTR持续计数
" P e# U! J0 I7 b
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
/ R" G* v% b4 V
// 禁用同步输出和同步输入
7 d' Y' N1 C) J( c+ w
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
" ]- P$ X$ V0 b( w ]* P
// 配置 ECAP 2 为 CAPTURE 模式
Q8 J( }# \5 A4 q, }+ p2 |0 M
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
) o) O- ^9 u9 `7 W6 T5 J3 O
! s! s9 `. s6 e: T$ q2 A- p
// 使能中断
# V, ~& O: k& B( b: e! r
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 _- P! g1 a1 V8 r1 n! r
}
7 o: R. w5 w; u8 ^/ A6 a
1 Q1 t* \ Z) N; t9 E
/****************************************************************************/
" }- R, S1 y/ C' y& J
/* */
3 h H5 W: c, t8 b% q2 _
/* 取得捕获结果 */
) t7 L) s1 X( `4 K1 g
/* */
' B0 e* f9 D w
/****************************************************************************/
) H& w9 O6 q9 C0 X7 h
unsigned int ECAPRead(void)
8 p1 \' p B/ G I8 Z0 S
{
4 h: y, e0 \( O
unsigned int capvalue;
4 P6 s' V" F1 o G- e' p
unsigned long frequency;
0 H! W& _0 t) B% Y4 \
+ G, V. w$ ?5 M) F. z7 H* z5 h& c
// Event1 中断标志
+ F) t7 s8 G. H& c' C5 J
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
4 b1 q9 L8 k. {1 j& N/ r" r+ T
{
8 P! z, A; K: M/ n
// 取得捕获计数
3 P0 }: N+ |$ Y3 ]: a w* E
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 q5 ?8 |9 a7 |
capvalue = ECAPResult.cap1;
. {$ c" [' a4 S) e
% s! X3 Z; {7 E6 S) h2 H5 \
// CAPTRUE 模块 228M 时钟主频
, `0 J; [5 t6 O# s$ f! h# Z0 @6 \
frequency = 228000000/capvalue;
0 [% v5 B. l, B/ ]
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. B* L% w. V" Z+ x) I: `& |
1 _$ p1 }4 u$ V: Z+ _, ]/ |) h1 R3 c
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
- {. {9 I) ]4 f/ Z! B- u! ]
// IntEventClear(SYS_INT_ECAP2);
5 }& g& V- `& e) g+ ^: X
}
; u9 F- t) f7 v" J0 O
return frequency;
: M9 K/ E' W$ u4 K
}
0 J# S1 U: `$ @
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
# e; P* h& [' ?7 B
[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