嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
2 @0 T3 m6 D! i" `4 s
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
; C) t& R3 y5 r, B
/* */
P: M9 v& c# ~: T' q4 Q% R6 K
/* 宏定义 */
2 o3 D: A$ K5 ]- G
/* */
1 h+ n; h0 Q$ r: d. U8 F, w! J0 Y
/****************************************************************************/
# d* q. @1 z4 x2 r
// 软件断点
/ V' T! T5 d3 U: N+ x' U1 |, @
#define SW_BREAKPOINT asm(" SWBP 0 ");
* N" ~0 d S- Q) m9 C5 W4 T* ?
1 s g+ ]/ r, u0 k( c3 H
// 时钟分频
* G' A9 u) \3 ]2 ]* T# @6 N# }# Z
#define CLOCK_DIV_VAL 228
- x1 b7 `1 [% p/ ]/ u
: e. C/ m v# f4 @; \+ ]& l
/****************************************************************************/
5 G+ W- e0 t" e8 }
/* */
' A0 @9 z' V5 [9 c# I
/* 全局变量 */
% s5 S5 X0 N( [, `. H( X
/* */
# r2 A$ ]8 m8 d M" x
/****************************************************************************/
7 C$ T# ?# E5 \: v3 f. P
ECAPCONTEXT ECAPResult;
1 R' b2 N6 l, x
9 \* ~( [! d4 J4 t/ \
/****************************************************************************/
9 ?, ?* Z* ]! U/ [% C8 K. ?
/* */
% S3 ~& V) X1 {, c# d2 `. h7 Z
/* 函数声明 */
" h& p3 f: ?$ E( o" Q! p5 Y8 ~4 [$ [
/* */
* Y- e6 p& d9 |6 @0 r# ]
/****************************************************************************/
& p) M5 I6 \& }
// 外设使能配置
8 Y5 ^2 C t+ K$ i& p. [
void PSCInit(void);
7 ]2 J# y2 ~6 D/ P
6 N, u/ {; i3 B9 J3 L9 d
// GPIO 管脚复用配置
' _; e& A3 l7 Y3 N& F9 T
void GPIOBankPinMuxSet();
% {* s9 u& L+ s; { \# Y, f
$ H% T0 t1 ~8 b6 i, V* @
// 产生波形
$ D5 b* E9 M& I) f
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 H5 _4 B: s8 u7 d
void ChopperWaveform(void);
# S& S: _3 i0 w* J4 Z
0 i0 Q* V0 N0 J6 {2 G
// ECAP初始化和读函数
! ]1 }, y: b; m
void ECAPInit(void);
' n; |! c& c5 F5 k: O
unsigned int ECAPRead(void);
! B& f% c4 v8 w+ i L I6 E1 z
9 o( W6 [2 V" v1 I
//ARM 中断初始化
# @) c, h% s& y3 Z
void InterruptInit(void);
2 J9 Z; v+ }" U+ t7 N
7 q, G6 h( R. N% V+ Z/ E: ~ F/ }
// PWM 中断初始化
8 `/ a( x8 O" ~
void PWMInterruptInit(void);
: n1 Z7 [& W' N' H% u. q0 x
// 中断服务函数
4 F5 t# J2 w, D3 B& M
// PWM 事件
" \# D. T' Y: a/ w5 }
void PWMEventIsr(void);
- F5 Z& f4 b/ I. w2 I. g0 b
// PWM 错误控制事件
4 p4 i; z4 \( Z" B6 \" @
void PWMTZIsr(void);
! k. r% T. H8 } \4 r
$ W `( ^6 ?- B
/****************************************************************************/
! g, s! f& E, r& k. o( ?& q+ r
/* */
' a" |' y9 q, E( G& R4 P t6 Q/ w
/* 主函数 */
" m; y/ d% p1 `- d: E0 S( I
/* */
) a. l9 O% q+ J u# D. c
/****************************************************************************/
6 {: O0 e3 b' |9 i
int main(void)
" V5 V& Q2 f5 H( g" u) P6 \
{
|2 q3 Q r2 R
// 外设使能配置
$ t& h4 p" d0 F* \- M
PSCInit();
+ i- I! X. J+ u$ G! }
% f! j$ u2 s3 ?
// 初始化串口终端 使用串口2
) g6 V" |% o9 A0 v g
UARTStdioInit();
( p! z5 X5 }6 g* C
3 S3 s" V9 e0 a7 w
// GPIO 管脚复用配置
L N( [5 ^9 T" l2 Y: |
GPIOBankPinMuxSet();
* _) `2 ~6 O' I! C
5 b& R2 _- g/ c7 i, h) g
// ARM 中断初始化
8 w' D; s; K* A" |! Z3 h
InterruptInit();
# f) s# b. Q( D
1 M7 `, P) F! M9 C8 k* ?
// PWM 中断初始化
' H0 P) q, ~' k) ~- l, d
PWMInterruptInit();
. F2 M+ B) H( R, i
2 m$ m" [5 X) ~* \' `
unsigned char i;
% S; g0 |% @3 b) G
unsigned int j;
' f7 L$ a J. ~: W1 K$ k& s/ C) z
4 z( `' m L' r! Z
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ g5 P4 N$ g, t) ?& l
UARTPuts("------------------------------------------------------------\r\n", -1);
: [7 w0 {, o- ?- j; _; p/ {, Z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! T6 K$ G$ u) f% h8 F5 ] g$ B
// 产生波形
. L" s# Z: h8 d& b7 X$ z
PWM1ABasic(25000,50);
2 y: X- u* D3 X: y
0 L; H0 S; [4 q; e) `
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 z6 p* A" r1 w2 `5 E) {
UARTPuts("------------------------------------------------------------\r\n", -1);
* P v, }, ?( s0 o( a6 t
$ x. L% Z5 K4 K# r5 D$ Q; l8 u
9 z7 h4 Y% e% Q" |: e" m5 K! V3 B# R# i# v
5 U# P( E9 N( A$ T, W4 f$ C
UARTPuts("------------------------------------------------------------\r\n", -1);
3 h* d! V$ d! d0 f
UARTPuts(" C6748 ECAP Test\r\n", -1);
; X1 U$ s! Y* W1 _( {% s
// ECAP 捕获初始化
" x. G% i, a. Q; @
ECAPInit();
4 V# t$ V5 x7 ?6 f! |: n4 K0 W5 |
UARTPuts("Initialize ECAP.......\r\n",-1);
, j: s+ Z2 i3 J
for(i=0;i<5;i++)
& n1 @9 a# B) i
{
; x3 i# S# m1 K- p8 `
for(j=0x00FFFFFF;j>0;j--); // 延时
% ^6 P. R) a! ?7 v! }. P2 f; E& w
ECAPRead();
g: l/ q P0 Z$ S' Z) Z) k6 U. i
}
5 F# |/ Q& I( M4 K/ ?( z
UARTPuts("\r\n",-1);
; W" N. l1 H6 v! |% k/ o; I
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
# \) H z; O. b6 G4 z) ?- c
UARTPuts("------------------------------------------------------------\r\n", -1);
+ y# E% q. \" ~4 V. R! v
8 W U2 M9 }# m' E" n
// 主循环
/ w5 _% f- {" D% N9 M0 }% v# h
for(;;)
3 v2 @" f; k7 M6 O* W9 K
{
7 B9 l* q6 d3 G! L. G
7 I- {8 ~" B; N: x0 Q7 a
}
4 u1 v0 h. Y0 N+ Q' G
}
8 N# T$ f: l$ b( k _, O
* g$ q8 ^5 G( K! z' c3 e( i8 b
/****************************************************************************/
* P: h( X3 p$ `) m
/* */
* C/ d4 e- W! P2 I7 q; F
/* PSC 初始化 */
- ^+ Y- h; N/ g
/* */
5 e) {0 S0 m! \$ s: l
/****************************************************************************/
& P4 i) Z* b, S# |
void PSCInit(void)
8 g6 s: e( i w% t/ k
{
9 b5 i4 d* K4 d) ^# [, u* r. l5 v
// 使能 EHRPWM 和 ECAP 模块
+ c' I6 p% L9 K
// 对相应外设模块的使能也可以在 BootLoader 中完成
1 @/ o; B; }! Y, U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
_6 \. a; ^4 o b5 D# S# _" j% r
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! i: q# m' @8 ?4 L* F) B& R1 Z
}
( R5 a4 H3 c+ o8 v: ~
: ?( D+ `1 D% e1 V; {7 A7 ?
/****************************************************************************/
3 W6 V( r r& |
/* */
7 ~* I( F+ U# k# g: z9 y5 f& Q9 J. H" e
/* GPIO 管脚复用配置 */
; ^& I* |6 O3 b' e4 {- V* q
/* */
! _. G1 H- M- I7 t. M# q% k9 ?& o* s8 T
/****************************************************************************/
# q. d- R( J2 X7 p# M
void GPIOBankPinMuxSet(void)
1 P- L; B/ c2 J. L% U
{
. m3 X9 h/ l$ ]1 r1 C$ s* ]% [& v
EHRPWM1PinMuxSetup();
+ i5 e5 t3 O# e' `; L3 ^0 O5 R/ K
4 s3 X- A6 Z2 j* g
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
7 C4 [4 L7 r8 O& A
// 作为捕获功能时管脚方向为输入
5 i0 S6 i5 y! [0 H
// 作为辅助脉宽调制时管脚方向为输出
{& m b) m; `) u, P* F
// ECAP2 / APWM2
# W4 Z# H b! J1 v( F
ECAPPinMuxSetup(2);
6 Y! B7 Z' Q: b% m* g
6 U5 w& k! I: R: j8 V9 l
// ECAP2 / APWM2方向设置为输入
4 Q7 Q7 N$ u; M7 |. O0 e: D: _
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! `9 o7 P* q0 r. j ? Q3 I6 ~
}
) i% z# O$ g1 `* |. Q& h- q F
5 `1 N( a* F! T7 m% z( U; U
/****************************************************************************/
+ V6 Z3 Y( ], z% |: g" z2 O1 U
/* */
& s4 y0 o+ F3 G- L1 K& f6 ?. @
/* PWM 输出波形 */
/ g9 w% y; @( { ^
/* */
5 N4 h* f) K4 {$ N, ?$ e; _
/****************************************************************************/
- U* e+ Y/ u! U" X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
& W$ I" L( i, u0 E, h
{
' q% D1 h5 L' b; V; E: \: h
// 时间基准配置
! a# Q$ G" y$ @, R* J- q8 _
// 时钟配置
; c( h4 j7 ^ M; u
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" t1 J' q5 G+ X( A: H; z* h
/ ?7 h" R( }: H9 y& y
// 配置周期
; Q; K; c! V5 v" T8 s1 [( r
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( D3 _7 t/ ^+ }6 t. Y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
% ?6 i# f8 R+ C! x
' b1 r. y% J/ @5 x4 z! l1 H
// 禁用输入同步信号
4 d) x5 M. R8 D# Z1 H, l
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! n+ y! s& n5 E# d7 y
V2 Z& G2 w ^/ C( P8 G, g
// 禁用输出同步信号
* @; W# [$ }3 S; Z3 d- ^, U
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- U$ g5 C; t# q9 p$ \
7 F" [1 {) |* H# a+ w+ d7 G% }
// 仿真(DEBUG)模式行为配置
; _; C% ^: H, O0 E# l8 l6 _9 Q
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 l7 x4 c" H' v9 o3 P
2 g1 V; i1 j! x; C
// 配置计数比较器子模块
6 |0 |% o7 x- Y7 _4 P# X: z
// 加载比较器 A 值
5 H! ?- f- @! p+ X
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ q( ^6 y& w6 l" J( w
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ ]' } O: `' K/ i
* ^7 C4 k: k M/ Z1 o$ {. U" W
// 加载比较器 B 值
6 y$ s4 L. {- @" H9 O
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
( {, n* y" ]) ]- ?; Q! A& [) V
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. x" v* }% U% o: ^+ @& c- M
9 ]: o0 ~5 F* v6 i8 k4 N" U4 B4 J
// 功能限定配置(输出引脚触发方式设定)
( ]( S0 i5 R; U3 k3 n$ h
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! M& B. e' i. _/ `1 i: u1 K
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, Q" a: w4 B0 V8 Y% D; I
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
4 o# b( A0 l2 m0 h C/ j1 v% Z: f" s
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 ?" d: N% l+ v8 P
3 S+ _# H' F/ K6 b
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
5 p2 k# a4 t1 X# o+ P" S
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' Q0 h4 ~- N, ~6 A
: m0 i# Y1 G( r5 R# ?
// 禁用斩波子模块
8 {0 Y! L% \" b: D* h
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& y+ b3 @+ q% F8 |
& C0 b0 }; A. Z$ {7 T- Y/ a
// 禁用错误控制事件
5 f- c# k3 F2 t# F% ?# O
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ x! }7 Y% o& u- F7 ~0 s1 H* `* E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 R1 A- h. s; ^5 a/ t1 c
/ A" }& X" I! K( E, g1 K, ^
// 事件触发配置
# a) ~! z% r* Y* ^
// 每三次事件发生产生中断
# r; N, L) {0 S
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% ]+ O5 p0 v$ ?' z, l: s
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
0 d. N) i5 A% N: U1 W5 O! b% h7 e
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 j9 Y. Q6 C( v) t$ Z9 E5 x
// 使能中断
. p' ^' }5 q0 E" x0 i5 r6 n- i
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 ]8 U! ~) Z/ r* C
% G- }4 `; i1 g* h; n- c
// 禁用高精度子模块
+ T$ H+ n. Y' ^, w& ]$ i0 n
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# S% c& c" A% Q- v% h% d
6 m1 ^1 z& ~3 [
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
* k/ Q" ?7 o: ^
}
: @ H4 r! _: X3 Q
+ N- Q0 H# j0 R$ e
void ChopperWaveform(void)
1 F+ I L0 I X6 }+ ~
{
0 n$ o/ d7 l! L" C$ O6 y) H$ ~
// 50% 占空比
8 I8 i) l( N4 e9 Z
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 g9 a% m* d. o" A# k, r' V+ B
// 4 分频
# l N/ e$ U5 T% }: s* u
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* L2 W* U1 r& s8 [1 u
// 单个脉冲宽度
; f/ i1 k" G d; o# S, c/ b. V
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. U1 S# @7 b. z$ p; d& y
// 使能斩波子模块
6 c0 t5 E4 O' l8 f, R0 d
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ N! ]' T% T+ {' ?' u6 W
}
2 ?2 }% z' V$ J F% U1 c- W
4 V- n& T: o& b! X4 a: B7 L8 m' _
/****************************************************************************/
! i4 [1 O* V" |4 c# A! f( C3 k
/* */
! ?5 X6 Y5 t. n3 ~
/* PWM 中断初始化 */
- A& d$ u% V# y0 }; g7 T6 t* T
/* */
5 i& K+ B/ E9 {% C9 T o
/****************************************************************************/
% |3 r7 g. [* o1 V/ C2 Q
void PWMInterruptInit(void)
# q1 A* }3 w: N m. c. r, h
{
b4 N$ k, G: z5 ?# y
// 注册中断服务函数
# P5 ~4 S0 w; S6 c; y
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
, r' q1 T; a3 E2 }! F3 _) E) m% l
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 S' ^/ U3 D4 g& @- C0 ~3 E: E
. w9 B7 Y+ s6 A* g# a
// 映射中断
# _) A+ s0 I) g6 {& A
IntChannelSet(SYS_INT_EHRPWM1, 2);
2 p) F- x- Q" n& C
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ N; r4 Z- o1 v' W0 o& f5 `- B" P6 A
' D3 T5 U1 i$ _; M- j. r
// 使能中断
0 a1 J: {, u# g+ P# F
IntSystemEnable(SYS_INT_EHRPWM1);
) p7 {) g3 t' A/ X3 y
IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 k# z: s: ^$ W) H# F$ t1 e
}
2 a' b5 h. |0 H; d
! v; k; ?' \0 {. Y" n* I% Y2 p0 N
/****************************************************************************/
; q; P) D$ Y, ]2 o! k, B2 \
/* */
4 V9 h/ g4 P+ e( p, V* S2 Y3 M! A& S
/* ARM 中断初始化 */
$ N; H4 c6 W( h h6 P4 w
/* */
9 w! d& t8 {. c' e( g
/****************************************************************************/
: R# [4 E. I* t' }% O
void InterruptInit(void)
7 |) [0 \2 B& P1 A' c) L: n
{
b$ N* S1 W3 w* U
// 初始化 ARM 中断控制器
( z/ [8 n. H8 ?, v
IntAINTCInit();
5 d) j; k% Z) z5 Y0 R0 e
f$ l# H6 ^. A9 ]" e: t
// 使能 IRQ(CPSR)
) X# e7 X# b, n- o
IntMasterIRQEnable();
0 M% B2 m& W5 c9 ]3 o$ b
. g& |" }7 L6 a1 ^/ H
// 使能中断(AINTC GER)
# R# J X6 e) c# C
IntGlobalEnable();
3 ?% V# N( B" ?$ n ^$ z# ]
7 B& X6 g" Y2 x4 D6 m
// 使能中断(AINTC HIER)
. m$ R5 i3 M! m+ F% P5 W# j& ?( Y
IntIRQEnable();
* R4 u& F% G6 q- U& O
}
0 d3 X2 N5 S4 w" s$ }9 F
5 D, z; X d, X0 ^
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
5 D7 F! \9 E; \; q# F
/* */
8 p, c0 Y5 d9 I* u. ~9 G) y& ~8 X
/* 中断服务函数 */
/ _# k/ R6 E2 f9 X
/* */
, s% n6 v7 _1 I/ _; Y0 v* I$ A) T
/****************************************************************************/
) D0 W8 U$ Z+ ~4 \; Q1 k
void PWMEventIsr(void)
' k- [" ^5 g+ V, Q5 `
{
! S/ x9 N) O5 s+ {1 @% J& a# l
IntSystemStatusClear(SYS_INT_EHRPWM1);
1 H1 l, P6 L' j5 I: @1 P& P
; D% K' g; @0 K# K# V u2 O* P( L9 Y
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 Z1 g" P) {; \9 P4 z
}
3 A& S% v4 _5 i
& f$ t% }% _1 \
void PWMTZIsr(void)
0 J. E }% d; `( Y U( [, t* A
{
* z' z# i5 M& N0 E* r# m
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
: P5 O4 C2 {8 Y1 F
7 c- B( g0 f" \* m
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# u6 Z0 _/ L3 ^' U( S5 H
}
$ M6 q, I! [5 z4 G; |" V& F' s
. `) y# V' I, i9 k) _" Y3 a
/****************************************************************************/
. M0 G+ }9 k2 \8 V( e: K
/* */
U) B" w& [% s% H
/* 初始化捕获模块 */
' S% `+ w) ?/ b5 ?9 q5 Y5 j) o
/* */
/ f [1 o. C7 T# u4 o
/****************************************************************************/
' p' v+ e2 b0 x+ \
void ECAPInit(void)
2 L- g* a8 t# P/ z
{
7 S$ K: t5 b+ v, y; [
/*-----设置 ECCTL1-----*/
& | {- c# A" M: h
// 使能CAP寄存器装载
+ I1 A$ V" ?+ K2 j5 s' L6 z( J
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# Y: Q& e" [# o) g1 j; ?4 d! M* m
// 设置预分频值.
+ M$ d) n# x1 _$ _! F# L
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
# z) \& g8 U, y' _* w
// 上升沿触发捕获事件
4 s3 x7 s+ P' h" t2 I6 `! V
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
$ i9 E0 g9 l1 m6 w. B- N
// 输入捕获后重新装载计数器值.
& J1 k5 c# |6 u1 J* B
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
0 K" |3 L# q, M- x* ~4 u/ }8 E+ V
4 U5 a" K4 w* L7 N0 P: F
/*-----设置 ECCTL2-----*/
1 g' W$ b; f [6 P8 i
// 连续模式
4 Z; h5 c2 h+ C. z! h; ]
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
9 k- }/ f* f, H7 t' \
// ECAP计数器TSCTR持续计数
2 N1 o' ]6 X2 B+ [
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
, }) B# Y: Z$ w1 ?. T
// 禁用同步输出和同步输入
, n: E' A: C/ L* t) o' J
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
4 `2 ]5 ^& K' G
// 配置 ECAP 2 为 CAPTURE 模式
- i* p4 m$ _% l9 m* p/ A
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
& L6 T; e8 v, E3 q5 H
0 t# p. k3 V2 G$ ]& Y
// 使能中断
' v' s+ C! V1 [8 d& L
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
# B* U( d6 a" V# W
}
a7 {/ Q: E3 {* c, V7 H9 t
; U! F5 s# ~* [8 f' E
/****************************************************************************/
0 N' A$ J0 U* s5 ]3 D D
/* */
4 W5 q J' C9 b4 ~7 ^6 Q- f6 S+ e
/* 取得捕获结果 */
% h( Q# I+ _; W) Y3 G
/* */
. c* _- D) x9 h- W6 ~$ h1 H; w
/****************************************************************************/
# G: Y( J) V: A
unsigned int ECAPRead(void)
; x$ c: F1 b2 O5 j: z7 s# w, l. ]
{
; b8 f0 S# ]9 Z5 M7 q
unsigned int capvalue;
2 N) u) r6 k+ W6 x# w
unsigned long frequency;
9 R& M$ N4 u- `2 n O4 n
' o. R$ C5 G$ p* l1 i: _
// Event1 中断标志
! ?& ~& O3 Y, ?
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 S, x; Y7 h7 S8 T h
{
7 [% R" J$ A& s" z
// 取得捕获计数
3 A) Z$ A7 c! C) e
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 k3 h6 ~" ^" O: L
capvalue = ECAPResult.cap1;
) M! O1 S/ C4 J1 E
: _& a3 y. i8 g0 Y- N. l9 N' r
// CAPTRUE 模块 228M 时钟主频
5 v0 P8 _3 i! p V
frequency = 228000000/capvalue;
3 x% a; v" K/ l' I/ ~( Z5 @
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
1 @. H* X3 s! m. ]0 c/ a
7 G3 ^0 x7 X. A2 s8 X
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
5 P6 r& M; M+ b: b9 Z- {; W. A
// IntEventClear(SYS_INT_ECAP2);
9 W2 w) k. I7 g; P9 O# O( q* n3 |
}
, r; g1 i! g# L
return frequency;
; R& o+ h3 S, B1 A% _: X
}
6 \3 N. v+ f( |( g- s W
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
4 Y# r& W# _/ e( {9 \6 i+ O
[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