Nano Every - 3 Frequenzen messen + 3 Frequenzen ausgeben

Hallo Leute,
ich beschäftige mich seit ein paar Tagen mit dem Arduino Every Nano und verzweifle gerade an meinem ersten Projekt:

--- der wichtige Part ---

  • Messen von 3 Frequenzen
    (zwei davon 0-5 kHz, eines 0-500Hz)
  • Ausgeben von 3 Frequenzen
    (zwei davon 0-5 kHz, eines 0-500Hz)

--- Rein informativ - das sollte ich hinbekommen ---

  • es wäre schön wenn noch ein PWM-Ausgang möglich wäre für einen Pseudo DAO - den kann ich aber zur not mit einem externen I2C DAO umsetzen.
  • Ansonsten hängt noch am Every: 1x OLED128x64 (SPI), 1x Drehencoder mit Schalter, 3x Analog In

Meine Idee war für die 3 Frquenz-Ausgänge den Timer TCA zu verwenden mit den 3 Compare Channels. Nur klappt das überhaupt da die 3 Frequenzen so "unterschiedlich" sind (5kHz und 500 Hz)?
Der ATmega4809 wäre zum Frequenz-Messen super, allerdings sind beim Arduino Nano Every nur zwei der Capture Input-Eingänge (TCB) auf den Header herausgeführt.
Die Idee: für die beiden 0-5kHz-Signale die beiden herausgeführten Capture-Input-Eingänge verwenden und das Dritte 0-500Hz-Signal über einen der übrigen TCB-Timer + Interrupt verarbeiten.

Gibt es dafür bereits librarys oder jemanden der mit den TCA/TCB Timern schon etwas mehr beschäftigt hat? - oder muss ich hier die Bits in den Registern händisch schubsen?

Grüße
Tom

Kann sei. Aber hier ist ein Arduino - Forum. Was bedeutet, dass es darum geht, möglichst plattformunabhängig mit Komfort-Funktionen zu programmieren.

Wenn du schon so im Hardware-Detail drin bist, ist das bisschen "Bits in Register schubsen" ja das wenigste. Freu dich, dass die zugrundeliegende avr libraries dir schon Registernamen zur Verfügung stellen, parallel zur Arduino - Welt :slight_smile:

Hallo,

für TCBn kann ich dir meine Lib geben. Für TCA ist noch nicht fertig. Ist aber im Prinzip der gleiche Aufbau wie für TCB. Für die Messbereiche musst du die Prescaler durchrechnen und anpassen. Leider hat TCB nur 2 eigene Prescaler. 1 und 2. Man kann ihn noch auf den von TCA umstellen. TCA hat Arduino defaultmäßig einen Prescaler von 64 eingestellt. Es kommt darauf an welche Messauflösung du haben möchtest. Grundsätzlich kann man ja alles mit allen Prescalern messen. Aber 0Hz kann man nicht messen und wenn der Messbereich zu klein gibts Fehlmessungen wegen Überlauf.
Tipp: Bau dir eine Exceltabelle zum rechnen über alle Prescaler.
Bsp. 500Hz sollen gemessen werden. -> Periodendauer 2ms
Prescaler 2 -> Auflösung 125ns. Messbereich 65535. Maximal messbare Periodendauer 125ns * 655535 = 8,191ms
Geht. Geht auch mit Prescaler 1.
5kHz funktioniert demzufolge auch.
Mit Prescaler 2 kannste demzufolge messen bis runter auf 1/8,191ms = 122Hz.
Für alles was drunter liegt musste die Prescaler von TCA verwenden.
Deswegen wäre ein externer D/A nicht falsch.

Wenn die Timer und Ausgänge nicht ausreichen und du doch mehr benötigst, dann kann ich dir noch das Microchip Board "AVR128DB48 Curiosity Nano" empfehlen. Kann man hier und da bestellen. Da ist ein AVR128DB48 drauf. Der ist vom Aufbau und Handhabung zum ATmega4809 sehr ähnlich/verwandt. Hat von allen mehr und man kann zwei TCB zu einem 32Bit TCB kaskadieren. Damit kann man quasi mit Prescaler 2 alles messen. Ein D/A ist auch vorhanden. Wenn du nicht alles selbst machen möchtest gibts auch dafür von Spencekonde auf Github ein Arduino Package. Für den ATmega4809/NanoEvery übrigens auch von MCUdude.

:slight_smile:

libraries.zip (41,2 KB)

Hier hatte ich einmal was zusammengeschrieben.