PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rad-Gabelsensor Sharp GP1A30R



Miklo
13.09.2006, 14:01
Hallo zusammen,
ich bin ein ziemlicher Newbie was das Programmieren von mc angeht. Ich habe nun ne Frage, vielleicht kann mir ja jemand einen kleinen Tipp geben:
Ich habe ne testschaltung mit "Asuro" dem Roboter , gebestelt, wo ich nun den Pin PD2 am Prozessor ATMega8 "misshandle" für den Sensor. ich habe es nun soweit gebracht, dass mir der Sensor bei Hell angibt und bei dunkel nichts tut. Nun möchte ich diese Signale zählen, um eine Umdrehung des Rades zu bestimmen. die Scheibe ist in 120 schwarze und 120 weisse felder geteilt. Wie könnte nun so ein GCC-Code aussehen, damit er diese Implulse zählt und bei 240 Impulsen der Motor stoppt oder ne Led an z B. PD4 nach diesen Impulsen ausgeht?
Wäre echt froh, um jeden kleinen Tipp.
PS: Der Port PD2 ist als normaler IO-Eingang konfiguriert.
Mit freundlichen Grüssen
Manuel Miklo

tdomega
14.09.2006, 03:55
Hallo,

Habe grade was ganz ähnliches gemacht, allerdimgs mit nem Mega32, von daher wird die mein Code wahrscheinlich nicht helfen...
Im Grunde hast du 2 Möglichkeiten:
1.) Den Ausgang an einen InterruptPin anschließen und in der ISR dann bei jedem auftreten eine Zählvariable erhöhen. Der Vergleich mit nem voreingestellten Wert und das Motorabschalten sollte dann nicht das Problem sein.
2.) Nen Timer einstellen der mit höherer Frequenz die ISR aufruft als der Sensor Signale geben kann. Ist deine max. Drehzahl 10/s bei 120 s/w-Übergängen musst der Timer 2400 mal in der Sekunde den Sensor abfragen. Da keine AD-Wandlung vorgenommen muss, sondern nur High/Low geprüft wird sollte das auch noch im akzeptablem Zeitrahmen bleiben. Gezählt wird hier wenn sich 2 aufeinanderfolgende Werte unterscheiden, allderings nur einmal, also bei High -> Low oder bei Low -> High.

Ich bevorzuge 1. Die 2. Möglichkeit hab ich selber noch nicht ausprobiert, sollte aber klappen. Wahrscheinlich ist die Frequenz des Timers besser noch höher anzusiedeln...

m.a.r.v.i.n
14.09.2006, 08:28
Hallo Manuel,

hier ist mal ein Beispielcode (ungetested) für dein Problem.

Funktionsweise:
*Es wird eine Globale Variable PulseCnt deklariert.
*In der Initialisierungs Routine wird für Port PD2 (INT0) Interrupt bei steigernder Flanke enabled.
*In der Interrupt Funktion SIGNAL(SIG_INT0) wird einfach nur PulseCnt erhöht.
*In der Main Funktion des Programmes kann man PulseCnt dann auswerten. Da nur auf steigende oder fallende Flanke getriggert werden kann, müßte man in diesem Fall auf den Wert 120 abprüfen, nicht 240.



#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>

unsigned int PulseCnt;

SIGNAL(SIG_INT0)
{
PulseCnt++;
}


void Init(void)
{
DDRD |= (1 << DDD2); // Port D2 als Eingang
MCUCR |= ((1 << ISC01) | (1 << ISC00)); // Steigende Flanke generiert Interrupt
GICR |= (1 << INT0); // Erlaube externen Interrupt 0
sei();
}


int main(void)
{
Init();

while(1)
{
if (PulseCnt >= 120) // mind. 120 High Flanken
{
PulseCnt = 0;
; // Tue irgendwas sinnvolles
}
}
return 0;
}

Hoffe, ich habe jetzt nichts wesentliches vergessen.

Gruß m.a.r.v.i.n

Superhirn
28.01.2007, 17:18
Hi,

ich hab 2 GPA30RJ00F. scheitere jedoch schon an der ansteuerung.

ich hab einen spannungsteiler mit 1k und 470 Ohm verwendet um ein signal für die soundkarte abzuleiten(sollen 1-2V sein). Jedoch zieht das ganze so viel strom (eigendlich zieht die ganze schaltung nur 0.08A laut netzteil). Jetzt ist die Spannung direkt am Vo Pin nur 0.1V oder weniger. Der 2. ausgang ist unbeschaltet. Er funktioniert eiwandfrei. ein umlöten ergab dass dann der andere funktionierte und der angelötete nicht funktionierte, parallelschaltung nutze auch nichts.

Könnt ihr mir helfen?

marvin:
bei dir reicht eine char variable denn du setzt sie bei 120 eh wieder auf null und char geht bis 256 :)

mfg
Thomas