嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ U2 m2 _. c. M( | {9 y
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
( H# }) ?; `0 } I- E0 e; m- t& N: |: c T
/* */
% y$ S; t) ~6 z' `! q
/* 宏定义 */
: M& [9 B0 g, N. Y; z* w. j+ N7 D
/* */
1 ~ j1 w% j# G0 N5 l
/****************************************************************************/
J! r6 m4 I- I, E" E0 l
// 软件断点
9 r9 W3 U& d1 E( L1 b% v" F% E
#define SW_BREAKPOINT asm(" SWBP 0 ");
# x0 Q r' z- f) p" S6 {2 t
: _( Y6 L/ f+ E' t5 c+ X! A
// 时钟分频
$ }* n* n3 A6 `/ [" r+ ]4 G9 |4 k
#define CLOCK_DIV_VAL 228
* O+ y( F1 Z! N2 n5 q1 N" h
& A [1 ]- ~" L
/****************************************************************************/
. \- N0 e1 M- d/ l" n- L
/* */
$ F8 j9 A# M9 S- b
/* 全局变量 */
6 [0 A3 i9 Z) [
/* */
' f. W# g$ X7 H7 ]! m! I
/****************************************************************************/
: {7 r3 J" R; Z
ECAPCONTEXT ECAPResult;
8 {) [" m, D+ y2 ?9 E6 y
. v4 U1 c2 \ ?/ }
/****************************************************************************/
( y! @8 i1 {7 I r
/* */
/ ^, R$ y& p0 I; }* Z7 q
/* 函数声明 */
/ V: J! S; o9 K) O, t: p+ p
/* */
! q2 ?! X; p# o# }9 L9 H% [
/****************************************************************************/
2 _, p, w: W. W- x! r( s
// 外设使能配置
: f4 _& I9 V, j) D) _( g
void PSCInit(void);
- A0 q) j( L6 f" R9 X
4 a2 ^/ y' v- c9 M
// GPIO 管脚复用配置
+ p# W9 l S7 v R2 e) k5 g3 T
void GPIOBankPinMuxSet();
; l% K' ?5 A* ~
- D& W) [( w# ~8 ^6 I# n& p
// 产生波形
: u8 n5 [6 s/ R5 M1 b' H! s0 M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
" [0 q8 }5 _- v$ U
void ChopperWaveform(void);
# Z: ^2 \( {. Z8 {
; M- ~' ~8 f7 }, W
// ECAP初始化和读函数
9 l$ D* o0 H% ^- _0 ]5 b# s, P
void ECAPInit(void);
' _% Z$ l( P/ s
unsigned int ECAPRead(void);
6 M" C4 g% k- @' `" ]: Z% a2 {) P& A
) r4 a% @/ M4 |# B# _1 {) j
//ARM 中断初始化
# ]% ^: W7 T7 n C# N! Y
void InterruptInit(void);
9 |/ B3 g! T* A7 U
4 K6 E' n D8 D" k0 S* c
// PWM 中断初始化
4 n8 P7 d D6 B. Z, h4 G
void PWMInterruptInit(void);
) e/ I, h( g0 ~/ e( T. F" g
// 中断服务函数
; f+ g, F9 V. W3 \
// PWM 事件
K/ L9 ]' W/ m3 L% e4 m0 V
void PWMEventIsr(void);
5 [4 h3 z, o$ C; K4 f8 O
// PWM 错误控制事件
9 P" e3 M" l# U; e3 Q. |
void PWMTZIsr(void);
* X$ I/ n# P" v; V0 D
( p, w9 ^" b. x$ t# v, R
/****************************************************************************/
$ [! Z: j% A6 o9 K9 x
/* */
- u+ V1 h/ W4 S4 O' \
/* 主函数 */
# T$ ^4 u9 E, i+ X3 W6 T5 A1 S- s
/* */
5 c4 C) t3 M/ ^; v# t9 u8 F# R/ l2 N
/****************************************************************************/
2 b) a7 n4 `5 I7 L: m# z
int main(void)
2 I8 o0 ?* X* e4 |: b
{
4 d. a% a# Y* d/ D. r1 f
// 外设使能配置
3 t0 Z( Y, w. @* B
PSCInit();
2 ~) ?: t8 A! Y
1 ]6 W# ]: t$ C% J+ m
// 初始化串口终端 使用串口2
) t, l4 [4 ?" S% l% ]
UARTStdioInit();
) r* P2 \) @2 w
& ^6 z1 y& E$ x5 `3 \
// GPIO 管脚复用配置
& o- w! `8 I' V$ u- n1 Z
GPIOBankPinMuxSet();
) Y5 A5 o- w4 \$ A' c
2 H& M2 H3 v; z1 d, B
// ARM 中断初始化
; A2 q5 y5 B; G- `, W
InterruptInit();
( s, J* |$ E2 c% C8 k3 s9 e, d4 |
2 V: z2 R1 y' A+ V1 J
// PWM 中断初始化
/ q! d7 t" }8 t
PWMInterruptInit();
& O8 B7 K* O( }
' K; f1 j( b4 X
unsigned char i;
6 e9 |! c$ a: {5 ?1 `, d
unsigned int j;
9 o4 J- U* J8 |
+ Z, M* t" v. {5 `4 a7 {. V4 ] m A
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
7 P8 I, M' p/ i) U1 c
UARTPuts("------------------------------------------------------------\r\n", -1);
" ?) v5 Q8 n- w% D+ B0 N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
' O# @$ ?' }( j! ]. S
// 产生波形
: E0 _: y! C; E5 n
PWM1ABasic(25000,50);
6 S3 A0 G. O7 _! @ a3 b2 |
+ ?2 x1 [3 Q U+ D" {9 g- c
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
7 r8 T, Q$ \4 g6 F# B( r
UARTPuts("------------------------------------------------------------\r\n", -1);
" H8 @8 K6 b; S3 D J- ]. O, t D& M
+ x3 k/ q# h P9 Y7 x- J1 @; J# L
: ^: e% f* \- H7 n8 T) i: N
$ `- y. P/ k8 N( K9 y" ?
UARTPuts("------------------------------------------------------------\r\n", -1);
% E( l3 i; a; i* O; _" [ Q
UARTPuts(" C6748 ECAP Test\r\n", -1);
. r9 b( Q; G7 k/ z( }
// ECAP 捕获初始化
& D* d& u* s1 D- e# z
ECAPInit();
% i, U6 D& z7 |: h
UARTPuts("Initialize ECAP.......\r\n",-1);
0 ?9 }! W t8 S' L: q' b3 M4 y4 d& S3 N5 I
for(i=0;i<5;i++)
- A" X; V& a+ C8 A7 z
{
1 A, [! I6 K" f
for(j=0x00FFFFFF;j>0;j--); // 延时
: v! j6 b3 z) M7 }' D. ]: I, h
ECAPRead();
& k3 u2 F6 u8 g* m
}
% |( F# _! y1 E6 `2 t
UARTPuts("\r\n",-1);
9 I5 G9 a, Z& z5 {7 o
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
* _) c ^; w1 N8 n
UARTPuts("------------------------------------------------------------\r\n", -1);
* E5 ^: L1 e; p8 s2 R. i
- N2 B; _8 M8 e8 R
// 主循环
1 h4 J; K H3 O/ a7 m$ G6 Z
for(;;)
: ]/ K' M% T/ X0 ]; [
{
9 ?$ f: P: |+ }9 I: Y- U2 ]$ Z" \- q
8 N5 o; @/ ]; z! I1 } P5 d F/ Q
}
- f M" T: t$ a) `+ V8 Y7 y
}
+ d; T/ K; q; c/ q
6 m. M& |2 f( C0 {2 [! ^+ n
/****************************************************************************/
/ Y) P4 E X& J
/* */
" I6 G8 b) V+ N, k# l
/* PSC 初始化 */
5 h! z8 s% k) T( F0 Q
/* */
: R0 ?7 y% ?$ l3 i- u3 A2 |8 z! Q
/****************************************************************************/
! M1 y1 W5 N9 Y: X3 G
void PSCInit(void)
+ d" f$ b2 P9 N- U7 |
{
% Y2 j- H% [' z2 r
// 使能 EHRPWM 和 ECAP 模块
' a4 i5 I, P! p
// 对相应外设模块的使能也可以在 BootLoader 中完成
! V/ V1 e9 K7 y* q+ R2 G+ z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 A% n2 F& _3 D7 x
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( m$ Y7 d: e; Y4 `4 s
}
9 p% F) D, o. o! U9 o
: `% _5 J6 B. Q2 F" s7 g
/****************************************************************************/
/ F* C' v- L' R) p6 v4 y5 M
/* */
& q2 c+ C& m, s3 g9 v4 N
/* GPIO 管脚复用配置 */
: b0 d8 ?$ ]/ Y; y0 N9 q% ?/ R- P
/* */
' S2 A. i9 p" T
/****************************************************************************/
/ x* T/ A" ?+ a* x1 s! ~
void GPIOBankPinMuxSet(void)
3 d7 a/ a0 H3 a0 F! e
{
2 I% o. C+ o3 B0 L1 j$ i
EHRPWM1PinMuxSetup();
S+ `! W2 U. S3 i
: u x/ L2 T6 T# l, l- g. M5 y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# u$ a4 | P9 ?. i. }
// 作为捕获功能时管脚方向为输入
7 }( X3 j5 k7 ]
// 作为辅助脉宽调制时管脚方向为输出
3 e! R2 I7 h0 x8 h' f
// ECAP2 / APWM2
: K% a4 P4 W3 n! M. G2 e) b e( O0 V4 Y
ECAPPinMuxSetup(2);
7 h. Y5 j: I! s' @! W/ V0 _
- O0 @) Y2 _0 f8 _( ?) C8 I+ Y
// ECAP2 / APWM2方向设置为输入
5 }4 H0 \) f$ S. z
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
2 D% u: @, F6 R4 f0 s/ L
}
/ ~+ ~; _( Y, ^1 I" b( s+ o* X
5 I9 H* r0 m8 P- A x1 c
/****************************************************************************/
9 r, D' |0 h5 A# t
/* */
/ {& s) z3 C2 Z/ s" ]6 d, s1 R
/* PWM 输出波形 */
' v% F3 u; `4 [) j, f! l
/* */
: q" R& r2 @* y( s# }- V
/****************************************************************************/
4 L7 ?! Q/ H+ a& s0 G$ Z! G
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
2 o) \# C9 Z1 C9 b7 }) B9 [ y" B
{
: A( V! [3 l5 v" Y3 L( r
// 时间基准配置
3 w7 y% q! N3 j$ x5 l+ w% @
// 时钟配置
+ h6 X0 \: ^ b
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
& D: B8 t9 A* N9 a4 I
6 J; w6 a; F% g* P
// 配置周期
/ L7 N- s7 |# a# d" T6 ?, z- C! X
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* s5 H9 l9 s6 a6 Z0 [
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 W0 }* Y8 o5 R ^
& \! D, m" @. d% A4 f T4 G( M
// 禁用输入同步信号
# v9 }! J. [7 r
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
- \2 ?& f$ R/ b( B4 ]: q7 T; L
) I2 c$ ^2 l4 T7 g7 X/ f
// 禁用输出同步信号
8 t6 }& Y5 C" F0 j; c, h, g. ^+ m( X
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
% n* y( _1 @* Q& L$ G" o! T0 }! o
" m+ O6 {& g+ q H; ]0 b# {
// 仿真(DEBUG)模式行为配置
# G! L6 K/ F; q
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 x% h% w4 m( O/ Q" T0 q
& S. O N! z$ o8 O4 `1 y
// 配置计数比较器子模块
1 {) y X, i/ l" O; v1 I
// 加载比较器 A 值
9 h7 b0 o8 }* {- B
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
v" w* F( ]2 _" }6 t- \
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 n+ e6 B C+ g4 j5 B
; E5 h0 m& e( Z+ l
// 加载比较器 B 值
: `) o3 ]2 u. J# K; i+ P6 T# E
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& f" Q+ b! f2 c$ ]+ P( F9 {
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% P" a# l5 w4 m6 Y4 Y4 J
: M( Z. D; a2 X
// 功能限定配置(输出引脚触发方式设定)
0 ]5 I$ e7 w1 t) N. U
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
& o7 t5 i+ x$ Q3 d1 z6 o
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 g: e- m. q2 j. o( H# q' _1 J- ?& g
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 s5 M! Z1 x' V9 p( V
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 s, a( N% b g5 L* U; H7 c7 Q
( T; Z9 @# X0 k% ~9 Q q2 ]
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 r- Q7 g1 b: A2 `. n& {% j4 i, t: F' j2 W
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) u; o$ |, V- g
. [- `5 R, k* j# r5 \- S
// 禁用斩波子模块
. u1 \$ y1 j' d7 ]4 { X# S% O* c
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- V0 x4 J. x# N M' c8 E' p6 ^
5 V% H" h& ]# P
// 禁用错误控制事件
0 E0 R7 R F* w7 }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 ]$ t7 E0 d" s j( b( w E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 T/ e8 h) y* L7 w* w
+ c4 a9 U/ v) O; X) J! }3 X
// 事件触发配置
+ d) j% k1 b: U/ ?
// 每三次事件发生产生中断
3 m& C" @9 J1 R
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
" T! q+ |& C- U* B
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
9 g( o/ H% z9 W8 d
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) F& P- I! F: x
// 使能中断
! o* n4 A5 }: @. v& Y' g
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
* K" }+ }3 b1 E2 x# V2 \5 Z
2 `- i+ n. V a- I" O* }1 x
// 禁用高精度子模块
# |! ?) _" i. ~$ n/ }
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' x: u/ _. t+ S* Q2 O8 e
& o: l: A2 L/ e: s2 ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. e# N# _" O+ a- b% G7 g* W
}
0 C4 [( [$ l) S6 ?8 s
& T, z. ~7 s0 F0 ]. ]. y
void ChopperWaveform(void)
, x x; n" H- F: [0 J* K
{
/ ^$ u% A2 e8 _7 k
// 50% 占空比
6 F1 N0 G8 w; M7 J5 ^2 R
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' S& ]3 B* {% f5 M2 S, D ~
// 4 分频
: l1 y4 K( C0 _8 R9 f( T- h
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 u/ ~/ b# M4 n& L) `
// 单个脉冲宽度
. t0 V! K) ` F& O: A
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
j" i( Y* t3 s* J- t6 Q1 X- A
// 使能斩波子模块
6 c! ~- G, p4 ^* m/ i3 S
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
6 b! n0 Z9 J* P" C4 l' y' J
}
! O8 i. S/ \8 J! t) S
" S2 W3 d/ O* N( A- ]
/****************************************************************************/
& J- ^0 u" w2 Z9 r. ]1 C$ E
/* */
/ D8 A/ O) L* g9 Q# n0 l
/* PWM 中断初始化 */
' V3 `* z: N% W% N
/* */
6 v7 Z; A2 L8 ~# _/ ]- q. d7 W7 F5 j
/****************************************************************************/
/ N: D) {7 W. c( }) O
void PWMInterruptInit(void)
5 \( ?1 W! u# B1 A
{
/ u+ s2 s/ g' [9 o" e9 [
// 注册中断服务函数
$ D$ z1 P3 W4 F9 F
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
: U T' h, f* R! E7 t
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
( k( c6 V k1 D9 q$ J: j# E0 u
# Y* ~, ^" A. ?! ? J
// 映射中断
# C# |# a0 \+ n9 S6 l) ~- u
IntChannelSet(SYS_INT_EHRPWM1, 2);
2 p% e/ V: Y3 s0 h( S
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
& |8 j- {8 m7 i! k3 S
5 q5 E! }* W- M2 Y( i
// 使能中断
$ H: ^2 @8 w& E! D: X% z
IntSystemEnable(SYS_INT_EHRPWM1);
5 ^8 w) s+ t1 V$ x8 j
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 U9 [8 t& ~9 B4 E* z7 @# ^7 @% M
}
" Y/ q% w* u4 Q, F. U
8 q5 ?6 ~6 L# n0 U" m, T v2 N
/****************************************************************************/
4 Y( Q. Q0 N% H8 q" G5 H# M
/* */
% i+ i. ]' J' {3 W$ R
/* ARM 中断初始化 */
: z7 H4 L, n& \. \( ?! y3 t
/* */
. w4 Y9 F8 _. j* @- A' f- g
/****************************************************************************/
3 M1 Y1 Z& y. G( Y! k2 Y
void InterruptInit(void)
% q" l+ X8 Q5 Z
{
4 d2 L6 w1 f( O/ y$ v0 _; u
// 初始化 ARM 中断控制器
0 N# i; C9 l! u% e/ J! \ k
IntAINTCInit();
! \. f) h4 b) a6 v" I b
8 q2 e5 \' b5 V5 o+ x
// 使能 IRQ(CPSR)
# R8 p% @" m. y$ J- J6 y6 M
IntMasterIRQEnable();
+ I) H1 K$ _! L- C* w7 ~
, ^" p* U1 q$ A3 A0 L! {
// 使能中断(AINTC GER)
9 ^) N4 Y" v Z, K# }" @
IntGlobalEnable();
1 q1 ]+ o4 J/ |5 t5 Z" e2 }' s
0 A- @% M2 j9 h: e
// 使能中断(AINTC HIER)
3 s, @3 s3 J! `1 C
IntIRQEnable();
i+ u) p. @# g, A+ L
}
; O8 g5 p7 C- g+ w. c
7 Q: Z% E( H7 x1 d( s
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
) |! v0 k. ~4 U: d
/* */
9 v3 f6 R7 G- S# e% _
/* 中断服务函数 */
# V5 d! z) H9 e# {
/* */
- m* R3 d% r! Q6 {
/****************************************************************************/
- J4 u0 a' i$ ]2 y& ]" ^' t
void PWMEventIsr(void)
! H0 C. f# j9 |2 S- l
{
5 G- g# g3 w2 a
IntSystemStatusClear(SYS_INT_EHRPWM1);
3 U/ ~! L* n$ \' t0 u) m' p
6 h' f7 t0 O, i8 z
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- m. ~1 I3 ~" T! T% }9 ]. ` N) \
}
( r& |6 B8 c+ s' `9 i
0 m( Z8 \+ k8 k9 i6 U& d. |
void PWMTZIsr(void)
8 `# M% m7 Y- Y0 u# d9 u
{
3 n+ f. J" N7 K; ~- Y3 M ~
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
j6 ?; k# H/ J/ U) p6 l
: O1 n- v' c3 j- y
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 [5 j: m( D4 G6 I0 O- I
}
9 u2 s0 I* [" a' J$ U U4 L2 x
( { ?2 x+ f* _& i7 |
/****************************************************************************/
4 A( K' E1 `% h
/* */
- J! X7 o% T0 d* l ^
/* 初始化捕获模块 */
" z; `9 x8 M* W0 V) I4 K
/* */
- y0 ~( ]. i5 Z" t# q
/****************************************************************************/
+ _9 j: t/ C5 _4 s4 @) H! p" |
void ECAPInit(void)
/ p/ s# d1 s" e
{
2 f( O6 c; T+ y M! l: G- V* ~
/*-----设置 ECCTL1-----*/
" v* u# {" K. m3 V" V: S7 s% A
// 使能CAP寄存器装载
6 ]4 A$ e2 q' z- C
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
" q$ q/ W' d: x+ v
// 设置预分频值.
u* A2 Y1 @) C; p' d# x$ z. m
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 ]+ H5 o$ l8 t5 Q- }
// 上升沿触发捕获事件
" d# \9 V' { K4 f
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
% W. A* t2 a, q6 G( ?* Q
// 输入捕获后重新装载计数器值.
' Y$ j I. ~* E3 e$ m: _ s% f
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
9 [$ R$ Q1 V+ s5 f' Y4 N; u
/ D. ]" u) \5 D7 e
/*-----设置 ECCTL2-----*/
3 n6 w' i: k& W
// 连续模式
- \6 ~& Q$ w1 d
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
+ r* G+ j2 `$ r& I" L' @
// ECAP计数器TSCTR持续计数
% J7 r: } L5 h4 d6 f
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
9 r. r0 y/ s1 }4 \: ~- J, ^4 v: o
// 禁用同步输出和同步输入
# d' p2 p, l6 Z8 g" [
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 q J$ B; z$ b! L4 b/ L. h$ _
// 配置 ECAP 2 为 CAPTURE 模式
: l- h* e: B9 n" l; s/ I5 \+ e, V8 i
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 t1 H: x+ B' R$ _. [' |7 S
9 e& C0 f" ^% F5 S: r* P
// 使能中断
. N( p2 T7 v7 F5 F o6 A4 U" H
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ z# [8 v$ U( U( q
}
! C2 t: L& f8 R4 u2 }6 m
, Z& N# A2 X7 w y8 V
/****************************************************************************/
( u& ~, ^( ~' q% `& y3 i
/* */
5 X2 U$ @) E3 f: D
/* 取得捕获结果 */
5 H; y% r1 m" ?9 p
/* */
7 b' U: O: E N5 n) q% B" `0 J: Y
/****************************************************************************/
; B) X! C5 E+ ~7 F4 T/ G% y
unsigned int ECAPRead(void)
4 }& g- N" C" V3 b7 H& I1 z E0 Q
{
" g" L# O, a& [+ L# k7 E
unsigned int capvalue;
6 f9 G% U! o7 X
unsigned long frequency;
4 J7 N: P3 V0 y+ f4 b
+ q5 [) P* l- Z: g! Y
// Event1 中断标志
3 }3 i) V9 h* G W
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 n% w3 H6 r* ?; V" T
{
: ]' ] D( [, K+ Y5 U8 s' T
// 取得捕获计数
! ]- r' g- c+ ?& `
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
; \ p+ {1 P3 G; N5 m
capvalue = ECAPResult.cap1;
1 Z* h/ J9 Y j
0 B) b; W% z. v
// CAPTRUE 模块 228M 时钟主频
) b$ R4 D- I3 v. r$ V2 A" {' x
frequency = 228000000/capvalue;
' \; ]$ @9 E/ J9 ~
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
; t2 e2 E1 U. _3 u$ X7 Y! x
. Y5 M* @6 J2 l; m
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
4 x9 m( D0 j& q
// IntEventClear(SYS_INT_ECAP2);
: j$ ?8 L3 d. G( E
}
7 x0 l. c1 q" n
return frequency;
1 {4 \" M! m5 l8 e2 w
}
3 d( U! P4 u2 s) M2 `" g" ?
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- n" p3 y8 ^0 U/ Q( `
[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