Servo-Motor por nuno_monteiro@portugalmail.com gabrieldinis@portugalmail.pt Um servo-motor é um pequeno dispositivo cujo veio pode ser posicionado numa determinada posição angular de acordo com um sinal codificado que lhe é enviado. Enquanto esse código persistir na entrada, o servo irá manter a sua posição angular. Se o código de entrada variar a posição angular também varia. Na prática os servo-motores são usados no controlo de aviões telecomandados, robots, etc. Figura 1 - Servo-Motores Os servo-motores são extremamente úteis em robótica. Os motores são pequenos, possuem internamente o circuito de controlo, engrenagens redutoras, mecanismo de posicionamento por feedback e são extremamente potentes para o seu tamanho. Um servo possui 3 entradas. Uma é a alimentação (+5 V), outra é a massa e a outra é a entrada de controlo. Um servo é controlado enviando-lhe um sinal PWM (Pulse Width Modulation), ou seja, a posição angular irá depender da largura do pulso enviado. Figura 2 Servo-Motor (mecanismo de feedback) - 1 -
O sinal de controlo é uma onda quadrada (0 a 5 V) de frequência igual a 50 Hz (também funciona a 60 Hz). A uma frequência de 50 Hz corresponde um período de 20 ms ( 1 / 50 = 20 ms). O sinal PWM a enviar terá de ter sempre o primeiro milisegundo a 5 V. A partir daí, durante o milisegundo seguinte, o tempo que o sinal se mantiver a 5 V irá determinar a posição do veio do servo-motor. Ou seja, se imediatamente após o primeiro milisegundo o sinal passar a ser de 0 V, então servo ir-se-á colocar na posição 0º. Se em vez disso, o sinal for durante o primeiro milisegundo igual a 5 V e se esse valor se mantiver durante o segundo milisegundo (igual a a 5 V) então o servo-motor ir-se-á colocar na posição 180º (a posição angular máxima de um servomotor é normalmente de 180º). Em qualquer dos casos, a partir do segundo milisegundo e durante os 18 ms restantes (2 ms +18 ms =20 ms) o sinal de controlo deverá ser de 0 V. Vemos assim que é o tempo, durante o segundo milisegundo, que o sinal se mantem a 5 V, que determina a posição angular do servo. Ou seja, se o servo tem um raio de acção de 180º então, como 1/180 5 µs, bastam incrementos de 5 µs, para alterar a posição do servo Exemplos de sinais PWM e respectiva posição angular: 1 ms a 5 V e 19 ms a 0 V corresponde a uma posição angular de 0º 1,005 ms a 5 V e 18,995 ms a 0 V corresponde a uma posição angular de 1º 1,010 ms a 5 V e 18,990 ms a 0 V corresponde a uma posição angular de 2º... e assim sucessivamente... 1,995 ms a 5 V e 18,005 ms a 0 V corresponde a uma posição angular de 2º 2 ms a 5 V e 18 ms a 0 V corresponde a uma posição angular de 180º Para controlar o servo-motor o sinal deverá ser o seguinte: 5 V e repetir-se... 0V 1 ms 1 ms 18 ms 20 ms Este sinal deve repetir-se para que o servo se posicione na posição angular pretendida e se mantenha lá imóvel. Uma forma de gerar este tipo de sinal é usando um microcontrolador. Neste caso foi usado o PIC16F84 da Microchip. - 2 -
Usou-se a PORTB (todos os pinos) como variável de entrada para o processo unicamente para demonstrar o funcionamento deste controlador de servo-motores. Em utilizações reais do servo, bastaria usar um pino de entrada e enviar os dados ao microcontroldor via protocolo série (RS-232, SPI, I2C, etc). Este circuito deve ser uma referência para outras utilizações de um servo. O código em assembly que controla o servo é o seguinte: ;######################################## ##################################### ;######################################## ##################################### ;################ Circuito usado no projecto de 5º ano - Mapa de proximidade por ultra-sons ############# ;######################################################################################################## ;######################################################################################################## #include p16f84.inc org 000h ; POWER_ON Reset goto Start org goto 004h Start angulo equ 0x0D oquesobra equ 0x0E contador equ 0x0A MS_REG equ 0x0B US_REG equ 0x0C Start call call PortsInit Inicializa_interrupts bcf PORTA,0 ; O pino RA0 é usado como saída e é ligado à entrada de controlo do servo ; Os pinos da PORTB (RB0, RB1, RB2..., RB7, são usados como entrada ; O registo PORTB funciona assim como a variável ; A posição angula do servo irá ser proporcional aos valores existentes em PORTB - 3 -
ciclo_geral movf PORTB,w movwf angulo sublw.255 movwf oquesobra movf PORTB,w movwf angulo ciclo ciclo2 bsf PORTA,0 movlw.1 call WaitMS ; esperar 1 ms - primeiro milisegundo decfsz angulo,f ; manter a 5 V o tempo proporcional ao valor em PORTB goto ciclo bcf PORTA,0 ; no fim desse tempo, fazer a transição para 0 V decfsz oquesobra,f ; manter a 0 V o tempo que falta até completar os primeiro 2 milisegundos goto ciclo2 movlw.18 ;A partir daqui apenas resta esperar os 18 milisegundos finais com a saída RA0 a 0 V call WaitMS goto ciclo_geral ; Repetir todo o processo. Este processo deve repetir-se para o servo manter a sua posição angular ;************************************************************************************************ ;* Subroutime : WaitMS * ;* Purpose : Software delay in ms * ;* Parameter : ms in W Register (W=0 -> Delay = 256mS) * ;* Return Value : W=0 * ;* Var usage : MS_REG, US_REG * ;* Subrot.used : None * ;************************************************************************************************ WaitMS movwf MS_REG ; Store ms movlw 0FEH ; Correct call time (included movwf US_REG ; 1 movlw before calling for first loop WLoopMS movlw 0F9H ; 1 Loop 249*WLoopUS+4Cycles addwf US_REG, F ; Destination is F Register WLoopUS ; One Loop=4 cycles decfsz US_REG, F ; USReg - 1, skip if zero goto WLoopUS decfsz MS_REG, F ; MSReg - 1, skip if zero goto WLoopMS ; correct time of last ms loop retlw 000h ; return with W=000h ;######################## Rotina PortsInit ##################################### PortsInit bcf STATUS, RP1 bcf STATUS, RP0 ; BANK 0 clrf PORTA clrf PORTB bsf STATUS, RP0 ; BANK 1 movlw b'11111111' ; Configuração da PORTB movwf PORTB movlw b'00000000' ; Configuração da PORTA movwf PORTA retlw 0 ;################################################################################## ;########################### Inicializa Interrupts ################################ Inicializa_interrupts bsf STATUS, RP0 ; BANK1 bcf STATUS, RP1 movlw b'10000000' movwf OPTION_REG - 4 -
bcf STATUS, RP0 bcf STATUS, RP1 ; BANK0 movlw b'00000000' movwf INTCON retlw 0 ;################################################################################# end - 5 -