PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo und PWM



BoGe-Ro
14.11.2010, 10:40
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

radbruch
14.11.2010, 12:13
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 (http://www.conrad.de/ce/de/product/234915/), ein Kleinrelais (http://www.conrad.de/ce/de/product/505188/) (eventuell mit Ansteuertransistor) und ein zusätzliches Poti (http://www.conrad.de/ce/de/product/450036/) 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

BoGe-Ro
14.11.2010, 12:48
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

radbruch
14.11.2010, 14:35
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):

#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 https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=324867#324867)

Gruß

mic