-         

Ergebnis 1 bis 8 von 8

Thema: NE555 oä. stufenlos von 0-15kHz im VCO prinzip Regeln !?!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.05.2009
    Ort
    Dresden
    Beiträge
    90

    NE555 oä. stufenlos von 0-15kHz im VCO prinzip Regeln !?!

    Anzeige

    Hallo,
    Ich habe eine kleine Frage zu einem Rechteckimpulsgenerator.
    Ich würde gern ein Varriable Frequenz im bereich von 0 - ca 15Khz erzeugen.
    Die range von 0-15kHz würde ich gerne über ein 0-5V analoges Eingangssignal (1024 verschiedene Spannungen die von einem µC erzeugt werden) steuern. (oder auch digital, oder PWM)egal was halt geht. Das Problem an der ganzen sache ist das meines wissens die frequenz nicht nur von einem eingangsstrom abhängt sondern auch die größe der verwendeten Kondensatoren und wiederstände einen einfluss haben. Giebt es eine möglichkeit einen Timer so zu beschalten das er eine 0-15kHz Range bedient (und nicht wie zb 0-100bei Kondensator A und 80-1000 bei Kondensator B) ich kann keine Dipschalter bedienen um kondensatoren auszutauschen, damit ich höhere frequenzen erreiche.möchte es gern stufenlos....giebt es da eine Möglichkeit? oder etwas föllig anderes woran ich vieleicht noch nicht gedacht habe???(mit mein µC (Arduino 2009) ists intern zwar möglich aber ich hab noch nicht rausgefunden wie ...

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.07.2008
    Alter
    54
    Beiträge
    224
    Hi biele01,

    z.B.:
    http://www.ferromel.de/tronic_14.htm - Bild 4
    oder
    http://www.umnicom.de/Elektronik/Sch...g/Vco/Vco.html

    und: DIP-Schalter bedienen? Wozu gibt's für solche Fälle denn Relais (z.B. kleine Reed-Relais). Zwei freie Ports des Prozessors sind nach Herrn Boole 4 möglich Kondensatorwerte...
    Geht das nicht auch einfacher???

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.08.2006
    Ort
    Budapest
    Alter
    30
    Beiträge
    563
    Warum erzeugst du die Frequenz nicht mit dem µC, wenn schon eins vorhanden ist?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Du musst dich mir den Timern in deinem Arduino beschäftigen, dann kannst du die Frequenzen problemlos erzeugen.
    Tutorials hier: www.rn-wissen.de/index.php/Timer/Counter_(Avr)
    http://www.mikrocontroller.net/artic...Zähler_des_AVR
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    06.05.2009
    Ort
    Dresden
    Beiträge
    90
    Hallo, also ich habs jetzt hinbekommen, Ich hab zu meinen Programm eine Interrupt service Routine gestartet .wobei ein timer bis 655XX Zählt.
    aus em ich wiederum auf pin 9 ein rechtecksignal generiere. die frequenz hängt von meinem Eingelesenen RC Signal (Xsmoth) ab.
    funktioniert von 0 bis 15kHz kann ich mit meiner Fernsteuerung die frequenz regeln.

    Allerdings sind dadurch 2 neue Probleme entstanden. erstes ist das vermutlich durch den timer mein eingelesenes Signal vom Rc Empfänger willkürlich ab und an Unmögliche werte einliest. da muss irgendwas mit dem timing nicht mehr stimmen.
    Das zweite ist das ich beim Initialisieren des Arduino oder nach einem Reset eine Kurze schnelle frequenzfolge auf pin 9 (mein ausgang) habe, was sozusagen meinen Schrittmotor beim einschalten des arduino ungewollt 200-300 schritte machen lässt. kann man das unterbinden, oder irgendwie sagen it einem Delay das die Interrupt Routine erst nach 2 Sekundn nach initialisieren beginnt, oder das 2 sekunden meine sample (0= 0V 255=5V) auf null stehen. oder bekomme ich das damit auch nicht weg.

    Code:
    /////////////////////////////////initialisierungen daten timer und Interrupt////////////////////////////////
    float Xsmoth_plus = (Xsmoth - 250); //final smoothstepped value
    float Xsmoth;
    int taktPin = 9;
    void writetakt( uint8_t val ) {
      OCR1A = (val);
    }
    uint16_t phase = 0;
    uint16_t speed = 0;
    uint8_t sample = 0;
    
    SIGNAL(TIMER1_OVF_vect){
      writetakt(sample);
      phase += speed;
    
      if(phase >= 32768)
      sample = 255;
      else
      sample = 0;
      if (Xsmoth < 1)
       sample = 0;
    }
    /////////////////////////////////initialisierungen daten zum PWM einlesen////////////////////////////////
    int RCPin = 2;                                                               //Eingang rc signal
    int Motor_drehrichtung = 13;                                                // LED Pin(Motor Drehrichtungssignal für SM steuerung
    int timeX = 0;                                                             //Gelesener Zahlenwert des RC Signals
    int timeX_old = 0;                                                        // im vorherigen Durchlauf gemessener Wert (time X)
    int timeX_final = 0;                                                     // Fertiger ausgegebener Wert
    int Zero_delay_timeLED = 250;                                           // Mittelstellung des RC Steuerhebels
    
    long lastPulseX = 0;                                                  // die Zeit in Millisecunden des letzten Pulses
    long mstime = 0;                                                     // Liest die zeit in Millisecunden
    long hptime = 0;                                                    //  Liest die Zeit in Microsecunden
    
    extern volatile unsigned long timer0_overflow_count;
    unsigned long hpticks (void)
    {
     return (timer0_overflow_count << 8) + TCNT0;
    }
    
    /////////////////////////////////initialisierungen für die Nichtlineare Kurvenumsetztung der werte////////////////////////////////
    
    #define SMOOTHSTEP( Xsmoth) (( Xsmoth) * ( Xsmoth) * (3 - 2 * ( Xsmoth)))
    #define SMOOTHSTEP_plus( Xsmoth_plus) (( Xsmoth_plus) * ( Xsmoth_plus) * (3 - 2 * ( Xsmoth_plus)))
    
    float TimeX_Min_Val_minus = 1500.0;            //Input Min Value ,hier wird die zu Interpolierende Range festgelegt
    float TimeX_MAX_Val_minus = 0.0;              //Input Max Value, hier wird die zu Interpolierende Range festgelegt
    float TimeX_Min_Val_plus = 0.0;              //Input Min Value ,hier wird die zu Interpolierende Range festgelegt
    float TimeX_MAX_Val_plus = 1500.0;          //Input Max Value ,hier wird die zu Interpolierende Range festgelegt
    float N = 250.0;  
    float Nplus = 250.0;                      //Maximaler eingangswert
    float v;                                 //smoothstep expression variable
    
    /////////////////////////////////////
    
    void setup() {
     Serial.begin(115200);                                      // Kommunikationsgeschwindigkeit Pc
    
     pinMode (taktPin, OUTPUT);
     pinMode(RCPin, INPUT);                                    //R/C Pin als Input setzten
     pinMode(Motor_drehrichtung, OUTPUT);                  //LED simuliet Rückwärtslauf (pin High versteht Schrittmotorsteuerung als RW)
    
     TCCR1A = _BV(WGM10) | _BV(COM1A1);
     TCCR1B = _BV(CS10) | _BV(WGM12);
    
     TIMSK1 |= _BV(TOIE1);
    
    }
    void loop() {
    
     if(millis() - lastPulseX >= 5)                               //Signal alle 5 Millisecunden auslesen
     {
       while(!digitalRead(RCPin) == HIGH)                         //Auf das Nächste RC Signal von RCPin Warten
       {
         continue;
       }
       mstime = millis();
       hptime = hpticks();                                        //wenn das Signal Ankommt, Beginn der Startzeit aufzeichnun
       while(!digitalRead(RCPin) == LOW){
         continue;
       }
       mstime = millis();
       timeX = (hpticks()) - hptime - 220;                       //Hier wird der unterschied zwischen start und endzeit ermittelt, Das Ergebnis ist das Rc Signal.
    
    ////////////////////////////////////////Tiefpassfilter zum glätten des gemessenen wertes///////////////////////////////////////////////
    
       timeX_final = (0.1 * timeX) + (0.9 * timeX_old);       //10 Prozent des Wertes des ersten Durchgangs, werden mit 90 Prozent des Wertes des 2. Durchganges addiert
      
      /////////////////////////////////// Wertebereich begrenzen////////////////////////////////////////////////////////////////////////////
    if (timeX_final > 500)                                  
       {timeX_final = 500;}
    
    if (timeX_final < 0)
       {timeX_final = 0;}
    ///////////////////////////////////////werte in CW und CCW übersetzen///////////////////////////////////////////////////////////////////
    if (timeX_final < 250)
      {
        v = timeX_final / N;                                                            // Unterteilungen geteilt durch die nummer an schritten.
        v = SMOOTHSTEP(v);                                                             // Starten der smoothstep expression on v.
        Xsmoth = (TimeX_MAX_Val_minus * v) + (TimeX_Min_Val_minus * (1 - v));         // Lineare Interpolation Ausführen auf basis der zuvor gesetzten werte
       digitalWrite (Motor_drehrichtung,HIGH);
      }
    
    
    
    if (timeX_final > 250)
      {
        v = (timeX_final - 250) / Nplus;                                                         // Unterteilungen geteilt durch die nummer an schritten.
        v = SMOOTHSTEP(v);                                                                      // Starten der smoothstep expression on v.
        Xsmoth = ((TimeX_MAX_Val_plus * v) + (TimeX_Min_Val_plus * (1 - v)));                  // Lineare Interpolation Ausführen auf basis der zuvor gesetzten werte
        digitalWrite (Motor_drehrichtung,LOW);
      }
    
    ////////////////////////////////////////////Eingegangener wert zu nächsten Loopdurchlauf übergeben//////////////////////////////////////
     timeX_old = timeX_final;                    // messwert für Tiefpass an nächsten Durchlauf übergeben
    
     speed = Xsmoth;                            //Ausgabe Frequenz geschwindigkeit
    
     Serial.println(Xsmoth);              //Zeigt das Aktuelle errechnete Ergebniss an
    
    ///////////////////////////////////////////Werte für nächsten loopdurchlauf übergeben////////////////////////////////////////////////
       hptime = 0;
       lastPulseX = millis();
     }  
    
    }[/list]

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    @biele01

    Gestern ist bei mir das RN Motorcontrol (DC) eingetroffen. zu meiner
    Überaschung kann man dort auch einen Üblichen RC Empfänger anschließen
    und damit dann Motore steuern. Ich will damit den RN Dualmotor Treiber
    ansteuern. der ist dafür schon mit ensprechenden Stiftleisten ausgestattet.

    Das, RN Motorkontrol + RN Dualmotortreiber könnten für Dich also ganz
    genau das Richtige sein? Das RN Motorkontrol hat 2 Eingänge für 2
    Enpfangs Kanäle, Links/Rechts und +/- Geschwindigkeit und wird einfach
    auf das RN Dualmotor aufgestekt.

    Damit kannst Du dann ohne Programmierarbeit und ohne Prozessor nur
    mit einer RC Fehrnsteuerung 2 Motore ansteuern.

    Getestet habe ich das noch nicht, muß heute erst einmal meinen Arbeitstisch
    vom angesannelten "Müll" befreien ehe ich anfaqngen kann zu Basteln. (
    Ich habe noch einen Gyro für z.B. Hubis, und werde damit einmal versuchen
    einen 2 Rädrigen Bot zum Balancieren zu bringen. Theroretisch sollte sich der
    Gyro einfach an den Servoeingang von der RN Motorcontrol stecken lassen
    um die Motore mittels Gyro dann zu steuern.....

    Gruß Richard

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    06.05.2009
    Ort
    Dresden
    Beiträge
    90
    servus..
    der RN motorControll ist für meine zwecke glaube ich nicht das richtige da ich Schrittmotoren ansteuere. falls es doch geht glaube ich nicht das das bord das kann was ich brauche. Zb die Bewegung des steuerhebels wird nicht linear zur motorgeschwindigkeit "übersetzt" ich habe eine Logarhytmische funktion mit eingebaut... Super einfach, programmiere seit 3 Wochen.. fetzt..!! Des weiteren habe ich eine Herforragende Microschrittsteuerung (16 Microschritte) für 25 € von Nanotec (SMC 11-2) die ist der wahnsinn, wie fein das geht... außerdem hab ich mir das Arduin 2009 gekauft auch 25€ 16mHz ATmega382 Chip drauf und die programmierung dazu ist kinderleicht,bin echt begeistert. Das Ding ost Ja das mein Progrämmlein Ja schon Komplett funktioniert, allerdings hab ich eben dieses kleine "vermutlich" timing problem, wobei ich etwas fachkundigere Hilfe brauche... sonst funzt super. Kann ich nur empfehlen und hat mich deutlich weniger gekostet, mit deutlich mehr Potential...

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Kann sein das ich Dich etwas verwechselt habe, hie sind anscheinend
    mehrere die so einen Kameraarm bauen. Ich hatte jetzt eher DC
    Motoren im Kopf. Bin Gestern mal angefangen Servos zu Steuern und
    mit einem 2. Kanal den Gyro einzustellen. Klappt eigentlich recht gut.
    Jetzt muss ich erst den einen Motor wieder zusammenbauen, habe den
    Hallsensor leider "Invers" betrieben was derselbe nicht überlebt hat.

    Ne RN Motor control gibt es (glaub ich) auch für Stepper, aber wenn es
    eh bei Dir klappt hat sich das ja erledigt.

    Gruß Richard

Berechtigungen

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