Ü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! :-)
Es handelt sich um exakt dieses Modul, das sollte also passen: https://www.pollin.de/p/funkmodul-hoperf-rfm69cw-868-mhz-tx-rx-810303 Der Peak bei den 840 MHz war auch wirklich nur dann zu sehen, wenn ein Paket gesendet wurde.
Hans schrieb: > Bitte Code Tags benutzen! Ja, Syntax ist klar im Hilfe-Text angegeben. Abschreiben müsste man können ...
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
