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