Ziel wäre es einen Drucksensor anzuschließen und dessen wert einzulesen (ergibt 4-20mA aus)
Ich habe mich jetzt nur mal auf das einlesen des ADC konzentriert, bei mir wären 5V = 1023
Mein aktuelles Problem ist das der ADC wert > 205 und < 409 ist und das Immer sogar wenn nichts angeschlossen ist ?
Ich konnte den Fehler noch nicht finden, daher ich noch kein Poti habe verwende ich verschiedene widerstände.
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
uint16_t lastValue = 0;
uint16_t ADC_Read(uint8_t channel);
int main()
{
// Set PORTD as Output
DDRD = (1<<PD7)| (1<<PD6)|(1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2)| (1<<PD1)| (1<<PD0);
PORTD |= ((1 << PD7) | (1 << PD6) |(1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2)| (1<<PD1)| (1<<PD0));
ADC_init();
while (1)
{
//0V = 0
//1V = 205
//2V = 409
//3V = 614
//4V = 816
//5V = 1023
//Vgemessen=lastValue*5/1024;
lastValue = ADC_Read(0);
if (lastValue = 0) {
PORTD = 0b11111111;
}
else if (lastValue > 205) {
PORTD = 0b11111110;
}
else if (lastValue < 409) {
PORTD = 0b11111100;
}
else if (lastValue > 614) {
PORTD = 0b11111000;
}
else if (lastValue > 816) {
PORTD = 0b11110000;
}
else if (lastValue > 1023) {
PORTD = 0b11100000;
}
}
}
/* ADC initialisieren */
void ADC_init(void) {
// die Versorgungsspannung AVcc als Refernz wählen:
ADMUX = (1<<REFS0);
// oder interne Referenzspannung als Referenz für den ADC wählen:
//ADMUX = (1<<REFS1) | (1<<REFS0);
// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
// schon auf 0, also single conversion
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* 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
}
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
(void) ADCW;
}
/* ADC Einzelmessung */
uint16_t ADC_Read(uint8_t channel)
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
}
return ADCW; // ADC auslesen und zurückgeben
}
Lesezeichen