Hi,
ich habe hier einen Abtastkopf an meinem Gaszähler hängen und versuche
die Impulse zu zählen. Der Zähler arbeitet mit einem Magneten an der
Walze und bei jeder Umdrehung wird im Abtastkopf ein Reed-Relais
geschlossen und anschliessen wieder geöffnet. Ich habe dafür einen
Jeenode Arduino Controller verwendet, der daran angeschlossen.
Das eigentliche Zählen sieht wie folgt aus:
Port connector(1);
static unsigned long last;
int gescount,bettersend = 0;
MilliTimer countsend1;
void setup () {
connector.mode2(INPUT); // Set AIO mode as input
connector.digiWrite2(0); // Activate pull-up resistor for
last = millis();
}
void loop () {
static boolean ledOn = false;
if (countsend1.poll(1000)) {
bettersend=0;
}
int pushed = connector.digiRead2();
if (!ledOn && pushed == 0) {
ledOn = true;
} else if (ledOn && pushed == 1 && bettersend == 0) {
ledOn = false;
gescount +=1;
bettersend=1;
}
}
Es handelt sich hierbei um eine verkürzt Version des Quellcodes der nur
den wichtigen Teil des Zählens enthält.
Mein eigentlicher Gedanke ist nun das er nur nach eine steigenden Flanke
und einer fallenden Flanke das ganze als Umlaufen zählt.
Außerdem soll durch "bettersend" eine 1 Sekunden Sperre eingestellt
werden, damit er nur jede Sekunde maximal einen Impuls zählt. Das ganze
klappt aber nicht und ich habe immer zuviele Impulse gezählt. Wenn ich
das ganze händisch mit einem Magneten teste, finde ich keinen Fehler
aber bei richtigen Test am Gaszähler habe müsste ich zum Beispiel 323
Impulse drauf haben, habe aber 510 gezählt. Eine direkte ungenauigkeit
ist für mich nicht zu erkennen? Ich zähle also aus irgendeinem Grund
nicht immer richtig.
Kann mir bitte jemand helfen, wie ich das richtig mache, mit dem Zählen.
Vielen Dank.
Gruß kami
Hi >Der Zähler arbeitet mit einem Magneten an der >Walze und bei jeder Umdrehung wird im Abtastkopf ein Reed-Relais >geschlossen und anschliessen wieder geöffnet. >Mein eigentlicher Gedanke ist nun das er nur nach eine steigenden Flanke >und einer fallenden Flanke das ganze als Umlaufen zählt. Auch ein Reedkontakt prellt. MfG Spess
Hi, okay ich habe jetzt mal mit der Software des Controllers versucht eine Entprellung zu schaffen. Zurzeit habe ich den Schalter wie hier bei dem Phototransitor zu sehen angeschlossen. http://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor#Phototransistor Wie sollte ich das entprellen mit HArdware richtig lösen? Kondensator parallel dazu schalten? Wenn ja wie groß? Gruß kami
So ganz verstehe ich den Quellcode nicht, weil ich nicht weiß, was die
ganzen Klassen machen.
Bei einem bin ich mir aber sicher:
connector.mode2(INPUT); // Set AIO mode as input
connector.digiWrite2(0); // Activate pull-up resistor for
Das DEAKTIVIERT den Pullup-Widerstand beim AVR. Aktiviert wird er duch
Schreiben von einer logischen 1 in das PORT-Register (digiWrite2(1)).
Das mit dem Timer mit 1 Sekunde ist ja schon eine Entprellung, nur wie
das in der gezeigten Software funktioniert, ist für mich etwas
undurchsichtig.
Das liegt wohl auch daran, dass man den Quelltext in der gezeigten
Formatierung kaum lesen kann.
Deswegen bitte richtig einrücken und farbig darstellen:
1 | Port connector(1); |
2 | static unsigned long last; |
3 | int gescount,bettersend = 0; |
4 | |
5 | MilliTimer countsend1; |
6 | |
7 | |
8 | |
9 | void setup () |
10 | {
|
11 | connector.mode2(INPUT); // Set AIO mode as input |
12 | connector.digiWrite2(0); // Activate pull-up resistor for |
13 | last = millis(); |
14 | }
|
15 | |
16 | |
17 | |
18 | void loop () |
19 | {
|
20 | static boolean ledOn = false; |
21 | |
22 | if (countsend1.poll(1000)) |
23 | {
|
24 | bettersend=0; |
25 | }
|
26 | |
27 | int pushed = connector.digiRead2(); |
28 | |
29 | if (!ledOn && pushed == 0) |
30 | {
|
31 | ledOn = true; |
32 | }
|
33 | else if (ledOn && pushed == 1 && bettersend == 0) |
34 | {
|
35 | ledOn = false; |
36 | gescount +=1; |
37 | bettersend=1; |
38 | }
|
39 | }
|
So geht das schon besser, und kaum kann man das lesen, ergeben sich weitere Fragen. Warum ist pushed vom Typ int? Das ist doch ein Binäreingang, also würde ich da boolean verwenden. Und bettersend ist ja auch nur ein Flag, also auch boolean. Für eine richtige Entprellung sollte der Timer auf den Taster aufsynchronisiert werden, also auf Null gesetzt werden, wenn eine Flanke erkannt worden ist. Sonst kann es passieren, dass bei geeignetem Zeitpunkt, an dem der Taster prellt, die Entprellung wirkungslos ist. Statistisch zeigt sich das dadurch, dass man zu viele Impulse misst. Zur Sicherheit sollte man immer zusätzliche Klammern verwenden, die auch die Lesbarkeit verbessern:
1 | (ledOn && (pushed == 1) && (bettersend == 0)) |
Grüße, Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.