嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
% P; @+ z Q, L, q" d
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
- d. h1 g( I" b. |2 x( A
/* */
2 N3 p5 V1 c3 i0 W+ P- T
/* 宏定义 */
2 |3 C$ d' ]9 q$ n, i% s8 n
/* */
9 u! z/ ]3 O* {
/****************************************************************************/
5 l, m/ _& N- P: U
// 软件断点
- w m; x% ]$ ^1 r9 _# [3 B
#define SW_BREAKPOINT asm(" SWBP 0 ");
6 p" v8 I2 N5 Y; j C1 g: N( e, U
: {; M8 M9 h6 q! K
// 时钟分频
4 q. o/ A1 ]- q, E" D
#define CLOCK_DIV_VAL 228
0 X+ W( o8 ]: T- P& a" }# r8 b
. ~, ]0 v/ z! _: e6 |4 U
/****************************************************************************/
: p! ~# R; @4 v- r, i
/* */
+ e9 p3 \* v$ a' c! x5 M6 E
/* 全局变量 */
: |; k! ] O) \$ L4 Y
/* */
# I3 h w9 \' C7 J. _! P Q. i7 U
/****************************************************************************/
; Z7 R5 M/ V4 c2 ?" h5 F
ECAPCONTEXT ECAPResult;
0 Y" T8 |+ O: n' F0 H
% g6 z; M( d6 U% O& M
/****************************************************************************/
$ i; ^* P4 r9 {! k
/* */
, g3 c% c- F% s; Z s G
/* 函数声明 */
+ j+ }; h1 t' z! G. y. J/ J
/* */
# ?' e, d5 H8 T) o, s& X
/****************************************************************************/
- {4 D) u; \: t% s
// 外设使能配置
( m8 [5 \* L _$ _' ~) W; n6 ^
void PSCInit(void);
" _$ i3 i7 E7 M7 g9 _9 k0 J
$ Y4 k7 q$ a! O2 o; R9 ]/ Q9 _
// GPIO 管脚复用配置
, m! q5 A+ ]5 s, t/ }5 A; e
void GPIOBankPinMuxSet();
% T3 H$ b. L" l
, _: m, r) ^; M) `' L- E: y( y9 p
// 产生波形
# S7 j8 r, q( B5 b s4 |* V
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 t# f# Q4 N( y: @
void ChopperWaveform(void);
r1 c- A+ d- F3 {- E& Z9 |- N% @- r
, c4 |* y4 w$ y, }3 x
// ECAP初始化和读函数
2 Y$ b* W" g+ g, Y+ I, G: m
void ECAPInit(void);
( V( o* \ L0 V0 h/ R
unsigned int ECAPRead(void);
* |& s# c5 s* D
7 `2 [! X5 [8 }, T
//ARM 中断初始化
& ^$ i# ?- T' i4 h- [! e
void InterruptInit(void);
+ L7 a0 e! [! p
4 R' ~5 e' \8 p9 z
// PWM 中断初始化
( v7 C+ r) H1 H% u+ h7 i) T3 [
void PWMInterruptInit(void);
+ U" Z, O5 P- m: D, e. {
// 中断服务函数
8 n* I) `- w: l1 z0 q2 h$ W- C, m
// PWM 事件
2 o# X1 m6 w+ T+ h8 S) o
void PWMEventIsr(void);
6 e7 n4 w5 G/ {8 _7 l2 g3 N! D
// PWM 错误控制事件
+ N" y+ |- ~$ X5 s/ B
void PWMTZIsr(void);
) N7 s& \& l1 b* u. b
. k$ M- e& t% f
/****************************************************************************/
( @1 z) A$ n' ]0 H
/* */
* v( a0 s1 h% G. S- B
/* 主函数 */
- R1 Q8 z- E P+ ^3 @
/* */
5 r/ q& P1 N) B# u
/****************************************************************************/
5 f0 k" ?5 E( F7 B" `
int main(void)
8 Y j0 ?* K% a2 p/ {$ S
{
) J# ]9 r6 I/ y9 n6 r. w9 ]* ~/ |
// 外设使能配置
6 [+ E+ y# a' z
PSCInit();
, }% u, M" Z5 Q0 n7 n5 g
& E( D& E% B+ L5 v+ |2 G" r4 T8 H
// 初始化串口终端 使用串口2
: p) I% [" a' l) E/ G) U
UARTStdioInit();
- z- o' R% M0 R# z, H3 t8 s# r- o
( } I: p1 }6 J
// GPIO 管脚复用配置
1 S7 e ^, s' }. T6 I
GPIOBankPinMuxSet();
7 x( y9 U( M7 [3 d# \0 W n
. M3 G! t5 H# u [( i2 o2 N* C
// ARM 中断初始化
- ^7 v. J2 O/ C! y/ c. s
InterruptInit();
8 B+ g6 S8 Y9 I" e) H; I& \- Q
5 q% z% J. v) P8 d
// PWM 中断初始化
|7 C* h6 } n/ w
PWMInterruptInit();
% m. O$ D; }' V9 w* G$ b% N4 G
$ ~) V1 M, X3 ]# Z( Y' m1 f
unsigned char i;
. A0 G% P7 M Z' [
unsigned int j;
$ o1 S( O6 l* A0 j2 ~- H
% ?2 @6 N7 m7 D9 D5 q
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 n& @3 ^1 c% C5 e6 G
UARTPuts("------------------------------------------------------------\r\n", -1);
' V5 t M' k# b) z* K( b. ^
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
, [0 D$ t. L/ E. d* N5 W
// 产生波形
3 x4 z5 E: Z- x ^
PWM1ABasic(25000,50);
1 d9 S/ ] R" Y! s8 T8 r2 V
3 I# P0 R; t2 I; E9 ?& V! P; g6 q& ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 ^0 n/ f8 A$ q: h( w( u8 }
UARTPuts("------------------------------------------------------------\r\n", -1);
/ `$ f2 W; a, t/ t3 ?
6 m9 S0 W; U+ [* E7 e. F; W
% t2 t. _0 s- j* J' j( _
6 V1 a6 }/ K; h$ Z3 |
UARTPuts("------------------------------------------------------------\r\n", -1);
$ t* {3 y& C3 G
UARTPuts(" C6748 ECAP Test\r\n", -1);
4 b* k) N3 l, ?, _' Z
// ECAP 捕获初始化
0 K5 l R, F( s& e% F
ECAPInit();
8 V8 k' m0 E. A6 H
UARTPuts("Initialize ECAP.......\r\n",-1);
+ }2 D1 M/ B( R; c+ b
for(i=0;i<5;i++)
5 {) V8 `' U) P: u$ Z% `3 ^! k
{
6 f6 H t' D, ]6 J: i* b
for(j=0x00FFFFFF;j>0;j--); // 延时
4 E, A. y2 a3 ]2 P+ h ~& W: `( T6 D
ECAPRead();
) S3 }6 N7 z. P; r5 ~% x( t
}
# H) n$ p( ^9 Y" J: a
UARTPuts("\r\n",-1);
% P* e$ _3 U% j- K( J" z
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; }; d9 v9 }% d
UARTPuts("------------------------------------------------------------\r\n", -1);
7 g$ E! `0 g- Y/ _( V8 }
9 I/ p0 U: S: w7 T' C
// 主循环
. s/ ~: o2 R- {8 k) G
for(;;)
* ^6 j, Z7 T Z
{
" B! v1 f+ m/ d/ s0 L
' ]. d% M% n7 [1 e
}
6 M# b) `, o% U6 ~. E* c/ }
}
# M6 n0 q3 \# q C
5 x8 A" F; ]# R0 k. @4 e' T
/****************************************************************************/
, [# T9 r2 J" B8 [, u7 `0 Q, O" ]
/* */
+ N6 S) m! N2 a+ S' N0 V
/* PSC 初始化 */
' \! [7 Y7 [! m) b
/* */
8 T) R5 Q! d8 S
/****************************************************************************/
0 a2 t& \: c$ |( G; p& i
void PSCInit(void)
6 ?( J4 q, ~& f3 }" k
{
1 }" i- F+ n6 d2 }1 J' J8 f
// 使能 EHRPWM 和 ECAP 模块
0 u* a1 e- [, O3 y* t% ^
// 对相应外设模块的使能也可以在 BootLoader 中完成
8 M1 H6 Y4 Y" P- B k6 H7 M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ S. x9 q0 i# e+ X: |% Z F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; q# {. p* q1 _" R+ `
}
t3 _; w- a) q* Y' l
' S. P, N/ [) y7 ~2 T
/****************************************************************************/
2 L, m4 t7 O/ ?
/* */
' {+ u! u0 X. d9 b+ ^
/* GPIO 管脚复用配置 */
/ L, `4 J: g4 ^- E7 A
/* */
: o8 X& @9 x" k7 p
/****************************************************************************/
2 C& v' z- u* I( W: _$ P
void GPIOBankPinMuxSet(void)
* G l5 B: p, L9 v, L2 C) S" |
{
# `4 L$ }, |7 F5 ?# W; r
EHRPWM1PinMuxSetup();
5 J4 F9 J; F) ]2 C. p+ i
/ d9 U& m( V7 n% T8 T
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
& ?0 W u5 K' h( w( F
// 作为捕获功能时管脚方向为输入
" _: ^$ s) w/ a5 ~
// 作为辅助脉宽调制时管脚方向为输出
9 s- x2 b8 v! r
// ECAP2 / APWM2
4 \3 L& e7 m( A* c: z. f
ECAPPinMuxSetup(2);
3 f1 P9 q# ^) F t+ f, b
! M7 E# H1 g& b' p: C# i
// ECAP2 / APWM2方向设置为输入
) x; h4 k5 {9 P# e- M, |4 G$ P
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
- {( m6 i4 p* O$ x+ Z/ j9 N x
}
7 d/ s6 Z: ?4 L! O6 t m. `( o' h* @
7 U x/ ^3 H% ?, J0 R% _
/****************************************************************************/
O* m( h5 E& l9 K
/* */
# ~) g# T3 s: L1 a' [
/* PWM 输出波形 */
; I8 d/ J% ?: R; a. n
/* */
4 ?. R3 d7 u" w1 J& E; b, c
/****************************************************************************/
2 W j; s# L' E1 w, O3 c
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
6 T" w! [) H8 |% h" G$ L: B% G: a
{
7 }- A8 H) T6 |# U
// 时间基准配置
) W' _4 z O' M" J
// 时钟配置
: s8 T: X u( W/ q3 j
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
, c: r5 F. E, g9 v: b$ S, u0 [- |
" B/ F4 g$ d9 v" b9 p9 p. a3 |. P
// 配置周期
, E2 ^- }/ H* V9 q
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
" f: s F7 B, o1 y+ {5 K# s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
" s- I; f$ v4 \
4 F' {& E4 N. D! U' y) P
// 禁用输入同步信号
9 C! D4 |% ?' M+ ~) x
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
1 I2 C1 o M1 \+ u; ~( T! {; W. U) E
! t: T$ u- V* B" U1 h+ T& W8 j
// 禁用输出同步信号
0 _1 \6 e& G& e$ G l) |
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ f) c6 D) S+ B' Q' r* G. p4 ^2 ~
7 f6 H% d& N- v- Q) P1 ^7 M- ]
// 仿真(DEBUG)模式行为配置
! {+ o+ {9 j& @2 I, q! \ U, ~
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
) H, P ~3 W% e+ c$ }
$ p" _* I2 Y; J6 K5 {1 s2 P
// 配置计数比较器子模块
% J! t6 O9 A# H3 f5 K, y: ]( H7 {
// 加载比较器 A 值
! S: F3 K8 f# U% u$ l g
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ p% U( X& F E
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 Z9 ]2 s o) K5 d% o
: |! u* [% H3 f: t) o6 ^
// 加载比较器 B 值
8 c1 ~! `3 d8 ~
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
4 j) A) l& [ R
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ Q( v6 s+ e8 ?4 G8 y+ ~& A o/ N2 A
$ A3 T9 H# a: K A
// 功能限定配置(输出引脚触发方式设定)
& }3 }* ? D- v/ r0 U
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 |0 x2 Z7 o; g9 l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; |; W" H2 J l
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! j$ Z T/ ^9 E$ N9 ]
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" [- \2 b. i k9 d9 u& E5 N+ Q q) O
: d& L7 ^! `7 N% y! Z
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
. L X% a6 o! t7 t( v' c' N
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; ]* q# t5 t. L/ r2 f
" B; l3 y: s8 ]2 ?* C2 C: l
// 禁用斩波子模块
2 F. T& H% q8 u
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ n" _) }: ~, l8 x
5 H5 c1 h T0 P V* e
// 禁用错误控制事件
# D) i$ ~4 j0 n& X0 i# O; X0 a
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
' {' h& n9 e3 s' W8 h
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! S, z1 i- t& l9 Q
& P q& C8 K, M9 E5 ]8 x
// 事件触发配置
! A. G5 [; { z# n! O: x: `) B
// 每三次事件发生产生中断
6 C( m9 f4 y* X6 P) Q( Q% I
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
6 K1 f3 z! J' ?) e# g; U7 s/ {8 }# U% ?
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) K$ ~2 q; Y! K0 `( O, O
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
. g, r- C% w" K2 h& Q
// 使能中断
- B9 {' a* o0 ]- R3 h
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ s5 x _& p1 t/ k7 Q9 {
' @' I$ K) z: M5 e" U$ R3 }! ~
// 禁用高精度子模块
/ d. J2 v& P& o' x
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! v5 B, b, L$ K2 T
9 `2 d+ Y8 _) g1 g; d4 q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 f! V4 T4 Q: z! @( a& t! Z& f
}
4 {; @% o0 q0 \. q6 p
: q% w( K' _4 q+ Y0 H+ V
void ChopperWaveform(void)
3 ^) P" f2 D. j# Q: z0 b! G
{
& e1 g4 {; k' l
// 50% 占空比
: D8 T& A' F8 S
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' ?2 O. t+ f5 H8 k. O
// 4 分频
: ?- X8 T3 w6 I" Q: c
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) x" ?% y# X! p+ u: M% p
// 单个脉冲宽度
0 S* [ d3 A1 l K/ E4 o+ p
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
* z" s' O6 X8 b+ |. Z7 s' l# w) w
// 使能斩波子模块
`( s# U! B1 j
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 P' t2 X7 T# |7 r- V9 U8 q- `
}
7 `" F L( X+ q
( H# r2 ]- r( Y3 N. {+ |9 C' B
/****************************************************************************/
- O0 a* r4 |0 h# y
/* */
) \! R- b( D. T( _8 z+ \+ T- ]
/* PWM 中断初始化 */
% R" j7 N" U0 R
/* */
+ s% Z! g! B, z+ V+ y7 M5 d$ I
/****************************************************************************/
" f% M; M c5 |& T; ?
void PWMInterruptInit(void)
5 k0 H6 S; J& w4 f8 S. h1 ?9 u
{
* R/ j9 z1 B$ S3 \( m+ f
// 注册中断服务函数
' C& L; H d: r4 H$ R4 M
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 L1 b+ [) U! Z5 {
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
: L+ K! s! S% J8 [$ [4 M
1 r: w7 U9 A/ j% x
// 映射中断
/ D0 ]( V9 a h1 n
IntChannelSet(SYS_INT_EHRPWM1, 2);
9 d; I, }0 @! R# v& u2 [
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
6 k4 C! ^' v: N5 C$ h6 o" c
0 k5 q& A( N6 ?2 ?1 x/ I
// 使能中断
, H4 P6 s8 Q! [0 t4 `
IntSystemEnable(SYS_INT_EHRPWM1);
{: f2 E: \6 p h
IntSystemEnable(SYS_INT_EHRPWM1TZ);
! Z# [# T( |( W9 }# r. ]
}
4 h0 D7 ~% W$ B% ~8 d* o3 Q
# q- A' l6 \9 ~& a% H
/****************************************************************************/
& J2 k) H% e; B
/* */
' [% G9 }' x7 [
/* ARM 中断初始化 */
5 o. [& w: {" i, T
/* */
$ z' N8 u3 L6 C! C0 \ O
/****************************************************************************/
- @- }, C9 ?0 W8 {$ @
void InterruptInit(void)
0 ?$ @. v0 @2 c( E* b" q( v
{
( b- L5 V4 @% j" ^" G% L: }
// 初始化 ARM 中断控制器
+ d# l/ s9 s0 P0 Z
IntAINTCInit();
4 l- n4 V4 h! b+ L% i7 c' t8 M8 }; r
K( ?9 y- [1 U$ E
// 使能 IRQ(CPSR)
1 J M, e3 k& ^- M% i9 s+ w& a
IntMasterIRQEnable();
8 a5 M3 C8 X( j7 X4 p/ t b* ~
^4 d/ a4 G. E4 K
// 使能中断(AINTC GER)
) j# |' i: w3 q! R" b
IntGlobalEnable();
/ g3 n9 g8 i6 _ n6 p7 a/ o
& d$ ] v# o; U' C2 |$ P
// 使能中断(AINTC HIER)
$ O. h4 K: E- p$ A% ~3 j9 ]6 K1 D, S
IntIRQEnable();
; w/ B. G5 e7 F H, Q
}
: N5 W2 D V; ~5 E2 x7 j X2 j
3 w" U G! s/ T; K/ P& @& K J8 |
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
: M7 P. a& ]% Y/ k* L6 P7 N9 y( N
/* */
% O4 I# i# y1 S; @
/* 中断服务函数 */
2 o8 t5 j" o: r0 `* p8 v
/* */
) X0 k) f+ y, U# a6 D8 X2 D
/****************************************************************************/
% c' m8 b7 L/ N) t
void PWMEventIsr(void)
/ j# L7 A' q* |) \! i
{
/ _: }: t) T, p0 v5 I# f" J
IntSystemStatusClear(SYS_INT_EHRPWM1);
( b8 n& h; P0 |( q: D9 G
' I% p; [# j1 @$ R
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
, o# J$ k$ s" S0 x; f0 a4 i5 u
}
1 E+ g9 I9 j3 H: Q( Y# H
. v8 y9 W6 m$ I: K
void PWMTZIsr(void)
/ g, v6 L0 a j9 R
{
$ O! k5 \, w: v9 a* |. K( X5 u
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 z0 K# e3 Z g: T. E
7 L6 R% A! C' F- \' O
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
+ r% r( a3 T; h& L+ W, f: W
}
: x' W/ r) ~1 s6 I& ?; H
% A+ y0 O6 G7 e/ [, N
/****************************************************************************/
' z+ t( B) ]7 z2 d; o
/* */
" x; {8 ~) ^7 f9 S8 R, k5 o
/* 初始化捕获模块 */
; A# j" X( t# \3 R3 E& h5 a% G1 Y
/* */
! u0 W1 S4 H8 [( [9 H' h
/****************************************************************************/
5 i1 `6 O! ?1 H
void ECAPInit(void)
1 c/ L1 I% K/ b
{
" V) h& x5 C3 q, p+ Y" \
/*-----设置 ECCTL1-----*/
, h/ O# A* v9 |: W& \3 Z
// 使能CAP寄存器装载
( m, y9 F9 s9 {1 X* x+ K
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
- m- e* @; N: o$ R# {9 }3 V! i: V4 B) W
// 设置预分频值.
0 D4 T L! a% W N4 \
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
/ d) O ]. @) ]" v
// 上升沿触发捕获事件
3 F0 g7 x4 O2 g
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
3 [6 D/ W6 `3 I; s; Q5 Y
// 输入捕获后重新装载计数器值.
% J ]. |: L! G4 M. ?# n8 G/ W
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
+ K$ o- q7 ^/ I% J
0 N0 l4 q2 K0 v( B: q5 d
/*-----设置 ECCTL2-----*/
$ P% w) r# O9 |$ ?0 y6 x
// 连续模式
* x1 H% h6 X R; v
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
0 [3 x( Y9 \% j1 [* f
// ECAP计数器TSCTR持续计数
" ?8 h0 Y/ k- u/ N
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
7 b8 Z. K# f' z: ~
// 禁用同步输出和同步输入
7 \6 w; l' h8 d, M7 O4 U5 ]' _. Y
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
4 S8 K' x7 Y' m- l( u4 O, Q
// 配置 ECAP 2 为 CAPTURE 模式
5 |/ ? o5 i; z7 U/ U8 q# {
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% g0 G8 j( x# I N% W" U
! C" A+ n9 T4 Y% Z/ b
// 使能中断
1 {/ u/ s/ I$ {0 a( S; y
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
. c& s2 G- ~% @# z0 i. v9 G1 i: T
}
- k1 G4 a6 U2 l/ ]
; `4 }. U- u8 {* [, Q
/****************************************************************************/
( t3 s: h: x* F
/* */
5 f6 G' R( H8 W) a6 f( i6 S
/* 取得捕获结果 */
6 U2 v: M3 \" X! W, u
/* */
5 m; U9 k. g9 r8 b
/****************************************************************************/
6 B2 u$ l* }' T9 j
unsigned int ECAPRead(void)
' Z* u+ o0 T+ B" s- o' b
{
. p0 ]6 `8 g4 r6 i# [" w" ?% a
unsigned int capvalue;
* k3 p- D% n, [2 B# D
unsigned long frequency;
5 u+ T/ x0 @% }" _- v
; t$ R* ^6 n. ?6 q( l
// Event1 中断标志
}# r( y; v4 }4 S4 L: Z, E1 Z
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
1 w v! R) k, ^7 s; e8 F i* K8 y* B& [
{
+ F' o0 F+ N& k4 u$ X# a
// 取得捕获计数
9 q3 J3 e1 N- s& ~" Q. Z9 Y
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
. Y% K0 `9 \: Z0 ~- o4 ]) {; }
capvalue = ECAPResult.cap1;
5 \9 r, { E9 x
% v3 R6 M" g+ t+ c( S3 d1 F
// CAPTRUE 模块 228M 时钟主频
! H9 D/ [, F' @8 q$ N- W
frequency = 228000000/capvalue;
+ A0 H( R3 D8 J/ v% W
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
& F- U* i1 I9 e7 ]" C
8 d( O x7 _! i. z6 b7 _
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
7 v6 f$ r0 Z3 \) E
// IntEventClear(SYS_INT_ECAP2);
$ w. [$ u( \ b4 z; i/ |* l
}
2 r7 `2 K, d5 O/ s
return frequency;
: {4 F& |9 \8 L/ g! a
}
2 n/ ~9 k7 ^* R( s i3 K
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
9 n- W8 O% ^: r6 [+ d
[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