Académique Documents
Professionnel Documents
Culture Documents
Arduno
ATmega168/328-Arduino Pin Mapping
Ateno:
Os
pinos
analgicos
podem tambm
serem usados
como
digitais
(E/S).
2/42
Arduno
Conectores do arduno
Duemilinove
Uno
3/42
Arduno
4/42
Timers no Arduino
Gerando
manualmente:
void setup() {
PWM
pinMode(13, OUTPUT);
}
void loop() { // Aproximadamente 10% duty cycle @ 1KHz
digitalWrite(13, HIGH);
delayMicroseconds(100);
digitalWrite(13, LOW);
delayMicroseconds(900);
}
Uso de PWM:
Controlar a intensidade da luz de
um LED;
Fornecer uma sada analgica,
decorrente do uso de um filtro na
sada do PWM, que ir fornecer
uma tenso analgica de 0 a
100%;
Gerar de sinais de udio;
Controlar
a
velocidade
de
motores DC;
Gerar
sinal
modulado,
por
exemplo para controlar um LED
infravermelho de um controle
remoto.
5/42
Timers no Arduino
Desvantagens
manualmente:
do
uso
do
PWM
6/42
O que um Timer?
7 / 40
O que um Timer?
8 / 40
Timers no arduno
Timer0
Timer0 um temporizador de 8 bits. Na plataforma arduino o timer0 est sendo utilizado para as
funes de tempo, como delay(), Millis() e micros(). Se houver alterao nos registradores do uC do
arduno, relativo a timer0, isso pode influenciar nas funes de temporizador. Ento, voc deve saber o
que est fazendo.
Timer1
Timer1 um temporizador de 16 bits. No mundo Arduino, a biblioteca Servo usa timer1 do Arduino Uno
e timer5 no Arduino Mega.
Timer2
Timer2 um temporizador de 8 bits como timer0. A funo Tone() usa timer2.
9 / 40
Timers no Arduino
10/42
Timers no Arduino
Prescaler
O Uno tem trs temporizadores chamados timer0, timer1 e Timer2. Apenas o timer1
de 16bits.
Cada um dos temporizadores tem um contador que incrementado a cada instante
do relgio do timer;
A contagem interrompe quando o contador chegar a um valor especificado para a
comparao;
Uma vez que um contador atingiu este valor mximo, o contador zerado;
Ao escolher o valor mximo para a comparao pode-se controlar a freqncia de
interrupes do timer.
O primeiro parmetro a ser discutido a velocidade com que o temporizador
incrementa o contador. O relgio Arduino executado em 16MHz, esta a maior
velocidade que os temporizadores podem incrementar seus contadores.
Em 16MHz cada tique-taque do contador representa 1/16, 000.000 de um segundo
=~ 63ns:
Para uma contagem de 0 a 9
=> T = 10/16000000s
(timer speed (Hz)) = (Arduino clock speed (16MHz)) / prescaler
Para uma contagem de 0 a 99 => T = 100/16000000s;
Valor_registrador = (16 MHz) / (prescaler * tempo) ) 1
Para uma contagem de 0 a 255
=> T = 256/16000000s =~ 16uS / mximo
para timer0 e timer2;
Exemplo: tempo=1s / prescaler = 1024 => valor_registrador = 15624 => (apenas o timer1)
Para uma contagem de 0 a 65535 => T = 65536/16000000 = ~ 4 ms / mximo
para timer1 (16bits);
11/42
Timers no Arduino
Counter
Diagram
Unit
Block
Timers no Arduino
13/42
Timers no Arduino
Normal
PWM fase Correta
PWM fase Correta 8bits
PWM fase Correta 9bits
PWM fase Correta
10bits
PWM fase e frequncia
Correta
PWM Fast
PWM Fast, 8 bits
PWM Fast, 9 bits
PWM Fast, 10 bits
CTC
14/42
Desligado
Timers no Arduino
15/42
Timers no Arduino
Timer/Counter
Timer1
Prescaler
16/42
Timers no Arduino
Timer/Counter
Timer2
Prescaler
17/42
Timers no Arduino
O ATMEGA328 tem
3 timers e 6 sadas
PWM;
O Arduino usa o
Timer0,
8bits,
internamente para
as funes millis()
e delay();
Portanto, mudando
os
registradores
deste timer, pode
afetar o uso destas
funes;
A biblioteca de PWM
18/42
usa estas funes
Timers no Arduino
19/42
Timers no Arduino
20/42
Timers no Arduino
21/42
Timers no Arduino
Timers no Arduino
Timers no Arduino
24/42
Timers no Arduino
Timers no Arduino
26/42
Timers no Arduino
27/42
Timers no Arduino
Timers no Arduino
29/42
Timers no Arduino
Timers no Arduino
TIMSK2
Timer/Counter2
Interrupt Mask
Register
TIFR2
Timer/Counter2
Interrupt Flag
Register
ASSR
Asynchronous
Status Register
GTCCR General
Timer/Counter Control
Register
31/42
Timers no Arduino
32/42
Timers no Arduino
Se 1, habilita interrupo quando TCNT2 = OCR2B levando o flag OCF2B= 1, em TIFR2, e desviando o programa p/
atender a interrupo;
Bit 1 OCIE2A: Timer/Counter2 Output Compare Match A Interrupt Enable
Se 1, habilita interrupo quando TCNT2 = OCR2A levando o flag OCF2A= 1, em TIFR2, e desviando o programa p/
atender a interrupo;
Bit 0 TOIE2: Timer/Counter2 Overflow Interrupt Enable
Se 1, habilita interrupo quando ocorrer overflow no timer2 levando o flag TOV2=1, em TIFR2, e desviando o programa
p/ atender a interrupo;
33/42
Timers no Arduino
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
Reserved
EXCLK: Enable External Clock Input
Se 1, clock assncrono (externo) selecionado para um clock de 32 KHz no pino TOSC1;
AS2: Asynchronous Timer/Counter2
Se 0, indica clock interno clkI/O e se 1, clock externo em TOSC1 ;
TCN2UB: Timer/Counter2 Update Busy
Se 0, indica que TCNT2 est pronto para atualizao;
OCR2AUB: Output Compare Register2 Update Busy
Se 0, indica que OCR2A est pronto para atualizao;
OCR2BUB: Output Compare Register2 Update Busy
Se 0, indica que OCR2B est pronto para atualizao;
TCR2AUB: Timer/Counter Control Register2 Update Busy
Se 0, indica que TCCR2A est pronto para atualizao;
TCR2BUB: Timer/Counter Control Register2 Update Busy
Se 0, indica que TCCR2B est pronto para atualizao;
Os mecanismos para a leitura TCNT2, OCR2A, OCR2B, TCCR2A e TCCR2B so diferentes. Ao ler TCNT2, o
valor atual lido. Ao ler OCR2A, OCR2B, CCR2A e TCCR2B o valor no registrador lido.
34/42
Timers no Arduino
Cdigo correspondente:
Sada A:
Fpwm_A = 16MHz / 64 / 256 = 976,56
Hz
duty_A = (180+1)/256 = 70,7%
Sada B:
Fpwm_B = 16MHz / 64 / 256 = 976,56
Hz
duty_B = (50+1)/256 = 19,9%
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
35/42
Timers no Arduino
36/42
Timers no Arduino
Count = contagem
ATMEGA328
com
os
prescalers
no
37/42
Timers no Arduino
Cdigo correspondente:
Sada A:
Fpwm_A = 16 MHz / 64 / 255 / 2 = 490,196
Hz
duty_A = 180 / 255 = 70,6%
Sada B:
Fpwm_B = 16 MHz / 64 / 255 / 2 = 490.196
Hz
duty_B = 50 / 255 = 19.6 %
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
38/42
Timers no Arduino
Fast
Sada A:
Fpwm_A = 16 MHz / 64 / (180+1) / 2 =
690,6 Hz
duty_A = 50%
Sada B:
Fpwm_B = 16 MHz / 64 / (180+1) = 1381,2
Hz
duty_B = 50 / 255 = 19,6 %
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
// pwm em A, duty 50 %
// pwm em B, duty 19,6%
39/42
Timers no Arduino
phase-
Sada A:
Fpwm_A = 16 MHz / 64 / 180 / 2 / 2 = 347,2
Hz
duty_A = 50%
Sada B:
Fpwm_B = 16 MHz / 64 / 180 / 2 = 694,4 Hz
duty_B = 50 / 180 = 27,8 %
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22);
OCR2A = 180;
OCR2B = 50;
40/42
Timers no Arduino
/*
* author: Sebastian Wallin
http://popdevelop.com/2010/04/mastering-timer-interrupts-on-the-arduino/
*/
unsigned int tcnt2;
int x= 0;
void setup() {
pinMode(2, OUTPUT); // 2 como saida
TIMSK2 &= ~(1<<TOIE2); // desabilita interrupo do timer overflow
// timer2 em modo normal (pura contagem, sem PWM) - WGM = 000
TCCR2A &= ~((1<<WGM21) | (1<<WGM20)); // clear bits
TCCR2B &= ~(1<<WGM22);
// clear bits
/* clock interno */
ASSR &= ~(1<<AS2);
/* desabilita interrupo decorrente de comparao*/
TIMSK2 &= ~(1<<OCIE2A);
// configura o prescaler do clock da CPU = 128 => 101
TCCR2B |= (1<<CS22) | (1<<CS20); // Set bits
TCCR2B &= ~(1<<CS21);
// Clear bit
// loop infinito
}
41/42
Timers no Arduino
Serial.begin(9600);
while(!Serial) {};
Timer1 / Modo 4 / CTC => WGM = 0100 (wgm13=0, wgm12=1, wgm11=0, wgm10=0)
clock = 16MHz / prescaler=1024 => CS = 101 (cs12=1, cs11=0, cs10=1)
valor = (16MHz / (prescaler * tempo) )-1
valor = (16MHz / (1024*1)) - 1
valor = 15624 = 0x3D08
OCR1A = 0x3D08
*******************************************************/
int toggle0=0;
// usado para inverter led
ISR(TIMER1_COMPA_vect)
{
//timer1 interrupt
OCR1A = 15624;
TCCR1B |= (1 << WGM12); // Mode 4, CTC on OCR1A
TIMSK1 |= (1 << OCIE1A); //Set interrupt on compare match
TCCR1B |= (1 << CS12) | (1 << CS10); // prescaler = 1024
toggle0 = ~toggle0;
digitalWrite(13,toggle0);
void setup(){
pinMode(13, OUTPUT);
digitalWrite(13,toggle0); // inverte bit na saida 13
}
loop() { }
//end setup
42/42
Timers no Arduino
43/42
Timers no Arduino
ISR(TIMER0_COMPA_vect)
{
//timer0 2kHz
// 2kHz/2 = 1kHz
toggle0 = ~toggle0;
digitalWrite(8,toggle0); // inverte bit na saida 8
}
ISR(TIMER1_COMPA_vect)
{
//timer1 1Hz
// 1Hz/2 = 0,5Hz
toggle1 = ~toggle1;
digitalWrite(13,toggle1); // inverte bit na saida 8
}
ISR(TIMER2_COMPA_vect)
{
//timer1 8kHz
// 8kHz/2 = 4kHz
toggle2 = ~toggle2;
digitalWrite(9,toggle2); // inverte bit na saida 8
}
void loop(){ }
//end setup
44/42
Timers no Arduino
45/42
Timers no Arduino
Fontes de Consultas:
1.
http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
2.
http://www.instructables.com/id/Arduino-Timer-Interrupts/?ALLSTEPS
3.
http://www.gammon.com.au/forum/?id=11504
4.
https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328
5.
http://www.cs.washington.edu/education/courses/csep567/10wi/lectures/lectures.html
6.
http://popdevelop.com/2010/04/mastering-timer-interrupts-on-the-arduino/
7.
http://stackoverflow.com/questions/12904637/arduino-duemilanove-pwm-and-timer
8.
http://electronics.stackexchange.com/questions/40279/multiplexing-two-7-segment-displays-ghosting-issues
9.
http://timer-scheduler.googlecode.com/svn-history/r30/trunk/examples/timerInterrupt_Match/timerInterrupt_Match.pde
10. http://forum.processing.org/topic/converting-from-arduino-to-processing
11. http://www.jeremyblum.com/2010/09/05/driving-5-speakers-simultaneously-with-an-arduino/
12. http://books.google.com.br/books?id=R7DKeahnY4C&pg=PA343&lpg=PA343&dq=arduino+WGM22+OCIE2A&source=bl&ots=M3-cCaQVFZ&sig=pa2I12ZWT3WGnymR
f2KYLXiGUKE&hl=pt-BR&sa=X&ei=cwfoUKH9Coq09QSb0oHYDA&ved=0CFMQ6AEwAzgU
13. http://www.4shared.com/office/jE7Zvx9E/arduino_internals.html
14. http://bennthomsen.wordpress.com/embedded-design/peripherals/timers/
15. http://www.gammon.com.au/forum/?id=11504
46/42
Timers no Arduino
Arduino / Timers / Interrupes