Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

61

Sonntag, 28. Oktober 2007, 13:21

???
LM2940 ist ein 1A Sp. Regler!

Grüße
Milan

62

Sonntag, 28. Oktober 2007, 13:32

Autsch. Sorry. Bin beim Datenblatt anklicken in die falsche Zeile geraten. :O
Hast natuerlich recht.
Ja, dann tut's der nautuerlich auch.
War beim LM2931 gelandet.
Gruss
Thomas

🖖
So long, and thanks for all the fish.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Thomas_R.« (28. Oktober 2007, 13:32)


Dante

RCLine User

Wohnort: Rheinknie

  • Nachricht senden

63

Sonntag, 28. Oktober 2007, 15:57

Wurpfel:
ich habe noch 4 aus dem DevKit, brauche also noch nichts...

Sven:
Wenn Du bei 6 Servos und ca. 20 Schaltfunktionen bist, reissen Dir die Bootler das Teil aus den Fingern.

Leo
Es ist besser etwas zu wissen, als es nur besser zu wissen
Trollfilter: Ein

64

Sonntag, 28. Oktober 2007, 21:58

Empfänger

Hi,

ich habe heute eine wenig gebastelt. Ergebnis ist ein fertig verlöteter
5 K-Empfänger. Der 3,3V Regler wird aber noch ausgetauscht:-)
Die Servostecker sind nach "unten" eingelötet. So kann ich den Empfänger in die Kabinanhaube kleben ohne das nachher die Kabel zu sehen sind. Bei der 2-Layer-Variante der LP sind die Stecker dann seitlich. Die Leiterplatte von 8-Kanal ist auch gleich fertig.



@Leo

Zitat

Wenn Du bei 6 Servos und ca. 20 Schaltfunktionen bist, reissen Dir die Bootler das Teil aus den Fingern.


Das geht problemlos mit PCF8574 für 8 Schaltausgänge über I2C. 3 Davon kann man anstecken. Für sowas ist ein Bussystem perfekt:-)

Gruß Sven

Space

RCLine User

  • »Space« ist der Autor dieses Themas

Wohnort: Hasloh b. Hamburg

  • Nachricht senden

65

Montag, 29. Oktober 2007, 00:06

Ups, ich habe den ganzen Tag gearbeitet :dumm: , während andere bereits schon mit dem Empfänger fertig sind :ok:

Zitat

und hier die große Variante vom Empfänger, zum kritisieren und zerreden.
Kritisieren und zerreden dürfen nur jene, welche ebenfalls parktikable Vorschläge machen. Aber was soll ma da kritisieren?
Alleinig die Taktversorgung über den internen RC macht mir Sorgen bezüglich der asynchronen UART Kommunikation und der Servomittellage im Sommer vs Winter.

Die Idee die 3 Reihigen Stecker auf Ober und Unterseite zu löten ist gut. Ich habe trotz recht intensiver Suche bisher keinen Lierferanten gefunden, welcher 3Reihig und 90° gewinkelt Stecker in Stückzahlen < 100 liefert.

Meine Schaltplanbemühung für den Senderteil hat gestern einen Dämpfer erhalten (anderer Thread hier in der Rubrik ). Ich habe den Schaltplan aber wieder hergestellt und schon mal angehangen, PCB folgt.

Thomas
»Space« hat folgende Datei angehängt:
Gruß

Thomas

^____

RCLine User

  • »^____« wurde gesperrt

Wohnort: anonymisiert

Beruf: anonymisiert

  • Nachricht senden

66

Montag, 29. Oktober 2007, 00:09

Hallo Sven,

Kompliment! :ok:

Gruss Bruno

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

67

Montag, 29. Oktober 2007, 09:50

Hi leutz


wenn ihr zb ein crumb168 board und ein ULN2803AP nehmt könnt ihr pro käfer 16 funktionen mit 30V und 0,5A schalten.


kombiniert man ein ATt15, ein logikgatter, zwei ULN und einige LM317 sind pro busknoten 16schalter machbar. nehmt ihr L6205 Hbrücken sind schrittmotoren einfachst anzuhängen..

die ULN sind kräftig genug um auch leistungsFETs zu schalten.






einige Bestellungen sind noch eingetrudelt, ich habe noch:
5 crumb168 20.- €
1 crumb8 12.- €
10 ATt26 2.- €
10 ULN2803AP, 8fach 0,5A darlingtontreiber 2.- €
10 PC817, vierfach optokoppler 200mA 1.- €
1 1,5" display3000 D62


ich bestelle meistens 10er oder 25er packungen. damit habe ich einen jahresbedarf abgedeckt



@Sven
super ==[] ich würde aber das XBEE separat anschliessen, dann reichen vier buchsen..

für alle die kein SMD verarbeiten können: das crumb168 ist etwa gleich gross: die RS232 (mit+ohne PCpegel) ist schon drauf, ebenso reset/brownout und läuft mit 20MHz. es besitzt genügend speicher um per bootloader programmiert zu werden ;)
bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

68

Montag, 29. Oktober 2007, 23:04

Servoimpulserzeugung

Hi,

Mein Empfänger erzeugt Servoimpulse:-) War in paar Minuten erledigt:-)

Gruß Sven



#include <avr/interrupt.h>
#include <stdlib.h>


volatile uint16_t RX[5]; //RX-Daten

uint8_t PPM =0;
uint16_t OCR1Atemp =0;

ISR(TIMER1_COMPA_vect) //interupt
{
if(PPM==0)
{
PORTB= 2; // setzen Kanal1
OCR1A=OCR1A+RX[0];
}
if(PPM==1)
{
PORTB= 4; // setzen Kanal2
OCR1A=OCR1A+RX[1];
}
if(PPM==2)
{
PORTB= 8; // setzen Kanal2
OCR1A=OCR1A+RX[2];
}
if(PPM==3)
{
PORTB= 16; // setzen Kanal2
OCR1A=OCR1A+RX[3];
}
if(PPM==4)
{
PORTB= 32; // setzen Kanal2
OCR1A=OCR1A+RX[4];
}
if(PPM==5)
{
PORTB= 0;
OCR1A=OCR1Atemp=(OCR1Atemp+20000);
PPM=-1;
}
PPM=PPM+1;
}

int main (void)
{
PORTB=0;
DDRB=0b00111110;
TCNT1=0;
OCR1A=OCR1Atemp=100;
TCCR1A=0;
TCCR1B=2; // CK/8
TIMSK=(1<<OCIE1A);
sei();
PPM=0;
RX[0]=1100;
RX[1]=1300;
RX[2]=1500;
RX[3]=1700;
RX[4]=1900;

while(1);
}

69

Dienstag, 30. Oktober 2007, 09:44

Hallo Sven,

klasse, wie schnell es hier voran geht...
Muss momentan mehr Arbeiten und komme deshalb leider am Projekt nicht so schnell weiter..

Nur mal kurze Anmerkungen zu deinem Code:

Grundsätzlich sollten Interrupt-Routinen möglichst kurz sein. Sonst bekommst du nachher massive Probleme, wenn sich verschiedene Interrupts gegenseitig blockieren. Gerade bei zeitkritischen Sachen wie Servoausgabe muss man auf sowas achten (habe da bei einem anderen Projekt gerade massive Probleme..)

Folgende Ideen dazu:
- statt immer if ab dem zweiten else if nehmen, damit sollte er dann gleich rausspringen (mal im Disassembler anschauen). Damit wird die Durchlaufzeit leider verschieden lang, je nach Kanal... nicht schön.

- Mach das setzen mit einer berechnete Variable statt mit den festen werten, so wie in meinem Codebesipiel weiter oben:

Zitat

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
PORTB |= (1<<scount); //Servo-Pin an (scount = Servo-Nummer)
OCR1B = (OCR1A+1000+4*sp[scount]); //Ausschalt-Wert (sp=servoposition[])
}
SIGNAL (SIG_OUTPUT_COMPARE1B)
{
PORTB &=~(1<<scount); //Servo Pin aus
if (scount < 4) //Jetzt 4 Servos
{
scount++;
OCR1A = (2100 * scount);
}
else
{
scount = 1;
OCR1A = 0; //Wieder von vorn
}

}


Weitere Optimierungsmöglichkeiten:
Variablen, die in Interrupts oft gebraucht werden (bei dir z.B. PPM) direkt als register festmachen. Spart ein paar zyklen:

Zitat

register uint8_t PPM asm("r3")

(Ok, könnte übertrieben sein und muss kontrolliert werden, aber um das letzte rauszuquetschen... 8)

Soweit dies...

Bis denn

Marc

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

70

Dienstag, 30. Oktober 2007, 12:34

Hi leutz


servoimpulse kann man auch anders erzeugen, inkl. testen der servoweggrenzen :shy:



ein servopuls ist 1-2ms lang.

ansatzA
timer zwei mal laufen lassen ;)
pin(servoNrX) ein
timer (compare-match) mit unterster grenze laden (per ISR)
neuer wert für servo(X+1) berechnen, telemetrie abfragen, rumtrödeln..
ISR lädt den timer mit wert(x) und der max.grenzeServo(x)
pin(servoNrX) aus

schleifenzähler um eins erhöhen, watchdog löschen




die min/max/failsafe daten stehen in einer lookup..


ansatzB
zuerst servowerte 1-x berechnen
werte ins SRAM schieben


nebenher läuft unabhängig davon:
pin(x) ein, per ISR timer mit wert x laden aber nur wenn er gültig ist sonst nächster wert nehmen, pin(x) aus


auch hier kommen die statischen werte aus einer lookup



ansatzA ist praktischer, das hauptprogramm besteht nur aus einer schleife
und einigen gosub :D
man muss nie in einer ISR testen ob der zu ladende wert gültig ist..
mit beiden methoden ist es möglich mehrere servos synchron zu bewegen.
je nach anspruch sogar mit einem separaten timer..


mischer/expo sind shift-rotate-befehle und additionen. wie oft und in welche richtung steht auch in der lookup. der wegüberlauf testet der timer :evil:


das abfragen und adressieren der telemetrie erfolgt mit gosubs.
die adressen (I2CslaveXX ist datentyp.untergruppe.xxx.yyy) mit denen die werte ergänzt werden stehen auch in einer lookup.





beim inizialisieren werden die lookups aus dem EEPROM ins SRAM geschoben, der watchdog und die interrupts gestartet.



will ich den busknoten für ein modell einrichten werden die min/max/failsafe-werte und die drehrichtung mit einem konfigurationsdialog per knüppelbewegung festgelegt, dann im modellEEPROM gespeichert.
der busknoten ist bereits für seinen einsatzort vorprogrammiert und die mischerlogik voreingestellt. nun kann das mischverhältnis im laufenden betrieb angepasst werden und nach der landung ins EEPROM gebrannt werden.
auch die trimmwerte können dauerhaft gespeichert werden..


failsafe steht auch in einer lookup.
bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

71

Dienstag, 30. Oktober 2007, 13:44

Hallo,

es geht jetzt wohl in Richtung Detailfragen... Da einiges an Hardware steht, fände ich das ok, macht den Thread halt unübersichtlich...

Sollte man das ganze teilen HW-SW-Allgemein?

Davon abgesehen... weiter :D

@Wurpfel:

Zitat

ISR lädt den timer mit wert(x) und der max.grenzeServo(x)

Beides? oder das was niedriger ist? (würde mehr Sinn ergeben...)
Wie wärs mal mit echtem Code ?

Zitat

AnsatzB: pin(x) ein, per ISR timer mit wert x laden aber nur wenn er gültig ist sonst nächster wert nehmen, pin(x) aus
was passiert, wenn der wert ungültig ist? Hold des letztem gültigen?

Zitat

mischer/expo sind shift-rotate-befehle und additionen...
Darf man das sehen? Alle lernen gern!

Zitat

nach der landung ins EEPROM gebrannt
Und was passiert bei einem Reset in der Luft (Spannungsspitze/-abfall)? Alles weg?

Gruß

Marc

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

72

Dienstag, 30. Oktober 2007, 16:25

Hi Marc

es gibt mehrere timer die sich durch die art des/der abbruchkriteriums unterscheiden, bis zu drei sind möglich ;)


da ich den gleichen typ verwende lade ich die untere und obere.
beim ersten durchlauf gehts sicher nur bis zur unteren, dann muss beim zweiten durchlauf nur die untere erneuert werden.. spart zeit!


wenn die ISR zuschlägt könnte gerade ein neuer wert ins register geschrieben werden. also benötigt man eine flag um sowas zu verhindern..


wenn du beim delta zb servoL und R mit je 50% QR und 100% HR mischt könntest du irgendwelche divisionen und ähnlich zeitraubendes zeugs machen
oder
einfach den wert im register um eine oder mehr stellen nach rechts verschieben

knüppel halb links und etwa halb gezogen, das hier sampelt der senderknoten
HR 0100 0000
QR 0100 0000

oben ist die verknüpfung so festgelegt:
servoL = HR + 50% QR
servoR = HR - 50% QR

der wert für 50% QR erhält man durch einseitiges verschieben nach rechts um eine stelle
50% QR sind dann 0001 0000 ;)

nun addiert man das ganze für servoL
bzw zählt es für servoR ab





ich arbeite allerdings noch lieber mit differenzübertragung, dh gesendet wird nur die differenz zum vorgehenden sample der knüppellage in 8bit. da sich der bodenteil eh langweilt können mit oversampling/mittelwertbildung und registerschieben selbst shit-poties zu einem linearen verhalten gebracht werden.

wenn die knüppel in mittellage sind wird 255 gesendet. die servostellungsroutine weisst dann jedem betroffenen servo die gespeicherte trimmstellung zu.
das gas ist 1:1 der knüppelweg in 8bit.


beim einschalten inizialisiert man mit werten aus dem EEPROM. wer will kann hier zb für das HR etwas mehr HRtrimm vorsehen, das gas steht immer auf null..
die werte hat der nutzer beim einrichten/servogrenzen festlegen/failsafe irgendwie sinnvoll gewählt..
nach dem einfliegen wird man eine geeignete trimmposition gefunden haben. die wird gebrannt.
je nach wetter sind dann klitzekleine korrekturen notwendig, die werden aber nicht abgelegt..

wer einen verbrenner fliegt verändert die trimmung mit der laufzeit, natürlich abhängig von der gasstellung/spritverbrauch.
die trimmung/mischer fürs starten und landen legt man als flugphase ab.




PS
es gibt keinerlei beschränkungen für bedienschalter :D
bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

73

Dienstag, 30. Oktober 2007, 18:25

C und Anderes

Hi,

gut, die Interuptroutine kann noch optimiert werden, geht aber eher in Richtung switch/ case.
Die Daten bekommt der Interupt über das Feld. Gerechnet wird in der Hauptschleife. und die sorgt immer für gültige Daten die ohne Berechnungen verarbeitet werden können. Das ist also asyncron:-)
Der Timer soll konstant laufen da er noch für andere Timings gebraucht wird.

Nachdem ich das PPM-Signal von einem 35MHz Empfänger über Input-Capture eingelesen habe, habe ich heftig Jitter festgestellt. Das ist normal, das brauchen unsere Servos sonst fühlen die sich unwohl:-)

Optimiert wird erst wenn es notwendig ist.

@wurpfel

Das X-bee muss auf die LP aufgesteckt werden! Sonst liegen hier auf dem Schreibtisch zu viele Kabel rum:-)

Wer tauscht ZLDO33 gegen eine 5K-Empfänger-Leiterplatte?

Hat schon jemand das X-Bee mit einer W-Lan-Antenne verkuppelt?

Gruß Sven

74

Dienstag, 30. Oktober 2007, 19:11

Hallo Sven,

Zitat

switch/ case

Das wird leider nichts helfen... Wenn ich richtig sehe, gibt es im Befehlssatz des AVR keine Abbildung für dieses Konstrukt und da alles von C in Assembler umgesetzt wird, mogelt der Compiler das wieder mit vielen Überprüfungen und Jumps hin. Aber ich lerne gern dazu... Einfach mal im Disassembler anschauen.

Zitat

Jitter

Hast du den getrennt gemessen an den Sorvos nachher gesehen? Könnte auch kommen, da der Servo-Interrupt so lang ist. Bei mir hält sich der Jitter nämlich in Grenzen...

Grüße

Marc

75

Dienstag, 30. Oktober 2007, 19:43

jitter und stecker

Hi,

Hier meine Variante der "abgewinkelten" 3fach Steckleiste. Sind 3er Abschnitte einfacher Stiftleiste mit einem Beinchen der abgewinkelten Dppelten veredelt.
Ist eine echte Friemele die Stifte alle gerade anzulöten. Wer es schön haben will muss leiden ( oder so ähnlich:-)

Der Jitter kommt vom 35MHz Empfänger. Gemessen wurde per Hardware (timer1 capt, als einziger Interupt!), was ein Springen um 1 digit erklären würde. es waren aber +-0,5% also um insgesamt 10 bei 1000 Positionen.

Wenn der PPM-Interupt etwas länger dauert verursacht das kein Probleme.
Die Zeitfehler durch den Einsprung über mehrere IF sind Konstanten und damit unbedeutend. Ein etwas verspäteter "Aussprung" stört höchstens den RX-, TX oder ADC Interupt. Und all denen ist das egal:-)
RX-TX und ADC sollten aber wirklich kurz sein um PPM nicht zu sehr zu stoeren. Aber ich optimiere erst wenn die Servos anfangen zu zittern!

Gruß Sven

[IMG]http://jetcontrol.de/2g4 001.jpg[/IMG]

76

Dienstag, 30. Oktober 2007, 19:50

sprunglisten

Hallo Marc,

aus Erfahrung ist C meisst besser als das was wir uns in asm ausdenken. Ein switch könnte durch indirekte Sprünge realisiert sein. Trau mal einer Hochsprache mehr zu:-)

add ZL, Temp ; calculate the pointer
adc ZH, Null
ijmp ;Z
TIM2COMP_SWITCHS6_TAB: ; jump table to the 6 possible commutation states
rjmp TIM2COMP_SWITCHS6_0
rjmp TIM2COMP_SWITCHS6_1
rjmp TIM2COMP_SWITCHS6_2
rjmp TIM2COMP_SWITCHS6_3
rjmp TIM2COMP_SWITCHS6_4
rjmp TIM2COMP_SWITCHS6_5

Gruß Sven

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

77

Dienstag, 30. Oktober 2007, 20:52

hi leutz


ich progge nur in BASCOM...

aber timer werden nur von einer instanz verwendet ;)

der ATt15 hat zwei timer
einer ist für die kommunikation über I2C.
der andere wird für die impulserzeugung verwendet.
das XBEE wird gepollt :evil:



edit
mit dem QFL-SMA-patch kann die antenne meies WLAN angeschlossen werden.
ist aber nur ein ordinärer sperrtopf..
bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wurpfel1« (30. Oktober 2007, 21:58)


spacedog

RCLine User

Wohnort: A- Wien

  • Nachricht senden

78

Dienstag, 30. Oktober 2007, 22:22

hallo leute,

ich hab vor ein paar min. meine xbees bestellt! :D

hier gibts ein nettes zubehöhr-teil:

http://robosavvy.com/store/product_info.php/products_id/348 :w
mfg matthias

wurpfel1

RCLine User

Wohnort: CH-rheintal

  • Nachricht senden

79

Mittwoch, 31. Oktober 2007, 11:21

Hallo Matthias


sind nett, wer macht eine sammelbestellung??



ich arbeite mit vier leitungen, einem 3V3 regler/Zdiode, optokoppler, zwei kondensatoren und eine HFdrossel die zusammen mit einem stecker an einer ecke des XBEE verheissklebert werden.

als kabel eignen sich zb USB-mini-buchsen oder die verbindung CDR-laufwerk-soundkarte.


ich montiere das XBEE möglichst weit weg vom "zentralrechner" und dem akku/motor.. das SLW ist der fast ideale ort!
bin schon zu alt zum spielen.. macht aber gleichwohl spass ;-)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wurpfel1« (31. Oktober 2007, 11:23)


Hellmut1956

RCLine User

Wohnort: FFB

Beruf: Dolmetscher und Übersetzer für Technik

  • Nachricht senden

80

Mittwoch, 31. Oktober 2007, 16:18

Finde die Boards auch Klasse, und á 5,- Pfund pro Stück nicht zu teuer wenn man denkt das damit die XBees im 2,54mm Raster verwendet werden können! Würde mich an einer Sammelbestellung mit 3 Stück beteiligen.
MfG
Hellmut

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Hellmut Kohlsdorf« (31. Oktober 2007, 16:18)