嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
" Q" |% f$ @0 B; b& J
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
, e1 g/ h4 V/ r% {8 c- l
/* */
; n1 |5 c" G) D3 W* K
/* 宏定义 */
* ^8 Z3 J) y( v
/* */
# U% e* D2 c( Y/ j
/****************************************************************************/
x+ d% o* s( n$ O& @
// 软件断点
" u5 u' R, _' j+ H2 s. o
#define SW_BREAKPOINT asm(" SWBP 0 ");
, b. }3 U' T+ Y% n7 T$ Q
3 I; n' N5 |0 s
// 时钟分频
; f# z. h6 `+ m8 Z, v
#define CLOCK_DIV_VAL 228
$ q+ u. x1 t7 e& V; A% ^4 P
* J; O1 T/ `& U2 ^) H6 i% m
/****************************************************************************/
* U6 ]. k$ l0 G
/* */
$ u3 ?1 }- U# }8 k- k2 t. A
/* 全局变量 */
2 B0 n6 H z9 I' _) k6 n
/* */
" q4 h5 R$ X7 |3 k
/****************************************************************************/
: {7 X$ J0 k5 t
ECAPCONTEXT ECAPResult;
; s3 Y7 k0 U- g# l3 E" ]2 ?% e+ h3 F6 ]
( r1 W2 V+ W! ]
/****************************************************************************/
~; h1 D- E0 N8 _* r$ |2 S( s
/* */
7 t: ~ C6 J' ~/ l8 p
/* 函数声明 */
* ?0 \# ]; Z2 S# V/ V8 E) p
/* */
# e- a8 j3 {) A1 d+ N6 x: e
/****************************************************************************/
2 R" v1 L0 Z: v& }" v |
// 外设使能配置
- v6 q5 ~4 ^! b& B( e$ I
void PSCInit(void);
: o( w* H+ i3 y( d
& p0 _( w0 g: J, P! c! \9 Q" c
// GPIO 管脚复用配置
8 r* s& m$ d! k& k
void GPIOBankPinMuxSet();
* n% e, g$ X! h/ l* f/ K
8 h9 {) R% A1 V( R3 o
// 产生波形
9 X4 g) B9 I% B9 b" f! K: _4 |
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: V4 Y! s0 X- c. z
void ChopperWaveform(void);
7 w6 s4 j8 \' k! Q3 t; m
c9 Y+ k' u4 ]$ p
// ECAP初始化和读函数
2 {% J# L0 g9 a* H }
void ECAPInit(void);
/ [& S/ ?& M) n s& a8 `
unsigned int ECAPRead(void);
$ j5 n# B( I) ?) Q
' \& O) R7 B& p5 B- _
//ARM 中断初始化
- {$ E. p: B9 B, q
void InterruptInit(void);
1 a: T) n0 ^( l' H$ {5 X
0 m( S7 v7 [9 Q+ e* y% ~
// PWM 中断初始化
$ {# X1 U, e' u9 j* A' m7 N+ p
void PWMInterruptInit(void);
# ]6 l5 {. p. c5 l) A: U6 {
// 中断服务函数
7 ^% u/ D$ p) h1 M5 f
// PWM 事件
3 ?3 O- g1 C, f
void PWMEventIsr(void);
! a$ Z, L% i) q' g: M
// PWM 错误控制事件
, {2 S' i. E1 B+ t# V }1 ~
void PWMTZIsr(void);
1 N# Y5 ~$ ?9 I8 ~' c6 X# L, |
+ p u% ]/ ?! K/ {0 D9 T* i7 x
/****************************************************************************/
3 d6 u* [* p5 Z7 e
/* */
% @, f1 R" A; G' D% H$ c
/* 主函数 */
/ b5 Q+ O( b2 g
/* */
8 U5 p Y+ F! H! C
/****************************************************************************/
$ r# o- O3 I' L; O7 ^
int main(void)
) Z3 v ]1 m5 @" ?% W" M" P
{
2 q8 k% _' Q6 X4 G# P' U
// 外设使能配置
; |) t6 h. w# M' m
PSCInit();
, e' z6 Q$ @2 @: _/ e/ W
9 F) A4 E4 C! e% \' j1 A
// 初始化串口终端 使用串口2
- ?$ w9 o ?- w) X/ Q) |
UARTStdioInit();
4 `1 c9 z- M: w
# Q7 |0 O8 E, E
// GPIO 管脚复用配置
( W' O$ H$ Q' K7 e7 r! `
GPIOBankPinMuxSet();
' Q5 b5 ]6 \+ p/ p+ _
* f5 q; |1 D1 r0 r1 ^* h& i
// ARM 中断初始化
, D4 T; J0 I- B5 s
InterruptInit();
6 k2 ~( c) Z; B/ r! B% B
+ U" c4 k- ]; A7 {& o/ |& a0 h4 Y
// PWM 中断初始化
" t) [, L4 B' M6 j
PWMInterruptInit();
7 w' ^3 H0 z- q9 t/ \6 F
! x- A* e1 u3 ~! a( L
unsigned char i;
( z' Q; p: `; r. u w, q$ R
unsigned int j;
% T# V j4 `% m" M- p4 z) Q
3 V w% p6 S" [6 w+ u3 H" s
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
8 i3 |: a: {4 W
UARTPuts("------------------------------------------------------------\r\n", -1);
% R+ J3 T5 ~7 J1 Z/ o% s7 B
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
* f( h# J n+ L& {" N) i4 w4 V
// 产生波形
* x! B4 o' Y4 \, L, O
PWM1ABasic(25000,50);
3 ?$ o& p$ r d( r) z
: D2 T3 d: k. @ [9 i5 ?
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 q7 N) j5 m1 H& b% \
UARTPuts("------------------------------------------------------------\r\n", -1);
, a) T# s. E( v$ w4 {2 o9 C
% M# T4 s9 m( \- x$ U
- S" Y6 A4 K A5 \, ^
4 p& |+ V$ w5 Y6 A7 g# Q. c0 B
UARTPuts("------------------------------------------------------------\r\n", -1);
" {! f( O6 f Y' M3 n# g
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 B) y; U* j3 R1 A- D$ V
// ECAP 捕获初始化
- ~: f8 f! x- Y0 y6 M) h
ECAPInit();
/ ~" L: m& F7 M- K0 ?9 T7 C
UARTPuts("Initialize ECAP.......\r\n",-1);
, n( H: m3 D, g4 z$ E# ^
for(i=0;i<5;i++)
* F' [; x- E; Z( H# }
{
" \2 M; S/ M3 t/ W0 k) }
for(j=0x00FFFFFF;j>0;j--); // 延时
6 C: ]9 W; Z% s6 g. E" p
ECAPRead();
6 N' p: k( }/ f6 B
}
( y+ I4 i D. q& _+ u( ^' c
UARTPuts("\r\n",-1);
: ]" T; U3 ]/ e* n0 Z
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
3 f3 z1 h4 ]" w6 C+ X6 L/ p, O0 B. {
UARTPuts("------------------------------------------------------------\r\n", -1);
" y5 |: A/ U y1 d7 b) Y+ o
# ^6 }. t* n7 o
// 主循环
5 A* M1 L" c& O3 d" Y
for(;;)
+ j2 u6 F! C" b, W
{
+ L5 d+ w. v" d: K0 b8 m: C5 A
, i( [) f( f9 C$ K3 F+ W% c: {
}
/ Z! j" c' x6 V t- O7 Z0 m
}
' e1 E; j/ s9 \/ p a: X
& j/ `) Y# r9 ?" T" e$ ]! D
/****************************************************************************/
. X/ B) ~6 @: S. J% t2 q
/* */
4 m9 W, `# s4 z6 u$ @+ ]+ ] p
/* PSC 初始化 */
+ j$ `& O# _; c; ^* W. n9 z
/* */
+ W3 k+ X7 f. B: ]7 q8 S$ ]
/****************************************************************************/
/ M1 |: B; R% K! a9 m( g& k: n
void PSCInit(void)
; o0 ~' q. L! c, R/ y, b% h
{
4 M+ \, _* y; O
// 使能 EHRPWM 和 ECAP 模块
/ Q! x4 L& Q! s6 B
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 K: P8 m o) j2 Y6 ~- o; v; S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 y/ {/ N1 R3 v3 f- Y1 W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ U. {% h$ C$ N$ g4 `
}
" x) m, T2 m; L9 Y, J4 o9 B! Y0 }
0 }4 R% ]* j/ i
/****************************************************************************/
9 V$ E( g$ y2 e( s( E9 e
/* */
( r2 t/ c, s2 y+ v( s/ Y9 z9 S
/* GPIO 管脚复用配置 */
. {/ Y8 Z5 c' } m. n
/* */
& G( \# `$ @; ^8 R
/****************************************************************************/
9 h y" A0 ?3 ~% Y/ s& H
void GPIOBankPinMuxSet(void)
$ @$ X7 O2 ]7 Q9 B5 j4 f) _+ O
{
! q; r) B, Z" N! f* y, D. K
EHRPWM1PinMuxSetup();
, o V( b1 j$ {
; f8 ^2 O7 |- B; Y
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
0 B* |$ y/ R9 A$ Q0 @ C
// 作为捕获功能时管脚方向为输入
9 q4 M: S+ z; P6 {/ Y
// 作为辅助脉宽调制时管脚方向为输出
9 \& G) O7 S7 {2 s( F/ ~" e9 \
// ECAP2 / APWM2
* V: A8 l+ ?$ `8 Y0 H
ECAPPinMuxSetup(2);
, K- S: `9 ], A% T' g# D: u
0 G( a+ W8 u G( ~, F d
// ECAP2 / APWM2方向设置为输入
7 C. v& g% I \# k8 E e
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( P2 Y( v% [ V4 L
}
& V8 _9 H5 @! v
0 x! Q4 ^2 ~$ \2 I ~! D
/****************************************************************************/
* u; i% D) O1 `8 E1 O, s
/* */
3 L* h. R/ x( U0 s) ~% n
/* PWM 输出波形 */
- y9 `' Z3 h3 g7 q* x6 v. I5 \: x
/* */
: O' N4 t" w5 y
/****************************************************************************/
0 A1 M/ m1 z: c. b9 |: H# V
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
5 X% {6 U) q- V
{
+ \" }% G6 S4 U, b. Q$ i
// 时间基准配置
`8 A4 n: _/ c: `7 E
// 时钟配置
3 ^2 N* r; ^5 i- `6 v
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
q1 y& L- p e! g$ |& T
; F# G# Z2 N) k& ]6 i0 j
// 配置周期
8 t: x/ p% N, _4 R' G- t( _
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' ?4 y: r' V, x2 k m% [( B7 e
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- z* K5 B. O) q$ m2 J9 m! `1 P
# D. C* V P4 ?" q5 W
// 禁用输入同步信号
# b% q. w$ e& T* t
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 k! ^1 A$ \! W# v) U3 A
% q; ~; b, \3 g1 t
// 禁用输出同步信号
7 u( U& f* d4 l2 @! j4 l* t4 t
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 L0 L! ^' L, W( J6 c
7 s6 z P x$ G X1 [
// 仿真(DEBUG)模式行为配置
* m$ d' O1 F/ Z6 A T% y8 B: A
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 ]5 W0 H$ w1 u# {
. M# [ v% C6 ~6 t; `" |3 N# k; F
// 配置计数比较器子模块
( m9 c* d8 h9 S7 E' K' s, [! J4 b; { b
// 加载比较器 A 值
9 I0 C" z- V7 g/ L
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- P; m& y$ h) C
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, H7 w+ o8 o8 J9 Q; d2 `
2 b7 P* _/ v5 C u ~
// 加载比较器 B 值
; g) s+ M" a) W
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, n; }/ g+ r4 [) J
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& L' z$ B; L# g! w' |
! Y& H E/ H3 r% x$ U2 y1 ~
// 功能限定配置(输出引脚触发方式设定)
& L0 P' X8 x% ?* B- O( U
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
! L" v& y0 r3 c: g% Z) }; O( y' K
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
% f j; P/ z7 N5 M- M
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: P9 V0 i+ y' X$ H, ]
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 S& c8 n6 n2 [% F! w" L
' \2 L$ R1 }4 r; x- I; f7 w V
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
( ]* \# O/ P' |$ H& m$ K& [! b
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
+ M+ |& e7 _- X7 u3 a
9 O! s; v ? k! ~) J. e
// 禁用斩波子模块
7 O2 O; q; v3 j5 |; X1 Z7 T5 p
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' m/ A: l7 Z- _1 V/ H: U
3 e# J# f5 X8 v7 [$ w& |, f* }
// 禁用错误控制事件
5 N3 J C) ]) R& ~4 d
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ S3 C! g* A# V# N3 ] A
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' g% z9 S+ p% e7 r+ ^: m
: f% Y1 c4 [: N
// 事件触发配置
/ [6 f$ m, ?' r) G
// 每三次事件发生产生中断
0 u+ P: {; M6 t* d, E6 K
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, _- T% x' L* z% @7 z
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
+ i% M2 \) F" B) Y8 a
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! K* ~. {$ B6 Z; \% A
// 使能中断
1 Z: E9 |1 C$ M) n* L \( n' u
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ t" b) {" K( j' q N x9 _! m
1 P0 V, w* Q0 T& y. [; u6 p4 d1 n
// 禁用高精度子模块
9 C; y# B4 \$ m5 P
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ z. J! @! l8 n8 f6 ^! v# V
- ?: s/ i3 d0 r; d2 O- ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& S4 p! c; G u) y0 H
}
: i1 u& l/ T2 c0 x% M
9 @( V: Z7 V# ^
void ChopperWaveform(void)
* R a+ K9 h( @6 H- v0 P/ C/ b
{
- m/ I6 j# e$ r" i0 _0 Z% W
// 50% 占空比
! T) i9 m+ O: H
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 D5 H& B, u# P# p
// 4 分频
5 Y/ O' ~% }% H0 Y5 I7 q! p
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
% x6 y% d+ {8 K% e1 m% ?
// 单个脉冲宽度
- [" {$ `3 H* |+ m0 _0 w2 x
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
& ]8 _7 y% y3 N
// 使能斩波子模块
4 H; x, ^3 s$ A, Z" s! C5 p0 O; O; r
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
( d* s) H: ^2 t# ^! S5 w. d I5 c
}
A/ J8 q, L$ i7 R
* O( t# ~7 C9 f% \4 b# d
/****************************************************************************/
, I: M# @" }& A$ W
/* */
( T3 e8 M/ ^( o
/* PWM 中断初始化 */
/ j4 Z* |/ I# o5 H# m( W+ p
/* */
( K7 u) N+ m; w5 ?/ O3 F
/****************************************************************************/
3 B. X Z2 s4 W9 Z- _! P( M
void PWMInterruptInit(void)
+ o3 z/ k: r* a! w8 b6 o4 C; N
{
8 ` f% g* h1 ]" D Z
// 注册中断服务函数
F1 S0 q2 S. p. @0 S" ~" p# l# C
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
& |- _ _2 O- l5 R% [
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% K) c' R! B2 }
9 J/ L6 @1 \# p% J# K/ J1 X& H
// 映射中断
7 B8 G! c" U7 x% A0 z
IntChannelSet(SYS_INT_EHRPWM1, 2);
6 ]1 |6 h) s1 x7 h- A9 _; L
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% y7 {' x: R, `- N
6 t l2 f, g. s7 k; l) X6 _3 f8 Z
// 使能中断
! j" Z/ W& f0 z/ y. t4 J9 H
IntSystemEnable(SYS_INT_EHRPWM1);
5 J+ m5 v1 Y& ]. q3 v/ F
IntSystemEnable(SYS_INT_EHRPWM1TZ);
U* k& _# V J6 X; C
}
) K. |+ v/ e& V
( [ a. q6 B/ [
/****************************************************************************/
0 O* Y* R- a% L. w& D
/* */
( e+ s h% f) Q/ v
/* ARM 中断初始化 */
& I; w- X. {* k
/* */
8 a$ h' F* p6 y0 b$ z" ]3 [; Z4 U
/****************************************************************************/
( C/ z& F: E% h. d9 {
void InterruptInit(void)
3 ~( K y) n* ]3 @. c( [ M
{
( v+ d) B' G$ ^7 y* o, X3 c: N$ A
// 初始化 ARM 中断控制器
+ U" a8 p: k) z5 ]* B0 V" r
IntAINTCInit();
; E1 j; ?0 \. Z+ V1 e* H! E
& T% b: r( t( \7 P/ U% p
// 使能 IRQ(CPSR)
3 {) I6 I) _! w& H0 U+ J( l. a
IntMasterIRQEnable();
. P6 \) | u) l+ w5 g. a
\: ^3 S) [: }% @
// 使能中断(AINTC GER)
. m U5 x5 B5 X4 U$ l
IntGlobalEnable();
9 }7 B7 Q+ K( J2 A) c
& C! Q$ X, G! I/ m
// 使能中断(AINTC HIER)
" l. E% v( H. H
IntIRQEnable();
$ {3 `) @9 s; g5 c2 W; R: m
}
9 U: C; Y |2 R9 i: W% s( }
2 ]2 `/ K* _" _" I+ _& |! `
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
6 }4 f4 `2 R- n) k1 @5 h* Z
/* */
' J8 W4 [2 X3 D. C" S3 `% U
/* 中断服务函数 */
: W. F ^: g1 l/ Z, B
/* */
/ ]% W, m) M8 u, o2 ^1 F
/****************************************************************************/
2 ~! R! H7 k6 N+ @( t
void PWMEventIsr(void)
$ m! m% E7 `; d V) u$ M4 H
{
4 s$ B9 Q! J$ V' O
IntSystemStatusClear(SYS_INT_EHRPWM1);
, t. e8 e+ a7 A8 }
+ P2 {% q. A" D" W2 f) }
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& Z. f+ B6 K& o' u) _3 V Q
}
8 c5 R6 Z! L! C4 s$ B9 Y$ n9 J
! i5 s8 C5 x* k+ A0 a0 w ]9 k
void PWMTZIsr(void)
- I% R: w' _' |- g& j; |
{
- U& Q8 }% {7 |/ v3 @% {1 t) [
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
% v t( C8 u3 X. J* C; _( H- |+ V
+ q1 h' @' K E: S
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
4 I$ K6 ]: F5 k5 y
}
! u. ~7 K; p+ a# F, S5 @; f
6 K1 s' Q- I# B V! x) p. W& E
/****************************************************************************/
- n) P& a _8 Y" E, D% W& e
/* */
+ W$ g. R. {$ `
/* 初始化捕获模块 */
( e3 b' K) K* S6 w+ i [
/* */
( Q% W2 @* Q$ t/ D' v' z
/****************************************************************************/
0 ?1 e, v7 x( ~
void ECAPInit(void)
+ a' j- e; J0 ~
{
% X8 J( S) [. [$ [" s0 C: j
/*-----设置 ECCTL1-----*/
9 b- A, f8 X3 a: x K+ ?* @2 w* f2 N
// 使能CAP寄存器装载
; s/ _' v: U; T) X9 i5 y) X5 u
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
% e' D. e7 [7 k. ]& S+ v2 J1 t
// 设置预分频值.
) r$ G9 r1 I7 ^; c0 p5 o6 a
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
3 \9 V. O- G: i) t* v' ]
// 上升沿触发捕获事件
/ H4 U/ V- H2 ~1 M, K: ]
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
( | | f% O T- L
// 输入捕获后重新装载计数器值.
B: w9 K4 ]) w$ ?* N& ]
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
) a- p3 O$ H3 @6 h
" _! B. Z% B. y' ^& v
/*-----设置 ECCTL2-----*/
: g8 a, x* d. Z2 W. b# w8 B, B
// 连续模式
, M4 T8 X; `, w0 I
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ l8 p' O( \2 p; J& ^! C) u
// ECAP计数器TSCTR持续计数
. v+ k( Q" M9 V' m4 e# U
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
2 n+ L4 m% Y9 r/ E
// 禁用同步输出和同步输入
7 h& V( |; L# L$ W
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
9 y1 r- I, T+ o% ~8 n9 Z
// 配置 ECAP 2 为 CAPTURE 模式
+ a' m8 r& r! ]0 q- u' \- Y, F, O: ]& h( P
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
7 o* Z, i+ O! s! X4 \6 R; j
4 o! T, ~& Z; X4 N+ F3 N% b$ Y+ m
// 使能中断
0 p6 ?/ f4 B4 v3 g
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
! u1 v' f$ u. F1 q3 t" y- \
}
" B) F7 V3 E5 c" Q. m# X
$ |8 A- J. t+ l
/****************************************************************************/
# ]8 l, t! p- f6 Y6 v/ l1 Z
/* */
7 \. E# e6 i, w& y
/* 取得捕获结果 */
3 c: ^( l4 L9 {" V& j; ?& _
/* */
+ ~8 o: Q0 W% R9 e$ s% C
/****************************************************************************/
^4 h2 B5 r5 `. M0 r8 i
unsigned int ECAPRead(void)
3 f8 o p9 n) u# R
{
, V5 y9 Z, m5 [1 y& z
unsigned int capvalue;
5 u0 g5 Q, z3 [
unsigned long frequency;
J) A2 Q/ ~; e. B# ^! @
+ Y5 I' @: n/ j6 ?# L9 `& i
// Event1 中断标志
8 ^3 Q: J+ @! ], x5 n" N
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
5 g4 m" o; E6 [$ |, A; P# z
{
* \ i; z# o: O. v
// 取得捕获计数
' ^% S6 D/ f$ \# |: s$ r0 Z
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
" y9 n, a) J. q! n7 }$ m
capvalue = ECAPResult.cap1;
! D) Y* o3 R6 ~! E; |# p$ B
% ^ R7 f/ [8 T0 M7 e
// CAPTRUE 模块 228M 时钟主频
6 {; f+ `! ~3 Q, R, p2 H8 ~" V; H$ F
frequency = 228000000/capvalue;
: ?7 Y& K) M5 W% \$ N( o& { H9 z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
7 O6 Z; N/ m3 o" Q5 M
3 G6 x# I6 v$ D6 X3 ]9 f
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
" [% _" g/ j5 N; @& I
// IntEventClear(SYS_INT_ECAP2);
5 F# y: J$ K- a- S
}
; j$ _6 K2 t- {) u; P
return frequency;
% j& t8 j+ u) ?, w( C
}
, G3 |/ Q6 b" M9 x1 S1 A# j
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
3 a) O. @( _! T3 R# X: n 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