Tengo ATMEGA328P-PU y le he conectado la fotocélula. Estoy usando el siguiente código para leer los valores analógicos y enviarlos a la computadora para la depuración.
#define F_CPU 800000UL
#define BAUD 11400
#define BRC ((F_CPU/8/BAUD) - 1)
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <util/setbaud.h>
#include <avr/io.h>
#include <avr/interrupt.h>
double dutyCycle = 0;
int main(void)
{
initSerial();
DDRD = (1 << PORTD6);
TCCR0A = (1 << COM0A1) | (1 << WGM00) | (1 << WGM01);
TIMSK0 = (1 << TOIE0);
setupADC();
sei();
TCCR0B = (1 << CS00) | (1 << CS02);
while(1)
{
unsigned int value = ADCW;
UDR0 = (value*100/1024) ;
_delay_ms(1);
}
}
void initSerial()
{
UBRR0H = (BRC >> 8);
UBRR0L = BRC;
UCSR0B = ( 1 << TXEN0 );
UCSR0C = ( 1 << UCSZ00 ) | ( 1 << UCSZ01 );
}
void setupADC()
{
ADMUX = (1 << REFS0) | (1 << MUX0) | (1 << MUX2);
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2);
DIDR0 = (1 << ADC5D);
startConversion();
}
void startConversion()
{
ADCSRA |= (1 << ADSC);
}
ISR(TIMER0_OVF_vect)
{
OCR0A = dutyCycle;
}
ISR(ADC_vect)
{
dutyCycle = ADC;
startConversion();
}
Uso el siguiente comando para ver la salida del sensor:
od -d /dev/ttyACM3 -w2
Puedo ver el cambio de salida en función de la cantidad de luz, pero cambia realmente raro, si quito lentamente la fuente de luz del sensor obtengo esta salida:
3542
3298
3142
2799
2243
2142
1799
1543
1542
1537
1542
262
257
1542
262
257
1542
257
1537
1542
1
256
257
262
65535
255
0
65535
0
65278
65535
65278
30969
30968
63736
63993
63737
63479
63992
La primera mitad se ve muy bien, pero de repente salta a 63k, esto sucede cada 10 cm, luego baja de 63k a 0 y luego vuelve a saltar a 63k. ¿Alguien puede decirme cómo convertir ADCW a valor decimal? Estoy esperando un número entre 0 y 1024 como salida.
El manual dice "ADC tiene una resolución de 10 bits, requiere 10 bits para almacenar el resultado" ¿no significa que es un 10bit (16bit) en lugar de 8bit?