嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ o- Q5 k4 [- i
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
5 K, S7 n" @; Y, @. d6 n
/* */
/ X1 z( ]# \( O( q# e4 {8 O
/* 宏定义 */
' t- I' q8 o' a9 _! @& z( n
/* */
% T' e0 j; r1 e
/****************************************************************************/
5 t8 K. G' Q- Q4 C% r" I5 u) E) Q
// 软件断点
& f3 L! @. P" t) s) \ I) n4 d
#define SW_BREAKPOINT asm(" SWBP 0 ");
; E( e2 p% O$ Y" j' O: G; b
( J& n$ n; F' R/ C; @
// 时钟分频
* d# e+ b* E5 F8 R! C- m5 v
#define CLOCK_DIV_VAL 228
: X) H6 H$ O; Z5 s) R$ O3 E6 y
, v6 w( \+ r P4 l$ `& k
/****************************************************************************/
4 `8 c8 G& n9 c/ R
/* */
7 w4 J8 L" Z, S& L0 V
/* 全局变量 */
- c( l+ J4 k, \% j* \& }
/* */
: L$ `# A0 z* l+ v ^4 o! ]% O
/****************************************************************************/
( B7 a6 A. A) A
ECAPCONTEXT ECAPResult;
6 }' V8 _ ~7 p" t
7 W2 J- I H' z. p4 q
/****************************************************************************/
0 q4 k6 y3 S( M" R6 g8 u
/* */
( A5 F. y. t+ G% @7 i0 z0 T7 P. f% K
/* 函数声明 */
) H9 J' Z' D! A) a; h/ Q
/* */
W" t% r( l7 T5 I2 N6 W: e; ~- c
/****************************************************************************/
+ W: v- D8 p$ @* }
// 外设使能配置
0 @( |) e) H$ w% l* r
void PSCInit(void);
4 K8 @4 ?; v* X' R
0 I$ }* ]. ?- H T5 ?; C- T" r
// GPIO 管脚复用配置
, i# \3 } c* ^ v. P4 u2 J
void GPIOBankPinMuxSet();
% L' F7 T4 F' _$ e, T3 S
) [" j0 N; M% J' K& |7 P' ?: m
// 产生波形
7 w6 ~1 r/ f% u$ i* Z- g. R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ H/ w8 E4 C, o
void ChopperWaveform(void);
2 S0 f/ A* a2 Q& W& C* e/ I
/ x2 p, ?( Q6 V! y0 g
// ECAP初始化和读函数
8 F; G* _7 u: A4 t1 X3 d* Y
void ECAPInit(void);
, q1 u& z/ |, y! M! U
unsigned int ECAPRead(void);
( E8 C3 w0 G. @! z, h( R. r& i
) w8 D# |" [1 D2 M+ x" }
//ARM 中断初始化
& M o2 k* k% @: w; u, P0 W
void InterruptInit(void);
* f5 t. z9 f# U! A' {
! C9 I& [/ _( f2 ] G
// PWM 中断初始化
5 A' b+ N" j* h! h: C' e" x& T
void PWMInterruptInit(void);
# a, i4 ~2 T( T& d& m6 [
// 中断服务函数
/ Q# O7 A6 x% g
// PWM 事件
0 {! x4 |& j4 R4 p8 i# j0 ^
void PWMEventIsr(void);
, j5 h+ {( [" `& P
// PWM 错误控制事件
' B5 j' G! h* j
void PWMTZIsr(void);
" D8 b: G& Q, W9 d v
: n7 z# u: E3 c4 R+ D
/****************************************************************************/
2 N8 Y; x5 P( m2 [, j- m
/* */
% u i+ r3 J3 e
/* 主函数 */
5 r& H2 ~3 f, h% ~: y% v/ e" E
/* */
4 K. t! V u# }# k+ T4 j$ V' O
/****************************************************************************/
5 t9 E% |$ H: Z$ B
int main(void)
& Q4 S! B1 t8 K) r
{
f! d* a2 s! x2 F) @
// 外设使能配置
6 ^5 Y b: S7 `5 }) p9 N2 f
PSCInit();
3 v7 Z& M- {- T# B4 P: l
, k3 z9 B" a7 x$ r7 D
// 初始化串口终端 使用串口2
5 P7 ] l7 [/ g
UARTStdioInit();
3 N5 p8 _2 r5 Z. u: L; v, ~
, W: U' Z& @4 h z. I8 Y, k
// GPIO 管脚复用配置
3 t! j( W9 k6 X8 q8 I
GPIOBankPinMuxSet();
3 K( \: A* \0 N% ^- a$ ^- _
$ n* q# r( |( K2 |
// ARM 中断初始化
5 {! X+ Q3 i; \1 }6 S2 g
InterruptInit();
n9 H) x7 j# M' y" N, Q
0 Q5 l8 g% e: Y
// PWM 中断初始化
( T. K3 c( ?# L5 }- u" z! o
PWMInterruptInit();
% t6 b2 R: |3 F q* u3 E, U
! O8 J: d p+ j% T
unsigned char i;
- P$ j% @+ p3 U
unsigned int j;
% S' C. q2 Y, Z* z2 m; o5 E, R
% O2 S P5 M, e# m7 G+ P2 b
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 w# {0 g. [6 g; M2 N
UARTPuts("------------------------------------------------------------\r\n", -1);
1 O& a% y; w2 Z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 c- ?8 k5 K- m
// 产生波形
6 z6 V: a4 |: d( G! T5 b, l' }
PWM1ABasic(25000,50);
7 ?: k. X' O a3 ~1 _
& @ ~8 K: O4 ^* t
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. a; @( y1 U( Q- C8 e9 U
UARTPuts("------------------------------------------------------------\r\n", -1);
) ^0 A7 I1 Y, c8 b" A/ p
) _. s" |4 l) [ I' b- }
M0 E; s0 q2 } \+ b5 @
( u" _3 P0 R7 ^, m) }
UARTPuts("------------------------------------------------------------\r\n", -1);
' W8 N& m* l( n1 O8 e g
UARTPuts(" C6748 ECAP Test\r\n", -1);
% r* R) A# `3 \- h
// ECAP 捕获初始化
. U, r, a+ f' b& {2 f* f) J4 W
ECAPInit();
9 |' c: a9 T: p4 A3 q# x4 R
UARTPuts("Initialize ECAP.......\r\n",-1);
4 K5 h' X& h, F
for(i=0;i<5;i++)
9 @7 I$ `: j3 `
{
: d$ _& W. n0 S- J4 K! M; \8 ?; A* ^8 p
for(j=0x00FFFFFF;j>0;j--); // 延时
+ w1 K; G, v4 [9 x. b; N! U
ECAPRead();
5 q. v; h x4 H" \- V: Q
}
3 y" Z; B. [" d& X; r8 T+ [
UARTPuts("\r\n",-1);
7 h: O( o }7 H4 ^
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) S' d/ n! M' |
UARTPuts("------------------------------------------------------------\r\n", -1);
" q p' ^# E5 f5 J* u7 q
5 F9 n* S' n" I; T9 _2 h6 i% v
// 主循环
9 }1 ~0 {. Q/ P
for(;;)
$ i: ~! F0 t/ n
{
; m- \2 Z# E W8 R T
: r! i/ p! Y0 Z7 }- X7 N
}
8 N1 ]( H; m3 d0 L0 Y& d3 \
}
- B) x, A* m( K1 H G
, b N; W: D N n" B& E* H5 u( s1 p
/****************************************************************************/
- b c. e8 s4 W
/* */
; ^" d1 l8 J l; D5 J
/* PSC 初始化 */
1 U; m! z/ k. h& }5 d8 G- B0 C
/* */
+ t* ~7 e, W2 B* m
/****************************************************************************/
; S' E' o0 a; i! B
void PSCInit(void)
, {/ {1 L; w/ V
{
; c- ^. x6 }8 d9 Z9 l
// 使能 EHRPWM 和 ECAP 模块
, k+ t% n+ p# @
// 对相应外设模块的使能也可以在 BootLoader 中完成
! w8 o: T7 a4 I( P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 j+ j" T6 t6 L
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ L$ r2 O/ X! E. v! L
}
$ b# t* W4 a' L
6 U/ `3 T% [4 c3 y# e: E
/****************************************************************************/
# v+ ?0 \3 H7 X
/* */
* S/ d7 q0 \3 \* \# {2 j4 e
/* GPIO 管脚复用配置 */
! m/ V7 D! N7 N" W( p" j
/* */
6 K8 @: b+ D. n
/****************************************************************************/
+ i b. B6 [1 v' T, K2 v( p6 X/ [
void GPIOBankPinMuxSet(void)
' ?7 b" X/ ~% f
{
' d7 [0 w7 W! t" ?( ^
EHRPWM1PinMuxSetup();
6 ]7 m- E; u# t4 X
3 f0 e2 p2 M) {1 w% Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- W0 q" G# b7 m3 A$ x
// 作为捕获功能时管脚方向为输入
6 X0 a) p3 X! n$ D: n/ d$ |) N) e: F
// 作为辅助脉宽调制时管脚方向为输出
* `% r1 Y: E* W5 B. m! G, p" T4 X
// ECAP2 / APWM2
$ F0 }$ e" r9 G4 g0 r
ECAPPinMuxSetup(2);
; F9 p0 N& ~* T. O8 m# o% b
7 i. ^" ^* y. _/ E
// ECAP2 / APWM2方向设置为输入
0 P7 N/ C& m, L7 w" {
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. W o$ [9 g1 U
}
2 Y+ |, @' T: y; Z3 x6 E! y) S
/ H% T, _( H3 t; M6 S+ y
/****************************************************************************/
- `* X* @! _* `
/* */
2 r' _* l& y2 O" J
/* PWM 输出波形 */
% l1 U9 c0 Z: O) o3 _7 G! n
/* */
; B9 U* Z7 K) v0 _! J9 R$ l
/****************************************************************************/
* T( J' p6 v) S' R7 Q4 E, |6 f$ S
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
# {+ D/ M+ n0 i% N) [9 @
{
9 \# y+ C( J3 }; u2 o/ \' m+ r
// 时间基准配置
7 y. G0 {/ E( T+ l
// 时钟配置
, y" L7 g a0 C g2 }& }) ?# Y5 A
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 m. I, `* [3 C* P [9 ~% V$ E: j$ s; B
2 j8 q8 s+ D6 k6 R$ Y
// 配置周期
5 h9 F; @; X7 Y; l: E6 g! Q
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 o* x- G9 x8 ]) x8 p
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
. A) |! ]: U! P6 r3 O4 F' u
! H H7 i; T( G5 m9 R4 m+ K4 C5 F6 }
// 禁用输入同步信号
% w4 E% A; J5 B
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
& f" p3 B3 n/ E0 P0 U0 A) }% U. g
" \3 z- i% U" p: b% y
// 禁用输出同步信号
1 F8 s& Y5 m4 p7 s4 r
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# O- z* Q3 K& A' Q# }
7 H& x1 w% U$ H
// 仿真(DEBUG)模式行为配置
' P$ j- {, M4 W1 z
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 v# @0 r* y! Y7 t# d
- j( f+ E+ @; c7 l) D
// 配置计数比较器子模块
1 g J2 L) D1 }- f1 W
// 加载比较器 A 值
0 x8 S% w5 ], K( Z8 V, A* c
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& X) P' B1 x b$ P8 U$ ^$ z
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, q2 d7 C! i- a5 O' }) @
3 V* F+ X( s4 [1 n
// 加载比较器 B 值
7 r+ V7 F- @2 r$ S$ j* e& C8 e
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
; I \$ G5 I& {# ^+ Z6 Q+ t$ @0 `
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 W, c* V/ |& \( N R
! w/ I# q D3 O2 C
// 功能限定配置(输出引脚触发方式设定)
/ d9 r2 F% V0 [2 [0 z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# N! W3 r g6 d. |
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 ?, o5 ~2 ]1 A) f$ |6 O+ Q
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 N2 k! q4 L2 X; @
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 h3 |" \2 E" @1 s# X& z6 @
; J4 o( f# U1 P5 E l5 N: _- ]
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 [! f6 x* R% j8 A
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. Q* S8 |. d; V" Z8 s! ?( d
- g- P- ]( j' [0 ~9 O! K1 o
// 禁用斩波子模块
1 z5 V: G7 [) P1 e) m
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 M6 g# c* g- g' H5 `5 o$ z
# U! t# x4 P8 n
// 禁用错误控制事件
8 ?' k7 v2 G( S3 c# M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
3 D. R, t4 x' j' y0 j2 T6 ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 M9 r; |. V Y8 h7 o2 b
) [* ~* c% b {8 U2 g
// 事件触发配置
6 i" e& o$ Y4 {
// 每三次事件发生产生中断
' J* S# R# u L) W* ~ K
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
: p# p- s8 y+ S7 t2 V6 y6 g
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
+ K) u' c8 Z# _' r: u. c
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
) U" N( w% l V+ g% W$ C
// 使能中断
, @0 E/ ^( l( J) b d) L3 [; j7 a1 w
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
b: h, \# `# l3 t6 E
k. }5 c8 ~$ a( ^; k; i" k
// 禁用高精度子模块
; r( l6 s. T U3 v; L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
4 g% @/ I* b* Z; H, c& C9 E
% u* f4 k G! q: K9 O- I
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 Y, F* J. f2 `
}
/ J' X2 w& h7 V- V7 L+ i4 \' n
- U8 w! I$ N1 M' ^& O' C
void ChopperWaveform(void)
$ E9 R& l* D9 N( D6 Q
{
, T( c/ {: v; f! ?
// 50% 占空比
% K9 l9 N! l, h# y: d! N
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
) p- e& _6 ~ C
// 4 分频
: D4 d/ x) m$ C% G3 V, d. h @
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& e! `% |6 E7 Y4 R" ? F
// 单个脉冲宽度
/ z0 A2 o8 o' i3 t2 s+ k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 `* y6 [8 M/ @9 ~- w
// 使能斩波子模块
+ _2 [+ E' b/ S/ L2 j5 X
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
* ~1 F* U: _3 M" S$ F) G: m
}
1 p6 G5 i+ ?5 ?6 @: s8 D
4 e# G4 d8 B& Q/ f0 n
/****************************************************************************/
' X1 r6 k- q5 C5 @5 i
/* */
' S9 t; W" a# q# ~! g% z
/* PWM 中断初始化 */
3 U# R. J$ j- S' B8 ^/ |) Z$ M* D! d
/* */
& @6 O u! g% D( k) e5 [
/****************************************************************************/
4 V. [4 S6 O$ X* g
void PWMInterruptInit(void)
; ?/ X8 g. \, I) Y3 ?
{
2 w* S1 x9 j8 P8 ~& h& I+ I: D
// 注册中断服务函数
- l& s) W8 ~* O3 L4 m! F$ {3 t
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ w( W2 y7 z) U' b# V5 k% N
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
: [( h6 c U; s( ?" F
* i }7 Z) Y8 k$ \4 ~9 _
// 映射中断
# p* h0 X. y6 B( L
IntChannelSet(SYS_INT_EHRPWM1, 2);
* F$ S v% m$ D3 s: r8 [4 W5 W& u; }
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
1 A z/ n) y& \, H0 ]' b+ T. J9 m
7 @) n6 O2 _+ j$ Q! p/ j
// 使能中断
/ q# A# n$ B1 Y8 ]1 k" }& L; T
IntSystemEnable(SYS_INT_EHRPWM1);
0 B6 h9 O9 t. |! A- C& A. _2 C
IntSystemEnable(SYS_INT_EHRPWM1TZ);
1 Y9 u+ Q5 a1 C: `5 p, N
}
' D) B7 {% u& [1 P3 T. @2 b
3 j: o% T& H" W: D7 k3 P1 K
/****************************************************************************/
" e3 g$ |. \' p2 I
/* */
. B8 ?% f2 _9 p' f" Y% R; {- f5 V
/* ARM 中断初始化 */
% h) R" U1 J4 n' |3 I. z7 `
/* */
8 r0 s( S' S/ p9 y* \& l
/****************************************************************************/
3 O# V( S' X7 t8 [6 B& u
void InterruptInit(void)
/ K0 S3 W% q' X
{
$ V: x" V" ^% b! i, b& y
// 初始化 ARM 中断控制器
: K e m' s7 m' f# l
IntAINTCInit();
- a5 j8 U7 n. t' }9 G
; }2 v! I1 g! [7 R! |
// 使能 IRQ(CPSR)
7 w0 c, r% f% T8 n. Q/ j6 O% R0 |
IntMasterIRQEnable();
" I, x7 L: ~8 O& b9 s
3 \+ F @1 l* {( l. ~
// 使能中断(AINTC GER)
+ ]* S4 ?" h/ L+ ]3 S2 R. {# V9 G
IntGlobalEnable();
) ~2 ]1 R0 o9 |' X- ]4 d
p9 C* {1 X& Q
// 使能中断(AINTC HIER)
" Q: e0 ~6 f5 Z) `" d# L4 g3 t5 Z
IntIRQEnable();
0 ], Q, Y& u8 p8 e
}
' I9 b+ E" n- Z) C" _7 s" w3 \1 f
; `6 |2 f* a; s& O5 a
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
/ _& y5 ?% s$ v9 F
/* */
( r6 b5 i0 U4 M" D% }
/* 中断服务函数 */
& q: n* i# J ]' ^
/* */
) i9 }# r# T9 h6 ^7 X6 l; m
/****************************************************************************/
9 m* s. y' P5 ]9 Q+ Y+ X# M
void PWMEventIsr(void)
. N5 [9 E- I" L' V: W
{
2 M0 t. ?* a% _! k
IntSystemStatusClear(SYS_INT_EHRPWM1);
& z. j* u5 p( a: S7 u, |
" X& R% Q+ x/ g' ~5 q0 v4 ]
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
. e/ D/ z0 d* G
}
3 d* h) B l6 E- i; q. Q* [
8 w% X8 o6 U. g$ R
void PWMTZIsr(void)
' n$ r7 k% N) x, t7 h: ~6 E' j
{
% Y. {1 F5 U" s. |/ q( O; j" _& @& a0 y
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& Z l9 P) W) S$ y2 v) s; V: |
8 f- p6 l* S; b! D& E3 f
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 k; `3 `$ C$ j- \0 C$ v% L
}
0 Q* m2 }0 S6 {# @- a( H1 ]
0 [* {4 g' i+ A8 a8 g" J; m
/****************************************************************************/
5 m' d% C& X! h$ G
/* */
8 @ s+ m2 }! V" g
/* 初始化捕获模块 */
0 X$ i7 Z! z5 ~* c9 e
/* */
% p( z1 E$ c$ w8 J4 n( t
/****************************************************************************/
9 Y! q; Z/ b0 a, ?
void ECAPInit(void)
5 B/ S5 Q0 L5 ]) P* G
{
) I7 |( i' I- X2 V; ?% X2 n
/*-----设置 ECCTL1-----*/
0 f6 h b% @+ I7 X+ c& M
// 使能CAP寄存器装载
; i" T) l7 Z" T
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( ?1 L5 d( T+ H2 X1 I( t
// 设置预分频值.
# a0 I `1 S% N2 m6 q1 s7 T
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
9 s% x! a' r1 R5 c
// 上升沿触发捕获事件
- |8 E x7 z" p% S
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 r5 b& A7 o6 R; ?$ I3 o7 q
// 输入捕获后重新装载计数器值.
2 g: ~' x1 F/ L2 S \
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" p4 V, U, D8 d6 N3 F) c% X
; H# H: G4 q! \% ?* K2 I
/*-----设置 ECCTL2-----*/
5 H6 c) u. s h. y+ x
// 连续模式
6 n) w, q5 G% p- a: V! }
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ T9 Z* S$ {$ s+ L, }, ?
// ECAP计数器TSCTR持续计数
7 e9 A0 ?7 M( D% _
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
8 |9 S$ j2 h$ P) E
// 禁用同步输出和同步输入
2 A( P% Y8 A8 [* G B3 J
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
% p6 m1 c) B: g4 r( ^& t0 U [& s
// 配置 ECAP 2 为 CAPTURE 模式
. D, M7 ~0 G5 U' l- ]2 \& ?$ E
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
1 y8 x% [+ y/ O6 R
4 W( o+ A _+ P! F7 y
// 使能中断
, B* [; l" f! [( L5 L
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
) G4 |6 D, N# k' b, ~% A! b
}
7 { L" u& }% I1 }. s: b% }
3 r3 V9 X0 I* t" y, D
/****************************************************************************/
0 [9 C. t; z& g9 x* o
/* */
3 }% T! E3 L$ T* f& S' ?6 s! C
/* 取得捕获结果 */
' d8 G1 ?- l" `: h9 x8 x
/* */
. k% L9 G8 [3 o" u: u
/****************************************************************************/
# a. Y8 |3 I9 J5 X2 p$ G5 |/ l
unsigned int ECAPRead(void)
- R4 I. I: s5 [
{
/ Y9 k3 h4 T+ e4 e3 x8 ~6 w7 k
unsigned int capvalue;
7 f a! ]# W. v! h0 p) K
unsigned long frequency;
" P0 W3 `6 C/ O5 m
* q e* f/ }5 O: E9 F* t9 w
// Event1 中断标志
; r4 }7 T8 I7 [/ |$ E: D8 [! H( U
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
/ m: N' v+ F0 w# k6 X
{
% h( j3 y- X! p: f* q' i: l2 q! f
// 取得捕获计数
' v/ o1 x" d0 _8 a# A! A& X5 R0 s8 ~
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
% F# D4 Y% R2 i+ X; ~+ D8 l0 F" v
capvalue = ECAPResult.cap1;
1 f1 r+ E$ r, x) ~% f
5 u, A$ r2 ~) B7 M
// CAPTRUE 模块 228M 时钟主频
9 q1 f) W8 G ]7 N% t$ q
frequency = 228000000/capvalue;
) l+ f# c F6 ]8 |$ N2 H
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: A4 V- K; F% J0 ^' B' T
* z- R5 X* |! Q2 ]8 t
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
6 j) f$ g+ S% s1 W3 F0 n
// IntEventClear(SYS_INT_ECAP2);
* F( L+ O4 {" x4 N$ ~- O/ q
}
4 y8 m/ Z) M5 R3 |8 g
return frequency;
5 N. e8 d* o" B/ n) L
}
7 p) D9 X- I7 C, P
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
5 }% w, w. r1 Y) w
[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