hi
also ich benutze ein zweites Netzteil mit dem ich 0V-2,5V anlegen kann und das is wie folgt angeschlossen
erste Stromquelle nur an VCC und GND um das board zu versorgen
zweite stromquelle am +pol mit dem gewünschten ADCpin verbunden (in meinem fall PA1) und am -pol mit GND verbunden
dann noch einen Kondensator von AREF zu GND (wobei es auch ohne den kondensator geht)
alles andere ist konfigurationssache des programms
mein programm:
ADC.c
Code:
#include <avr/io.h>
#include <avr/iom16.h>
#include <inttypes.h>
#include "ADC.h"
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
return result;
}
main.c
Code:
#include <avr/io.h>
#include <avr/iom16.h>
#include <inttypes.h>
#include "ADC.h"
#define F_CPU 4000000UL
#include <util/delay.h>
int main (void)
{
DDRA = 0;
DDRD = 1;
_delay_ms(500);
PORTD = 0xff;
_delay_ms(500);
PORTD = 0x00;
_delay_ms(500);
uint16_t adcval = 0x00;
while(1)
{
adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
PORTD = adcval;
_delay_ms(250);
}
return 0;
}
ADC.h
Code:
uint16_t ReadChannel(uint8_t mux);
ich benutze übrigens auch den ATmega 16 und das pollin board (allerdings zusammen mit dem addonboard)
mfg Grandalf
Lesezeichen