嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
: m7 K7 i6 f9 u5 U. ]. |" r
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
- u: I& }- r$ n
/* */
3 W/ U' o( M- s6 s p! @+ ^7 v7 d
/* 宏定义 */
; f7 i6 P, ?& m/ T" X$ N) g! V
/* */
& b' t( |$ F: g: g
/****************************************************************************/
. N8 \0 b- C2 p' ~* q$ S7 R
// 软件断点
; M" X+ ?: B/ s! U
#define SW_BREAKPOINT asm(" SWBP 0 ");
; V" B# G$ C$ t4 Z
. R/ L- Y ]5 O- |9 u) T& Q
// 时钟分频
5 h7 @" X$ P. _$ G% y N6 j: `' h
#define CLOCK_DIV_VAL 228
3 P( C- `' ^) q8 C5 w- X. h
, }2 g% q; M: U; |& T
/****************************************************************************/
4 K2 J' q$ t6 q# N! T; |
/* */
0 r2 r* J, v% Z8 n V( Q
/* 全局变量 */
; e5 E+ P1 E! M- p, D
/* */
0 D# l9 M& M7 C7 `1 R- t' b
/****************************************************************************/
( o6 W0 a6 R5 g
ECAPCONTEXT ECAPResult;
K7 B& |5 h( \! {' |
# E( ]+ ?5 `) V' K9 V
/****************************************************************************/
/ E+ X$ I" h7 D
/* */
( d) d1 f# G7 U- |0 h
/* 函数声明 */
7 x5 _& y4 P9 G
/* */
; {& B6 Y i) _" e A
/****************************************************************************/
( Z( M+ b8 L, b
// 外设使能配置
8 G S p% O$ z1 f% o: M$ I
void PSCInit(void);
) w. x, @$ N6 D" f& N8 l# k
# m2 C" X" R G9 u" z9 j2 B% v+ | {) l7 ^% ^
// GPIO 管脚复用配置
3 K* u& u+ z% h# E0 g" y2 k c4 [
void GPIOBankPinMuxSet();
3 S- y9 q/ }/ P5 F# \ l$ h* J+ d% |
3 G* f( h+ n6 z$ U8 k, G* ~
// 产生波形
# s, r8 f0 g6 S# @( d3 t
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
; s0 R" I$ |+ y
void ChopperWaveform(void);
# F+ Q- s3 g3 K
) G; v( M+ P' v6 a
// ECAP初始化和读函数
) T4 P ^( `3 C& g& E2 Z& X4 }
void ECAPInit(void);
2 M5 c# G: @. ]/ {3 C
unsigned int ECAPRead(void);
' u3 i8 B, P6 }) i ~3 g" p
3 ~% A9 ]+ L' s; j& t
//ARM 中断初始化
% e' B5 P+ g# u0 y
void InterruptInit(void);
! e/ h. q- J4 ^! U
( H( f* i, {, j9 Y
// PWM 中断初始化
% ]8 q6 @1 Z* }$ E
void PWMInterruptInit(void);
7 W) {4 V6 f7 R/ P+ g4 V
// 中断服务函数
7 O1 a5 a; w$ D. H' T! Y1 B
// PWM 事件
7 w1 u( x% q: Z# B; Y3 d% E) O
void PWMEventIsr(void);
5 N( t' k0 P. v
// PWM 错误控制事件
9 O3 K+ @4 @, e3 Y/ f: T, {& r
void PWMTZIsr(void);
- E6 i) ~7 ~- y( C
* A- l: h1 Q7 n1 \8 L
/****************************************************************************/
+ ^8 A6 d8 n2 N; f# x+ |$ d: n# ^% y
/* */
1 v4 c. y8 ^2 K! v4 U' N, |
/* 主函数 */
( y, R3 B; ]% }
/* */
* o: w+ P, G% l8 b5 T( V+ I0 s( B
/****************************************************************************/
1 s. i" A" g: ^, ?8 i; V0 @& v
int main(void)
9 f" Q$ _' U u2 v/ N
{
! A I+ P* H8 x) S# z3 e2 Q
// 外设使能配置
; p" k/ e7 J) r1 @8 X
PSCInit();
6 E1 J; p9 }1 p9 o+ P9 ]* F
/ A1 x7 X- F1 f' ^# @+ O
// 初始化串口终端 使用串口2
$ Z' k2 P4 B0 g$ E, t% j q, y
UARTStdioInit();
0 g+ b& s2 e" ~- N
`: x& t2 Y5 O9 M6 j( C6 \" w
// GPIO 管脚复用配置
4 x1 m9 `9 n, Y$ `4 m5 b% w* e% A; E
GPIOBankPinMuxSet();
( F/ z5 Y. b; c6 r. H: O5 L! N
G+ O7 o) @9 h$ T0 z. [) O9 x: K
// ARM 中断初始化
# C2 Z. ]3 [+ j
InterruptInit();
5 x( [' a9 r; ~9 r Y
3 v( b$ B" j0 W: M7 J7 Q% q2 Y
// PWM 中断初始化
5 H% i7 X% |8 w0 o8 j$ {0 z
PWMInterruptInit();
$ e& l' t1 I: u" o# v d, v
* D5 T8 d6 @4 S+ A- C
unsigned char i;
* u. p0 S' U( S/ k2 |' W7 A
unsigned int j;
8 x$ c5 g* V& s" [
! y. T# N- }$ P! ]
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& |4 X' P6 V1 S5 {' S4 }! _
UARTPuts("------------------------------------------------------------\r\n", -1);
$ W+ x3 ^0 d G' }( ^( m
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
" T6 P+ ]9 m5 j+ I
// 产生波形
/ T2 ~! [ _3 [ X h# L, ]) o
PWM1ABasic(25000,50);
" V3 Q: w0 |* k9 m
4 m6 i% V+ I/ w8 U' c+ }, G
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. s$ r0 u! L* u5 l! b
UARTPuts("------------------------------------------------------------\r\n", -1);
" M, @" e# w* ?* v/ j6 h R: L
q# [& F8 B) D9 K- l% `
1 n6 ^; v# q l& a' T W }) {' n' [
" @1 R( k, s5 }1 M; {+ w. B* u- A
UARTPuts("------------------------------------------------------------\r\n", -1);
+ Q$ Y* [ L; e
UARTPuts(" C6748 ECAP Test\r\n", -1);
- \# i+ {3 o9 G6 k, q$ Y
// ECAP 捕获初始化
/ B3 F E4 U& x
ECAPInit();
: C6 x3 ~- b: B+ N! O* l7 ~
UARTPuts("Initialize ECAP.......\r\n",-1);
) a, y' b8 j" t1 \/ P& }( I
for(i=0;i<5;i++)
9 I U' X" a9 l- h, O- D. I4 U3 N
{
. ^6 H3 ?3 t2 `' k& [3 ] o# E
for(j=0x00FFFFFF;j>0;j--); // 延时
2 Q* B% _, a+ ]2 {6 F
ECAPRead();
2 j; [+ g) v: N) [' t0 H- ^
}
+ L; n8 _0 D3 [
UARTPuts("\r\n",-1);
' c; u: @0 i' r8 [! F
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
a2 }7 e6 X* X
UARTPuts("------------------------------------------------------------\r\n", -1);
# u# ~6 t/ I t9 k
- F8 ~: |, m$ Z- M% F, k C
// 主循环
% O# X5 r" d! Q8 C
for(;;)
- t% ]% F6 c- C
{
. s% A7 G, A" x! w3 {
D r5 C. ]1 y" |" `4 k. L
}
7 D1 d. u* }% _
}
3 h0 }; G+ H5 |+ G' f2 z+ O
; H( X5 x* z: _
/****************************************************************************/
, e5 L5 a6 x r" I
/* */
1 N0 I0 k1 I5 v2 B& w6 v- z/ ]
/* PSC 初始化 */
. I8 l5 Z6 z* _5 ]( P
/* */
) k* U* s5 b6 P) H0 O/ h7 `( ?, Y
/****************************************************************************/
9 q4 u- V5 `# k
void PSCInit(void)
2 D3 X; w( M/ ~" W1 p; Y
{
5 Q; h8 U, Q4 z7 g8 I
// 使能 EHRPWM 和 ECAP 模块
( g7 v. c( k- T* L% D
// 对相应外设模块的使能也可以在 BootLoader 中完成
: K J" B4 g4 f- W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' d7 L/ D2 k% x3 t- N, d1 |/ P; r) K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; f8 S0 {& R7 t6 [" _
}
. M$ A6 l' ]. |! q6 n7 u
& M1 T. E4 K% n) y) X0 u
/****************************************************************************/
2 M8 k' e0 b+ A5 k; G) @
/* */
( P8 _& S% K* ]- c9 d
/* GPIO 管脚复用配置 */
/ ~% b& q* @7 b8 O, J- R
/* */
7 w* d7 g1 j' |, K4 B$ W: c X+ n
/****************************************************************************/
3 a( X+ B9 J2 |) Q9 ~' i
void GPIOBankPinMuxSet(void)
6 f- i4 l3 U! N
{
9 E) Q5 D2 J/ E0 M; k! v! L+ c
EHRPWM1PinMuxSetup();
2 s6 G3 h U) q' y3 a
4 j, M4 O j. Q# K/ H
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% r& g2 r7 R( [- I
// 作为捕获功能时管脚方向为输入
9 h0 U6 E" @& @% }
// 作为辅助脉宽调制时管脚方向为输出
4 w) o ?% x& Q2 U2 n. H
// ECAP2 / APWM2
4 c! {4 V5 w) c& |- U% s# M
ECAPPinMuxSetup(2);
: l" J; Q% f% n& E. K/ [" q
% D3 [2 W# u5 E
// ECAP2 / APWM2方向设置为输入
3 V& N& o5 b2 {* M. }8 s$ S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
$ u2 _% k' ]2 j6 M' e
}
- B$ V7 K8 o! w7 F
M9 _8 F& i1 ]0 d: U
/****************************************************************************/
! S$ V. y9 l% b" u3 _
/* */
1 N' A! q1 u5 O3 q5 W" F6 ^/ a0 V l
/* PWM 输出波形 */
$ H. U! ]6 k# P' K
/* */
8 G8 B8 O% _7 n% ]+ S
/****************************************************************************/
8 I+ j6 D3 r% M4 O, N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% d0 y8 C2 f# t2 L2 U
{
- H- N6 p* M( y* k! }+ m
// 时间基准配置
! j- j2 Z( _" @% h7 O3 O3 l, |0 x
// 时钟配置
, w3 w4 u3 T6 _
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 o; p' A5 c' v; R6 V
. V* ]- w* ?9 h
// 配置周期
. V- z' a8 [0 D. [7 H9 ? a2 {2 b
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ R G; B9 B( N6 |" t& K( \' z0 i# Y+ F
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: N- L1 q7 U. R7 }4 a
1 E) [5 } ]: p3 ]
// 禁用输入同步信号
, w9 o V# b' y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
$ _0 n* H7 P% E
! Q! @( W g, g% U& R( L' _; l! E
// 禁用输出同步信号
|2 q8 F8 s b- @
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
; @* ]# S2 o0 w: K" j
, q; {0 L, t8 @
// 仿真(DEBUG)模式行为配置
$ H8 [* c6 ]2 B* P$ i
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 y# e3 T; x$ G0 ?6 p3 W4 E
7 p/ s8 P0 J+ F- i+ X5 ]7 T& }
// 配置计数比较器子模块
2 c, U& d4 J( X
// 加载比较器 A 值
) Y6 f ?1 B7 y" O+ e
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ Q5 l. s3 p. ]/ \6 O
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- r0 |/ e$ K d3 s
) G5 [! Q# I4 N2 C x5 B2 a
// 加载比较器 B 值
, K% f7 G" }9 b# ]8 y3 y8 ~
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
6 n/ Y3 k; b- e4 [9 S
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: M f: i( B: c4 z
. ^ h# [8 ?) w+ p) K: u
// 功能限定配置(输出引脚触发方式设定)
8 y0 t6 d# V8 M k l0 J
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
w% a' g& R/ j/ ]* o: J
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
7 i7 [. H- f" j' l$ T
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
6 k: A3 N4 u) n4 p/ G+ X1 s
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 ]" o' Y# I/ A, U+ V
9 R' O/ N5 m) i
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 ]+ ]# X/ w7 m# e
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
3 U+ v" Z; |( f7 b- p: D) c5 c* ?
* m" g0 X9 G7 ]: `# J7 w3 y
// 禁用斩波子模块
- ^. X9 h ^% b( n, K, x
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 M/ T+ D1 {0 l- \8 n- w1 y F
3 r% H: X2 {/ d, C( Q2 [ a7 B5 c8 H
// 禁用错误控制事件
2 L2 K( r. ^/ ?1 p7 Y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
2 A& H3 X2 v" ?/ K8 ` f, I# Z
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
+ z8 a6 o6 b; X' I! V
# \: F& I3 H+ b- p1 m
// 事件触发配置
0 b6 l# G$ f0 w1 r9 L
// 每三次事件发生产生中断
4 p" b p8 q& S; o' J
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
5 z$ J, T$ X$ L# h( M
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# g0 K: K" G$ U/ ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
+ \. Z* y' v" `6 \
// 使能中断
$ T2 I* D W+ L( q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) `. T2 F, {( V
1 W. G8 }$ ^, X! `% K; e: {
// 禁用高精度子模块
4 g- Z, Y' [/ W8 D% Y
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! a/ k0 N+ T! V
( r: p0 ?8 |) V) S1 A5 u6 p! o
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
5 J5 b1 C1 n6 R. V0 N; ]7 n. U
}
( ^& \5 t& q9 q% x& \
, n" q( |" N. D0 k& M- ^3 [ o
void ChopperWaveform(void)
/ K( D# z7 N, e% y% q
{
( v4 t( G- B% W5 B2 U( s5 A8 @
// 50% 占空比
" U. r, i: q- @, u
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* I9 r8 c3 |, s |% l1 H4 ?" y
// 4 分频
! x4 P& ^# V6 j& I: }9 k
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
f3 t$ y9 J' N. w
// 单个脉冲宽度
" o0 h6 W! N p4 i& L
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! v; Q+ W9 L; [/ b: A" G
// 使能斩波子模块
. Z- i ]" m; B4 X! J' m! j
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
7 F( Z- Y: z: {4 r H. E2 v
}
: ~" Z' i7 f1 F( `9 {5 l" j
* b+ ?' r8 }" H- x% U5 Y; ~. j
/****************************************************************************/
7 L8 c$ D4 ~ B
/* */
- Q0 @2 [; [5 |& ? x/ O
/* PWM 中断初始化 */
" ^! v I8 `( M* L! K& q0 Y* w
/* */
7 _% n1 V9 G v
/****************************************************************************/
: m. w3 s6 z% ~. r3 s! m F2 h
void PWMInterruptInit(void)
7 E) m. n- M- H1 A1 n4 ?& E. v* l
{
" _% x2 A9 e/ x* Y
// 注册中断服务函数
2 w; s( H9 [& p# J
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 Y0 r0 d, g |4 r6 c. c
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
" u. F: ]0 {5 s9 w5 B% N
- K- u% s- e& [. M+ L
// 映射中断
! S' X' m# p4 p- N% p
IntChannelSet(SYS_INT_EHRPWM1, 2);
6 K7 w/ Q% m8 _% m3 A7 ~( `
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
3 ^$ X" l1 [0 R y5 V' d' U
; u1 R8 n+ ]0 _0 X4 |/ S
// 使能中断
" V( I2 p. s2 T) _- s' ?5 @. \
IntSystemEnable(SYS_INT_EHRPWM1);
% \- K. y8 v5 L/ v
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; l6 s# y+ E& N( v2 F( S8 M( |
}
8 @; x* z3 D5 h+ F" j e& w- l
9 f- Z0 K2 ~' T% M) S0 M
/****************************************************************************/
" k% D; t- R: `" S$ S% H( V
/* */
4 \) ] X% v0 o- p3 {
/* ARM 中断初始化 */
( K7 V& B5 Y, R, U3 Q8 V4 o" ^ ^
/* */
7 K- i% C, F u# p5 a8 A
/****************************************************************************/
, R* U7 l7 @7 Y5 m
void InterruptInit(void)
7 O. x: z6 \/ X
{
$ `9 @$ \" Z1 L
// 初始化 ARM 中断控制器
) R, [) t& ]3 r3 w. K6 `
IntAINTCInit();
9 l8 ^( S6 s+ K. T0 F1 n' N; v
" J8 B S4 m& B5 G0 P2 x
// 使能 IRQ(CPSR)
y0 c% B8 @$ x; S! u1 h/ F
IntMasterIRQEnable();
/ n. c) J: o. G% R
' c- s* u4 X2 M/ y8 R
// 使能中断(AINTC GER)
9 `( G7 ?; @% K8 _% r( \
IntGlobalEnable();
" Y+ q( j2 { ] L. h
3 u0 W4 B. B0 Y4 E) K3 q
// 使能中断(AINTC HIER)
7 Z0 E% s3 j1 ?; Z
IntIRQEnable();
; t. C9 ?# V7 _, m' y6 r
}
7 j0 E$ D7 i% D
9 V. ^ U% B( H7 N) O' _1 A- Y
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
* M& L! o: g8 r: B
/* */
- K( m3 J3 o7 D% }: X r: Q
/* 中断服务函数 */
; V# @9 A% _( @7 @: ?
/* */
9 T+ |, P- F% t. a0 p: b
/****************************************************************************/
- M/ {7 F% x1 N% ]5 t; Z) Y+ `
void PWMEventIsr(void)
9 M% Z# g; a! x+ ]0 d
{
- A8 A' \' ~, |8 N/ u
IntSystemStatusClear(SYS_INT_EHRPWM1);
$ l% i* W" w+ m& s
3 [2 V! L0 W$ [
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
/ G4 V) N! W4 _3 m, Q8 l1 G
}
8 Y* |4 X* C! Z& T g6 C
5 Q0 x0 N, S% b# n4 s
void PWMTZIsr(void)
3 J- k7 z2 J( j3 @6 |, k: E
{
8 h: Z3 x' E4 n$ ?
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
+ v) _* h/ E4 I9 R; \% P
5 v4 S) C) j! |( m+ k0 }. Q
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
6 g4 h+ [; [" m9 {# L+ t
}
, l& N" q$ N4 b5 l0 u
) y) l8 V8 b( v+ p$ h1 `
/****************************************************************************/
5 B: c9 T: {7 T( [9 p
/* */
$ ]& G0 U8 A- m) z( b0 b* Z
/* 初始化捕获模块 */
. T6 `6 K3 X5 U5 n9 \- U
/* */
- p0 F) ]2 ?' S; y/ b
/****************************************************************************/
. F- y% e$ p! X. L+ R2 N
void ECAPInit(void)
: D0 ], Z+ a( n+ L2 V: G
{
1 P, X8 l! ]+ I) B- Y/ K9 K
/*-----设置 ECCTL1-----*/
" K$ C$ F N- I9 @
// 使能CAP寄存器装载
! T" e0 I0 J6 [. J3 u
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
( L4 D" w: g: f( @, f
// 设置预分频值.
3 ^8 B: \( f+ q3 o
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
7 { l6 F0 l5 V% L, y
// 上升沿触发捕获事件
, v% H m. y, F5 N1 P
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
7 H& g, q. Z0 o9 E: k1 e3 }
// 输入捕获后重新装载计数器值.
" j% ^6 A" e" U0 K S1 G9 {
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 m- h; l: f: q
- q: [4 p2 F0 w1 M9 |
/*-----设置 ECCTL2-----*/
8 O, T A) y# S% Z; p
// 连续模式
" K. |3 S/ J5 p/ k3 O1 b. K
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
2 F0 s4 G' |# n# y
// ECAP计数器TSCTR持续计数
% _ z9 {( z+ B) d
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
3 ~$ P. V6 V+ ~, ]3 }0 ^7 D
// 禁用同步输出和同步输入
, W" J, Z3 G- t; W$ a
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 b$ I8 d# [4 G* _' I
// 配置 ECAP 2 为 CAPTURE 模式
; Z1 w( S0 I. K1 F* ^
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 W+ Y4 m- n+ Z2 p* i- s8 d
. q" E# M$ U" j* m4 T/ b
// 使能中断
6 \4 i1 q5 R" @6 Z; h
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
) v* q- O8 z+ u
}
4 l3 o& d; b$ Y) y1 F4 x0 u+ g' {
) r( e3 p1 `5 [4 F$ g, o. t
/****************************************************************************/
$ U2 [$ T) Q% |( G
/* */
0 {3 T: e. E# C7 c& C
/* 取得捕获结果 */
6 }! A, B* [. ~. K3 g0 d3 y3 }
/* */
, ~% u) q" c/ {9 Q2 \- x
/****************************************************************************/
! ^) d( Z' j; K1 e
unsigned int ECAPRead(void)
$ ^; s- n6 g. R; t, f; \
{
8 s$ Z1 q+ A! q5 w' F/ B# p. o" D2 Q
unsigned int capvalue;
( a( A' @. K# ?" s
unsigned long frequency;
# ~) k5 Q, n# f+ Q$ E3 z( P9 Y! t0 A
& X% n9 n2 H2 v) B, ]* f( ~
// Event1 中断标志
3 A4 X% k& N. W8 ?3 U/ {6 n. D8 F
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. A$ Z' Q( b0 T7 h u8 s' `* O! a
{
P |# |& _0 ]! c/ E/ l% j3 W
// 取得捕获计数
1 q a4 F. t/ `8 T0 ^
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- K- C- Z) z" U& G, m6 ]
capvalue = ECAPResult.cap1;
' D" w0 n& V9 n# K2 @7 W( `- T# T0 N
( {. |9 T' J( ~+ r; M
// CAPTRUE 模块 228M 时钟主频
4 T/ K) L/ Z/ k8 N' L8 W' w4 k
frequency = 228000000/capvalue;
) Z4 i- W/ v! I$ R( s
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
) M5 f8 H, s4 y. R6 ]1 N! ?
7 q' p2 I* T# |: P5 g
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
# m$ S4 s+ C3 d- f; o5 }( H
// IntEventClear(SYS_INT_ECAP2);
6 m- {$ a0 W7 Y& K3 W$ i
}
9 H% E' V3 j# d$ E
return frequency;
1 z- n* ^1 G6 U' A1 P
}
; [- r1 r3 N5 T- Y: V7 T
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
+ J$ @ ^: P0 ]5 C0 c; C
[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