-
        

Ergebnis 1 bis 4 von 4

Thema: Rad-Gabelsensor Sharp GP1A30R

  1. #1

    Rad-Gabelsensor Sharp GP1A30R

    Anzeige

    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2005
    Beiträge
    12
    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...

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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.

    Code:
    #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

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •