Ok, ik heb deze exersitie in de hoek gegooid...de NANO versie dan....
Werd té complex en storings gevoelig. Maar het concept vond en vind ik wel leuk: een ingangs signaal veanderen met hulp van een opgeslagen conversie.
Pas kwam ik voor een paar euro een bordje tegen met een ESP32 en ingebouwd OLED schermpje.
Het mooie van de ESP32 is dat Hij (Zij? Het? They?) een tweetal cores aan boord heeft.
Op de ene core draai ik dan de besturing en bewerking van niet-critische programma onderdelen, zoals het besturen van het schermpje, de rotary encoder enz.
Op de andere core draait alleen het programmatje voor het samplen, de conversie en de output van het aangeboden signaal, wat 51uSec (ofwel 19.6kHz) in beslag neemt.
Eigenlijk wat te traag, maar voor laag frequente signalen (bv control voltages) gaat dit heel leuk.
Voordeel van deze ESP32 is dat er een ADC en DAC aan board is, de ADC is 12 bits, terwijl de DAC 8 bits breed is.
Beetje filteren en ziet er gewoon leuk uit.
Je kan dus twee programma's onafhankelijk van elkaar laten draaien, wat nogal wat voeten in aarde had, maar waar ik na veel puzzelen uitgekomen ben.
Probleem was nl. dat de watchdog van de core waar ik de signaal bewerking op doe elke 5 ofzo seconden aansprong en een berg data naar buiten spuwde en er gedurende een paar seconde geen conversie plaatsvond.
Alles wat tussen de loop() staat, draait op core 1, daar doe ik dus mijn sampling, conversie en output (elke 51uSec) en verder NIETS.
Om een programma in core 0 te laten draaien moet je een task aanmaken (zie
ESP32 Dual Core with Arduino IDE | Random Nerd Tutorials)
In de task staat oa de prioriteit van de task, en in het voorbeeld staat dat op "1", ofwel de hoogste prioriteit. Ik heb hem op "0" gezet en toen ging het goed met de watchdog.
(ik kon zien dat het de watchdog was die het probleem gaf door naar de Serial Monitor te kijken in de Arduino IDE.
Nu ziet het er zo uit: