Über einen STM32 betreibe ich ein RFM69CW Funkmodul als Sender im
Packet-Modus bei 868 MHz. Versuche ich nun allerdings, die Datenpakete
zu empfangen, so sind bei den insgesamt 60 Bytes in einem Paket oft 1-2
Fehlerhafte mit dabei. Zudem kommen die Pakete nur ca. jedes 4. Mal an.
Das ganze habe ich mir mal an einem Spectrum Analyzer angesehen.
Anscheinend kommt auf den 868 MHz nur ein geringer Bruchteil der
Ausgangsleistung von 13dBm an. Der Großteil ist auf ca. 840 MHz zu
finden, und zwar über eine Bandbreite von etwa 10 MHz verteilt.
Ich verwende einen einfachen Lambda/4 Dipol und die Einstellungen von
diesem Library: https://github.com/LowPowerLab/RFM69
Wie kann so etwas überhaupt zu Stande kommen? Das Modul habe ich bereits
einmal ausgetauscht und der Fehler war immer noch vorhanden. Was könnte
ich mal versuchen, um den Fehler zu vermeiden? Ich habe bezüglich den
Einstellungen der Register schon viel versucht, allerdings gehen mir da
langsam die Ideen aus.
Bild vom Aufbau, Einstellungen und Screenshot vom Spectrum Analyzer
wären da meiner Meinung nach durchaus hilfreich. ;)
Ohne das Datenblatt anzuschauen kommen mir 10MHz in dem Frequenzband
schon arg spanisch vor, da stimmt meiner Meinung nach irgendwas nicht,
sei es hinsichtlich Ausgangsfilter oder sonstigem, so breit wird der
garantiert nicht senden, WLAN im 2,4GHz Band läuft mit 5-20MHz
Kanalbreite.
Ok, gerne. Hier ist ein Bild des Aufbaus (Links: Empfänger, Rechts:
Sender).
Der Spectrum Analyzer steht mir momentan leider nicht zur Verfügung.
Jemand anderes mit entsprechendem Equipment hat das für mich
freundlicherweise untersucht. Ich hoffe, ich habe mich da nicht
verguckt. Ganz klar ist allerdings, dass der Peak bei 868 MHz kaum aus
dem Rauschen hervorging, was bei den 840 MHz klar der Fall war.
Die Initialisierungsroutine des Senders sieht folgendermaßen aus:
[c]
sendSPI(REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF |
RF_OPMODE_STANDBY);
sendSPI(REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET |
RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00); //
no shaping
sendSPI(REG_BITRATEMSB, RF_BITRATEMSB_1200); // default: 4.8 KBPS
sendSPI(REG_BITRATELSB, RF_BITRATELSB_1200);
sendSPI(REG_FDEVMSB, RF_FDEVMSB_50000); // default: 5KHz, (FDEV +
BitRate / 2 <= 500KHz)
sendSPI(REG_FDEVLSB, RF_FDEVLSB_50000);
sendSPI(REG_PARAMP, RF_PARAMP_2000);
sendSPI(REG_FRFMSB, RF_FRFMSB_868);
sendSPI(REG_FRFMID, RF_FRFMID_868);
sendSPI(REG_FRFLSB, RF_FRFLSB_868);
// looks like PA1 and PA2 are not implemented on RFM69W, hence the max
output power is 13dBm
// +17dBm and +20dBm are possible on RFM69HW
// +13dBm formula: Pout = -18 + OutputPower (with PA0 or PA1**)
// +17dBm formula: Pout = -14 + OutputPower (with PA1 and PA2)**
// +20dBm formula: Pout = -11 + OutputPower (with PA1 and PA2)** and
high power PA settings (section 3.3.7 in datasheet)
///* 0x11 */ { REG_PALEVEL, RF_PALEVEL_PA0_ON | RF_PALEVEL_PA1_OFF |
RF_PALEVEL_PA2_OFF | RF_PALEVEL_OUTPUTPOWER_11111},
///* 0x13 */ { REG_OCP, RF_OCP_ON | RF_OCP_TRIM_95 }, // over current
protection (default is 95mA)
sendSPI(REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 |
RF_RXBW_EXP_0);
//sendSPI(REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 |
RF_RXBW_EXP_2 ); // (BitRate < 2 * RxBw)
//for BR-19200: sendSPI({ REG_RXBW, RF_RXBW_DCCFREQ_010 |
RF_RXBW_MANT_24 | RF_RXBW_EXP_3 },
sendSPI(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 ); // DIO0 is the only
IRQ we're using
sendSPI(REG_DIOMAPPING2, RF_DIOMAPPING2_CLKOUT_OFF ); // DIO5 ClkOut
disable for power saving
sendSPI(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN ); // writing to this
bit ensures that the FIFO & status flags are reset
sendSPI(REG_RSSITHRESH, 220 ); // must be set to dBm = (-Sensitivity /
2), default is 0xE4 = 228 so -114dBm
//sendSPI(REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3
preamble bytes 0xAAAAAA
sendSPI(REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO |
RF_SYNC_SIZE_2 | RF_SYNC_TOL_0 );
sendSPI(REG_SYNCVALUE1, 0x2D ); // 0x2D as sync1
sendSPI(REG_SYNCVALUE2, NETWORKID ); // NETWORKID as sync2
sendSPI(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE |
RF_PACKET1_DCFREE_OFF | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON |
RF_PACKET1_ADRSFILTERING_OFF);
sendSPI(REG_PAYLOADLENGTH, 66 ); // in variable length mode: the max
frame size, not used in TX
//sendSPI(REG_NODEADRS, NODEID );
sendSPI(REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY |
RF_FIFOTHRESH_VALUE ); // TX on FIFO not empty
sendSPI(REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS |
RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF ); // RXRESTARTDELAY
must match transmitter PA ramp-down time (bitrate dependent)
//for BR-19200: sendSPI(REG_PACKETCONFIG2,
RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON |
RF_PACKET2_AES_OFF ); // RXRESTARTDELAY must match transmitter PA
ramp-down time (bitrate dependent)
sendSPI(REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 ); // run DAGC
continuously in RX mode for Fading Margin Improvement, recommended
default for AfcLowBetaOn=0
[\c]
Also stark angelehnt an: https://github.com/LowPowerLab/RFM69
QuantumPeak schrieb:> Der Großteil ist auf ca. 840 MHz zu> finden, und zwar über eine Bandbreite von etwa 10 MHz verteilt.
Bestimmt auch, wenn das Modul gar nicht sendet. In dem Bereich liegt
nämlich LTE.
QuantumPeak schrieb:> Anscheinend kommt auf den 868 MHz nur ein geringer Bruchteil der> Ausgangsleistung von 13dBm an.
Versehentlich Module für 434 MHz erwischt? Die können auch auf 868 MHz
gestellt werden, allerdings bleibt die Leistung dann im Tiefpassfilter
hängen.
Hans schrieb:> Bitte Code Tags benutzen!
Er hat's versucht! :-)
Von der Hardware sollte es auf die Entfernung gehen, sogar ohne
ordentliche Groundplane. Für richtige Entfernung muss die aber da sein.
13dbm ist ein wenig viel auf diese Entfernung, oder? Ich hätt behauptet
auf diese Strecke ohne Groundplane mit 5dbm klar zu kommen. Pass auf die
Limits auf.
Ohne mir die Konstanten im detail angeguckt zu haben. Fdev, BW und
Bitrate sollten zusammenpassen. Da gibt es im Datenblatt Formeln, die
man großzügig (im Sinne von Reserve) verwenden kann. Der Empfänger
könnte bei der Sendeleistung übersteuern, passend einstellen.
Kontrolliere die o.g. Konstanten mit dem Datenblatt. Ich hatte beim
ersten Einstieg auch viele Beispiele im Netz gefunden - es funktionierte
erst richtig gut, als ich (fast) ALLE Werte manuell selber festgelegt
habe.
BTW es muss kein fetter Analyzer sein. Ein DVB-T Stick mit RTL Chip und
z.B. HDSDR reicht für es sendet grob im richtigen Bereich oder nicht
durchaus aus.
Alexander B. schrieb:> BTW es muss kein fetter Analyzer sein. Ein DVB-T Stick mit RTL Chip und> z.B. HDSDR reicht für es sendet grob im richtigen Bereich oder nicht> durchaus aus.
Oder wenn man damals bei TI schnell war gabs deren Analyzer für 25$. Gab
es da nicht sogar irgendein Opensource Projekt?
QuantumPeak schrieb:> und zwar über eine Bandbreite von etwa 10 MHz verteilt.
Eine Bandbreite vom 10MHz für den RFM69 (welchen eigenlich genau) ist
wohl arg hoch gegriffen, da das Eingangsfilter beim Empfänger lt. DS
maximal 500kHz breit ist. Wie hoch ist den der absolute Empfangspegel -
nicht dass du dir den Empfänger hoffnungslos zu stopfst.
Ich habe das Problem jetzt teilweise beheben können. Und zwar habe ich
festgestellt, dass beim Verringern der Ausgangsleistung auf etwa -2dBm
(vorher: 13dBm) das Modul beim Senden eine akzeptable Bandbreite von ca.
10 kHz aufweist.
Nun habe ich auch keinen Paketverlust mehr. Allerdings werden immer noch
teilweise einzelne Bits falsch übertragen. Als Lösung sende ich jetzt
solange meine Daten, bis entweder ein Timeout überschritten wird oder
ich ein ACK vom Empfänger zugesendet bekomme.
@alexbrickwedde:
Danke für die Tipps! Meine jetzige Bitrate con 1.2 kBaud würde z.Zt.
ausreichen.
Ich habe einen Verdacht, wieso Bitfehler auftreten: Auf Empfängerseite
ist die RxBw ca. 17-mal größer als die Baudrate. Das Datenblatt legt da
nur das Minimum der RxBw fest, nämlich Baudrate < 2 * RxBw. Wie groß
würdet Ihr die RxBw wählen? Ich glaube, ca. vier mal größer als die
Baudrate ist bei so etwas ein guter Ausgangswert, weiß es aber auch
nicht genau.
Mit einer Fdev von 3kHz würde ich auf einen Modulationsindex von 5
kommen, der laut Datenblatt gut verträglich ist.
Ich werde jetzt mal diese Einstellungen versuchen und berichten.
@Wolfgang:
Eine RSSI-Messroutine werde ich auch mal implementieren, danke für den
Tipp. Es handelt sich um ein RFM69CW.
QuantumPeak schrieb:> Das Datenblatt legt da nur das Minimum der RxBw fest, nämlich> Baudrate < 2 * RxBw. Wie groß würdet Ihr die RxBw wählen?
So breit, dass das Signal vom Sender durchs Filter passt. Du hast doch
einen Speki in Reichweite. Warum traust du der Angabe im Datenblatt
nicht? Abweichungen zwischen nomineller Sende- und Empfangsfrequenz
sollte die AGC abfangen.