Forum: Mikrocontroller und Digitale Elektronik RFM69 Funkmodul 10MHz Bandbreite!?


von QuantumPeak (Gast)


Lesenswert?

Ü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.

von Egon N. (egon2321)


Lesenswert?

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.

von QuantumPeak (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hans (Gast)


Lesenswert?

Bitte Code Tags benutzen!

von Mario M. (thelonging)


Lesenswert?

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 QuantumPeak (Gast)


Lesenswert?

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.

von Och nöö (Gast)


Lesenswert?

Hans schrieb:
> Bitte Code Tags benutzen!

Ja, Syntax ist klar im Hilfe-Text angegeben.

Abschreiben müsste man können ...

von Alexander B. (Firma: brickwedde.dev) (alexbrickwedde)


Lesenswert?

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.

von Egon N. (egon2321)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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.

von QuantumPeak (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> die AGC

Sorry, AFC

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
Noch kein Account? Hier anmelden.