嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; q X+ q F2 E0 W6 N5 @
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
N3 S6 K, z+ k; g) X: V6 K
/* */
7 e) _& [. l8 m, b7 Z
/* 宏定义 */
! r. B. L! N! c- \, F+ S3 ]/ a
/* */
0 B4 _' a/ R. c( o
/****************************************************************************/
/ j8 B9 _7 z3 P0 A3 f: n
// 软件断点
6 k# M1 D3 \4 a& @5 w5 o! l
#define SW_BREAKPOINT asm(" SWBP 0 ");
3 G& |7 N ~3 d4 o: v3 d' z
6 a2 v& p+ H3 z1 T- I4 K Y( V
// 时钟分频
v1 |- I# S/ C0 k$ J: E4 L
#define CLOCK_DIV_VAL 228
6 {3 M5 u0 I V a! k5 `& c
/ |4 r9 ]& K# \' W. U! j) o2 f
/****************************************************************************/
" ~" t4 T4 W" H
/* */
4 z6 p6 ~) V, Q# n% K$ U: j L
/* 全局变量 */
, @# ^. \2 v! R5 M/ E4 b/ c, P7 o% _
/* */
7 X2 N2 _4 S. j6 D+ P9 }+ b. Q" E
/****************************************************************************/
+ e& M$ [; Z( m( R
ECAPCONTEXT ECAPResult;
, s2 P, k. b7 T% x
& U2 j& L3 y' d# c
/****************************************************************************/
. v- a1 p1 _7 ~6 y" ^5 [" X
/* */
( n! W' ?: M5 r4 W4 A% {
/* 函数声明 */
3 N* S3 C& e" s
/* */
+ ^8 |+ d H7 l
/****************************************************************************/
: C5 x& U% G. r$ B
// 外设使能配置
/ ]6 X% a. S. u8 |( y b! A9 t* V7 a
void PSCInit(void);
2 J2 r: S. P4 X& ^8 B* E
, X9 z \7 }6 u$ e" [$ I
// GPIO 管脚复用配置
( R' e; ` X) D K
void GPIOBankPinMuxSet();
+ }9 o# ~ q+ u: ^! A# d7 d$ Q
5 h: t4 S: H# W: x: v
// 产生波形
& d( | B5 m# a2 Z8 O8 }! X2 W3 @
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
T) {0 d. L( r2 [2 k% B4 n9 K7 y" z
void ChopperWaveform(void);
% k9 ~" U$ }: Y, O
2 C0 V5 X; x4 ~' R$ R- T2 U
// ECAP初始化和读函数
. C# Z S G. ~
void ECAPInit(void);
- G) r7 s3 o, s& Y0 E
unsigned int ECAPRead(void);
! _. h/ r9 B5 _& t5 C2 r
7 e) |+ V v' `
//ARM 中断初始化
) i9 p& u3 G, n% ~
void InterruptInit(void);
; y8 z# E* m* q' J: E3 L# P+ ]3 y
" Q6 H+ c" U7 K. p9 g
// PWM 中断初始化
1 _8 k* ` }$ m* _7 i8 `/ z& }
void PWMInterruptInit(void);
9 n$ O6 K0 V" W0 r
// 中断服务函数
* e6 ]3 ?, c* }
// PWM 事件
7 [( Y5 [5 u- W( E5 m5 _7 N
void PWMEventIsr(void);
* c& I" L+ I' l+ C. ~
// PWM 错误控制事件
# A. I" R& e5 H5 B8 L8 d
void PWMTZIsr(void);
; \. @2 Y2 V; ]' a5 \4 s5 ?
( N' c- d2 B3 t0 a0 v
/****************************************************************************/
+ p9 z. q. T! S* m9 V
/* */
q* }/ Q5 i3 L" L
/* 主函数 */
7 h! F% `0 ^2 \ x# y& A) ~
/* */
% o9 W7 e9 R7 U/ [" L. F
/****************************************************************************/
6 D6 ~8 Z8 Z; G* x. f, f
int main(void)
/ u! q K: C6 @9 d: k! L8 k
{
}7 U' ]8 ?4 [4 |
// 外设使能配置
' }+ G% E; w ~$ m# ]7 n
PSCInit();
: q: j' ]" ^/ a0 y: Q( V9 G
5 |% X- D. ?$ ~( R$ b% ?8 j8 @
// 初始化串口终端 使用串口2
1 w! u' T$ _2 Q. C
UARTStdioInit();
3 N$ D; v: i" _* J
4 T# N: E* M+ y2 _8 g4 T
// GPIO 管脚复用配置
1 F# k0 V2 y7 i. V# Q- S
GPIOBankPinMuxSet();
_. r0 E6 _! h3 h4 C
+ c7 `0 O! I5 M5 i1 Q/ v2 k
// ARM 中断初始化
2 n; L: [, J# M4 k, t
InterruptInit();
0 b, E; K6 U. J& f0 k& V; L8 I2 g
- y& `! {! t8 F, b) }9 U+ w
// PWM 中断初始化
; z: }9 p) Y/ U8 l
PWMInterruptInit();
7 W- e: b. j" |' n% ?8 {
m* j) y% p8 g% \# x8 x5 @
unsigned char i;
+ C# \5 {3 k' X( e+ Y
unsigned int j;
: ?9 j/ C+ w( N& r/ x, X
5 o# c: t3 P$ Q5 N" S3 p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" z2 k% V& ~; N: P, @6 K
UARTPuts("------------------------------------------------------------\r\n", -1);
+ a9 q2 e) ~. U/ q Q% N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. j7 ]) u4 J8 R, E* ^
// 产生波形
8 c' n# w4 p, V
PWM1ABasic(25000,50);
/ W7 Q& E) }+ I6 e, f7 y( U
( x3 q! h4 }/ q& C
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
5 L5 V, ]2 h$ n1 v/ e/ o" f+ g# F
UARTPuts("------------------------------------------------------------\r\n", -1);
# w4 _, v R& y8 @' G
2 y# X+ r I4 U5 c
3 y+ Q( W4 x# d M8 P# H( L1 G4 a
0 |$ n- a3 f5 a
UARTPuts("------------------------------------------------------------\r\n", -1);
8 q0 `- N" D/ v# [4 o
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 Z% ~+ P, I8 I# b; P
// ECAP 捕获初始化
0 X$ ~. y9 p; t& \4 W0 S- `
ECAPInit();
* L: H& J0 C6 r* p3 o" x
UARTPuts("Initialize ECAP.......\r\n",-1);
! G2 L( ^) J: h# c% u* a8 |5 X
for(i=0;i<5;i++)
0 Z$ ]9 |1 w- V$ e! h% b, [
{
9 \+ I/ T0 K4 h3 f7 r( G$ E
for(j=0x00FFFFFF;j>0;j--); // 延时
- R' P" ~$ B2 z3 X6 V( ~, M
ECAPRead();
' N, T/ Y' P* w1 c3 |
}
2 d3 J7 y- m& E: a
UARTPuts("\r\n",-1);
; G* h4 ]* C& a4 [7 w
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
6 Q1 V$ a# Q% B' y4 \
UARTPuts("------------------------------------------------------------\r\n", -1);
' Q( g6 ~8 G7 P, U+ y
# u1 q9 i7 i; g% E! q
// 主循环
' V4 o: m% m$ ~
for(;;)
$ m( X. {! x" O! c8 E7 v
{
- l: w' |# E5 Z
; c4 `% k. r0 w, L5 b. t- o
}
# e% c1 u, k* c7 q/ C5 E! Q
}
! ]3 _+ ]. [/ r7 ~* E( A
0 W. N, o/ r9 U: m
/****************************************************************************/
( s2 S; Q) a, G( ` m5 r2 P
/* */
! }/ G) B8 L$ g: l% L. |* D1 S
/* PSC 初始化 */
$ s& n$ f8 Q6 q2 C6 J# R r" V) [
/* */
# Q* n- [6 P K9 N% ^2 G" S
/****************************************************************************/
6 G: j5 _- ~2 H/ X# s; ?# Z% H
void PSCInit(void)
* g- p5 z$ h) U2 F0 t
{
$ R4 g8 H4 I" ]% X% V* t
// 使能 EHRPWM 和 ECAP 模块
( [9 z& q/ a6 o
// 对相应外设模块的使能也可以在 BootLoader 中完成
0 s' w8 a, V% u' z# O+ n% i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ C+ Z3 U% a1 \$ \
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; c. |+ W7 ~, p; g# q! v2 D
}
' n$ s1 \( f6 p- d" K
8 l. |3 T& {0 S G* Q. _8 T7 q6 r
/****************************************************************************/
4 c. x6 Z3 A' j- d# W, V; Z
/* */
/ }7 a3 {2 ?; s7 G) ~- m* \7 s1 }$ g- t" l
/* GPIO 管脚复用配置 */
' O+ f3 F0 \# Q- u4 h; e
/* */
% @8 y& f9 S" ]
/****************************************************************************/
2 J# L! N& V$ _+ G6 f; C% X9 I
void GPIOBankPinMuxSet(void)
& j& g$ Q. E1 u7 L! F" S9 w
{
: N) F7 E( `' d# l4 I
EHRPWM1PinMuxSetup();
+ r1 G7 q0 u U: d# W. K
! a" M5 M/ Y4 B+ u: _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ E0 N( e8 k3 p# ]! J8 E1 {
// 作为捕获功能时管脚方向为输入
8 ~# f I& q1 O
// 作为辅助脉宽调制时管脚方向为输出
0 t" i: `& @ d5 B! H
// ECAP2 / APWM2
; z$ }% P# o. [, \
ECAPPinMuxSetup(2);
: c) i' N u$ m; q: K, _. B
O" Y. E' A- M% y& |* M) K
// ECAP2 / APWM2方向设置为输入
5 E! p) n& q7 y, F6 d) |
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: A" H6 l! ^4 @0 y$ X/ T3 q4 Y
}
" ^' T+ L$ i& L& C& ~# M( i
/ n( B& k- h+ n+ o* n. D: n; R
/****************************************************************************/
* g7 p& `7 j3 x. D( q; h
/* */
% T* O, }, ~7 f* H8 s
/* PWM 输出波形 */
/ _' O" @- E2 a- t( `
/* */
6 [; @) Q( E- H, w
/****************************************************************************/
% Q% A. q8 }& ?
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) P" x- h( ]: p7 O' V5 A6 |
{
f4 B! q K! I; \- d
// 时间基准配置
: _( F- b+ Q3 j' o
// 时钟配置
# y1 [" b, U7 `7 z" A; E; O
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
M$ e8 e2 \! F
# ]1 ^6 }. F: C0 r1 L0 {
// 配置周期
8 B7 {5 N' s% E. C9 t
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
; {3 S- j1 s& G$ V: M" b
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
1 K% Z% a3 ?6 |. q
0 P( G6 K9 {! m6 r
// 禁用输入同步信号
( {$ S) @: u- p2 p
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! G+ {# ^$ m+ t. G
5 e3 s+ g) a+ n% m! E3 k ^
// 禁用输出同步信号
3 m/ B" [; |) o1 H
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! y3 o& u5 c# y8 V- d3 L1 `
+ L l* F; x. |% P, E2 k; w( [
// 仿真(DEBUG)模式行为配置
6 I, A9 q5 E4 r, y
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
" T/ G9 w( V+ c8 e( f1 b
; U e# V+ C' P5 |* p: D# V: e
// 配置计数比较器子模块
& M3 y0 ?0 {. U) R9 P
// 加载比较器 A 值
# L3 q" F2 i+ l1 A
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
, u; q9 R" p/ g. s- \! }! n
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 E% s5 w+ ~/ w
, w2 e+ M5 ^4 i! R1 }
// 加载比较器 B 值
- _5 Q! m7 _% E0 @; i2 H
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& ]2 t+ B8 ^2 `
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 R5 ~1 Q! o7 m. {( X2 U
$ X( m1 `9 ~, [* H' ^% |5 c
// 功能限定配置(输出引脚触发方式设定)
# {. N: a* M: O9 U) J
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 i& }! ]1 v3 W9 Y" m
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, t9 k8 @/ |& V0 m
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ {8 Q; [# E+ U# p4 _" X
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
) ]2 F& z% I# v D
$ K1 B# w4 F: U+ f6 y
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ J O% v4 C& y7 Q
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 g5 x* }: I' ?- }; ~) x' e' E. b7 F6 a
) u) E: D9 m, R* l! g
// 禁用斩波子模块
1 k4 v7 n- g' A8 u
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
O7 J7 ] K: W& U
! E/ o1 |; \+ o) b
// 禁用错误控制事件
1 @0 v2 D+ k6 f4 f
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 d5 J) c5 n7 p+ q% B9 J; w
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
N8 [* M. z% \9 }7 R0 J
' H/ Z) }3 u9 y7 Z6 X5 ?
// 事件触发配置
3 a. T7 u2 |( w3 q/ v& {
// 每三次事件发生产生中断
; V. L. C+ b& U9 _& \4 [$ b
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
7 R' r' S z4 U* `5 W( j
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% j: d9 d# }7 t. k2 |/ b' {
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; V: v/ Z! _( [, L% J5 U7 D
// 使能中断
9 \) L0 h( `* K E6 d, b; \
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 ?; g. M, c ], D* M- g
1 Y: M" K/ V3 g. m$ V. Y$ }
// 禁用高精度子模块
) Q# {- S/ K$ B$ J
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ N9 z; Q* H1 g: l
( }. a) E5 \$ f0 e0 K$ J/ U
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: U+ c- b6 y `1 Y6 T
}
+ p2 `2 ^- l7 N9 w
9 l8 J+ K+ z( E. J, w
void ChopperWaveform(void)
& J; S1 Q8 h; `: K$ h. D
{
* }9 d* D2 z _; I$ k
// 50% 占空比
" W% B' [2 o) u' j& s
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& q7 ?$ N' ~3 q" q! B7 x
// 4 分频
6 |+ W6 ~- V8 a9 I5 n' ~# P) C
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, S& r6 t5 o# ~/ ]5 x! a8 w" B
// 单个脉冲宽度
6 Y' ?' a; N8 F' |6 J7 w% c6 N
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
7 D% w( I; s3 I3 P0 H2 Q$ T: j* T- p
// 使能斩波子模块
: y9 H+ K6 {3 o- m L0 u( Y
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
, x7 r. w. S8 Q% w
}
8 x) k" C+ {0 m" b' K7 x
$ k4 q+ r. `; B2 W+ |! l
/****************************************************************************/
& g7 C2 M; }2 {( {
/* */
) A2 Y; l: g4 Q; ~4 ]/ v
/* PWM 中断初始化 */
) R8 |% p$ U( C4 `
/* */
, P: X7 l% H' e3 `: k5 N
/****************************************************************************/
9 a( ]/ f2 d+ ^9 r
void PWMInterruptInit(void)
) y3 }6 D4 J! n6 n
{
) [9 n* `$ D( c ]4 J
// 注册中断服务函数
4 c2 U7 c# \ A& O+ p/ }
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' j) ?# B& b u2 t( W% T1 |
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ M5 G9 n0 h S2 B" N# B
1 \& N5 \% n$ r* F
// 映射中断
# r! e1 b9 [ d5 f/ I
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ \( Q8 w1 @' a$ u! u2 U
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( L+ @ y: n1 X* s# d6 k
. T; _: c8 f0 @
// 使能中断
8 b0 I/ Z6 K9 e( U& U V
IntSystemEnable(SYS_INT_EHRPWM1);
( P/ r; \3 _5 D4 i( ~
IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 x# n( N; F1 R7 ?/ ?
}
7 l$ ^9 w- b9 ?/ v$ [( ]
# ^# e! V) T* k1 u
/****************************************************************************/
+ n1 `& ? K8 n* T; L; U
/* */
: e s4 U/ @: R
/* ARM 中断初始化 */
. b# ]$ P& \# N7 I' w3 y0 c! c
/* */
8 u6 ^( _) r, I) W' M1 w* g! _
/****************************************************************************/
" `" ?& r5 n4 I1 ~
void InterruptInit(void)
" M5 o: U) P7 m& ]% A7 s9 O8 S! U
{
! H& C4 X x' Y. w
// 初始化 ARM 中断控制器
' C2 J5 I% u; x# l5 j9 ^
IntAINTCInit();
) X# f$ T9 g; R/ A$ K" ^8 q: C, T: Z
- b" l5 R# E; c# |: p2 y: d( S8 Y
// 使能 IRQ(CPSR)
" w/ L% l, M- q: |$ w1 J; D) E. ]
IntMasterIRQEnable();
$ g( V) i3 U* Y6 y6 n6 G2 Q
5 y4 n& x }( P2 B) a4 B' k% G
// 使能中断(AINTC GER)
+ R, R5 r% ]4 e4 ?
IntGlobalEnable();
; R$ s! r7 @' \% y
& N$ _4 w: `$ w' R8 g2 Y# F
// 使能中断(AINTC HIER)
! N. M0 ?, Z1 [' s! q, X
IntIRQEnable();
9 O, F9 H- |, \1 D: H4 V( F
}
" D i- f( i5 p9 Q
7 }, v% I! P8 n! S6 h) e& F
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
) w0 G1 ^3 b% G' S0 M' M
/* */
) `; i4 ?' U" j8 c
/* 中断服务函数 */
. L$ L% U/ l% p7 S4 ^) r# q
/* */
" F; Z J! {! }2 c4 H4 K- Q7 H
/****************************************************************************/
+ Q% t$ `/ s& b; o
void PWMEventIsr(void)
0 V9 {( m( |/ j) G9 K$ }! [7 [/ @
{
$ E2 E) l2 L1 \$ j9 }1 d
IntSystemStatusClear(SYS_INT_EHRPWM1);
' g' c& R( e: D) s! O4 \3 n8 Z) F
1 S& J% C( B+ \4 |: p. d
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" `' b) f" C! P' O2 Z A
}
m' ^$ m/ D2 J: _: b; p1 i
9 {0 ^" N* O% j& ?0 Z
void PWMTZIsr(void)
# W6 C c; X4 a# N8 O8 s( n$ F6 T
{
, x8 I; x8 \8 x
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
. a8 ~- u# Q, @6 @; v% Y
* B! u/ X0 a% N* n2 W
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! {& \7 b1 Y" G' @# m
}
$ f! V2 F" c& F+ @* G
& K* j5 d5 S0 y1 U
/****************************************************************************/
4 ~( P9 p& H' v# z+ D+ }2 ]% `
/* */
% e( Q, n/ m+ ]: W k- s4 { c1 s
/* 初始化捕获模块 */
+ i$ `1 F# Y; Q# A) r
/* */
0 A/ n% N" x1 v/ y
/****************************************************************************/
0 m! s& I9 F' A" L
void ECAPInit(void)
9 Q3 w* ^) ~5 g+ i7 F
{
2 H% t* g) ~- m1 Q& s) S. |; k. g
/*-----设置 ECCTL1-----*/
- \* q* c- A8 h2 {
// 使能CAP寄存器装载
8 _9 J5 ?; @/ M% b8 h+ \
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
* R: H& N6 A; T8 P7 R6 ^% D; ~5 g. T
// 设置预分频值.
- y2 ^- o: D% X/ W' r: S
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ _2 u3 U# _: y# T
// 上升沿触发捕获事件
( i8 C4 F+ [9 K0 U. k
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ f+ i9 T6 Y7 X: i+ ~& ^4 M, l/ y
// 输入捕获后重新装载计数器值.
$ @! y/ J. |6 q( \7 Z
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
$ \; ^/ ~; f7 x5 X# Z: I" |4 m
0 b$ [1 A+ [0 D, W4 X# A1 g. q
/*-----设置 ECCTL2-----*/
2 i+ T+ t5 b$ M5 w; q; v
// 连续模式
1 J% i4 }8 I6 n1 k3 p
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
; [+ j6 Z: |1 _* N5 V; \
// ECAP计数器TSCTR持续计数
( c y# I7 f2 `0 _$ }# k' V8 D
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; f# t2 q5 E( v0 G4 u- k8 d" m
// 禁用同步输出和同步输入
' w% F' ~& S! `( f2 e7 r
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 p' h4 e. j2 @! w- i+ T `
// 配置 ECAP 2 为 CAPTURE 模式
. ]: H$ H3 {. Y$ x! \
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 V+ R) w2 c& G
5 u H, O7 o1 Q( \: a! b8 D
// 使能中断
, _) Y( R- {+ J4 Y% ?; r
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
: i2 y% E1 ]# n, L) H" C; D4 }6 w% h) g7 X
}
' n p: ?& k1 Y& f$ }, p G! U1 v
% P5 f$ g' L0 e; W& @8 O6 N2 v- `
/****************************************************************************/
4 b3 g- H/ `1 [) \( I
/* */
/ {% a6 E! S; T
/* 取得捕获结果 */
3 P$ G/ O9 u g" u
/* */
# `7 l- a) y; V/ U# B5 Z: X [& A
/****************************************************************************/
% q, n! u* ^0 X/ `4 F: ^
unsigned int ECAPRead(void)
. }: v' ]( |( b% [2 {0 V! Q. l
{
5 B0 Y& i) P- o% u
unsigned int capvalue;
1 u5 j4 x0 L2 ~* Y$ L1 j
unsigned long frequency;
" N+ O- v7 T, C6 P0 Z6 c
. c+ n2 p1 T% A- G* `! c- i a" F
// Event1 中断标志
4 F N1 C/ v. @
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
. _7 n# z7 W9 h" e& d
{
+ X2 M, V- d" `# a% G" W
// 取得捕获计数
7 t6 m$ m) \/ i4 t
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
: }3 Y# Y* [) ]8 G7 ~
capvalue = ECAPResult.cap1;
& ^& R* p2 e( T3 a, G
2 C8 b; `5 m% a6 k
// CAPTRUE 模块 228M 时钟主频
' N- H A( t' r. M+ [* Q$ Z
frequency = 228000000/capvalue;
R' E) Z# }. H5 W7 ^$ I% t
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. r0 n5 T9 i H- A; ~# c$ S
6 j- J, M( q. e! ?* Q }9 o
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
1 f+ I" w, ^! [) G- _* H1 K
// IntEventClear(SYS_INT_ECAP2);
, \) o5 x8 h% |0 ]/ v
}
: l6 [; T- _1 d" U% Q1 \+ E, h3 z
return frequency;
, _: k/ v, b" L0 C1 ~
}
1 I$ t0 L) ?9 h+ @/ e3 {
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( j- }' t/ N8 ~7 f9 t& D7 z
[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