You are on page 1of 21

UNIVERSIDADE TECNOLOGICA

FEDERAL DO PARANA

ENGENHARIA DE COMPUTAC
AO

GUSTAVO TEIXEIRA RUDIGER


RINALDI MASSUDA SEGECIN

Controlador para motores brushless

APS DE MICROCONTROLADORES

CURITIBA
Fevereiro de 2015


GUSTAVO TEIXEIRA RUDIGER
RINALDI MASSUDA SEGECIN

Controlador para motores brushless

Esta APS consiste em projetar e construir


um controlador de velocidade para quatro
motores brushless que funcionarao de forma
independente e medir a rotacao em RPM de
cada um.
Orientador:
Prof. Rubens Alexandre de Faria

CURITIBA
Fevereiro de 2015

LISTA DE FIGURAS
1

Quadricoptero sem as helices. . . . . . . . . . . . . . . . . . . . . . . . . .

Esquematico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Eletronic Speed Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . .

Sinal PWM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Circuito de chaveamento para o pulso PWM. . . . . . . . . . . . . . . . . .

Sinal do ESC sobre o motor. . . . . . . . . . . . . . . . . . . . . . . . . . .

Circuito do sensor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Regulador de tensao acoplado ao quadricoptero. . . . . . . . . . . . . . . .


SUMARIO
1 Projeto

1.1

Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Lista de componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3

Esquemativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Desenvolvimento

2.1

Controlando ESCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Leitura RPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Energia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Conclus
ao e Relatos Finais

A C
odigo em C

REFERENCIAS
BIBLIOGRAFICAS

17

Projeto

Figura 1: Quadricoptero sem as helices.

1.1

Objetivo
O objetivo deste projeto e controlar os 4 motores tipo brushless atraves de ESCs

(Eletronic Speed Controllers), e que tambem seja possvel fazer a leitura das velocidades
dos motores em rpm usando sensores infra-vermelhos.

1.2

Lista de componentes
Para a realizacao do projeto foram utilizados os seguintes equipamentos:

Fonte de tensao
Osciloscopio
Multmetro
Componentes
1. 4 ESCs
1

2. 4 Motores Brushless
3. 1 Placa P51USB
4. 1 AT89C5131A 24MHz
5. Resistores: 200, 1K, 10k, 17k
6. Capacitores de 100nF

1.3

Esquem
ativo

Figura 2: Esquematico
3

2.1

Desenvolvimento

Controlando ESCs

Figura 3: Eletronic Speed Controller.


A forma de ativacao de um ESC (figura 3) ocorre atraves de um sinal PWM
(figura 4) em um de seus cabos. Ele funciona da mesma forma que a ativacao de um servo
motor, aonde o pulso PWM ocorre num perodo de 20ms, que permanece em nvel logico
alto durante 1 `a 2ms. A variacao entre esta faixa de 1ms do pulso PWM acarreta na
variacao de velocidade do motor.
Para garantir o funcionamento dos ESCs, a ligacao com o microcontrolador foi
feita atraves de um simples circuito de chaveamento, realizado por um transistor como
mostra figura 5. Isto garante que a corrente seja suficiente para a comutacao do circuito.
Os cabos do ESC que vao para o motor, quando ligado, submete nele uma forca
eletromotriz que faz os imas do motor se orientarem para a mesma direcao desta forca.
Aplicando a sequencia correta sobre os tres polos do motor, faz com que ele se rotacione.
A figura 6 mostra este sinal.

Figura 4: Sinal PWM.

Figura 5: Circuito de chaveamento para o pulso PWM.

2.2

Leitura RPM
Na leitura do sensor infra-vermelho, os motores foram pintados de preto com

uma listra branca ao longo de seu eixo, para que seja possvel detectar a reflexao da luz
IV pelo sensor quando o motor gira. Os sensores foram acoplados de forma que pudesse
incidir a luz IV diretamente no motor, e que pudesse detectar a sua rotacao da melhor
forma possvel. Devido a poucas portas de interrupcao fornecida pelo microcontrolador,
foi dividido o tempo para utilizacao da mesma interrupcao para cada sensor, tambem
conhecido como TDM (Time Division Multiplexing). Para tanto e necessario ativar cada
sensor por vez num intervalo de tempo, e para isto um outro circuito e utilizado como

Figura 6: Sinal do ESC sobre o motor.


mostra a figura 7.

Figura 7: Circuito do sensor.


A ideia do circuito (figura 7), e habilitar a sada INTERsomente quando o transistor esta saturado, e manter em nvel logico 0 enquanto o MICRtambem for 0. Desta
maneira podemos curto circuitar as sadas dos transistores numa mesma interrupcao, e
habilitar somente o sensor que deseja-se obter a leitura. Dependendo do sensor pode variar significativamente o valor do resistor associado a ele para seu funcionamento. Talvez
ate mesmo um comparador Amp. Op. ou um comparador histerese seja recomendado
para a captacao do sinal.

2.3

Energia
A energia utilizada pelos componentes foram provenientes do regulador de tensao

7805 acoplado junto ao quadricoptero, com entrada e sada dc de 12 e 5 Volts respectivamente. Como mostra a figura 8.

Figura 8: Regulador de tensao acoplado ao quadricoptero.

Conclus
ao e Relatos Finais

A ideia inicial do nosso projeto era utilizar o microcontrolador para fazer a funcao
do ESC em si. Entretando tivemos grandes dificuldades em fazer com que o circuito
MOSFET responsavel por fazer o chaveamento da corrente que vai para o motor. Assim
decidimos por utilizar o microcontrolador para controlar cada motor de forma independente e medir a sua rotacao em RPM que seria mostrada em um display LCD. Mesmo
assim tivemos duas barreiras que tiveram que ser superadas. A primeira foi de como
gerar 4 sinais PWM com tempos de alta e baixa diferentes utilizando apenas um dos dois
timers disponveis no 8051. A segunda foi o circuito necessario para que os quatro sensores infravermelhos fossem lidos separadamente utilizando apenas uma das interrupcoes do
microcontrolador ja que a outra estava sendo usada por um botao. A solucao para estes
problemas ja foram demostradas no codigo e no esquematico disponveis neste relatorio.
Este projeto nos forneceu um conhecimento que ainda nao tnhamos sobre o
funcionamento dos ESCs e de como e o sinal enviado aos motores para que os mesmos
funcionem de acordo com o PWM enviado ao ESC. Por mais simples que nos pareca
agora, tivemos grande dificuldade em encontrar essa informacao antes de fazermos os
experimentos que nos proporcionaram esse conhecimento. Assim esperamos que esse
relatorio tambem sirva para ajudar aqueles que buscam mais informacoes sobre estes
controladores de velocidade que sao tao populares em aeromodelismo.

C
odigo em C

main.c
1 # include < at89c5131 .h >
2 # include < lcd .h >
3 # include < stdio .h >
4
5 # ifndef NULL
6 # define NULL (( void *) 0)
7 # endif
8
9 # ifndef bool
10 typedef unsigned char bool ;
11 # define true 1
12 # define false 0
13 # endif
14
15 // liga ou desliga os sensores para que cada um seja lido de cada vez
16 # define PWRSensor1 P1_4
17 # define PWRSensor2 P1_5
18 # define PWRSensor3 P1_6
19 # define PWRSensor4 P1_7
20
21 # define Botao P3_2

// botao que muda o modo de operacao

22 # define RPM_In P3_3 // pino de entrada para a contagem do RPM


23
24 // pinos de saida de cada PWM
25 # define PWM1 P1_0
26 # define PWM2 P2_0
27 # define PWM3 P3_7
28 # define PWM4 P3_0
29
30 // contadores
31 unsigned int counter20ms = 0;
32 unsigned int counterRPM = 0;
33
34 // flag para informar o display que deve atulizar a informacao
35 bool flag_int_0 = true ;

36 bool flag_int_1 = true ;


37
38 char string [16];
39 unsigned int operation_mode = 0;
40
41 unsigned int PW1_Duty_Cycle = 0;

// varia de 0 = 1 ms a 100 = 2 ms

42 unsigned int PW2_Duty_Cycle = 0;


43 unsigned int PW3_Duty_Cycle = 0;
44 unsigned int PW4_Duty_Cycle = 0;
45
46 unsigned int RPM = 0;

// valor do RPM medido

47 unsigned int timer1_loop ;


48
49 // funcao de interrupcao do botao
50 // muda o modo de operacao e seta a flag de interrupcao = true
51 void botao ( void ) interrupt 0 {
52

while ( Botao == 0) {}

53

operation_mode ++;

54

operation_mode %= 7;

55

flag_int_0 = true ;

56 }
57
58 // timer 0 responsavel por geral os 4 PWMs
59 void timer0 ( void ) interrupt 1 {
60

if ( counter20ms == 200) {

61

counter20ms = 0;

62

PWM1 = 0;

63

PWM2 = 0;

64

PWM3 = 0;

65

PWM4 = 0;

66

} else {

67
68

counter20ms ++;
}

69
70

if ( counter20ms == 10 + PW1_Duty_Cycle /10) {

71
72

PWM1 = 1;
}

73
74

if ( counter20ms == 10 + PW2_Duty_Cycle /10) {

10

75
76

PWM2 = 1;
}

77
78

if ( counter20ms == 10 + PW3_Duty_Cycle /10) {

79
80

PWM3 = 1;
}

81
82

if ( counter20ms == 10 + PW4_Duty_Cycle /10) {

83
84

PWM4 = 1;
}

85
86
87 }
88
89 // interrupcao 1 - aumenta a contagem do RPM toda vez que ativada
90 void int1 ( void ) interrupt 2 {
91

counterRPM ++;

92 }
93
94 // timer 1 conta de 20 em 20 ms e quando timer1_loop
95 // chega a 50 1 segundo se passou entao ele calcula o RPM do motor
96 void timer1 ( void ) interrupt 3 {
97

if ( timer1_loop == 50) {

98

RPM = counterRPM * 60;

99

counterRPM = 0;

100

timer1_loop = 0;

101

flag_int_1 = true ;

102

// rpm_switcher ++;

103

// rpm_switcher %= 4;

104

// 20 ms * 50 = 1 s

} else {

105

timer1_loop ++;

106

107

TH1

= 0 xF63 ;

108

TL1

= 0 xBF ;

// 0 x63BF = 20 ms

109 }
110
111 void main ( void ) {
112
113

PWRSensor1 = 0;

11

114

PWRSensor2 = 0;

115

PWRSensor3 = 0;

116

PWRSensor4 = 0;

117
118

init_lcd () ;

119
120

TMOD

= 0 x02 ;

121

TH0

= 0 x37 ;

122

TL0

= 0 x37 ;

123

EX0

= 1;

// Enable external interrupt 0

124

ET0

= 1;

// Enable timer0 interrupt

125

EX1

= 1;

// Enable external interrupt 1

126

ET1

= 1;

// Enable timer1 interrupt

127

EA

= 1;

// Enable all interrupts

128

TR0

= 1;

// Enable Timer0 immediately

// Set timer0 in mode 2 = 8 bit mode with auto reload


// EB = 10 us , 0 x37 = 100 us

129
130

TMOD |= 0 x10 ; // Set timer1 to counter mode 1

131

TH1

= 0 x63 ; // 0 x63BF = 20 ms

132

TL1

= 0 xBF ;

133

IT1

= 1;

134

TR1

= 1;

135
136
137
138

while (1) {
if ( flag_int_0 ) {

// caso tenha ocorrido uma interrupcao 0 ( botao )

139

string [0] = \0 ;

140

switch ( operation_mode ) { // altera o valor dos PWMs de cada motor


conforme o mode de operacao

141

case 0:

142

sprintf ( string , " All Motors OFF \0 " ) ;

143

PW1_Duty_Cycle = 0;

144

PW2_Duty_Cycle = 0;

145

PW3_Duty_Cycle = 0;

146

PW4_Duty_Cycle = 0;

147

break ;

148

case 1:

149

sprintf ( string , " Motor 1 ON \0 " ) ;

150

PW1_Duty_Cycle = 50;

151

PW2_Duty_Cycle = 0;

12

152

PW3_Duty_Cycle = 0;

153

PW4_Duty_Cycle = 0;

154

break ;

155

case 2:

156

sprintf ( string , " Motor 2 ON \0 " ) ;

157

PW1_Duty_Cycle = 0;

158

PW2_Duty_Cycle = 50;

159

PW3_Duty_Cycle = 0;

160

PW4_Duty_Cycle = 0;

161

break ;

162

case 3:

163

sprintf ( string , " Motor 3 ON \0 " ) ;

164

PW1_Duty_Cycle = 0;

165

PW2_Duty_Cycle = 0;

166

PW3_Duty_Cycle = 50;

167

PW4_Duty_Cycle = 0;

168

break ;

169

case 4:

170

sprintf ( string , " Motor 4 ON \0 " ) ;

171

PW1_Duty_Cycle = 0;

172

PW2_Duty_Cycle = 0;

173

PW3_Duty_Cycle = 0;

174

PW4_Duty_Cycle = 50;

175

break ;

176

case 5:

177

sprintf ( string , " All Motors ON \0 " ) ;

178

PW1_Duty_Cycle = 50;

179

PW2_Duty_Cycle = 50;

180

PW3_Duty_Cycle = 50;

181

PW4_Duty_Cycle = 50;

182

break ;

183

case 6:

184

sprintf ( string , " Unbalanced \0 " ) ;

185

PW1_Duty_Cycle = 25;

186

PW2_Duty_Cycle = 50;

187

PW3_Duty_Cycle = 75;

188

PW4_Duty_Cycle = 100;

189

break ;

190

13

191

lcd_cmd (0 x01 ) ;

192

delay (1) ;

193

lcd_cmd (0 x80 ) ;

194

delay (1) ;

195

string_to_lcd ( string ) ;

196

delay (1) ;

197

flag_int_0 = false ;

198

// imprime o modo de operacao atual

199
200

if ( flag_int_1 ) {

// caso tenha ocorrido uma interrupcao 0 ( RPM )

201

string [0] = \0 ;

202

sprintf ( string , " RPM : % d \0 " , RPM ) ;

203

lcd_cmd (0 xc0 ) ;

204

delay (1) ;

205

string_to_lcd ( string ) ;

206

delay (1) ;

207

flag_int_1 = false ;

208

// imprime o RPM atual

209

210 }

src/main.c

lcd.h
1 # define dataport P0
2 # define str_len 16
3 sbit rs = P2 ^5;

// register select pin

4 sbit rw = P2 ^6;

// read write pin

5 sbit e

// enable pin

= P2 ^7;

6
7 void delay ( unsigned int msec )

// Function to provide time delay in

msec .
8 {
9

int i , j ;

10

for ( i =0; i < msec ; i ++)

11

for ( j =0; j <2550; j ++) ;

12 }
13
14 void lcd_cmd ( unsigned char item )

// Function to send command to LCD

14

15 {
16

dataport = item ;

17

rs = 0;

18

rw =0;

19

e =1;

20

delay (1) ;

21

e =0;

22 }
23
24 void lcd_data ( unsigned char item )

// Function to send data to LCD

25 {
26

dataport = item ;

27

rs = 1;

28

rw =0;

29

e =1;

30

delay (1) ;

31

e =0;

32 }
33
34 void string_to_lcd ( unsigned char * s )
35 {
36

unsigned char i , l ;

37

l = str_len ;

38

for ( i =0; i < l ; i ++)

39

40

if (* s == 0)

41

break ;

42

lcd_data (* s ) ;

43

s ++;

44

45 }
46
47 void init_lcd ( void )
48 {
49

lcd_cmd (0 x38 ) ;

50

delay (20) ;

51

lcd_cmd (0 x38 ) ;

52

delay (20) ;

53

lcd_cmd (0 x0D ) ;

// for using 8 - bit 2 row mode of LCD

// for using 8 - bit 2 row mode of LCD

//

15

54

delay (20) ;

55

lcd_cmd (0 x01 ) ;

56

delay (20) ;

57

lcd_cmd (0 x06 ) ;

58

delay (20) ;

// clear screen

// display ON

59 }

src/lcd.h

16

Refer
encias
[1] M.Sc. Hugo Vieira Neto. Microcontroladores mcs51. 2002.

17

You might also like