HOME      PROJETOS      PROGRAMAÇÃO      MÓDULOS      EMAIL     

CONTROLANDO UM SERVO MOTOR

O objetivo desta página é fazer com que um servo motor acompanhe o movimento de um potenciômetro conectado a uma porta analógica do microcontrolador.

Como funciona um servo motor

Os servos motores tabalham, em sua maioria, com pulsos de frequência de 50HZ onde a variação do tempo em que o sinal permanece alto (Time_on ou Duty Cycle) é responsável pelo giro do rotor para frente ou para trás. O ângulo de giro geralmente permanece entre 0° e 180°.

FIGURA 1

A figura 1 demonstra o que queremos dizer. Para uma frequência de 50HZ, temos que o período do sinal é de 20ms (milisegundos). Se a parte alta do pulso (Time_on) for de 1,0ms (1 milisegundo) o rotor deve se posicionar totalmente à esquerda. Se a parte alta do pulso for de 1,5ms o rotor deve se posicionar no centro e se a parte alta do pulso for de 2,0ms rotor se posicionará totalmente à direita.

Infelizmente, na prática, isso não funciona maravilhosamente pois, devido a certas características de construção, defirentes motores apresentam diferentes comportamentos, como é o caso dos motores SG90 e o MG996R usados neste projeto.

FIGURA 2

Sendo assim, resolvemos aumentar um pouco a amplitude de alcance do rotor fazendo com que os tempos em que os pulsos permanecem altos variem entre 0,5ms a 2,5ms ao invés de 1,0ms a 2,0ms, permitindo que os rotores girem um pouco mais do que 180°. Isso não prejudica os motores.

Adotando um Fosc de 4MHZ, que resulta num ciclo de instrução de 1,0us e sabendo que o período (T) do sinal não deve ultrapassar 20,0ms (20000us), os tempos de Time_on e Time_off (em microsegundos), para o rotor se posicionar totalmente à esquerda serão:
Time_on = 500us (máximo à esquerda) Time_off = (T - Time_on) = 20000 - 500 Time_off = 19500us

Do mesmo modo, para o rotor se posicionar totalmente à direita temos:
Time_on = 2500us (máximo à direita) Time_off = (T - Time_on) = 20000 - 2500 Time_off = 17500us

Tendo definido os tempos, vamos agora usar o TMR1 do microcontrolador para cronometrá-los, lembrando novamente que estamos usando um Fosc de 4MHZ que produz um ciclo de 1,0us e, além disso vamos adotar um valor de prescaler de 1:8 para TMR1.


Cálculo do valor residual para posicionar o rotor totalmente à esquerda

O valor residual de contagem de TMR1 para o rotor se posicionar totalmente à esquerda será:
TMR_ON_esq = 65536 - (Time_on/8) TMR_ON_esq = 65536 - (500/8) TMR_ON_esq = 65474 TMR_OFF_esq = 65536 - (Time_off/8) TMR_OFF_esq = 65536 - (19500/8) TMR_OFF_esq = 64099

Cálculo do valor residual para posicionar o rotor totalmente à direita

O valor residual de contagem de TMR1 para o rotor se posicionar totalmente à direita será:
TMR_ON_dir = 65536 - (Time_on/8) TMR_ON_dir = 65536 - (2500/8) TMR_ON_dir = 65224 TMR_OFF_dir = 65536 - (Time_off/8) TMR_OFF_dir = 65536 - (17500/8) TMR_OFF_dir = 63349
Os valores calculados acima serão carregados em TMR1 para a contagem dos tempos, da seguinte maneira:
movlw 0x30 ; prescaler 1:8 T1CON<5:4> movwf T1CON ; configura TMR1 e seu prescaler movlw HIGH(.65474) ; pega MSB movwf TMR1H ; carrega MSB movlw LOW(.65474) ; pega LSB movwf TMR1L ; carrega LSB bcf PIR1, TMR1IF ; limpa flag bsf T1CON, TMR1ON ; liga o cronometro tstm btfss PIR1, TMR1IF ; terminou de contar o tempo goto tstm ; NAO --> espera o tempo passar




Considerações sobre o conversor A/D

Como o controle do servo motor será feito através de um potenciômetro conectado a uma porta analógica com resolução de 10 bits, isso significa que vamos dispor de 1023 passos, ou seja, se o rotor do servo motor conseguir girar 180°, então cada passo será de 180°/1023 que dá 0,176° por passo.




Detalhe do cabo do servo motor

FIGURA 3

Na figura 3 podemos ver em detalhes o cabo de um servo motor. Esse cabo consiste de tres fios, sendo o de cor marrom o ground (-), o vermelho a alimentação (+5V) e o amarelo o fio de sinal, que deve ser conectado diretamente a um pino de uma porta do microcontrolador para receber os pulsos de controle que movimentarão do rotor.




Programa exemplo

Esse projeto, tanto o hardware como o software, passou por teste real antes de ser publicado.

Para testar o que foi dito, baixe o projeto MPLAB "ServoMotor", e descomprima o arquivo com o comando:

# tar -zxvf servomotor.tar.gz.

Entre na pasta ServoMotor e abra o arquivo servo_motor.mcp no MPLAB.

O projeto, muito simples, não necessita de um esquema elétrico para ser montado, é baseado num microcontrolador PIC18F4520 e pode ser facilmente adaptado para outro microcontrolador. Monte o circuito e teste o programa exemplo com o seguinte procedimento:

  1. Faça uma montagem básica de um PIC18F4520 usando um cristal externo de 4MHZ.
  2. Conecte o pino central de um potenciômetro de 1K ou 5K no pino RA0/AN0 (PORTA<0>).
  3. Conecte um dos pinos laterais do potenciômetro ao Ground do circuito.
  4. Conecte o outro pino lateral do potenciômetro ao +5V.
  5. Conecte o pino amarelo do servo motor diretamente ao pino RC1 (PORTC<1>).
  6. Conecte o pino marron do servo motor ao Ground do circuito.
  7. Conecte o pino vermelho do servo motor ao +5V.
  8. Grave, no microcontrolador, o pograma servo_motor.hex, sem alterações.
  9. Após a gravação gire o potenciômetro e verifique se o servo se move.

Se não funcionar, reveja as conexões e tente novamente.




Índice dos circuitos




H P S P I N

Desde 04 de Março de 2010

Atualização: 30 de Novembro de 2020