Nabend
Ich habe ein Problem mit folgendem Aufbau:
ATMega328 steuert einen kleinen Getriebemotor an,
an wessen Getriebe eine Reflexlichtschranke (CNY70) die Umdrehungen vom
ersten Zahnrad misst.
Mein Skript ist relativ überschaubar:
Wenn ich digitalWrite nutze werden ca 470 Umdrehungen gezählt.
Bei der halben Spannung werden über 800 Runden gedreht.
Gehe ich recht in der Annahme, das bei voller Spannung das Zahnrad so
schnell dreht,
das entweder die Lichtschranke oder der AVR zu langsam sind?
In der Anlage noch mal zwei Diagramme.
Es sind die readpin Werte aus Zeile 3.
Oben bei voller unten bei halber Spannung
Danke für eure Hilfe
Gruß Kolja
Kolja L. schrieb:> Gehe ich recht in der Annahme, das bei voller Spannung das Zahnrad so> schnell dreht,> das entweder die Lichtschranke oder der AVR zu langsam sind?
Schreib an deine X-Achse mal Zeiten ran, dann wissen wir mehr. In
welchem Zeitabstand liegen rechnerisch die Pulse, die dein Reflextaster
bekommt? Was für einen µC mit welcher wirklichen CPU-Frequenz (LED
Blinktest!) setzt du ein? Von AnalogRe() darfst du keine
Geschwindigkeitswunder erwarten.
Nimm einfach mal einen Pulsgenerator an Stelle des Reflextasters.
Kolja L. schrieb:> Wenn ich digitalWrite nutze werden ca 470 Umdrehungen gezählt.
Pro Sekunde?
Kolja L. schrieb:> Bei der halben Spannung werden über 800 Runden gedreht.
Pro Sekunde?
Kolja L. schrieb:> Gehe ich recht in der Annahme, das bei voller Spannung das Zahnrad so> schnell dreht,> das entweder die Lichtschranke oder der AVR zu langsam sind?
Das ist denkbar. Mit einem Osziloskope könntest du dir den Signalverlauf
anschaun und recht zügig sehen wer hier eventuell aus dem Tritt kommt.
Deine Programmiersprache schaut merkwürdig aus, aus dem analogRead
schließe ich aber, dass du den ADC benutzt zum Messen. Wie schnell hast
du den getaktet und welchen Modus hast du eingestellt? Es könnte schon
sein, dass dein ADC zu langsam eingestellt ist und du daher das Problem
hast.
However, das ist aber eine reine Spekulation, erstmal bräuchte man mehr
Infos. Wie schnell ist dein ADC eingestellt, wie schnell der AVR und
benutze ein Osziloskope. Wenn du keines haben solltest: Es würde zu
beginn auch so ein preiswertes DSO-Nano genügen. Sich Signalformen
anschaun zu können ist ein nicht zu unterschätzender Vorteil,
insbesondere bei der Fehlersuche.
Michael K. schrieb:> Es würde zu beginn auch so ein preiswertes DSO-Nano genügen.
Selbst ein kleiner Logikanalysator für 8€ wäre hier Gold wert.
Such mal bei ebay nach "8Ch 24MHz"
Wolfgang schrieb:> Michael K. schrieb:>> Es würde zu beginn auch so ein preiswertes DSO-Nano genügen.> Selbst ein kleiner Logikanalysator für 8€ wäre hier Gold wert.> Such mal bei ebay nach "8Ch 24MHz"
Sowas ist auch immer sehr hilfreich, keine Frage ;)
Guten Morgen
@Wolfgang
Es sind ca 10.000 Messungen in ca 40 Sekunden.
Genauer kann ich es später nochmal messen.
Wie ich die wirkliche CPU Frequenz mit einem Blinktest ermittele,
weiß ich leider nicht.
Auch nicht, wie du das mit dem Pulsgenerator meinst.
@Michael
Sorry,du hattest zu wenig Informationen von mir.
Das Getriebe dreht einen kleinen Stift heraus.
Dieser hat eine feste Start und Endposition.
Dass Ausfahren des Stiftes dauert bei HIGH ca 40s und benötigt 470
Umdrehungen.
Bei der halben Spannung sind es dann 800 Umdrehungen(Zeit habe ich nicht
gestoppt,aber deutlich länger)
ADC ist richtig, aber dafür habe ich weder eine Frequenz noch einen
Modus einstellen müssen.
Ein Oz habe ich nicht, aber vielleicht ist ja noch ein günstiges in
meinem Budget.
Dann aber gerne eins, welches per USB angeschlossen wird.
Danke und Gruß
Kolja
Wo und wie werden denn in deinem Programm die Impulse gezählt...?
Vielleicht ist es für mich auch einfach noch zu früh. Ich kann das
leider nicht sehen. Wenn man Impulse zählt führt in der Regel kein Weg
an einem Timer und/oder Pin change Interrupt vorbei. Beides sehe ich
nicht. Anbei ein Link wo anfängergerecht erklärt wird, wie man so was
macht mit einer reflektionslichtschranke.
http://extremeelectronics.co.in/avr-projects/avr-project-atmega8-based-rpm-meter/
Moin Thomas
Es gibt einen weißen Bereich auf dem Zahnrad hinter der RLS.
Der Maximalwert ist etwas über 850.
Kann aber auch mehrmals hintereinander vorkommen,
deswegen der Marker.
Irgendwann fällt der Wert aber wieder und das wird gezählt.
Gruß Kolja
P.S.
Danke für den Link.
Der Code sieht tatsächlich ganz anders aus als meiner.
Kolja L. schrieb:> Das Getriebe dreht einen kleinen Stift heraus.> Dieser hat eine feste Start und Endposition.> Dass Ausfahren des Stiftes dauert bei HIGH ca 40s und benötigt 470> Umdrehungen.> Bei der halben Spannung sind es dann 800 Umdrehungen(Zeit habe ich nicht> gestoppt,aber deutlich länger)> ADC ist richtig, aber dafür habe ich weder eine Frequenz noch einen> Modus einstellen müssen.
Hm, die Frequenz sollte man wissen um abschätzen zu können ob man
richtig misst. Bei Arduino arbeite ich mich auch grade erst ein, hab
gestern meinen Uno bekommen. Das mache ich nur aus Interesse da bei uns
an der Hochschule viele den Arduino Uno benutzen und ich da eine
beratende Tätigkeit habe. Ich verwende idr den AVR GCC und avrdude.
However, viele Pulse liefert deine Lichtschranke denn pro Umdrehung bzw.
sollte sie liefern?
Ich gehe mal von den 40s und 470 Umdrehungen aus, d.h. du hast pro
Sekunde etwa 4,2 Umdrehungen. Wenn du da nun 1000 Pulse pro Umdrehung
(bzw. 1012 Pulse pro Umdrehung wären nicht unüblich für einen Encoder)
erwarten würdest hättest du ein Signal von 4200 Hz. Läuft der ADC mit
der geringsten empfohlenen Frequenz von 50 kHz und ist im
Freerunning-Mode (dann braucht er 13 Zyklen zum Samplen) hat man eine
Abtastrate von ca 4 kHz und gemäß dem Nyquist-Kriterium wäre das nur für
ein 2 kHz Signal ausreichend.
Hier könnte ein Problem sein, das müsstest du halt mal genauer
Recherchieren wie der ADC bei Arduino läuft.
Kolja L. schrieb:> Es gibt einen weißen Bereich auf dem Zahnrad hinter der RLS.> Der Maximalwert ist etwas über 850.
850 was? Käseplatten? Nackte Frauen? Herz, mV, mA? Oder was genau?
Ich sehe immer noch nicht wo und wie Du Impulse oder Zeiten zwischen
Impulsen misst. Ich höre immer etwas von ADC. Mit einem ADC misst man
Spannungen, sonst nichts. Gehe ich richtig in der Annahme das Du eine
Reflexionslichtschranke, die Dir ein Rechtecksignal in
drehzahlabhängiger Frequenz liefert an den ADC Wandler deines Arduino's
angeschloßen hast und der naiven Meinung verfallen bist dass Du so einen
linearen Zusammenhang zwischen Drehzahl und einer Spannung hast, von der
ich nicht weis wo genau die herkommt, den Du dann in deiner "Software"
auswerten kannst? Korrigiere mich wenn ich dein Problem nicht korrekt
geraten habe.
Sollte das alles so sein so vergiss es aus diversen Gründen, denn so
geht das absolut nicht. Ganz ungeachtet der Tatsache, das Du ein
digitales Signal (Impulse und Flanken) hast das eine absolut präzise
Messung ermöglichen würde und unnötigerweise versuchst dieses in ein
anders zu wandeln (Spannung), wobei Du die Wandlung ja nicht mal
durchführst, viel schlimmer Du gibst direkt Impulse auf den ADC, der
dazu auch noch ungenau ist und eine weitere Fehlerquelle in deinem
ganzen Konstrukt aus diversen Fehlerquellen darstellt.
Vergiss das also alles komplett und orientiere dich an dem was Leute
machen die was davon verstehen.
Wenn Du eine Drehzahl messen willst über Spannungen und den ADC, dann
verwende einen Tachogenerator mit einem entsprechend dimensionierten
Filter oder Miss in einer definierten Zeit Impulse oder die genaue Zeit
zwischen zwei steigenden Flanken.
Den bereits ausgesprochenen Tip Bücher zu lesen möchte ich an dieser
stelle auch noch einmal unterstreichen!
Thomas H. schrieb:> 850 was? Käseplatten? Nackte Frauen? Herz, mV, mA? Oder was genau?
Da ein ADC im spiel ist liegen doch "Counts" als Einheit hier nahe.
Thomas H. schrieb:> Ich höre immer etwas von ADC. Mit einem ADC misst man> Spannungen, sonst nichts.
Mit einem ADC kann man auch Signalverläufe aufzeichnen und daraus
Schlüsse ziehen, z.B. auf die Drehzahl schließen. Das ist doch nun kein
Hexenwerk.
Michael K. schrieb:> Mit einem ADC kann man auch Signalverläufe aufzeichnen und daraus> Schlüsse ziehen,
Ohne Frage, man kann die Umdrehungen auch von seiner kleinen Schwester
zählen lassen.
z.B. auf die Drehzahl schließen. Das ist doch nun kein
> Hexenwerk.
Wie von Ihm demonstriert!
Leute!
Um Pulse an einem Eingang zu detektieren ist doch der ADC Käse!
Wird die Lichtschranke wie üblich und vernünftig angeschlossen, dann hat
man an einem digitalen Eingang entweder eine 0 oder eine 1, je nachdem
ob die Lichtschranke unterbrochen oder nicht unterbrochen ist. Was
anderes will man ja auch nicht von einer Lichtschranke. Kein Mensch
interessiert sich hier konkret dafür, ob der Lichtstrahl zu 2/3
unterbrochen ist oder nicht.
Die ganze Vorgehensweise, da jetzt in den ADC zu gehen bzw. dessen
Verhalten im Detail festzustellen, ist zwar löblich, aber im konkreten
Fall eine Sackgasse.
Die Lösung besteht nicht darin, den ADC schneller zu machen. Die Lösung
besteht darin, vom ADC weg zu gehen und auf einen digitalen Pin zu
gehen.
Und dann zeig mal dein ganzes Programm.
Denn um Drehzahlen festzustellen braucht man ja auch noch eine zeitliche
Komponente. 850 Ticks ist schön. Aber in welchem Zeitraum?
Wie hast du dieses gelöst?
Ich frage mich immer, wie die Leute auf derartige Ideen kommen, eine
offensichtlich digitale INformation (unterbrochen - nicht unterbrochen)
nicht ganz einfach als das zu behandeln was es ist: eine digitale
Information. Zumal das bei einer Lichtschranke normalerweise nicht
wirklich ein Problem ist, die elektrisch auf die Digitalpegel zu
bringen.
Moin
@Thomas
850 hat keine Einheit, wenn dann: 3,3V/1023
Da es aber um das Auslesen des analogen Pins geht,
dachte ich es wäre eindeutig.
Ja, mit dem ADC messe ich die Spannung aus dem Phototransistor.
Und wenn sich eine weiße Fläche unter dem PT befindet, liegt am readpin
eine höhere Spannung (etwas über 850, bzw 2,74V) an.
Bei einer schwarzen Fläche liegt der Wert so um 130 bzw 0,42V.
Wenn die Fläche jetzt aber nicht ganz schwarz ist, sondern auch ein
binschen weiß,
dann liegt der Wert wohl irgendwo dazwischen.
Wir haben den analogen Pin gewählt, damit wir die Grenze, ab wann ein
"HIGH" vorliegt definieren können.
@Michael
Danke für den Hinweis mit der Zeitmessung!
Damit habe ich jetzt mein ursprüngliches Problem lösen können.
Die analoge Spannungsversorgung (PWM) brauchte ich nur, damit der Stift
des Getriebes im Leerlauf weniger Kraft hat
und stehenbleibt, wenn er auf den Stift on dem Ventil trifft.
Also suchte ich nach einer Möglichkeit diesen Startpunkt zu finden.
Motor start --> Leerlauf --> Trifft auf Ventil, Startpunkt (Zähler=0)
--> ab jetzt kann die Ventilstellung anhand der Umdrehungen des
Getriebes eingestellt werden.
Nachdem ich mir die Zeit zwischen den Auslesevorgängen und die Anzahl
der Messungen ausgegeben hatte,
war der Startpunkt gefunden. (siehe Bild)
X-Achse: Anzahl der Umdrehungen des ersten Getriebezahnrades
Y-Achse links: Anzahl der Messungen pro Umdrehung des ersten
Getriebezahnrades
Y-Achse rechts: Zeit für eine Umdrehung des ersten Getriebezahnrades
Jetzt lasse ich den Motor stoppen, wenn die Zeit länger als 90ms sind
UND es nicht eine der ersten 20 Umdrehungen ist.
(Manchmal gibt es in Runde 2 einen großen Ausschlag)
Hier mal mein kompletter Code.
Bitte vorsichtig mit der Kritik, es ist mein erster Versuch in C.
1
#define motor1 9
2
#define motor2 10
3
#define readpin 5
4
#define irpin 8
5
#define versorgung 4
6
intmarker=0;
7
intc=0;
8
intc1=0;
9
longstart;
10
longdauer;
11
voidsetup()
12
{
13
Serial.begin(9600);
14
pinMode(motor1,OUTPUT);
15
pinMode(motor2,OUTPUT);
16
digitalWrite(motor1,LOW);
17
digitalWrite(motor2,LOW);
18
pinMode(readpin,INPUT);
19
pinMode(irpin,OUTPUT);
20
pinMode(versorgung,OUTPUT);
21
digitalWrite(irpin,HIGH);
22
digitalWrite(versorgung,HIGH);
23
}
24
voidloop()
25
{
26
digitalWrite(motor2,HIGH);//2=zu 1=auf
27
c1++;
28
if(analogRead(readpin)>850){
29
marker=10;
30
}
31
elseif(analogRead(readpin)<850&&marker==10){
32
c++;
33
Serial.print("Umdrehungen: ");Serial.print(c);Serial.print(" Dauer pro Umdrehung: ");
34
Serial.print(millis()-start);Serial.print(" Messungen pro Umdrehung: ");Serial.println(c1);
35
if(millis()-start>90&&c>20){
36
digitalWrite(motor2,LOW);
37
Serial.println("angestossen");
38
delay(30000);
39
}
40
// if (c >= 250){digitalWrite(motor2, LOW);Serial.println("angekommen");delay(30000);}
Karl H. schrieb:> Leute!>> Um Pulse an einem Eingang zu detektieren ist doch der ADC Käse!
Ich glaube das habe ich bereits mehrfach, und für meine Verhältnisse
sogar in relativ freundlichem ton angedeutet. Es ist mittlerweile aber
wohl so, dass Unwissenheit nicht nur hartnäckig verteidigt wird, nein
sie bekommt sogar noch unbelehrbare Unterstützung.
Es ist nun nicht mehr nur so, dass die Leute nicht mehr gerne Lesen,
nein sie verstehen es nicht, wenn Sie denn mal was zum Lesen vorgesetzt
bekommen.
Kolja L. schrieb:> Hier mal mein kompletter Code.> Bitte vorsichtig mit der Kritik, es ist mein erster Versuch in C.
Es ist C++ und es ist offensichtlich auch dein erster Versuch mit der
Elektronik.
Ich wünsche viel Spass beim Spielen oder Basteln. Ich gebe an dieser
Stelle auf. Es sind ja genug andere Kinder hier, die dir helfen. Ich
gehe jetzt im Sand spielen.
Kolja L. schrieb:> delay(30000);
Da kriege ich ja Augenkrebs.
Lies doch mal, wie man so was mit einem Timer macht.
Vielleicht arbeitest du besser erst das ganze Tutorial auf Arduino.cc
durch.
Sicher, ich haue auch auf die Schnelle mal ein längeres Delay rein, aber
dann muss da im Programm auch nicht viel passieren.
Thomas H. schrieb:> Es ist C++ und es ist offensichtlich auch dein erster Versuch mit der> Elektronik.
Eindeutig Arduino, nicht C++. Vieles ist davon abgeleitet.
Was ich echt nicht verstehe und da muss ich K.H.B. mal wieder recht
geben, dass gerade Anfänger schon zu Anfang sich so dicke Brocken
ausdenken.
Macht doch erstmal die ganzen Beispiele und versteht was da passieren
soll und dann versucht -ganz vorsichtig- darauf aufbauend, eure eigenen
Sachen.
@ F. Fo (foldi)
>> Es ist C++ und es ist offensichtlich auch dein erster Versuch mit der>> Elektronik.>Eindeutig Arduino, nicht C++. Vieles ist davon abgeleitet.
Arduino nutzt einige Elemtent von C++, der avr gcc kann das.
>Was ich echt nicht verstehe und da muss ich K.H.B. mal wieder recht>geben, dass gerade Anfänger schon zu Anfang sich so dicke Brocken>ausdenken.
Je kleiner die Fähigkeiten, umso größer die Phantasie!
Hi Falk!
Den Spruch muss ich mir merken.
Weißt du, ich bin ja schon so oft, gerade im Programmieren,
zurückgeworfen worden. Denke den letzten Grund kennst du (wie viele
andere hier), aber selbst wenn ich dran geblieben wäre, die Projekte
sind doch oft so anspruchsvoll (ich nenne da nur "Bordcomputer"), dass
sie selbst von der Hardware für diese offensichtlichen Anfänger auch in
diesem Bereich, sicher nicht so einfach zu realisieren sind.
Als ich anfing, da wusste ich schon nach einigen Wochen, dass ich doch
ziemlich doof auf dem gesamten Sektor bin und noch ne Menge zu lernen
habe.
Sicher, in meinem Job, gerade im Bereich der Elektronik, bin ich schon
ziemlich gut gewesen, aber etwas selbst bauen, das ist dann doch noch
mal eine ganz andere Hausnummer.
Woran es liegt, weiß ich auch nicht. Liegt es nun an hoffnungsloser
Selbstüberschätzung oder recht der Horizont bei einigen dieser Leute
nicht so weit, die gesamte Problemstellung überhaupt zu überblicken? Das
wäre dann verständlich. Denn wenn ich nur ein paar Meter gucken kann,
dann weiß ich halt nicht, dass die Hürden erst nach der Sichtgrenze
kommen.
@ F. Fo (foldi)
>andere hier), aber selbst wenn ich dran geblieben wäre, die Projekte>sind doch oft so anspruchsvoll (ich nenne da nur "Bordcomputer"), dass>sie selbst von der Hardware für diese offensichtlichen Anfänger auch in>diesem Bereich, sicher nicht so einfach zu realisieren sind.
Eines der vielen Probleme ist die Featuritis. Anstatt sich auf eine
endliche Menge an Eigenschaften erst einmal zu beschränken wird jeder
Mist auf den Wunschzettel geschrieben. Das macht viele Projekte kaputt,
auch im Profibereich.
>Als ich anfing, da wusste ich schon nach einigen Wochen, dass ich doch>ziemlich doof auf dem gesamten Sektor bin und noch ne Menge zu lernen>habe.
Das ist ja kein Problem.
>Woran es liegt, weiß ich auch nicht. Liegt es nun an hoffnungsloser>Selbstüberschätzung
Jain.
> oder recht der Horizont bei einigen dieser Leute>nicht so weit, die gesamte Problemstellung überhaupt zu überblicken?
Wer wenig Wissen und Erfahrung hat, kann es nicht überblicken.
Das Problem ist eher, dass viele Dinge von aussen deutlich einfacher
aussehen als sie es wirklich sind. Das ist nicht erst seit Arduino & Co
so.
Es gibt Schlimmeres ;-)