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 }![]()







Zitieren


Lesezeichen