PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NE555 oä. stufenlos von 0-15kHz im VCO prinzip Regeln !?!



biele01
15.03.2010, 21:17
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 ...

williwilli
16.03.2010, 07:27
Hi biele01,

z.B.:
http://www.ferromel.de/tronic_14.htm - Bild 4
oder
http://www.umnicom.de/Elektronik/Schaltungssammlung/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...

pongi
16.03.2010, 07:34
Warum erzeugst du die Frequenz nicht mit dem µC, wenn schon eins vorhanden ist?

Hubert.G
16.03.2010, 09:27
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)
www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR

biele01
18.03.2010, 19:15
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.


/////////////////////////////////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]

Richard
19.03.2010, 08:57
@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

biele01
19.03.2010, 21:45
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...

Richard
20.03.2010, 08:02
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