You are on page 1of 17

Engenharia de Computação

MicroProcessadores e
MicroControladores

Aula 21
Acionando
Servo-Motores
De Posição

Prof. Glaucus Brelaz


Conteúdo

Introdução
Características e Ligações
Conectando um Servo-Motor ao M2051
Como Gerar os Pulsos no M2051
Como Testar um Servo-Motor
Como determinar a Faixa de Acionamento
Introdução

Servo-Motores de posição são motores


freqüentemente utilizados no controle remoto
de aeromodelos, auto-modelos, e outros
veículos radio-controlados em escala reduzida.
Por esse motivo, são facilmente encontrados no
comércio especializado, e podem ser de grande
valia em aplicações de automação e robótica.
O objetivo destes slides é o desenvolvimento de
um firmware de controle para aplicações em
Robóticas utilizando o kit M2051 e o µRTOS
versão 1.5.
Características e Ligações
Um servo-motor típico possui um cabo com 3 fios:
Preto - terra comum a alimentação e sinal;
Vermelho - alimentação +5Vcc;
Branco ou Amarelo - entrada do sinal PWM.
Um servo-motor típico (Hitec HS-90) possui as características:
Tensão de Alimentação: 4,8 a 6Volts
Largura do pulso de controle: 0,9ms a 2,1ms
Largura de pulso para posição central: 1,5ms
Amplitude do pulso: 3 a 5V de pico.
Conectando o Servo-Motor
Para este experimento um servo-motor é alimentado
com tensão de 5Vdc e a entrada de controle PWM ligada
ao pino P3.3 do 2051.
A geração do sinal PWM é obtida a partir da
temporização de 50µs gerada pelo µRTOS.
Inicialmente considera-se o servo-motor com a
especificação abaixo:
Freqüência de PWM: 50Hz (20ms)
Ciclo ativo do PWM: 600µs a 2400µs
Limites de rotação:
⌧-90° a 900µs e 90° a 2100µs
Posição central: 0° a 1500µs
Caso necessários ajustes serão feitos de acordo com
cada motor em particular.
Conectando o Servo-Motor
Conexão de um Servo-Motor usando a porta P3.3.
O fio em vermelho conduz o sinal PWM;
O Motor usa a mesma alimentação de 5V do kit;
Resolução de Rotação
Conforme a especificação considerada:
1200µs para 180° => 6.667µs por grau
Ou 0,15° por µs => 1,5° a cada 10µs
A resolução do µRTOS é de 50µs. Como conseguir a
resolução necessária?
É necessária o uso de outro timer mas o TC1 é utilizado para a
geração do baud rate
Como o TC0 opera apenas em 8 bits, a solução é usar o TC0 no
modo 3 onde opera como dois timers de 8 bits independentes
O terceiro timer (TC0’) utiliza dos controles e o vetor de
interrupção do TC1
O TC1 pode continuar sendo usado pois não precisa gerar
interrupção. (veja Aula15 Software Básico)
Como Controlar a largura de Pulso

Como gerar atrasos maiores que 256µs


Ao invés de gerar todo o tempo de largura do pulso, o TC0’ irá
gerar apenas os valores intermediários entre cada slot de 50µs
Como?
⌧Uma variável de controle do servo (servo_1) o número múltiplo
de 1,5° (10µs) que posiciona o servo
⌧A partir deste valor se calcula o número de interrupções do µRTOS
(50µs) dividindo servo_1 por 5
⌧O resto da divisão é utilizado para fazer com que o TC0’ adicione
períodos de 10µs aos múltiplos de 50µs do µRTOs
⌧Os valores dos múltiplos de cnt200 são obtidos dividindo servo_1:
servCnt=(200-(servo_1/5));
⌧E os valores múltiplos de 10µ são obtidos pelo resto da divisão:
restX10=((servo_1%5)*10);
servTc1=256-restX10;
Como Controlar a largura de Pulso

Como usar a variável de controle servo_1:


O TC0’ será iniciado cada vez que a variável do µRTOS cnt200
for reiniciada (RTproc_2) no ciclo S2D2 e o pino P3.3 é colocado
em 1
⌧ if(!S2D2) P3_3=1; //quando adc desabilitado
⌧Limitando esse procedimento ao ciclo de S2D2, pode-se usar o
ADC0832 e gerar o ciclo de 20ms (50Hz)
A cada interrupção seguinte (RTproc_1) o número de
interrupções servCnt é testada:
if((!S2D2)&&(servCnt==cnt200)){
⌧Obs.: 0 < servCnt < 200
Se não houver resto da divisão P3.3 é desligado:
⌧ if(servTc1==0){ //se múltiplo 50µs
⌧ P3_3=0; //desliga
Se houver resto, TC0’ é iniciado com o valor servTc1.
⌧ TH0=servTc1; //TC0 no modo 3
⌧ TR1=1; //e liga como TC1
Diagrama de Tempo

Temporização para ADC0832:


Note que o período convAD << /S1D1

convAD() TC0’
220µs (ASM)
600 a 2400µs
adcDt

S2D2 S2D2=0

S1D1 S1D1=0

t=0 10ms 10ms t

adOn
Nova Versão do µRTOS (V1.5)
Para utilizar o TC0 no modo 3 as seguintes alterações
no µRTOS foram feitas:
1. Na inicialização a interrupção do TC1 é habilitada
⌧ IE=0x9B; //EA+ES+ET1+ET0+EX0
2. e o modo de TC1 alterado para Modo3
⌧TMOD=0x23; //TC1=modo2 TC0=modo3
3. O TC1 não é mais ligado na iniciação.
⌧O TC1 real fica sempre ligado gerando o baud rate
4. TL0, o contador do TC0 8 bits precisa agora ser recarregado
(em asm) no início da Int do TC0.
⌧ mov TL0, #215 ;recarga modo 3
5. A rotina de atendimento do TC0’ pode ser feita no programa
do usuário.
⌧void timer_1(void) __interrupt(3){
⌧ P3_3=0; //ao completar resolução
⌧ TR1 =0; //desliga pulso
⌧}
Como controlar 3 Servos?

Pelo diagrama de tempo é fácil observar que o


há folga para se adicionar mais dois pulso de
controle para servos.
No slide seguinte há um diagrama do hardware
para os 3 servos.
Existem dois cuidados a se tomar:
1. Os servos 2 e 3 compartilham os controles do
ADC0832 (P3.4 e P3.5) e por isso devem ser
desabilitados no período S1D1=0.
2. Os servos 2 e 3 devem ser iniciados em RTproc_2
após o limite de desligamento do servo anterior
⌧Sugestão: ligar em 3600µs e 6600µs.
Conectando 3 Servo-Motores
Conexão de 3 Servos usando P3.3, P3.4 e P3.5.
O fio em vermelho habilita o controle quando S1D1=1;
µRTOS v1.5 e Prog16_servo1.c
As listagens dos fontes de µRTOS v1.5 e
Prog16_servo1.c estão na UnP Virtual Aula21
Um diagrama de blocos do µRTOS foi colocado
no slide seguinte para referência
Trabalho: Desenvolvam a aplicação que controla
os 3 servos.

Divirtam-se
Programação com o µRTOS 1.4
µRTOS
Inicio InT Ex0 Int TC0 Int Serial

Debounce RI=1 TI=1


Includes e Mux
variáveis temporização
globais do sinconismo e
Ler Serial Grava Ser.
µRTOS Reti semáforos
RTproc 1

Reti Reti
inic
Includes e RTproc 2
variáveis
globais da
Aplicação Inicialização

Reti

3 Ret

convAD hex27S rdBuf wrBuf

Loop Processos
Conversor Display de Buffer de Buffer de
ADC0832 7 segmentos ENtrada Saída
Principal

Assíncronos Ret Ret Ret Ret


Referências

FUTABA. Futaba Brushless Digital


Servos.
Disponível em http://www.futaba-rc.com.

Outras Fontes:
Servomechanism
http://en.wikipedia.org/wiki/Servomechanism
The RC Trasnmission
http://www.reocities.com/BourbonStreet/3220/servobasics.html
RC servo Controlling
http://www.epanorama.net/documents/motor/rcservos.html
Referências
SDCC Compiler User Guide
sdcc.sourceforge.net/doc/sdc
cman.pdf .

BANGERT, Ulrich. A utility for In


System Programming the
AT89S8252, AT89S52, AT89S53,
AT89S8253, AT89LP2052 and
AT89LP4052. Atmel ISP Help.

You might also like