Servo motores são muito úteis em sistemas eletrônicos e embarcados. Você pode encontrar o uso de Servo motor em qualquer lugar ao seu redor, eles são usados em brinquedos, robôs, bandeja de CD de computador, carros, avião etc. A razão deste amplo escopo é que o servo motor é muito confiável e preciso. Podemos girá-lo para qualquer ângulo específico. Eles estão disponíveis em uma ampla variedade, desde motores de alto torque até motores de baixo torque. Neste tutorial, faremos a interface de um servo motor com o microcontrolador 8051 (AT89S52).
Primeiro, precisamos entender o princípio de funcionamento dos servo motores. O servo motor funciona no princípio PWM (modulação por largura de pulso), significa que seu ângulo de rotação é controlado pela duração do pulso aplicado ao seu PIN de controle. Basicamente, o servo motor é composto de um motor DC que é controlado por um resistor variável (potenciômetro) e algumas engrenagens. A força de alta velocidade do motor DC é convertida em torque pelas engrenagens. Sabemos que TRABALHO = FORÇA X DISTÂNCIA, no motor DC a Força é menor e a distância (velocidade) é alta e no Servo a força é Alta e a distância é menor. O potenciômetro é conectado ao eixo de saída do Servo, para calcular o ângulo e parar o motor DC no ângulo necessário.
O servo motor pode ser girado de 0 a 180 graus, mas pode ir até 210 graus, dependendo do fabricante. Este grau de rotação pode ser controlado aplicando um pulso de nível 1 de LOGIC por uma duração entre 1ms a 2ms. Um 1 ms pode girar o servo a 0 grau, 1,5 ms pode girar a 90 graus e o pulso de 2 ms pode girá-lo a 180 graus. A duração entre 1 a 2 ms pode girar o servo motor em qualquer ângulo entre 0 a 180 graus.
Diagrama de circuito e explicação de trabalho
O servo motor tem três fios vermelho para Vcc (fonte de alimentação), marrom para terra e laranja é o fio de controle. O fio de controle pode ser conectado ao 8051, nós o conectamos ao pino 2.1 do 8051. Agora temos que manter este pino no Lógico 1 por 1 ms para girá-lo em 0 grau, 1,5 ms para 90 graus, 2 ms para 180 graus. Usamos Timers no chip de 8051 para criar atraso. Criamos um atraso de 50us por meio da função “servo_delay” e usamos o loop “for” para criar um atraso em múltiplos de 50us.
Estamos usando o Timer 0 e no Modo 1, então colocamos 01H no registro TMOD. O modo 1 é o modo temporizador de 16 bits e TH0 contém o byte alto e TL0 contém o byte baixo do temporizador de 16 bits. Colocamos FFD2 no registrador de temporizador de 16 bits, FF em TH0 e D2 em TL0. Colocar FFD2 criará um atraso de aprox. 50 nós com o cristal de 11,0592MHz. TR0 e TF0 são os bits do registrador TCON, pino TR usado para iniciar o temporizador quando definido e parar quando redefinir (0). TF é um sinalizador de estouro, definido pelo hardware quando o estouro e precisa reiniciá-lo pelo software. Basicamente, TF informa a conclusão do temporizador e é definido pelo hardware quando o temporizador 16 passa de FFFFH para 0000H. Você pode ler sobre os “8051 Timers” para entender o cálculo do valor nos registros dos timers, para criar o atraso de 50 us.
Agora, quando medidos a partir do CRO, 13 loops da função servo_delay darão o atraso de 1 ms, então começamos com 1 ms (13 loops) e fomos para 2 ms (26 loops) para girar o servo de 0 a 180 graus. Mas aumentamos lentamente o atraso de 1 ms, dividimos a janela de 1 ms para 2 ms em 7 partes como 1,14 ms, 1,28 ms, 1,42 ms e assim por diante, então o servo irá girar em múltiplos de aprox. 26 graus (180/7). Depois de 180, ele retornará automaticamente a 0 grau.