嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
# h$ B- c+ K# y+ j
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
8 A4 W$ F* X8 e4 t) k
/* */
: X7 m5 [* h0 s$ c1 m$ [) I
/* 宏定义 */
8 N9 Q& R( f6 ^3 w9 u
/* */
& E+ c, k! b8 \$ w3 X
/****************************************************************************/
6 s7 ]5 X4 m' e q! v# x" W
// 软件断点
8 ]% o6 M8 G4 v1 t3 P
#define SW_BREAKPOINT asm(" SWBP 0 ");
+ n* u2 J( `' X' j! B3 n' o
( k3 {& V6 a3 M) M- V: P; [9 g! m
// 时钟分频
; H1 F. a6 Q! a) U
#define CLOCK_DIV_VAL 228
% H+ ^, i5 U% ?' G C
: J+ w( A: R* ?
/****************************************************************************/
$ c/ o5 k' K* a" W: n$ F/ ^
/* */
) C+ B7 _ R* z' V0 G
/* 全局变量 */
3 R5 d/ ~, S; i2 H1 r
/* */
9 V! {8 ~2 E! |: ]# n: R# V
/****************************************************************************/
s% F0 l# p! d$ B1 n
ECAPCONTEXT ECAPResult;
% S! Y! N" z% o0 [6 V8 v/ z
L/ ~ e5 B' n2 E9 j( j3 F
/****************************************************************************/
V& {2 N9 B7 S1 M+ N1 Z# e
/* */
! L. g4 `5 ?1 n V. r4 y
/* 函数声明 */
, U$ ?. W' m9 t! a' P
/* */
+ C( n0 a3 a: T; L; g
/****************************************************************************/
- `9 x2 b( Y) t) y1 L5 i7 v
// 外设使能配置
+ @7 h1 r Q P1 C" V" @
void PSCInit(void);
$ x% \- |) \8 `- x8 X
D3 q$ M+ V; M! o6 \: N. H# n Y
// GPIO 管脚复用配置
6 Z7 C s+ ~1 v% s9 h4 \9 P: [
void GPIOBankPinMuxSet();
( J1 [: f& U0 d+ h% {
* k s! O0 s$ ^+ J% {
// 产生波形
3 |5 v! Z; U, ~; I% _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 j/ P( T( R* v6 y" ?' m
void ChopperWaveform(void);
2 B) c" [/ H* D$ o1 ]4 Y( C
* I7 i- P& p8 G% o
// ECAP初始化和读函数
) \1 p0 M* p3 j; o
void ECAPInit(void);
1 I5 W9 a3 ]- n' m @/ H8 M3 ~
unsigned int ECAPRead(void);
' a. X' a% J, h- D: ?7 l0 D
* R, f+ z4 i! P T) t% ?+ ~
//ARM 中断初始化
$ k$ \1 `, O8 p9 A
void InterruptInit(void);
9 e+ a! W6 {- ]) b3 I
. ^' \- r. ^: {7 h( r! x% h* v
// PWM 中断初始化
: y! W2 n8 i* w9 @0 ?
void PWMInterruptInit(void);
" j, k/ E" A6 W. r/ p
// 中断服务函数
! I5 y- }! A4 k$ m- ^
// PWM 事件
! `% N/ T2 U! ]4 F: n: r: S* W
void PWMEventIsr(void);
( a' L+ S) [& X
// PWM 错误控制事件
+ S/ a$ F# @7 x. s G- [
void PWMTZIsr(void);
+ t' Y2 O! V" b
, i% D, ?0 x. U& g! `- j
/****************************************************************************/
; B: d6 }: A% B; a
/* */
' a, U* C/ m- D9 v
/* 主函数 */
2 o+ C/ m# e9 T1 }& u
/* */
: c' v' m& F6 m6 u- o! l
/****************************************************************************/
& i/ ~/ m% Y: S; t
int main(void)
0 s. W [+ X+ x+ }
{
: R6 g' |" n2 M
// 外设使能配置
/ Y) h% p6 R2 a& b3 H- C- ]
PSCInit();
" A2 P% X; B. W* k. ?! o' [4 ]) h
$ ]2 o1 H* |0 g
// 初始化串口终端 使用串口2
' T9 I; f1 ~6 B: G" @
UARTStdioInit();
! Z/ O4 y# o2 O& I7 S! f+ l
# I9 Q# n2 x y6 r& {6 M, C& ^
// GPIO 管脚复用配置
`+ U5 d) a c7 z: I( B1 m
GPIOBankPinMuxSet();
: n* B$ t' Z7 |$ w; l s" H) a5 [
; I Z' O8 n( e# A# p* \
// ARM 中断初始化
3 Z( g# |7 r) k% y5 t5 K# @
InterruptInit();
D% a. ^. h* J/ x% V4 J5 K, @
. @( B7 F! J X5 B0 |- e
// PWM 中断初始化
! i3 z' r9 d. \% @3 v& y
PWMInterruptInit();
: D9 W8 p4 |! _- m4 t
. F$ T! q6 F( H
unsigned char i;
6 K6 c6 x9 g1 A; b7 Z0 n* b
unsigned int j;
. K% g4 V! W& c3 o) E
' Y0 M* _$ ~1 W2 n+ Q/ V% q% R
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& X% p- ~4 R$ d5 B( o4 X4 a3 I
UARTPuts("------------------------------------------------------------\r\n", -1);
- i8 b' O: k; } k# e" y# _
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 I7 N* `0 b" r* N1 o% _. H# M
// 产生波形
, ?5 z2 I7 |2 B l3 h3 v8 S
PWM1ABasic(25000,50);
( `. M% k* { g
( M8 P% a; ^6 c: U( W
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 q% ?: L4 C/ T" ~
UARTPuts("------------------------------------------------------------\r\n", -1);
3 y+ J. r( F& ?" e( x. b
7 F6 T* ^( N; ?
' h: a' c. ]/ A# r# w1 q& K0 ]! `9 v5 V7 V
$ Q2 L' F3 K/ M# Y- M! t
UARTPuts("------------------------------------------------------------\r\n", -1);
! R/ G, O3 i6 U. H
UARTPuts(" C6748 ECAP Test\r\n", -1);
$ W- ^: l q2 l8 R( J" z! X! l# z
// ECAP 捕获初始化
4 Y/ h: V, F' x2 Z6 a
ECAPInit();
1 \( s: c7 r S; d6 u4 A
UARTPuts("Initialize ECAP.......\r\n",-1);
7 B$ A$ H/ D( ^6 A) j
for(i=0;i<5;i++)
! l+ x' {" }+ l3 _ H3 Y8 D
{
' W- ?- ]1 w& t
for(j=0x00FFFFFF;j>0;j--); // 延时
6 K: s- n9 P, f* A: p
ECAPRead();
8 _, P) o( M7 [: z4 K9 S2 r
}
( B, y* H9 k0 ]
UARTPuts("\r\n",-1);
6 s& R% Z2 D" \# B; l/ B
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) W8 d# @$ h* b: ?6 X
UARTPuts("------------------------------------------------------------\r\n", -1);
# [+ g$ S! s: i! c9 k L7 [
# V" @' _, Q$ Y. ~3 y, _
// 主循环
9 v, z6 o6 n8 T; N
for(;;)
# w% w8 Y' V# }8 I
{
4 l& _5 B/ a3 F$ Q/ W: K8 Q
6 I/ L) m! {4 H
}
8 B- N1 {! D6 F i# b# q# Z
}
( _" }# j. N/ Y- V. h0 U
5 J! |5 q; D, E
/****************************************************************************/
- Z5 l, p! N( N: d0 d0 O% o
/* */
/ m) L! v7 ~8 e
/* PSC 初始化 */
: I* L" U# D M
/* */
; R- U: q Z- n- U8 a+ ?+ c( ~5 p
/****************************************************************************/
3 h X- j4 Y3 |5 H% v+ c9 o7 F% T
void PSCInit(void)
! }9 w) |1 j5 P, G! m5 j
{
( c! |9 K; L' w+ @
// 使能 EHRPWM 和 ECAP 模块
- O* {7 R! `) o
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 `8 [0 a# s- y# f' K4 Z: i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ |) P( B( {: @0 z5 ~8 l
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# c! e5 V C& n$ U5 g$ P
}
7 Y- u ~. c: V# z7 U
; B* {4 q) {* n8 J4 B
/****************************************************************************/
6 H6 E) d- Y+ `) z1 p
/* */
" V; w1 V/ O" N( _8 ^/ S! H
/* GPIO 管脚复用配置 */
; Y3 V2 a5 N# w, }: s, }0 M0 H9 v
/* */
: d' N, h5 Q# @
/****************************************************************************/
) I1 H* A0 }4 e# ^" R: f# V. n
void GPIOBankPinMuxSet(void)
; ~9 O2 y' T# m. ? R! ]8 y4 T. U
{
/ A; m: q3 A" ?
EHRPWM1PinMuxSetup();
& \/ F0 F* B" Z, ]2 L( V
) r' Y3 d3 t) i- [/ ^( q# v) w
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% Q" U3 p; g7 ~, j0 O% _( G
// 作为捕获功能时管脚方向为输入
. O7 P9 L. x1 K/ ^. W8 {
// 作为辅助脉宽调制时管脚方向为输出
( `0 N0 U& n& G3 s9 Q, E" k, U/ A
// ECAP2 / APWM2
8 ~3 T k5 p/ Z! t
ECAPPinMuxSetup(2);
0 g2 A' D# Q, S- A' ?
' S9 ]5 A4 Q9 r7 \& Z; t _
// ECAP2 / APWM2方向设置为输入
8 P9 T, j6 Y. N4 J+ f$ B; I% q; I: }
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
7 L( l3 e5 a6 g2 G$ ^2 f' }
}
- l5 W$ s& L9 J. W3 `$ d7 B
$ H( _9 ^5 ?5 M6 _& j1 G
/****************************************************************************/
: ~! {. m. j& z/ p# O
/* */
7 y O. ~) m: m7 u; {6 t
/* PWM 输出波形 */
6 g, v* m9 L t; P f) q$ E# m: _
/* */
- k6 \# R U+ [
/****************************************************************************/
/ d: T4 G t" `1 O3 i! X n
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ E& r' ~8 |- n7 t. ]4 j
{
! d7 D8 }9 Y! l: o7 V& k& l
// 时间基准配置
. x' g8 k& V6 L8 }
// 时钟配置
& y, t% d& U2 _) Q
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- \$ n2 Q: ]4 d, U h6 j/ Y' A& k
& ~3 ^: W6 L, N! ]: e# @0 l, @3 }
// 配置周期
# N3 |- C5 p' Z. d; N
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 J% ^( |& B4 g7 h& u7 m* s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; v8 G( F* t/ U" G4 }7 N
5 y' h4 p7 V# o* @) P Q
// 禁用输入同步信号
* v, Q- p! G# Q9 s0 q
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, `7 N: a3 r: j; D% o
1 v/ p% t* A, R; Q, |& j
// 禁用输出同步信号
0 v& ^2 {% J' g' q# D% R& R: x) `! l
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
& Y% o8 Y/ P$ z0 d: z0 @+ G7 i& c# y' k
3 Y* s5 R5 T8 V! K8 r7 j+ M
// 仿真(DEBUG)模式行为配置
1 N5 m! P1 V5 r* S/ x
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
, G( w1 _3 V: @9 v5 T7 e2 h' T
* f; W2 q. Z- O; i: a
// 配置计数比较器子模块
' S% z+ \3 y2 m
// 加载比较器 A 值
3 k# R; D, `; f2 s3 D% B
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; w: j! `9 K3 ?% a- o
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' M, {$ }6 M* ]
6 [' {; n/ {2 i2 G9 {7 c
// 加载比较器 B 值
* F' W2 ?6 X" ?0 q/ W
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
$ b! d5 @2 L- ~" d- F Y; V- p
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 l* b5 S! _. P- A
6 u ]2 w. z7 b3 @) u4 q7 D3 {
// 功能限定配置(输出引脚触发方式设定)
1 Y7 n9 A3 N" d. d
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 o: O9 q. U1 e1 d
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 T# s. A+ C' m& ~
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 t- Q1 l: _$ @2 s: L" ~6 h
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 o2 I* \' r4 g% O( o
8 q$ Q# q9 c& b
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
' d" G5 e. d% P5 P6 E
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
! ]2 s+ ]2 {1 n' D: l3 T3 K
5 t5 Y$ |1 A8 ]( z. M' R
// 禁用斩波子模块
. ~7 I6 c4 b" n& V% N
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
" D2 B& Q5 r/ j4 n
7 L# P& v. T/ P8 J' U0 ]& v
// 禁用错误控制事件
+ I4 _9 T1 k" m4 y8 O. q4 w
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 L. k, T; ~5 L, R8 F, s9 A. A
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
% Z; I* k n/ a3 O% r0 o" w
6 K: ]( a' ~7 {& P! T' B
// 事件触发配置
8 C8 g/ f% c; b% i% g
// 每三次事件发生产生中断
" I9 y% w& F* V, P9 n* q6 u
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
5 U. I# `. A2 t& Y" x9 O& S
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& K: j( d% c! z6 b
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 W) I; d6 R" E+ l: ~9 R# X' f% F
// 使能中断
! `0 Y% Y; z! m7 W
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) S3 X% D: X, }3 K6 D# ?
( t N9 v3 j# K. h f
// 禁用高精度子模块
, A, `9 \ y7 K/ ^
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ G% `0 _: ] q/ n- W
- Y, d0 Z n* p0 t# y" M+ R. N
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
' n7 s" d& l7 w! T$ S
}
" v" o) E9 O* @1 W* Q' E0 y# Q& c
. ?) h" s% \/ V& y' u, d! M5 D
void ChopperWaveform(void)
; f4 ]. p! P6 h) X" p* X, N6 F3 \
{
6 Q2 \: s: [& _1 ? J
// 50% 占空比
& k+ t+ f! ]& n7 p6 V3 r
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* j6 s3 l+ r* I, [1 Z& f- d( k" v) u
// 4 分频
. U2 \2 ~& ~- @; o9 ?% g7 z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 k) D8 G' o0 [) J
// 单个脉冲宽度
, h/ `% P9 X: ?) h3 j, W2 P) e
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. v$ a* T9 V& O% K2 d* o
// 使能斩波子模块
E- `7 W: |! t _; A
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 Y# B) J8 c8 O/ T; n* e z
}
- m8 h0 p, U3 g# e
/ a& O0 F& S( @. p/ R* \8 T
/****************************************************************************/
2 @1 w+ P' ^' ^5 Y; j. z" R
/* */
- K4 X9 u( g* f3 @
/* PWM 中断初始化 */
1 b$ f$ B% r3 C& `* Y1 g9 z
/* */
2 C) M) N9 G+ G
/****************************************************************************/
0 B8 b1 e8 E p& q7 w
void PWMInterruptInit(void)
) Y6 ?! X! @1 S* B% b
{
5 Y5 r- f. w [, G( ^
// 注册中断服务函数
; K* }, J# B* ?4 E
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 n6 X6 h2 }( H9 b! v, y) | J
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
5 Z; j$ h3 T* y# ?- O5 S! \
& I4 I- }; B% g
// 映射中断
' N/ U4 t3 ]/ C
IntChannelSet(SYS_INT_EHRPWM1, 2);
1 z2 x; E0 D8 _2 V# _- B: H1 {* |
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) ~0 {3 G7 |( C: w
* H9 }# h0 D6 k+ p" z
// 使能中断
6 f( a& x2 v2 n1 k1 w
IntSystemEnable(SYS_INT_EHRPWM1);
( m0 m3 }2 |. d" m+ V ^- [
IntSystemEnable(SYS_INT_EHRPWM1TZ);
) _ I2 X) E2 G/ k" x: p- Z6 T
}
( F2 P, ~( Z. k8 U' ?
# t% f% R: o" p' P O# a
/****************************************************************************/
- F0 J- Y0 k9 Z: G1 _
/* */
! N, ?" P) O2 M% G; i# f3 R* J
/* ARM 中断初始化 */
# q4 |5 q* Z/ f' z
/* */
3 e6 H, F# v% T, c8 T9 c: V
/****************************************************************************/
# a g9 ~! P9 C: C* C
void InterruptInit(void)
4 w* _9 P4 B& Y1 }0 k" i/ x9 z* A5 B
{
& ?* K/ u; I0 N! U
// 初始化 ARM 中断控制器
6 U1 v% ]! J3 e3 G0 l+ _7 y
IntAINTCInit();
* C! l; s) j7 p) V( \* T4 |6 ?- M
/ G2 \9 ^0 B+ _0 q
// 使能 IRQ(CPSR)
. Q) K- Y6 h2 L3 p% X
IntMasterIRQEnable();
5 [% n! G0 k4 M
& U2 u1 j3 v0 B" i/ i
// 使能中断(AINTC GER)
6 ?3 b+ P& K0 w9 q1 I7 u
IntGlobalEnable();
, ~4 N9 w% F) o, J; z a `
/ W5 m( \/ K' a8 |
// 使能中断(AINTC HIER)
2 O1 @- T& n( K! }! d$ B( P
IntIRQEnable();
9 [, P. c9 S w( e$ u
}
- n$ H5 D C7 T0 ?# w3 G
; C) ~3 z+ b7 h0 v
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 k% `! m* e) ^# [0 f# u# f
/* */
+ i/ D# ]" z2 F5 F
/* 中断服务函数 */
( O2 C% D; B. `# x. d. `" T
/* */
( a( i6 |. v3 V' l( A W" [5 O
/****************************************************************************/
. A; S9 A+ ~5 @3 W# ^
void PWMEventIsr(void)
) m/ I* ~. b" o' \, {- j
{
4 ]6 v7 S! O6 v, _. N
IntSystemStatusClear(SYS_INT_EHRPWM1);
4 b5 d. I1 f o; n
8 _5 L3 H7 I; }; p
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 G% ]' p% f0 u3 o8 |
}
5 c( I7 f$ @( n5 p. L4 k# L
! F7 p* h6 }: i( a/ H+ k* B
void PWMTZIsr(void)
% {0 L$ y* l- X6 G9 h
{
$ `% g6 ^* u+ n9 Q/ P; D
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
! Q& D6 ^8 I$ @+ x8 K0 u
6 ^# _: V+ M# M7 d3 P$ K4 n
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" C7 F) w- a% K8 ~' @7 {
}
' S0 h% @+ O" {, ?5 E; @
! H ]& E0 a- s( J& S
/****************************************************************************/
/ x- ^8 F6 }. j* _) S% _; t
/* */
5 g% }; H. F! g. B$ |, L) W! F
/* 初始化捕获模块 */
2 u- u% v9 H9 W$ i' A# o, B
/* */
. R2 V" q' h' U' Q K" M( r
/****************************************************************************/
' H/ q: J0 w: R2 m$ V% H& A
void ECAPInit(void)
* M; g( V$ M' ^7 V
{
/ y! M- U( U6 V U
/*-----设置 ECCTL1-----*/
3 S5 r( H4 A8 ]9 F. }$ R% V2 n, P- u
// 使能CAP寄存器装载
7 c/ Y( Y5 R" \% I* Y( \! ]
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; ^# I- }% d2 ]$ O( ~
// 设置预分频值.
* l+ O7 W0 A! K/ ] W. s+ N
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
?; y3 p, ~: N& S$ o
// 上升沿触发捕获事件
( R/ J) v/ O( m1 {' c$ ^0 L9 S7 H
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" E" K, `5 ^' h: N- S0 S
// 输入捕获后重新装载计数器值.
' `1 d' M; e, L: a
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" y/ Y/ v4 ?8 O! a- O
. K5 h2 k1 l; i3 T2 t g5 O' r+ I
/*-----设置 ECCTL2-----*/
# B% l" L3 m0 U
// 连续模式
' h: ]; e8 `7 o; |1 Y
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
/ @5 @# P+ B. C& h% ~
// ECAP计数器TSCTR持续计数
$ M: r9 m8 g9 c
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
- F J- P4 x/ A0 Z/ E
// 禁用同步输出和同步输入
. a, q/ n5 ^! x: b" C: \
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
$ V% b* G! v# j/ }& L, c
// 配置 ECAP 2 为 CAPTURE 模式
; D. w) S! m7 S2 y' V; n
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
* _3 \0 W7 |8 I8 A' S# O
' d5 S. {2 S/ \; N+ T
// 使能中断
' i% j) ^$ S7 b% C! M
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 j4 ]5 ?8 ?: ~
}
; m! n1 Q+ N, T/ ~# W
; _6 d, B) e* z! s
/****************************************************************************/
# @0 H. C( P& e8 j6 A% Y. Y
/* */
# m7 f! p: k+ G% t, g z
/* 取得捕获结果 */
# a% N) x8 k9 Y x
/* */
% L; g3 i. G5 k% D
/****************************************************************************/
q$ \0 U1 b; q/ I& s
unsigned int ECAPRead(void)
/ z8 F: F6 v8 T* \/ c9 M( h
{
! v8 r% {; H: `
unsigned int capvalue;
1 w" U2 F: S4 J2 \
unsigned long frequency;
% K& ~5 r- k3 W; y- {
) ~7 H" l( Z# Q O; l5 z. f
// Event1 中断标志
9 Q3 J1 U! \+ a2 c2 Y6 f1 a
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
7 ?& _/ c, @- j
{
4 l: n3 Z( A9 B: j. I
// 取得捕获计数
2 t* Q- E, L# N3 T8 A6 p3 t
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- M! d/ {/ v/ d
capvalue = ECAPResult.cap1;
5 G3 ~% A, p$ l- r9 V) K
% ]. i8 J7 u3 J+ C( P2 X
// CAPTRUE 模块 228M 时钟主频
# V& C* B0 _% A. }
frequency = 228000000/capvalue;
0 [" z( K3 a, t
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ X/ V; l6 m# ]* K7 x) }
8 T1 x8 o6 G- X' x% Y8 G4 X& m
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ ~- v% w' @- C1 M! j. [
// IntEventClear(SYS_INT_ECAP2);
3 L. g. n7 \$ B- E
}
6 S8 A% D& e* D d; _+ t
return frequency;
B( o* c; r( z2 n( f1 c
}
% i8 p$ z8 N* ^* R5 T. u) E* H
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
* P2 u. x7 A3 ?
[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