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:

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:

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);
- }
- }
Servo | Máximo | Central | Mínimo |
Gardiner 1 | 48 | 30 | 14 |
Gardiner 2 | 47 | 31 | 14 |
Motortech | 47 | 32 | 15 |
Motorsat | 47 | 29 | 11 |
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:
Postar um comentário