嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; m3 n2 M ]5 x. M
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
. e4 q0 V' [% {( o
/* */
5 x) y; M* a$ R% I! E1 }
/* 宏定义 */
% h% T0 b5 u, T
/* */
/ |% t0 F% P/ A$ g" F5 F @ F
/****************************************************************************/
8 A: C# Z. t8 u/ b
// 软件断点
1 {6 o- |& e$ R
#define SW_BREAKPOINT asm(" SWBP 0 ");
: y& d( A7 G8 r, Y! @$ o, j
6 ~. f- p9 Q0 t" F, A4 W2 G) Q: y8 ~
// 时钟分频
: ^1 j/ _% h; R. N% E. ~
#define CLOCK_DIV_VAL 228
8 R# H( X" D" e4 d; G1 T
- o. G% c, G4 O4 u; P1 h
/****************************************************************************/
( X! J: Y3 X2 V# W1 a( H- w t
/* */
3 R1 y$ N- b+ u. u3 f
/* 全局变量 */
. }: K8 u+ ]) {7 K6 y
/* */
4 V4 Q9 L2 A5 w
/****************************************************************************/
( }" L% Z# ?" M' s
ECAPCONTEXT ECAPResult;
- j) N' p% [# ?( D% O- h+ y- {( s$ s
5 A$ G1 P2 Y; e6 C% m
/****************************************************************************/
) v% n& A4 c1 j& ^/ t
/* */
2 n& c# K# X3 `9 V& n' o$ \5 o
/* 函数声明 */
- b* Y/ D. H1 L: c% {
/* */
! B5 S2 J+ P1 j0 ~
/****************************************************************************/
1 G* S, _$ v, v* k/ s7 O0 f2 a: |
// 外设使能配置
4 v5 R9 ~% f: {3 q8 y y! u
void PSCInit(void);
& Y9 y; u( N& v7 x; Y* K
" k( ?, u6 f7 z7 z# [3 ^
// GPIO 管脚复用配置
3 L1 |* _7 \5 Y2 n
void GPIOBankPinMuxSet();
' V0 n: q U/ m9 R( }
) w: F# o ~, \& N- C
// 产生波形
$ C# i, W- J6 r, e. v6 k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
$ H+ n& m# h& j: j2 I9 z
void ChopperWaveform(void);
# ]5 j8 S+ T2 Y; h
" G* X ?& \; X* @: L
// ECAP初始化和读函数
. n5 |$ V' i6 h; e" H
void ECAPInit(void);
8 _" C) [1 F, q8 v* y' ~) ]
unsigned int ECAPRead(void);
# `# D( `" @: }' M& u3 o' _. u6 p u! D
5 f5 m. M. Q- P2 s: ~3 D
//ARM 中断初始化
) G3 M. j7 S% i p, H+ v5 o
void InterruptInit(void);
; h9 W1 _, G4 ~+ V3 `# a
" l' |+ D, ]4 G7 i3 F; Z
// PWM 中断初始化
) R Z$ K, c' j& k$ ]6 z$ L
void PWMInterruptInit(void);
+ d) r9 q2 ~$ _+ w) X; l
// 中断服务函数
* V9 S( e* L$ A
// PWM 事件
$ Y) [0 ^$ b5 O: n8 B# S
void PWMEventIsr(void);
B% I& y4 Z; v1 _4 I, L
// PWM 错误控制事件
. Q' c% G5 j5 I- L2 a: Z, A
void PWMTZIsr(void);
& T3 E# F _1 H. J
8 U p) h6 x5 L( J2 k( h8 o
/****************************************************************************/
: [" p- n& y0 e' _0 m) k* |$ u1 K
/* */
# L0 b, F* n5 x* b% q
/* 主函数 */
) H" p6 _- ]; y$ E+ w3 z2 @
/* */
0 q5 w/ f# ]4 I. f, a, k
/****************************************************************************/
% ?- o! t3 A, c" N! @3 m
int main(void)
3 o9 K+ B% J( b* Z% o1 j
{
% r0 ]5 B/ l" C! [
// 外设使能配置
( U! A& _* \2 b4 H
PSCInit();
- c. {8 J7 s- \% k2 L, ^. W3 D
1 @$ H/ Y" v% \; q
// 初始化串口终端 使用串口2
) W I' z# p( [# S, n8 F
UARTStdioInit();
( }5 b) ~2 ]% ~1 r$ l
# x" ?* S- l- J9 L4 C- a
// GPIO 管脚复用配置
7 v# l) p( S' @( H+ |
GPIOBankPinMuxSet();
# C; x S) _; w2 d: k
+ f8 _% M' W$ U' d) i, a+ @6 t# ~5 F
// ARM 中断初始化
( U8 \( k: \2 M3 }/ p3 c
InterruptInit();
2 _* F( }+ J. b' l- \
% [, ^. v+ D4 P4 u
// PWM 中断初始化
- g3 Z f7 ` L. n
PWMInterruptInit();
6 i. O9 J6 B4 F7 d) A2 ^# C
, c2 v1 a* c) }5 a. ~- S
unsigned char i;
! I2 T- U+ J4 W
unsigned int j;
/ ^# d( [3 C4 q" k7 @7 @0 m
- j6 F5 t2 S2 S8 T
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 u4 p1 ?$ C0 {: O/ P; V* W
UARTPuts("------------------------------------------------------------\r\n", -1);
( T: D& I# _% N7 R3 V
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
- M, Y6 A% C7 H& k% ]; ^
// 产生波形
' e* D5 u& n6 L
PWM1ABasic(25000,50);
1 {5 u$ Y/ W8 M1 {& d0 X
5 G7 B# ?1 G- ~, I: ~& j% d
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
4 U4 y' Z4 ^( t
UARTPuts("------------------------------------------------------------\r\n", -1);
4 j9 O- g8 ]: @& p7 u" V
) `: C/ Y4 y2 Y8 T+ c4 j; ?% @
: g" D0 C# D: r: ~& y
y+ c" T0 G: U8 Q6 w" q' c
UARTPuts("------------------------------------------------------------\r\n", -1);
& |- S ^1 s: g$ \5 N5 j
UARTPuts(" C6748 ECAP Test\r\n", -1);
! J% @/ F+ d4 V& s4 d" n+ L
// ECAP 捕获初始化
" O% B9 x, v& q2 `7 \
ECAPInit();
6 i0 F$ ~) t3 d9 _" E1 }$ {
UARTPuts("Initialize ECAP.......\r\n",-1);
0 ?5 R/ `2 \/ A7 l/ f. Z
for(i=0;i<5;i++)
& R" c7 I1 m3 Y+ ?
{
) c$ \' I* U. W5 F% u
for(j=0x00FFFFFF;j>0;j--); // 延时
' `: n0 n \9 ~- k. x$ b" H. {! ~- _
ECAPRead();
1 h! z1 O3 h% x1 Y; _! S, p m+ C0 |
}
) R# \( U0 U8 A) m1 k. C8 D0 I3 o$ l
UARTPuts("\r\n",-1);
' L' b( b* n# R
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
4 ]. a$ f" o9 H, e8 O
UARTPuts("------------------------------------------------------------\r\n", -1);
. B M8 o6 V. [$ G, P
: {- {4 Z8 A! B! N9 v& k" e+ L
// 主循环
/ o) U8 \' n$ k! \* [' D% w3 Y9 {+ d# a) D
for(;;)
( v8 i3 E, J1 ^0 W
{
$ i i# E: q! i
' [ G* F0 g" E* i; U5 M
}
' c+ n Z& l/ |# G" E
}
. u* t0 ^2 s7 [7 Z
/ u2 w3 s% W( z
/****************************************************************************/
! c- w0 \2 n( v! q5 s4 [
/* */
3 r+ A: h; p! B: S: X* T; z. V
/* PSC 初始化 */
# X: [, ]! p2 F8 H1 U
/* */
N' u9 x1 j1 t& V" n; q( g
/****************************************************************************/
/ \+ r2 L: G, j0 H6 [* n- p0 g. H/ Y
void PSCInit(void)
5 y- M4 P3 I7 r- N
{
; |% e1 D; K, P4 C/ r2 O9 f) B
// 使能 EHRPWM 和 ECAP 模块
1 n8 `9 C9 k0 S7 u" i' j# c3 }: U$ u
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 C: C/ D: }7 b9 s F, A) _9 j3 F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. [) B# A% U. m# e* ~( N: P- l; L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- {, m1 S2 d0 j: Y( ?
}
) r% M) D* O; U% |
8 w% p1 |7 m" I# A( b* J
/****************************************************************************/
! C8 \. z. R& \
/* */
- Y6 U4 Y% g: O
/* GPIO 管脚复用配置 */
) U& l0 O6 q0 m W) L
/* */
" J- E: T# ?4 k9 G
/****************************************************************************/
- h/ e! m( d S1 E* P8 s8 P
void GPIOBankPinMuxSet(void)
2 E# I- N I5 q. y6 d- ^3 |
{
* S- h3 E; S* D
EHRPWM1PinMuxSetup();
* s& d8 k+ q3 w
, F. A @! R* z2 r9 g0 x
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( g2 f- U" a$ d* V2 {
// 作为捕获功能时管脚方向为输入
1 ~% C7 f6 L0 J: q: Y
// 作为辅助脉宽调制时管脚方向为输出
% M2 M( }9 p2 P4 |; r' N
// ECAP2 / APWM2
6 j, V9 z9 L) `- N7 q8 k
ECAPPinMuxSetup(2);
4 ?: G1 T$ t. A8 S3 n D' s# r
. L: P$ h% J5 ?1 {. h# x
// ECAP2 / APWM2方向设置为输入
9 c7 C/ `0 k) _8 r3 f
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( |5 x# p: K# M8 S1 x" k( S2 s3 M
}
& }" c, |/ f0 |1 e P4 `& r- U
* }8 f( x; |: H
/****************************************************************************/
g' S2 w2 R! z2 M) A
/* */
5 I3 \' a- G4 a9 U7 z
/* PWM 输出波形 */
7 `$ D4 G- N$ j# B
/* */
( E% u$ z' i w7 T
/****************************************************************************/
) B; Z; \/ f1 S0 G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
/ f4 Q! T4 d. M0 y6 h K
{
3 ~! K" x! a0 {4 {" O
// 时间基准配置
8 z5 @, l5 D* W9 Y* @3 f
// 时钟配置
. z& o0 T! @9 D4 f* ~
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& x5 N* B$ z. ~) p- e
, U, K* y6 I$ q( k3 _- e# e. _4 I
// 配置周期
$ Y9 u, A9 y! `7 T7 z
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 W+ D" U' s+ V0 {, ]
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; o I. v1 r& @4 O8 C" v5 w9 i, X- D
# L3 b; U6 Y" ~6 [- A
// 禁用输入同步信号
+ n, J' g0 w, h j8 A
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
/ [/ O- B$ F1 a( c+ X- k, x
# b! M, Y) N/ H* \# N- ?
// 禁用输出同步信号
8 [ T7 I6 K3 K; s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
. U% C7 Q1 X7 T' ~
8 r3 p/ ^' t7 p& m! r, L4 V
// 仿真(DEBUG)模式行为配置
1 v& F+ C% G2 s0 i' |1 \7 t8 C
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 N3 v+ J$ r3 j# h
' S8 C4 w3 W: \' S g
// 配置计数比较器子模块
. L* l( K5 X) C1 ?
// 加载比较器 A 值
3 x! v" x/ E! w9 [$ h z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& {& k: D: J9 Y& l& e
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- a5 j, r% r; ~9 f: t
- ]& z& x+ i: U5 s
// 加载比较器 B 值
1 ?7 U6 Q6 C+ z% q# @) ]7 g
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; a8 d) y* H4 u+ V
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ T' ^) f5 z! l0 M- H H6 S3 p$ z
( q. L; S- [2 C) ~( A! E1 V4 X
// 功能限定配置(输出引脚触发方式设定)
% U% c" N3 w) a. A) n& q4 X' ]7 l
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- ]1 U4 Y% s% u7 U+ {6 u6 a
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ l3 X0 }5 a' |6 t+ S
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
2 e% R; X6 m M* [
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 w% z+ X3 Q( ^
/ { j1 e$ p6 b
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
# z! o7 A1 G- w' j7 q1 f: M
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, X- r, b$ { V* F
% L D$ I6 o2 U
// 禁用斩波子模块
& ]. c B% a, q7 a. {
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 J5 h& X9 F8 \3 _' k% j
& B4 |& J/ F, g2 K& r: ]
// 禁用错误控制事件
0 c9 K- _; ?& I) }" H, g
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 u/ K' ^/ {! K0 F
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: v4 `/ X7 H4 `% t. V
0 B& L9 o9 x9 Z
// 事件触发配置
+ Q2 G. P6 n4 f; S( e' @' @
// 每三次事件发生产生中断
- L% ]. _4 i4 ~- Q& t+ q
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 B" U5 T0 x' z5 u1 C5 b
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, S0 X, ^. c) n8 X" Z% P6 B
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ H6 w( T; s8 D% C, ~
// 使能中断
+ w- H4 {- e5 H" [3 ]7 y0 F: ^
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. X: _# _: J8 A
8 Y- T7 g6 S8 w
// 禁用高精度子模块
1 u2 x$ k0 `" S
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 J7 e% w3 |* }' I0 W+ N
: X6 t- q3 o& a" M' J+ ^3 ~
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 p3 v' O! `; `+ n/ o
}
, m m7 Q! p! S9 D: |2 f1 @" `" o7 U* Z
! |1 q9 E, ]7 d9 G- c% n& g
void ChopperWaveform(void)
: s4 {+ f2 q. ?4 C A2 w+ F
{
( A. {1 |& ?, e8 N
// 50% 占空比
" `7 |, S8 _2 ]4 r6 B
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, Y5 N9 U5 A0 M- s/ i" q% l* @
// 4 分频
7 L }1 B: k% J8 D2 s
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
( j5 ^* \/ }, Q+ L" ^
// 单个脉冲宽度
1 _" ^6 C6 ~9 g( z, f/ P
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
" k% k7 c* y+ L+ |( d+ C; j
// 使能斩波子模块
7 ?& w. L- K7 z) V4 I5 Q- X; m! w
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
4 \$ Y- `9 u! M6 R2 N
}
4 V: E+ i) }* S2 v6 ?9 R7 d# B. X& Q. ~7 x
. `- [( J$ Z$ V" I
/****************************************************************************/
4 Q) J7 \4 f M$ q0 @. r( M
/* */
3 u' w* F% J- V. F% H5 a3 B3 C
/* PWM 中断初始化 */
8 \1 b2 I6 Q( Z" |5 Y. K/ [
/* */
: b, L) ~2 W: q; r
/****************************************************************************/
, L8 D. Q3 h/ D, f
void PWMInterruptInit(void)
9 T4 q/ O6 ` {$ g- X* u
{
8 O6 O' U+ O( F+ f
// 注册中断服务函数
% u% w3 n7 {: y7 e* l: T) O
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
! [/ ~" M' x/ J+ @1 {
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" {1 F. B9 @5 Y
# {. R4 N Y( C8 Z% z3 w4 c! w5 o
// 映射中断
0 H w) H" S( K0 D' ^. d
IntChannelSet(SYS_INT_EHRPWM1, 2);
5 G$ J# t% e" z& }! I
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
, N8 h" ^8 Y7 Y& ^6 s; o1 \
$ o% T+ c" w" Y# w, D( }0 g
// 使能中断
/ Z4 l, I+ W# O- ^ [" N9 `3 i& m2 }
IntSystemEnable(SYS_INT_EHRPWM1);
2 l" S9 |* a |6 i' h1 m! k
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 p0 w/ R( f; `
}
3 E* |7 r9 y, l2 y: }* E7 o
( |4 F$ B5 U' q& H* u, y; Y4 U8 H
/****************************************************************************/
9 |/ f0 ^0 a+ |# e7 N
/* */
. h" I/ W$ b2 E* b' h
/* ARM 中断初始化 */
8 k4 p W' S1 s( |' z$ z u7 M5 I
/* */
. C* k$ ]3 \5 b( v7 ?
/****************************************************************************/
- i" E+ g! S5 X- I) G
void InterruptInit(void)
" _1 E- f, p& l8 {
{
& O' @* J6 A* O
// 初始化 ARM 中断控制器
5 V/ @1 ?* S2 L# U! V, {1 n. a) Z
IntAINTCInit();
: Y1 u$ X3 g# D- @
' l% H8 a P: b4 [6 u/ s/ C
// 使能 IRQ(CPSR)
" L2 E. l2 j; p& O: m8 U$ J- u
IntMasterIRQEnable();
6 V0 D: s$ `9 c$ S: l; h; B
, l8 y& P/ X+ [* n0 ?! D$ C C6 W
// 使能中断(AINTC GER)
/ i5 J- z$ ^7 p+ [
IntGlobalEnable();
' w' m* k2 i, N) b
@2 Z$ z; a& c" b5 |4 N
// 使能中断(AINTC HIER)
/ Q' k' v) F6 C, P2 Z* ~6 z! E
IntIRQEnable();
8 U: U/ ~+ s/ I
}
% p# V8 `& ~9 J* R9 E% m( y
2 G8 k$ \5 d2 ?
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
' v( I( Y0 N1 }+ [) E+ U5 p
/* */
) X2 F4 y" y2 t# V4 z
/* 中断服务函数 */
# ^4 d( h+ {9 k! `( \! {! P7 z0 Y( K
/* */
3 \% \: M+ ?7 v) c
/****************************************************************************/
8 T2 J+ ?6 Y2 u1 |% y1 C
void PWMEventIsr(void)
3 J5 D- v# G1 G5 R# f M" B
{
7 ~8 o _. c- x
IntSystemStatusClear(SYS_INT_EHRPWM1);
0 P$ P: q: y% W# Q
" s) \# U: q% r9 e/ s
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
$ r+ R" h$ i1 a. ~$ S6 C7 }+ w1 x$ U
}
, i" W& n$ U( n% R5 J: q e
- q/ k4 L T4 F8 ^
void PWMTZIsr(void)
5 \# G" l' {/ ]% e
{
( l3 _) p& ^0 \+ g5 t# ]$ t8 m! Q
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ q! {9 W; ?, O
0 J4 f2 {2 N& t1 t
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 m3 B) K; z- z1 o: ]
}
# F2 n" x1 b, X
" T4 B/ g) T3 s+ h; \' T
/****************************************************************************/
# [7 l1 |, e1 t3 H$ F' N
/* */
, g& s" C( b2 ^. C
/* 初始化捕获模块 */
# s1 _( \7 c; s- u K/ D
/* */
- B# e$ s$ p0 O8 x+ A
/****************************************************************************/
1 R1 }9 i5 E0 |0 U7 w
void ECAPInit(void)
* j' ^* ~9 G8 D. s3 q; c
{
7 B, m& {1 U, f2 N2 k0 s' p
/*-----设置 ECCTL1-----*/
o9 O5 K& g# ~# s- k# z7 F/ j
// 使能CAP寄存器装载
' G" L% r1 b+ T7 y8 v
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
$ W; j+ f0 v( H$ {3 K( {5 h! G
// 设置预分频值.
& M5 M2 t* P( P8 U/ S
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
" \" G( R& K& x8 M' n
// 上升沿触发捕获事件
, H" ~: r% H* ]9 S
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
. q, B: p& X; U; y& c1 M; N6 h
// 输入捕获后重新装载计数器值.
1 s2 ?$ ^1 ]# n1 T4 b
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
* C, O l9 [1 L# w- O+ Z
2 W# j3 U3 p7 m- X4 v
/*-----设置 ECCTL2-----*/
9 b) K6 g4 d( |* N" x
// 连续模式
4 I0 m0 a7 I) i( b( _6 q3 p* f* @
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# d7 x5 D& p* b6 y! {& A3 w: _
// ECAP计数器TSCTR持续计数
[' h7 X# Z K' ?
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 a) }$ S1 O4 v% K
// 禁用同步输出和同步输入
$ B* \) A6 h3 j! d% U. M
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
) v! G) \# o7 u" V S
// 配置 ECAP 2 为 CAPTURE 模式
F4 a" j5 N3 x0 _# Y8 A3 ~* [
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
- E0 L' G) u- Z' k: w
) T* M. I) C) \0 [
// 使能中断
1 }' l( L K* Z, {! _
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 E5 O$ u. S+ ~
}
5 H/ A0 O! {/ L
% G( _) @, w1 d6 J. l1 e
/****************************************************************************/
9 t/ t' z. w# H4 a( F2 n
/* */
9 Y: i3 B6 a; ]! f& j6 B+ f
/* 取得捕获结果 */
5 w6 v& H/ g2 @" `
/* */
/ a" I' q9 Z e8 U" E% u( \, ~
/****************************************************************************/
# K8 @& A% H6 m# }. o5 D
unsigned int ECAPRead(void)
. q1 f g: e/ i. S1 b3 l! V: ~* v
{
! ^, }; k! X* |+ x' Z( K
unsigned int capvalue;
4 w. m& Y3 w# m- `
unsigned long frequency;
% E9 h) u: d; Z8 B8 m+ f$ ~2 R
# z6 k- }6 t- E' R, M: m8 X9 E8 V. c
// Event1 中断标志
3 q* M+ q/ E# P) z* d5 b; L# c
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
0 i |# \' O) U9 ~) m, G* T
{
+ ~6 j* E$ z/ ], B" j9 F( u! e
// 取得捕获计数
7 G2 K' C& m- b6 h1 g5 }* y& P
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( R x) f2 }; Z4 _. ~0 N0 M5 L$ I7 K
capvalue = ECAPResult.cap1;
9 m9 \& o$ ^6 P
8 n8 ]( y. A5 ]0 O- e
// CAPTRUE 模块 228M 时钟主频
1 i9 w: ?" k( r1 f3 ~ h6 T
frequency = 228000000/capvalue;
4 r7 _0 O1 w, G3 Z" {
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
# C4 q3 L/ H% n! F! G4 k% M
0 b# c1 _% O( t+ j% x0 `
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
. t1 _" }- p* C" X
// IntEventClear(SYS_INT_ECAP2);
E- L/ D1 d$ I. p0 J
}
% K# F+ h' k& D& ~4 K J3 ?. H& C
return frequency;
) l, C* `& O( ~8 ?; O
}
0 Q' i+ {1 a8 v0 w8 e
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Z' w& T3 w: a# N2 g" e
[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