21
UNIVERSIDADE TECNOL ´ OGICA FEDERAL DO PARAN ´ A ENGENHARIA DE COMPUTAC ¸ ˜ AO GUSTAVO TEIXEIRA R ¨ UDIGER RINALDI MASSUDA SEGECIN Controlador para motores brushless APS DE MICROCONTROLADORES CURITIBA Fevereiro de 2015

Controlador para motor brushless usando 8051

Embed Size (px)

DESCRIPTION

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 velocidadesdos motores em rpm usando sensores infra-vermelhos.

Citation preview

  • UNIVERSIDADE TECNOLOGICA FEDERAL DO PARANA

    ENGENHARIA DE COMPUTACAO

    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. . . . . . . . . . . . . . . . . . . . . . . . . . 1

    2 Esquematico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    3 Eletronic Speed Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    4 Sinal PWM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

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

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

    7 Circuito do sensor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    8 Regulador de tensao acoplado ao quadricoptero. . . . . . . . . . . . . . . . 7

  • SUMARIO

    1 Projeto 1

    1.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.2 Lista de componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.3 Esquemativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2 Desenvolvimento 4

    2.1 Controlando ESCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2.2 Leitura RPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2.3 Energia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    3 Conclusao e Relatos Finais 8

    A Codigo em C 9

    REFERENCIAS BIBLIOGRAFICAS 17

  • 1 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

    2

  • 1.3 Esquemativo

    Figura 2: Esquematico

    3

  • 2 Desenvolvimento

    2.1 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.

    4

  • 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

    5

  • 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 tran-

    sistor 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 va-

    riar 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.

    6

  • 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 respectiva-

    mente. Como mostra a figura 8.

    Figura 8: Regulador de tensao acoplado ao quadricoptero.

    7

  • 3 Conclusao 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 indepen-

    dente 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 senso-

    res 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.

    8

  • A Codigo em C

    main.c

    1 #include

    2 #include

    3 #include

    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;

    9

  • 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 = 1ms a 100 = 2ms

    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 counter20ms ++;

    68 }

    69

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

    71 PWM1 = 1;

    72 }

    73

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

    10

  • 75 PWM2 = 1;

    76 }

    77

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

    79 PWM3 = 1;

    80 }

    81

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

    83 PWM4 = 1;

    84 }

    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){ //20 ms * 50 = 1s

    98 RPM = counterRPM * 60;

    99 counterRPM = 0;

    100 timer1_loop = 0;

    101 flag_int_1 = true;

    102 // rpm_switcher ++;

    103 // rpm_switcher %= 4;

    104 } else{

    105 timer1_loop ++;

    106 }

    107 TH1 = 0xF63; //0x63BF = 20ms

    108 TL1 = 0xBF;

    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 = 0x02; // Set timer0 in mode 2 = 8bit mode with auto reload

    121 TH0 = 0x37; // EB = 10us , 0x37 = 100us

    122 TL0 = 0x37;

    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

    129

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

    131 TH1 = 0x63; //0x63BF = 20ms

    132 TL1 = 0xBF;

    133 IT1 = 1;

    134 TR1 = 1;

    135

    136

    137 while (1){

    138 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 (0x01);

    192 delay (1);

    193 lcd_cmd (0x80);

    194 delay (1);

    195 string_to_lcd(string); // imprime o modo de operacao atual

    196 delay (1);

    197 flag_int_0 = false;

    198 }

    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 (0xc0);

    204 delay (1);

    205 string_to_lcd(string); // imprime o RPM atual

    206 delay (1);

    207 flag_int_1 = false;

    208 }

    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 = P2^7; // enable pin

    6

    7 void delay(unsigned int msec) // Function to provide time delay in

    msec.

    8 {

    9 int i,j ;

    10 for(i=0;i

  • 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

  • 54 delay (20);

    55 lcd_cmd (0x01); //clear screen

    56 delay (20);

    57 lcd_cmd (0x06); // display ON

    58 delay (20);

    59 }

    src/lcd.h

    16

  • Referencias

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

    17