AD Wandler auslesen ATMEGA644A
-
Hallo,
Das Programm sollte den Wert des AD-Wandlers auslesen. Dies klappt auch jedoch springt der Wert meist zwischen zwei Werten hin und her. Wie kann ich dies beheben?
#include <avr/io.h>
#include "I2C.h"
#include "I2C_LCD.h"
#include "stdio.h"
#define F_CPU 14745600
#define i2c_clock 100000
#include <util\delay.h>
#include "ADC.h"
#include <avr/interrupt.h>char lcd_zeile[13];
int main(void)
{
float gewicht;
float multiplikator;
multiplikator = 4,96 / 1024;AnDi.aktivieren();
I2C.aktivieren(F_CPU, i2c_clock);
Display.aktivieren(0);
sprintf (&lcd_zeile[0], " Gewicht " );
Display.write(false, 0, &lcd_zeile[0]);
sprintf (&lcd_zeile[0], " ");
Display.write(false, 2, &lcd_zeile[0]);while (1)
{gewicht = AnDi.lesen(1);
gewicht = gewicht*multiplikator;
Display.write(false, 1, &lcd_zeile[0]);
sprintf (&lcd_zeile[0], "%f g", gewicht);
_delay_ms(500);
}
}
-
Lötlord schrieb:
Hallo,
Das Programm sollte den Wert des AD-Wandlers auslesen. Dies klappt auch jedoch springt der Wert meist zwischen zwei Werten hin und her. Wie kann ich dies beheben?
Wie weit liegen die Werte auseinander?
Bedenke, dass dein Signal Fehler (Rauschen) haben kann. Da ist es normal, wenn die Werte schwanken.#define F_CPU 14745600 gehört eigentlich ins makefile oder als alleresrtes im Code.
multiplikator = 4,96 / 1024; Kommazahlen werden mit . notiert. Hier hat das , einen ganz anderen Effekt.
&lcd_zeile[0] schreibt man i.A. kurz als lcd_zeile
Und benutze bitte Code-Tags. (Code mit der Maus markieren und auf den C++-Button unter dem
klicken)
-
Danke für deine Rückmeldung
Zwischen diesen beiden Werten: 2.644687 und 2.639844
Das ganze soll eine Waage werden nur das Problem ist, dass diese dann sehr ungenau wären, wenn der Wert immer zwischen den beiden springen würde.
Kann man das irgendwie rausfiltern? Bin da noch ein Anfänger
Liebe Grüße
-
lötlord schrieb:
Zwischen diesen beiden Werten: 2.644687 und 2.639844
Wenn man das auf ADC-Werte zurückrechnet, kommen 546 und 545 raus. Also nur 1 Digit Unterschied. Das ist sehr gut.
lötlord schrieb:
Das ganze soll eine Waage werden nur das Problem ist, dass diese dann sehr ungenau wären, wenn der Wert immer zwischen den beiden springen würde.
Deine 6 Nachkommastellen sind eh gelogen.
Der ADC kann doch nur 1024 Werte unterscheiden. Bei ca 5 Vollauschlag, liegt die Auflösung bei ca. 0,005.
Von der Genauigkeit wollen wir da noch gar nicht reden.lötlord schrieb:
Kann man das irgendwie rausfiltern? Bin da noch ein Anfänger
Du kannst Mittelwerte bilden.
Z.B. 8 Werte einlesen und addieren und die Summe durch 8 teilen.Schau mal bei https://www.mikrocontroller.net/articles/Hauptseite vorbei.
Da geht es nur um solche Sachen.