Hallo zusammen,
habe meinen alten Robbe Rodeo 6X6 wieder ausgekramt und ihm einen
Fahrregler(besser: Steller) im Eigenbau verpasst.
Basierend auf einem Mega48, Fets für die beiden Brücken usw. Wie man
eben so ein Ding baut. Sind 2Motore zu steuern.
Die PPM Erkennung und die Kanaltrennung laufen im ICP-Interrupt. Alles
kein Problem. funktioniert soweit auf dem Basteltisch.
Das einzige was nicht geht:
ich bekomme die beiden Servokanäle aus meinem Empfänger nicht über ein
Kabel auf den ICP-Eingang geschaltet.
Beim Empf. handelt es sich um einen Futaba FP-R112JE AM40. War damals
mit dabei. Die beiden Servokanäle liegen einzeln an den Ausgängen vor,
klar. Wenn ich beide Ausgänge über Dioden zusammenschalte, habe ich
keine zwei Kanäle mit einer kleinen Pause dazwischen, sondern einen
"langen" High-Impuls, welcher sich über beide Kanalzeiten erstreckt.
Ich habe jetzt hier eigentlich deswegen keinen Thread aufmachen wollen,
da ich die SuFu benutzt habe und folgende Aussage vom Peter gefunden
hatte:
Beitrag "Re: 6 PWM eingänge, wie?"
daraus:
[Quote]
Die Impulse werden ja alle hintereinander übertragen, also solltest Du
sie einfach über eine UND-Schaltung (Dioden) wieder zusammenführen
können.
[/Quote]
kann man also bei DEM Empfänger vergessen.
Was kann ich tun?
Wenn jemand schon mal in dieser Klemme steckte, kann er ja mal verraten,
was er getan hat.
Ich suche unabhängig nach einer Lösung und melde mich bei Gelegenheit.
Evtl. interessiert es ja jemanden ;-)))
Viele Grüße
AxelR.
Pinchange-Interrupt...
Oder den Empfänger "aufbasteln" und den ICP-Eingang direkt an den
Ausgang des Modulators (oder wie sich das Ding schimpft, das vor dem
Kanaldecoder sitzt) anschliessen; da kommt nämlich das komplette
Telegramm "vorbei".
PinChangeInt. liefert die Summe beider Kanäle, da die Pause zwischen
beiden nicht zu erkennen ist...
bin jetzt mit 47K vom PIN15 des verbauten FP8196R abgegangen. Dort liegt
das Impulstelegramm an.
Die Signalamplitude beträgt hier 1.2V. von da auf einen NPN und mit 1K
vom Kollektor auf die 3.3V vom AVR. Am Kollektor kann ich jetzt das
Summensignal auf den ICP-Pin geben.
Muss ich allerdings meine Auswerteroutine umändern und nur die
steigenden Flanken zählen.
Jetzt nehme ich ja die steigende und die fallende Flanke und bilde die
Diiferenz.
AxelR.
Axel, wenn die Signalamplitude des Telegramms nur 1,2V hat, dann kannst
Du sie direkt auf den Analog-Comparator legen und mittels
Spannungsteiler (oder Diode und internem PullUp) die Referenz von 0,6V
erzeugen. Der Analog-Comparator kann auch den ICP triggern. War
zumindest bei den älteren AVRs so, müsste der Mega48 auch können.
Ansonsten ist PCI schon richtig, beide Kanalimpulse an zwei Pins eines
Ports, nur die benutzten Bits maskieren (PCI-Maske), jeder Pegelwechsel
an einem der Pins löst den PCI aus. Bitmuster einlesen, um zu erkennen
in welcher Phase man sich befindet, und dann Differenz zum letzten Int
bilden und verarbeiten.
Da Du in C werkelst halte ich mich mit Code zurück.
'73
...
#define ICP_POS_FLANKE TCCR1B |= (1<<ICES1) // aus Main.h der Uebersicht
4
#define ICP_NEG_FLANKE TCCR1B &= ~(1<<ICES1)// wegen herkopiert
5
6
staticunsignedinttim_2;
7
staticunsignedcharicp_flanke;
8
9
Timer1Overflow=0;// Timerüberlauf löschen
10
if(ICR1>5000)icp_flanke=1;//lange Pause?
11
12
switch(icp_flanke)
13
{
14
case(1):
15
PPM_Signal[2]=ICR1;
16
TCNT1=1;
17
icp_flanke=2;
18
break;
19
20
case(2):
21
tim_2=ICR1;
22
PPM_Signal[0]=ICR1/4;
23
icp_flanke=3;
24
break;
25
26
case(3):
27
PPM_Signal[1]=(ICR1-tim_2)/4;
28
PPM_ok=1;
29
break;
30
31
default:
32
icp_flanke=1;
33
break;
34
}
35
}
PPM_Signal[2] verwende ich nur zum debuggen. Hier wird in der
Hauptschleife die Gesamtdauer des Paketes augegeben.
Zur Hardware:
Ich hatte noch einen BC817 da. Den habe ich im Empfänger auf ein
unbenutztes Pad nahe am Ausgang KANAL2 gelötet und einen 56Kohm an den
Basisanschluss angelötet . Einen CuL-Draht zum PIN15. Den Leiterzug von
KANAL2 habe ich entsprechend aufgetrennt und den Kollektor dorthin
verdrahtet (Emitter an Masse - hat gut gepasst, war gleich daneben).
Funktioniert sehr gut. freu
Gruß
AxelR.
Hannes Lux wrote:
> Axel, wenn die Signalamplitude des Telegramms nur 1,2V hat, dann kannst> Du sie direkt auf den Analog-Comparator legen und mittels> Spannungsteiler (oder Diode und internem PullUp) die Referenz von 0,6V> erzeugen. Der Analog-Comparator kann auch den ICP triggern. War> zumindest bei den älteren AVRs so, müsste der Mega48 auch können.>> Ansonsten ist PCI schon richtig, beide Kanalimpulse an zwei Pins eines> Ports, nur die benutzten Bits maskieren (PCI-Maske), jeder Pegelwechsel> an einem der Pins löst den PCI aus. Bitmuster einlesen, um zu erkennen> in welcher Phase man sich befindet, und dann Differenz zum letzten Int> bilden und verarbeiten.>> Da Du in C werkelst halte ich mich mit Code zurück.>> '73>> ...
Sorry Hannes, hatte deinen Post übersehen...
wo ich sooo stolz bin, das meine Routine nu läuft, habe ich ohne
hinzusehen gepostet.
Jetzt kann ich mit dem - sagen wir - Einwurf "PinChangeInt" von rahul
auch was anfangen.
Klar hätte man auf zwei PINs verteilen können. Hatte ich nicht in
Verbindung gebracht.
Sorry rahul. Nächstes mal denke ich etwas länger nach.
Mit dem PCINT konnte ich schon erfolgreiche Tests starten. Das geht
erstaunlicherweise sehr gut. Besonders vorteilhaft ist die Tatsache, das
der Controller auch aus dem tiefsten Tiefschlaf geweckt werden kann.
Nun gut. Als alter Hardwarerer habe ich nun den Empfänger "aufgebastelt"
die Sache so gelöst.
Jetzt muss ich nur noch einen IRF4905 irgentwo auftreiben. War zu
geizig, bei Reichelt gleich 10x oder 20x zu kaufen. Nu ist einer kaputt.
:-((
Wegen einem solch Teil bestell ich nicht bei Reichelt.
Gruß
AxelR.
Axel, kein Problem, Hauptsache es funktioniert. Viele Wege führen nach
Rom.
"Einwurf"... ;-)
Ja, das ist Rahuls Art. Ich find's gut so, ein kleiner Denkanstoß reicht
meist völlig aus.
Mit dem IRF kann ich Dir nicht helfen, solche starken P-Kanal-FETs habe
ich nicht vorrätig... ;-)
Gruß nach P.
Hannes
Hallo, ihr lieben...
Der Thread ist noch nicht so lang, als dass es sich lohnt, einen neuen
aufzumachen
Folgendes Problem ist aufgetaucht:
Fährt das Modell aus dem Sendebereich heraus, so bleibt es stehen. Das
habe ich über den Int1 Overflow gelöst, der ja sonst in der ICR
zurückgesetzt wird. Bleiben die Impulse aus, läuft Timer1 über und der
Motor/die Motoren werden abgeschaltet. Funktioniert also erstmal,
ABER:
Wenn der Sendebereich gerade noch nicht verlassen wurde, ist das
Emfangssignal stark "verrauscht". Wie lege ich denn eine "Maske" über
mein Impulsdiagramm, um eine Prüfung auf Plasibilität stattfinden zu
lassen?
Oder anders gefragt, hat schon mal jemand versucht, so einen
Summenimpuls softwaretechnisch zu "breinigen"?
Ich habe schon beim DCF77 Thread, der mir ja noch gut in Erinnerung ist,
beim Korrelationsverfahren nachgeschlagen, aber soo viel Speicher habe
ich ja nicht, um alle möglichen Knüppelstellungen der zwei Kanale als
Muster zu hinterlegen.
Vielen Dank für hilfreiche Infos eurerseits.
AxelR.
Hallo Axel,
nachdem Du mich aus diesem thread
Beitrag "Servo Summensignal auswerten"
hergelockt hast ;-)
Prüfst Du die Impulse auf "zu kurze" Flanken?
Ich finde, das das einlesen von 2 Servosignalen mit 2 Interrupts
einfacher geht und sicherer ist. (INT0=Sig1, INT1=Sig2) Bei meinem
Kettenfahrtregler (auch 2 Motoren wie bei Dir) triggere ich den INT auf
einen Flankenwechsel und messe die Zeit dazwischen. Du brauchst auch nur
einen Timer, da die Signale ja nacheinander kommen.
War der impuls zu kurz oder zu lange-> Signal verwerfen, Fehlerzähler
runterzählen.
Fehlerzähler auf 0 -> Motor Aus
Bei Reichweitenproblemen wirst Du i.d.R. sehr kurze Impulse haben, die
Dir möglicherweise in der INT-Capture Routine "durchflutschen". Kann das
sein?
My2Cent,
Klaus