- Componentes necessários
- Descrição do pino do servo motor
- Diagrama de circuito
- Servo motor de controle com AVR ATmega16
- Programando Atmega16 usando USBasp
Servo motores são amplamente usados onde um controle preciso é necessário, como robôs, máquinas automatizadas, braço robótico, etc. No entanto, o escopo do servo motor não se limita a isso e pode ser usado em muitas aplicações. Para saber mais sobre os fundamentos, teoria e princípio de funcionamento do servo motor, siga o link.
Anteriormente, fizemos a interface do servo motor com muitos microcontroladores:
- Servo motor de interface com ARM7-LPC2148
- Servo motor de interface com MSP430G2
- Servo motor de interface com STM32F103C8
- Interface Servo Motor com Microcontrolador PIC usando MPLAB e XC8
- Interface Servo Motor com Arduino Uno
- Interface Servo Motor com Microcontrolador 8051
Neste tutorial, faremos a interface do Micro Servo Motor com o Microcontrolador Atmega16 AVR usando o Atmel Studio 7.0. O servo motor é classificado para funcionar em 4,8-6V. Podemos controlar seu ângulo de rotação e direção aplicando trem de pulso ou sinais PWM. Observe que os servo motores não podem se mover para uma rotação completa de 360 graus, então eles são usados onde a rotação contínua não é necessária. O ângulo de rotação é 0 -180 graus ou (-90) - (+90) graus.
Componentes necessários
- Micro servo motor SG90 Tower Pro
- Atmega16 Microcontrolador IC
- Oscilador de cristal de 16 MHz
- Dois capacitores 100nF
- Dois capacitores 22pF
- Botão de apertar
- Jumper Wires
- Tábua de pão
- USBASP v2.0
- Led (qualquer cor)
Descrição do pino do servo motor
- Vermelho = Fonte de alimentação positiva (4,8 V a 6 V)
- Brown = Ground
- Laranja = Sinal de Controle (Pino PWM)
Diagrama de circuito
Conecte todos os componentes conforme mostrado no diagrama abaixo para girar o servo motor usando o microcontrolador AVR. Existem quatro pinos PWM, podemos usar qualquer pino PWM do Atmega16. Neste tutorial, estamos usando Pin PD5 (OC1A) para gerar PWM. PD5 é conectado diretamente ao fio laranja do servo motor que é o pino do sinal de entrada. Conecte qualquer LED de cor para indicador de energia. Além disso, conecte um botão no pino de reinicialização para reiniciar o Atmega16 sempre que necessário. Conecte o Atmega16 com o circuito oscilador de cristal adequado. Todo o sistema será alimentado por alimentação de 5V.
A configuração completa terá a seguinte aparência:
Servo motor de controle com AVR ATmega16
Como o motor de passo, o servo motor não precisa de nenhum driver externo, por exemplo, driver de motor ULN2003 ou L293D. Basta PWM para acionar o servo motor e é muito fácil gerar PWM a partir de um microcontrolador. O torque deste servo motor é 2,5kg / cm, então se você precisar de um torque maior, então este servo não é adequado.
Como sabemos que o servo motor busca um pulso a cada 20ms e o comprimento do pulso positivo determinará o ângulo de rotação do servo motor.
A frequência necessária para obter o pulso de 20 ms é 50 Hz (f = 1 / T). Portanto, para este servo motor, a especificação diz que para 0 grau precisamos de 0,388ms, para 90 graus precisamos de 1,264ms e para 180 graus precisamos de 2,14ms de pulso.
Para gerar os pulsos especificados, usaremos o Timer1 do Atmega16. A frequência da CPU é de 16Mz, mas usaremos apenas 1Mhz, pois não temos muitos periféricos conectados ao microcontrolador e não há muita carga no microcontrolador, então 1Mhz fará o trabalho. O Prescaler é definido como 1. Portanto, o relógio é dividido em 1Mhz / 1 = 1Mhz (1uS), o que é ótimo. Timer1 será usado como Modo PWM Rápido, ou seja, Modo 14. Você pode usar diferentes modos de temporizadores para gerar o trem de pulso desejado. A referência é fornecida abaixo e você pode encontrar mais descrições na folha de dados oficial do Atmega16.
Para usar o Timer1 como modo PWM rápido, precisaremos do valor TOP de ICR1 (Input Capture Register1). Para encontrar o valor SUPERIOR, use a fórmula fornecida abaixo:
f pwm = f cpu / nx (1 + TOP)
Isso pode ser simplificado para, TOP = ( f cpu / ( f pwm xn)) - 1
Onde, N = valor do conjunto de pré-escala
f cpu = CPU Frequencey
f pwm = largura de pulso do servo motor que é 50 Hz
Agora calcule o valor ICR1, pois temos todos os valores necessários, N = 1, f cpu = 1 MHz, f pwm = 50 Hz
Basta colocar os valores na fórmula acima e obteremos
ICR1 = 1999
Isso significa que para atingir o grau máximo, ou seja, 180 0, o ICR1 deve ser de 1999.
Para cristal de 16 MHz e Prescaler definido como 16, teremos
ICR1 = 4999
Agora, vamos discutir o esboço.
Programando Atmega16 usando USBasp
O código AVR completo para controlar o servo motor é fornecido abaixo. O código é simples e pode ser facilmente compreendido.
Aqui codificamos o Atmega16 para girar o servo motor de 0 0 a 180 0 e voltando de 180 0 a 0 0. Esta transição será concluída em 9 etapas, ou seja, 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Para o atraso, usaremos a biblioteca interna do Atmel Studio, ou seja,
Conecte seu USBASP v2.0 e siga as instruções neste link para programar o microcontrolador Atmega16 AVR usando USBASP e Atmel Studio 7.0. Basta construir o esboço e fazer o upload usando o conjunto de ferramentas externo.
O código completo com o vídeo de demonstração é fornecido abaixo. Também aprenda mais sobre servo motores, conhecendo sua importância na robótica.