-         

Ergebnis 1 bis 4 von 4

Thema: Servo und PWM

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67

    Servo und PWM

    Anzeige

    Hallo Forum,

    Ich bräuchte mal wieder einen Lösungsansatz.

    Ich habe einen kleinen DC-Lüfter mit PWM-Eingang und steuere den auch mit PWM an.
    Der erzeugte Luftdruck soll nun eine mechanische Klappe aufdrücken und somit ein Luftstrom gewährleisten.
    Leider passen Abdichtung, Klappenmasse und -Reibung, sowie Volumenstrom nur schlecht zueinander, so dass die Klappe nur wenig öffnet und schlecht schließt.

    Die Idee ist nun, die Klappe so umzukonstruieren, dass sie mit einem Servo bei laufendem Lüfter geöffnet und bei stehendem Lüfter geschlossen wird.

    Jetzt zum kompliziertem Teil:

    Da das Gerät bereits steht, habe ich aktuell, ohne Umbau nur die PWM-Information des Lüfters vorliegen.
    Da eine Servo-Ansteuerung ja beinah so etwas wie eine PWM ist frag ich mich, wie man das beides direkt verknüpfen könnte.
    Die Lüfter-PWM hab ich als sehr genügsam in Erinnerung - soll heißen, ich konnte die Drehzahl bei unterschiedlichen Vorteilern gut stellen.

    Ließe es sich nun schaffen, bei Lüfteranlauf die PWM so laufen zu lassen, dass sie auch parallel für den Servo funtioniert und danach die PWm-Frequenz so zustellen, dass der Lüfter weiterläuft und der Servo unbeeinflußt bleibt?

    Also, um eine reine softwaretechnische Lösung zu finden, bei Parallelschaltung von Servo und Lüfter?

    Es soll hierbei kein hoher Genauigkeitsanspruch an Lüfterdrehzahl und Servoposition gestellt werden.
    Es würde auch genügen die zwei Endlagen des Servos anzufahren, und danach in eine "PWM-Frequenz" oder sonstiges zu wechseln, wo der Servo nicht mehr mitkommt und der Lüfter gehorcht.

    Die zu bewegende Klappe würde auch so leicht sein, dass sie selbst bei stromlosen Servo geöffnet, bzw. geschlossen bliebe.



    Welche Ideen gibts?

    Gruß BoGe-Ro

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    Hallo

    PWM für einen Motor unterscheidet sich wesentlich von einem Servosignal. Beim Motor verwendet man die durchschnittliche Spannung über der Zeit, beim Servo ist die Länge des (High-)Impulses das Mass für den Stellwinkel des Servos.

    Mein Vorschlag für die Erweiterung der bestehenden Schaltung: Ein Servotester, ein Kleinrelais (eventuell mit Ansteuertransistor) und ein zusätzliches Poti für eine zweite Servoposition. Das zweite Poti wird parallel zum ersten Poti angeschlossen. Beide gehen aber nicht direkt auf Vcc sondern werden über einen Wechsler des Relais an Vcc angeschlossen. Das Relais wird über das PWM-Signal des Lüfters (gegebenenfalls über einen Schalttransistor) angesteuert. Mit dem Poti am Öffnerkontakt des Relais stellt man dann die Schliessposition der Klappe ein, am Schliesserkontakt die Offnenstellung (oder ungekehrt ;). Das ist aber ungetestet, ich gehe aber davon aus, dass es so funktioniert.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    Hallo Radbruch,

    Ja, so wie du das beschreibst dürfte das gehen - allerdings denk ich, ließe sich das alles auch durch einen ATtiny bewerkstelligen - der die Lüfterpwm detektiert und mit eigenem Timing den Servo stellt.
    Hierbei ließen sich dann auch eine Funktion f(pwm)=servo erstellen.

    hab mich innerlich auch schon fast damit abgefunden, dass es nicht rein softwaretechnisch möglich sein wird, den Lüfter und das Servo einfach durch unterschiedliche PWM-Frequenzen an einem Draht anzusprechen.

    Die Idee kam mir eben aus der faulheit, etwas umzubauen und eben aus der Tatsache, dass die Servo-Ansteuerung eben doch eine PWM ist, aber letztlich mit einem nur sehr kleinen Mittelwert.

    Gruß BoGe-Ro

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    Hallo

    Ein Tiny (ein 13er z.B.) kann das natürlich locker ohne zusätzliche Bauteile. Ich konnte ja nicht ahnen, dass auch ein µC eingesetzt werden kann

    Drei Servos an einem Tiny13 in C (mit internem 1,2MHz-Defaulttakt):
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define x_mitte 17
    #define y_mitte 17
    #define z_mitte 17
    
    unsigned int x, y, z, demo;
    
    void delay(uint16_t d)                                // Warteschleife
    {
       uint16_t d1, dummy;
       for (d1=d; d1>0; d1--) dummy^=d1;
    }
    ISR(TIM0_COMPA_vect)                                  // Servoansteuerung
    {
    static uint16_t count=0;
       if (count>x) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
       if (count>y) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);
       if (count>z) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2);
    
       if (count < 200) count++; else count=0;
    }
    
    int main(void)
    {
       x=x_mitte;                                         // Servos Basisposition
       y=y_mitte;
       z=z_mitte;
       demo=5;                                            // 5 Einzelschritte
       
       DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);             // Servoausgänge
       PORTB= (1<<PB3);                                   // PullUp Taster ein
       
       TCCR0A =  (0 << WGM00) | (1 << WGM01);               // CTC-Mode
       TCCR0A |= (0 << COM0A0) | (0 << COM0A1);            // ohne OCR-Pin
       TCCR0B = (0 << CS02)  | (0 << CS01) | (1 << CS00);   // no prescaler
       TIMSK0 =  (1 << OCIE0A);                            // Interrupt ein
       OCR0A  = 50;  // nicht wissenschaltliche Frequenz
       sei();
    
       while(1)
       {
          y=y_mitte+4; delay(400);                        // Schritt
          if (demo) while(PINB & (1<<PB3)); // warten auf Taste
          for (; x>x_mitte-12; x--)
          {
             if (x==5) y=y_mitte+7;
             if (x==0) y=y_mitte+5;
             if (x==-11) y=y_mitte+3;
             delay(120+x);
          }
          x=x_mitte-15; y=y_mitte+4; delay(100);
          y=y_mitte; delay(300);
          x=x_mitte+5; delay(1000);
          if (demo) demo--;
       }
       return(0);
    }
    (Code aus http://www.roboternetz.de/phpBB2/zei...=324867#324867)

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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