H P S P I N E l e t r ô n i c a D i g i t a l e P r o g r a m a ç ã o d e M i c r o c o n t r o l a d o r e s P I C |
HOME PROJETOS PROGRAMAÇÃO |
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.
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.
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
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
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.
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.
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:
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: 08 de Dec de 2024 |