嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 V" K+ p. A) K! [
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
+ \" K1 e3 g' I3 ~$ _7 u5 H
/* */
: a1 ?$ Y( @( p; h f
/* 宏定义 */
3 a$ R* w0 q* Q: u
/* */
5 d' p2 ^2 M J3 A9 u
/****************************************************************************/
. \: r5 k# k$ B6 T! G/ T
// 软件断点
# g! C9 O3 I' D5 a' Y7 s
#define SW_BREAKPOINT asm(" SWBP 0 ");
1 d8 S* c# y4 X5 s4 Q# h
* }! ^, v7 N B7 w9 i
// 时钟分频
# H* {7 T* ~4 \$ G
#define CLOCK_DIV_VAL 228
; \- {5 c- C$ }+ i5 N2 t$ \/ V' X
' t4 e) \6 _* ]: C/ e
/****************************************************************************/
& H5 O# j. x, R3 x
/* */
% Z' {3 q+ Z- {/ x- t- L
/* 全局变量 */
5 d& {6 P& s) _
/* */
0 S' }- i2 _, G) p
/****************************************************************************/
" A" P( `% k- n2 S
ECAPCONTEXT ECAPResult;
9 W& ]; w1 i, ^
# N m, z3 @" t$ q6 C
/****************************************************************************/
. j' A, T* |& ]: C
/* */
, D: D5 o, v9 B9 P3 a7 N: D
/* 函数声明 */
' G- S7 |$ m0 A2 I) L, Y' G5 `
/* */
: T( i' o; Z) Q0 F3 [6 x, m2 J% ]
/****************************************************************************/
1 D; k% @$ l* M" J
// 外设使能配置
; a! ~8 k. {5 \, P3 V7 ^9 _
void PSCInit(void);
7 f; @$ ~& [- x9 f
* d& g7 Z& K; z( j1 @+ o3 B$ b: Y
// GPIO 管脚复用配置
0 ~) T5 p6 ~& `9 S0 Q2 {- o* ]. {
void GPIOBankPinMuxSet();
3 E6 ^" L# l. K6 p$ ]" G) q
' v; I: ~% H- i, ?" y
// 产生波形
3 B. H" H% L. I8 b) i! N/ \
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. `) s' o2 T) s- Y% S! X
void ChopperWaveform(void);
# B, o+ T( Y% G1 M
; E2 n# q5 ]" k" a# `
// ECAP初始化和读函数
& y" U0 |, }9 W/ R. A2 A# @& k
void ECAPInit(void);
8 q; v& O4 J4 H/ F' i& f
unsigned int ECAPRead(void);
7 X! [ n8 H& H" S" F) s
+ W; h) x+ y* j* w
//ARM 中断初始化
( _9 @* K' P2 f; w5 p: s; l" P3 D* e
void InterruptInit(void);
0 }7 g7 [5 B" u8 x
& S/ U1 o$ B( J5 |
// PWM 中断初始化
9 t4 w9 E7 S3 Y `5 A7 c
void PWMInterruptInit(void);
4 a" J( f' \# m S9 a4 o
// 中断服务函数
' R( G# j3 v9 x1 {0 ~
// PWM 事件
2 l% z4 y9 F l. C5 M
void PWMEventIsr(void);
, \9 v5 e* D% R" N8 _. L2 a9 e
// PWM 错误控制事件
% U! z+ f1 v0 x0 }) E
void PWMTZIsr(void);
p8 H, I" e! f( `
) p9 p: I& F0 z: P1 Z9 h4 e
/****************************************************************************/
& l. E+ [% f* {
/* */
/ Z0 p. |2 a2 K+ `
/* 主函数 */
" u% i' c. Y: m! N1 s
/* */
/ n5 s/ m8 O; b" t4 c6 j$ S
/****************************************************************************/
, j) j# _+ b$ i, h" c
int main(void)
: O- F) |' P5 d% d2 A( ~, S: h
{
. `! |' w' ?0 F( z- @' X% N
// 外设使能配置
. r& T: O+ [# z
PSCInit();
) f% X( K" f3 Y& V# e$ G; w) z1 o
- J9 G& B9 q1 z
// 初始化串口终端 使用串口2
, r/ k9 H2 G- ^8 a4 Z3 f
UARTStdioInit();
7 g" V4 d( h4 a! P
9 k; V! D' w, J1 a8 t8 L
// GPIO 管脚复用配置
$ L6 A, x( m, E: i( M3 a/ C
GPIOBankPinMuxSet();
# l/ c( R6 A5 ~1 ^
9 J4 c- b3 K( ~6 ^8 v1 @$ c
// ARM 中断初始化
4 g2 E" }7 W- S8 H# |4 i
InterruptInit();
8 ]% a' N' o8 O; |( \# k+ }
0 {7 ]8 C- |& b- ]; s0 h) O* R
// PWM 中断初始化
/ Y3 \7 F- u9 ]: r
PWMInterruptInit();
3 X, G$ u$ b8 S$ a
+ t( P/ V D# u6 s1 a% {& p
unsigned char i;
# ?. u, Q; k! q/ a
unsigned int j;
7 j; O0 I3 J1 |. X" n
W" z. B0 Y- }
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ ~1 [6 T& O: E
UARTPuts("------------------------------------------------------------\r\n", -1);
) W6 m7 m1 N B! D: @
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
) k6 K- I* [# {
// 产生波形
! z$ S# r4 n( K1 n' A
PWM1ABasic(25000,50);
0 R3 J" Z% l. g4 c
+ x" O( `1 U7 R: W
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
" ^) H6 q1 y# `( x# a2 o# v1 T- o
UARTPuts("------------------------------------------------------------\r\n", -1);
! \% W! W% `0 E9 D/ y9 W! b; R$ }
8 r u8 v4 I! n# \8 p
- x$ h7 }5 m. M/ b
7 T- R u0 |; c- S9 Z2 R0 U
UARTPuts("------------------------------------------------------------\r\n", -1);
' w& D/ `% W' X7 R+ N3 _( Q7 x
UARTPuts(" C6748 ECAP Test\r\n", -1);
/ Y L: ]5 R9 t* Y2 f& X, ~; b! g
// ECAP 捕获初始化
9 E( A ^* d) K( T1 Z: l1 E
ECAPInit();
& \$ f( K' G9 C6 J) F7 v4 V( v# |
UARTPuts("Initialize ECAP.......\r\n",-1);
& {9 g% h" G$ K
for(i=0;i<5;i++)
% b9 e5 A0 \9 z% E$ |8 i- ?
{
2 }4 Y3 p+ R: i+ }5 M
for(j=0x00FFFFFF;j>0;j--); // 延时
& t, O3 b2 e% Q. H& H5 I, ?6 v1 Q2 F3 g
ECAPRead();
5 Q. O/ x! B: a. a
}
* q9 q- k! x9 z
UARTPuts("\r\n",-1);
& J! f4 z0 A7 b: G$ }' G+ R5 Q7 x( D
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
2 G) g6 {; y/ P6 V' Z9 M7 T
UARTPuts("------------------------------------------------------------\r\n", -1);
7 T" E5 n9 b8 |3 F! R6 o9 g
0 h& P n: `1 O, o
// 主循环
3 f1 D9 {; f. P, U
for(;;)
! F L* g% o0 s+ o7 h+ y
{
6 t, A7 m- g9 S* }
; `. A7 R6 z& \5 E8 ?2 ?( Y5 c
}
# T7 Y3 Q" J# s& d ~. k
}
1 C2 k9 z0 {6 m) y% y& r
* \- S( M* f5 y6 |7 F
/****************************************************************************/
8 Y6 b5 o% \3 x$ B4 j9 s
/* */
, e. [* h8 J W; Z
/* PSC 初始化 */
2 \, N- G8 j3 _7 S: _: ]) x
/* */
% Q. n4 ?* t* `& c2 a
/****************************************************************************/
2 U9 V: o6 e1 F) R& F3 _6 `
void PSCInit(void)
7 h4 {( k% Y& W) I
{
2 z! Y& K7 F3 Y" i
// 使能 EHRPWM 和 ECAP 模块
+ v5 l/ F( a. H3 n* R
// 对相应外设模块的使能也可以在 BootLoader 中完成
% D4 \) b4 |9 t0 U* ~0 d. X7 M8 O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 x; d. }, l, ?3 {3 k; s* ?
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. z% w: u8 Y$ W
}
% `; O4 A8 `" e& ^1 V6 g! y9 m
$ v# C6 |2 p" ]3 [& m) g4 A
/****************************************************************************/
+ y+ ~0 z2 Z6 K& T6 M
/* */
5 q! `! T3 v7 X" W% P/ O
/* GPIO 管脚复用配置 */
9 V- y& w: k- ~' Z0 p
/* */
3 e) k/ z8 x# j- y
/****************************************************************************/
3 x# k: C3 |9 n; _, J
void GPIOBankPinMuxSet(void)
6 |; o+ a3 _3 G) k
{
$ H0 M6 v+ C' ~2 F% U2 m1 M5 K
EHRPWM1PinMuxSetup();
( |) [( [; @: i: {9 ?2 i
2 w, B1 Y$ e$ Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 x6 F; P! H5 Z" I$ ~
// 作为捕获功能时管脚方向为输入
5 {- E, q) {+ i2 B* Z
// 作为辅助脉宽调制时管脚方向为输出
! \% I8 {2 p$ v
// ECAP2 / APWM2
& d, V+ ]* f) p, c, M0 q S# K) L
ECAPPinMuxSetup(2);
' X0 u4 U. `9 K9 E+ V# S
* t; N( l( D' O# t+ C7 @9 g
// ECAP2 / APWM2方向设置为输入
' y# C/ y6 A. v w+ ^
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! G7 L' ?2 V/ P0 F
}
/ O# r. @9 @* l: U+ B- u- b
: d' o2 V5 n; P, ?, \, ~" s
/****************************************************************************/
9 D$ H' P1 P0 C a
/* */
# M1 w: W" d6 b% N/ F8 s
/* PWM 输出波形 */
8 b- U' S; ?; c% N9 O7 S+ n; z
/* */
' n, U6 m3 ?0 Q* \! m! u
/****************************************************************************/
: r' i- ~3 u$ M5 A
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 C2 ^8 Y! S/ q; `2 h' l
{
1 z. s$ ^0 |4 Z0 f' q3 ?' M4 u! c
// 时间基准配置
+ g' b- f8 T- m
// 时钟配置
" \1 d: E3 _6 c1 T& M1 p; G
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
. u3 t& K/ k- A# S9 K2 }
7 ~- R6 R4 r. f9 X, E' R
// 配置周期
9 t2 w: j* q7 Z4 V0 \1 k! ~
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: l S6 s7 N- I0 t3 t. u# v% B; \
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 M4 f( ~" ^, j! N$ Y
. j* j$ X3 X) ^4 N0 f0 u, W
// 禁用输入同步信号
6 d7 \/ N5 L. V
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 \# Z! x/ W- n4 ]7 x
! Y+ m( l' t% o, m3 l+ k
// 禁用输出同步信号
/ S1 x$ K3 ]6 C2 G
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
9 a- j' E' Q F! L* t5 m1 ^
, n7 F+ B. Q k! S" v+ W4 ~
// 仿真(DEBUG)模式行为配置
7 T/ U9 c; p5 X2 R& |( V" W
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 m9 I5 }+ n8 f$ W+ t& y
( M' ?5 l/ q1 G/ E" W$ V( j
// 配置计数比较器子模块
' v2 z# B+ |4 {* k
// 加载比较器 A 值
. x0 s2 ` g, H! H9 M
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' o" L3 N" c) y9 x$ |
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- D; U) n# J9 d* B* s2 T- ?( J+ {; g0 Z
5 P& `4 ^7 l& n% \) O# \# S
// 加载比较器 B 值
6 x0 ^, g4 X/ ^* x, J. ]
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, x# b4 T' t; i" D5 }
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 \) j4 c+ Q5 d7 ~* N( A
& N8 D7 s! u! W$ q
// 功能限定配置(输出引脚触发方式设定)
- a# c8 F4 j/ O1 t3 y
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
) P0 [' g( \1 i( G% _- _0 y
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
( ]2 ?* C' S4 [# J% H
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: w3 }2 A8 K) l5 h8 Y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
* u+ Z8 C9 [0 c# l" X1 G
) C' u5 C- g* I) H
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
7 W3 `0 y1 e2 ^, c) ?% S
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 u! i" j1 m: @6 }* G
( O$ O& R( W$ g( ?" K# D
// 禁用斩波子模块
) Z; e$ X/ p# x3 N) {
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- I, z& a7 B" X3 p6 L3 Q h7 e
) z: K F, t# I ~8 Q
// 禁用错误控制事件
) U. Z( h; a/ u/ ]. D3 M% e! h
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ R% P8 L. W0 V/ [% b F
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 a& A4 k% f! g' _9 }7 L/ t
: K. h( Z; ?: j7 M" {0 o7 k$ Z Q7 u
// 事件触发配置
- I8 f+ Z# z0 \+ w7 B
// 每三次事件发生产生中断
$ \$ [( e/ n4 p2 C
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 _& N- i- g+ E2 ?* A! f
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
/ `- ^# D7 \8 a. e2 x, Q
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
, U q# ?# i7 n0 t& Z! n( X! z. e
// 使能中断
! T( M1 l: h1 j& t
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
/ ?+ D, c/ L3 G4 i4 Z1 b5 m* E
8 c' {1 R; ?" `8 S: \( s
// 禁用高精度子模块
4 n5 y) Q; T: V5 m' I8 f/ n
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ y: ?/ l6 O# q+ r* ~/ k
( u& D# v) A3 t# ^+ p7 _
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 l9 {: l, R% j
}
( x+ `4 Z& i# b" _5 p
1 e2 \, C6 ?/ P4 O& @
void ChopperWaveform(void)
5 {7 n$ I) N8 A1 A2 o5 T
{
& A4 \. F' h5 B7 c( n/ ^
// 50% 占空比
' s n$ m# K, F8 ]
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
% z3 A2 F, U B/ Y/ O+ e
// 4 分频
2 i+ s% @" v; p) `# D* @+ j! J
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
4 x% @6 I0 n, p* n0 f/ r+ s$ o
// 单个脉冲宽度
; C8 b1 d! b" e& ~6 n8 C
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. U7 I; @( m$ N# h! K4 Z& L
// 使能斩波子模块
! ]- `( x7 v3 L
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
* f4 o- h5 T( ~1 G. C+ W+ V
}
2 j$ d5 F6 h% Z' I$ U
" J( _: T5 u7 O% w& q3 {" W
/****************************************************************************/
* D5 h8 ^, `6 C, m% K% g
/* */
% v+ w3 g0 k R7 Q* |
/* PWM 中断初始化 */
8 u: A1 i4 J- a+ I4 m1 t
/* */
# l( Q" \, Y. T- B/ m5 O' v, \
/****************************************************************************/
9 a/ }" G8 }9 r) e0 H3 `8 v
void PWMInterruptInit(void)
5 |) c9 y* P0 U+ C; n2 |, ?, K$ h
{
9 N$ y5 w. |; z* B
// 注册中断服务函数
! c& c0 Z, Z, n' N& T) L
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
6 a1 V# [, r+ {- `* r3 E) h4 ]$ _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% i! r0 H j9 \, H+ u7 X$ A
. e. x0 |) ~# a* {
// 映射中断
# @7 M+ A$ o$ K" H0 S* h. h% ~
IntChannelSet(SYS_INT_EHRPWM1, 2);
4 ]6 G6 ~# l0 A& L5 \. E0 s
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: @( v5 C2 s; s v
- y6 ~ r# T2 \; ^' k
// 使能中断
* M# I% g h m% z" z" w7 H
IntSystemEnable(SYS_INT_EHRPWM1);
7 @8 Z( e( _! [+ `; o
IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 a& ?) c) Q, e6 D$ N8 X
}
$ V& S- }; |. y: `3 S p) n
. P5 N2 \0 e" r
/****************************************************************************/
) R9 b( i- g( k$ a" S, B
/* */
' C" y) o5 x( O" [- o$ m
/* ARM 中断初始化 */
# i# Y! t$ }0 d8 l5 u
/* */
& i% y' M* X8 q2 e# S, k
/****************************************************************************/
+ `8 B }# i! b: _
void InterruptInit(void)
" i4 b* r% [4 m/ _$ N; W
{
( J2 m. N9 ^) U3 N) |
// 初始化 ARM 中断控制器
7 G7 h0 q. j( s% d2 F% @
IntAINTCInit();
* e( o& `% B+ ~5 H2 M
# o; P2 I4 r- d9 v
// 使能 IRQ(CPSR)
' M5 V- a6 c' O& u
IntMasterIRQEnable();
5 Y& z K8 O0 A8 e: N" X
! ?; Y: d% Z. g3 i6 S" a( }* N
// 使能中断(AINTC GER)
3 a2 l7 ^- U! w. L0 J
IntGlobalEnable();
$ K7 s& W& f4 {. \: P% J" N
4 p4 _% \. K- _) e6 F
// 使能中断(AINTC HIER)
. N7 I( K+ F9 g' \3 @
IntIRQEnable();
0 j% I, s Q' Z* I
}
, p/ w9 e/ m+ F$ j; q B
3 k. Z1 b$ T5 x- |+ D+ y- h7 q# [
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
2 ~# _+ h7 E T& y& Q9 U9 G
/* */
0 h1 `% ?, U" H, r0 {, q; T
/* 中断服务函数 */
4 Q; S/ R$ H$ B3 w+ |5 q; u
/* */
# U8 L) L( G# @+ B" I( x
/****************************************************************************/
! O3 ?6 J5 v4 c, |- [5 o) Z( F
void PWMEventIsr(void)
8 m5 h R }& Y) ^
{
( Y/ W- ^8 [* X
IntSystemStatusClear(SYS_INT_EHRPWM1);
# k( c$ r+ j7 m5 O# I0 x
1 G" S2 \! h& K$ s3 F
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
$ j, O+ q9 Q. n$ C: g
}
) w4 R. O% r1 t; h4 m. R7 Z. R
F7 N* s& _5 L# X, e
void PWMTZIsr(void)
6 b6 n& Y' C' y/ o2 Z9 i( C3 g
{
. [: E- ~& X& \9 a
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
- i# Q, F6 B$ P8 Y$ Z# Y
% _( i/ w$ w" V' ]: m
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
$ F( @6 d5 P9 V
}
9 N8 H/ R7 q5 Y- c( d6 Y% y
: J& w% H2 c) @7 V
/****************************************************************************/
+ Q& g) d) @8 Q! D* w \4 K+ z, q
/* */
9 z7 v+ y f% \" a6 D
/* 初始化捕获模块 */
u( y6 m6 |6 ]6 N- B
/* */
6 k2 o2 _. L0 G' A- H `, I
/****************************************************************************/
2 h, a( ?5 V% k: k& p$ F" l4 `- d
void ECAPInit(void)
: W$ z# D2 T3 _" G8 i: y# P5 h
{
+ j( }# K3 O0 d6 R; T
/*-----设置 ECCTL1-----*/
4 p% M; e9 s4 t# _0 m
// 使能CAP寄存器装载
. |4 V Z5 {! ^: `
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
8 s T9 ?5 z r; k9 r0 @; ^
// 设置预分频值.
0 K$ N, u4 p: ~% D0 J3 G$ T
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
4 ?7 R" h1 K8 D5 k6 c, @ h
// 上升沿触发捕获事件
2 r0 A- C% C* j1 Z
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" ?7 E j* ^( y, y+ w0 H) x, H
// 输入捕获后重新装载计数器值.
2 c& D/ S0 y0 j/ ~) J; V
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 I- T3 a9 j8 j8 x4 z! o5 F& j" p- Q
: P: I4 n! o& Z+ Z3 {/ }
/*-----设置 ECCTL2-----*/
* X" n# w }9 k+ U/ v Q1 q+ w
// 连续模式
* I- ]: W6 w1 A1 j6 |8 }
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
# }) b) S0 Y( a
// ECAP计数器TSCTR持续计数
4 T- G$ O% Y+ [! }% J
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: R+ J/ F z+ ?- j+ i0 e
// 禁用同步输出和同步输入
4 ?2 z9 B; t7 l0 F' O
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
, |- c' D0 z' q7 s
// 配置 ECAP 2 为 CAPTURE 模式
4 c8 y: F& E# n
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
5 y, ]( L7 ~& k2 b) t' |1 Q
5 a# t. _, k' s
// 使能中断
: l9 {3 w" w3 x
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
1 \0 H% O2 F1 q3 m9 f: h
}
' d$ K0 `" E0 n
/ d2 g$ [ q3 t8 ?: u/ b) T
/****************************************************************************/
: z/ i3 L+ f) {: f2 n9 k3 ^
/* */
1 G) t, G. S; ]; h9 }& w
/* 取得捕获结果 */
' b+ ^. H& l2 Q7 x T
/* */
2 @. X3 f; P- T1 I3 z Z2 D: d
/****************************************************************************/
1 T- G' p! p3 u: z, _$ z6 h4 A8 @7 {
unsigned int ECAPRead(void)
) Y& ~3 R# n1 a V# Y! ?
{
* Z. g- H* J' F7 I5 u$ Y
unsigned int capvalue;
! o V5 J- t- _8 ?. R) m7 h) U
unsigned long frequency;
6 B) l0 W, G; F! W( n
; J/ v, q/ T+ t9 ~: N3 g
// Event1 中断标志
( J: j* O& O( y- i9 c
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
* i: ^+ {9 {' ?4 z7 D
{
5 q4 g$ P$ J9 d5 N! P) c; `. h; j
// 取得捕获计数
! Z* O( }% ?5 C" `7 [4 G" Z
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
8 j/ Z' w! X( f- ?, g* W) w5 Q
capvalue = ECAPResult.cap1;
( E) G/ a2 {. G1 m! X! I) K& y7 d
1 x! M5 Q; Y$ I1 g, }- Q4 }
// CAPTRUE 模块 228M 时钟主频
# `' O4 o3 z& x( d4 E4 o$ V
frequency = 228000000/capvalue;
5 I* Q: \( @; v- N$ q: l. H A
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
2 ~! |) M! S+ Y7 q: E
; d( X7 D( |; T9 D
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
7 Q" \0 x0 U8 V5 f6 G" m6 G+ |
// IntEventClear(SYS_INT_ECAP2);
" p) I) f/ v9 J: V# Y3 @9 F
}
5 P! I# F' O7 j. n3 O
return frequency;
1 N% M; L! ]2 ?
}
) {, U$ O" }& N5 S9 _
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
; R7 M" p ^9 A
[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