quarta-feira, 3 de setembro de 2014

Microcontroladores - Aula 08 - Temporizadores/Contadores

Senhores, segue a oitava aula de microcontroladores. Nesta Aula 08, serão abordados os temporizadores do ATmega328. A aula inicia com uma introdução dos temporizadores e seus modos de funcionamento. Na sequência, são abordados os registradores e as configurações dos temporizadores. Também são apresentadas duas bibliotecas para trabalho com os temporizadores do ATmega328. A aula termina com a sugestão de dois exercícios.

Primeiro exercício

Fazer o servo motor mover-se continuamente do ângulo de +90 a -90 e retornar para o ângulo de -90. Usar as seguintes propriedades para o servo motor:
Minimum Angle: -90
Maximum Angle: +90
Rotational Speed: 600
Minimum Control Pulse: 1m
Maximum Control Pulse: 2m

Servo motores funcionam com largura de pulsos. O pulso de controle deve ser de 20ms. O ângulo do servo motor é proporcional à largura do pulso. Para mover o servo motor para o ângulo de -90, o pulso deve possuir 1ms de sinal em alto e 19ms de sinal em baixo. Para mover o servo motor para o ângulo de +90, o pulso deve possuir 2ms de sinal em alto e 18ms de sinal em baixo. Logo, para fazer ângulos intermediários, deve-se enviar para o motor um sinal PWM com pulso em alto entre 1ms e 2ms e pulso em baixo com o resto do tempo para completar 20ms.

Sugiro que na implementação de vocês, usem o TIMER1 no modo PWM com fase e frequência corrigidas e topo em ICR1. O sinal PWM deve possuir 20ms, logo, calculem qual deve ser o valor a ser escrito em IRC1 para que a frequência do sinal PWM seja de 50 Hz. Utilizem o OCR1A para gerar os pulsos e mandem o pulso para a saída OC1A em modo não invertido.

A lógica é com vocês. Depois de implementar a solução de você, se quiserem comparar, segue o meu código para este exercício.

Segundo exercício

Movimentar o motor de passo usando passo pleno de fase simples. Usar as seguintes propriedades para o motor de passo:
Nominal Voltage: 5V
Step Angle: 1
Maximum RPM: 3600
Coil Resistance: 120
Coil Indictance: 100mH

Sugiro que na implementação de vocês, usem o TIMER0 no modo CTC para gerar uma interrupção a cada 10ms. Utilize esta interrupção para atualizar a fase do motor acionada. Atenção: Se for necessário alterar alguma variável dentro da interrupção, esta variável deve ser global e volatile, por exemplo:

volatile uint8 motorState;

Novamente, cada um de vocês vai apresentar uma lógica diferente. Depois de implementar a solução de você, se quiserem comparar, segue o meu código para este exercício.


Bons estudos.