terça-feira, março 23, 2010

CI 555 - Parte 4B: Tira-teima com o Servomotor

Na última vez que falamos do 555, eu estava atrapalhado com resultados que não batiam com o esperado e não tinha os instrumentos apropriados para investigar. Com o auxílio de um osciloscópio digital emprestado, tenho agora mais informações.

Medições com Osciloscópio e Multímetro

O primeiro passo foi fazer algumas medições do meu circuito com dois 555s em um osciloscópio digital, destes que se liga a um PC:

Resumindo as medições: o período dos pulsos mede 19,5 ms e o tempo de sinal alto varia de 1,04 a 2,16 ms.

Em seguida usei um multímetro para ver a faixa de variação da resistência no mono-estável (resistência fixa + potenciômetro). O valor obtido foi de 0,98 a 1,96K.

Colocando os tempos e as resistências nas fórmulas, obtive a capacitância entre 0,97 e 1uF.

Estes resultados são consistentes entre si, mas não com o que eu estimava ser as larguras necessárias para o servomotor.

Uma última informação importante foi mediar a largura de pulso em uma posição conhecida. Com os "chifres" do horn na posição horizontal, a largura do pulso foi de 1,55 ms e a resistência 1,45K.

Testando Vários Servomotores

Uma dúvida que vem desde quando comprei o primeiro servo é se as larguras de pulso são as mesmas para várias marcas e unidades de servomotor. Daí um pequeno teste empírico.

Aos dois servos que eu já tinha, um Gardiner e outro Motorsat (recuperado da Abóbora Assassina), acrescentei um segundo Gardiner e um Motortech. Todos eles tem preço parecido, na faixa de R$25,00.


Montei então um circuito de teste usando um PIC. Embora semelhante ao usado no meu primeiro teste, usei um PIC com uma interface serial (UART) integrada com um cristal de 20MHz. A conversão para o padrão RS232 é feita com um tradicional MAX232:

O clock mais alto me deu um pouco mais de precisão, sem precisar mudar a programação do timer dentro da interrupção (o que complica as contas, pois é necessário considerar o tempo entre a interrupção e a efetiva reprogramação).

A interface serial permite não somente mudar a largura de uma forma mais confortável como monitorar de forma confiável a largura atual. O código do microcontrolador é bastante simples:
// Includes e definições relativas ao hardware
#include <16F688.h>
#device adc=8
#use delay(clock=20000000)
#use rs232 (baud=9600, xmit=PIN_C4,rcv=PIN_C5)
#fuses HS
#fuses NOWDT, NOCPD, NOPROTECT
#fuses PUT, BROWNOUT, MCLR

#define MOTOR PIN_C3

#define TMP_PERIODO 390 // 20000 / 51.2
#define TMP_DUTY 30 // 1550 / 51.2

unsigned int16 cnt_duty, cnt_periodo; // contadores para PWM
int16 duty; // duty atual


// Programa Principal
void main()
{
char c;

// Iniciações do hardware
set_tris_c (0xE7); // C3 e C4 output
#use fast_io(C)

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_adc(ADC_OFF);
setup_uart (9600);

cnt_periodo = TMP_PERIODO;
cnt_duty = duty = TMP_DUTY;

enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);

delay_ms (3000);
puts ("Teste de servo");

for (;;)
{
c = getc();
if (c == '+')
{
duty++;
printf ("%ld\r\n", duty);
}
else if (c == '-')
{
duty--;
printf ("%ld\r\n", duty);
}
}
}

//////////////////////////////////////////////
// Interrupcao de tempo real
// Ocorre a cada 51,2 uSeg
//////////////////////////////////////////////
#int_RTCC
void RTCC_isr()
{
cnt_periodo--;
if (cnt_periodo == 0)
{
// fim de um ciclo
cnt_periodo = TMP_PERIODO;
cnt_duty = duty;
output_high (MOTOR);
}
else if (cnt_duty != 0)
{
cnt_duty--;
if (cnt_duty == 0)
output_low (MOTOR);
}
}
A tabela abaixo mostra os resultados obtidos em termos de limites máximo e mínimo e a posição central (no caso do Motorsat, ele não tem uma trava para limitar a movimentação - ou eu a quebrei sem perceber), em unidades de 51.2 useg:






ServoMáximoCentralMínimo
Gardiner 1483014
Gardiner 2473114
Motortech473215
Motorsat472911
Os servos Gardiner apresentaram no teste um posicionamento com diferença de 90o em relação aos demais. Como o horn é destacável e tem um encaixe quadrado, isto não é crítico. Aliás, como eu desmontei várias vezes o Motorsat, pode ser que a posição atual seja diferente da que ele tinha quando eu comprei.

Em termos de largura de pulso, a faixa 15 a 47 (0,77 a 2,4 ms) parece atender a todos, com o centro em 30 (1,5 ms). Esta faixa é diferente da que observei inicialmente (0,4 a 1,6 ms), o que me leva a crer que fiz uma medição incorreta naquela ocasião.

Nenhum comentário: