8 bit processing (vrij naar Leibniz)

Ik heb een btje zitten “pielen” met diverse conversies in de RAM (Sinus, Zaagtand, Driehoek).
Afgezien van een klein timing probleempje (waarvan ik de oplossing al in mijn hoofd denk te hebben) ziet het er heel leuk en hoopvol uit.
Sampletijd van 200kHz is haalbaar, de Max moet ik nog uitzoeken.
Ik heb al een oled display werkend, nu nog een rotary encoder eraan, en dan zal ik een klein youtube filmpje maken.(ben nu niet thuis…)
 
Ik heb een btje zitten “pielen” met diverse conversies in de RAM (Sinus, Zaagtand, Driehoek).
Afgezien van een klein timing probleempje (waarvan ik de oplossing al in mijn hoofd denk te hebben) ziet het er heel leuk en hoopvol uit.
Sampletijd van 200kHz is haalbaar, de Max moet ik nog uitzoeken.
Ik heb al een oled display werkend, nu nog een rotary encoder eraan, en dan zal ik een klein youtube filmpje maken.(ben nu niet thuis…)

Ik heb te weinig kaas gegeten van digitale techniek om het helemaal te snappen maar reuze interessant wat je doet !:halleluja
 


Dit is een korte demo met 13 verschillende blokken van 256 bytes in de RAM.
Als eerste heb ik een zaagtand genomen, zodat je kan zien dat wat erin gaat er ook weer uit komt.
Wat wel duidelijk is, is dat het geheel erg gevoelig is voor amplitude en offset (wat logisch is...)
Volgende stap is de ingang van een attenuverter te voorzien, ook moet de analoge eindtrap nog af gemaakt worden (nu is alles nog geïnverteerd). Zover het analoge deel.
Verder moet ik nog een externe klok-ingang maken en moet er nog een 8bits brede buffer komen van de data die nu (ook) naar de DAC gaat.
 

Attachments

  • adc_ram_dac_SCH.pdf
    159,3 KB · Bekeken: 152
Beetje progress, het wachten is nog op connectoren en dan kan ik hem afmaken.
Ik heb al wel wat aan de gui gedaan, zoals je kan zien ( het wazige deel halverwege de sinussen komt door de refresh van het Oled schermpje en de traagheid van de camera))
20231010_102817(1).jpg

Links boven is de ingang, onder en boven geflankeerd door LED's die aangeven of de spanning die naar de ADC gaat onder nul, danwel boven de Vref van de ADC gaat.
Daaronder de offset regeling (OFF), en daar weer onder een attenuverter (GAIN)
Dan de uitgang (OUT) en een externe clock ingang (EX CLK). Op het moment dat er een connector daarin wordt ingeprikt wordt de inwendige clock (ca 200kHz) overgenomen door het extern aangeboden signaal.
Ik heb de uitgang getest met zowel audio signalen als control voltages, en de effecten zijn op zijn minst verrassend te noemen...
 
Laatst gewijzigd:
De 32kbit ram heeft 14 adreslijnen, waarvan de 1e 8 door de DAC geleverd worden.
De 7 msb adreslijnen worden door een Rotary Encoder rechts van het Oled schermpje, die door een Arduino wordt uitgelezen, ingesteld.
Daarvoor gebruik ik een serie naar parallel omzetten voor.
Dus elke stap die de Rotary Encoder maakt wordt er een andere conversie gekozen.
Oh, ik zie idd dat dit een omissie is in de vorige post van me,
Het Oled schermpje laat de conversie zien, waarbij de X de adressen zijn (vlnr) van 0 - 255 en de Y de uitgangsspanning van de DAC voorsteld (In dit geval een dubbele sinus).
Wat betekend dat als je een zaagtand aanbied van 0 - 5volt, er een sinus uitkomt van de dubbele frequentie als het aangeboden signaal.
 
Laatst gewijzigd:
Als ik het goed begrijp zijn er binair gezien 256 verschillende ingangswaarden mogelijk. Voor elk van die 256 verschillende ingangswaarden kun je binair gezien kiezen uit 256 verschillende uitgangswaarden. Dus zijn er in totaal opnieuw binair gezien [imath] 256^{256} [/imath] (is gigantisch veel) mogelijke binaire omzettingsfuncties mogelijk. Heb je daar zelf al een selectie uit gemaakt?
 
Dat componeren van die conversies is een levenswerk op zich….
Op dit moment heb ik er een stuk of 20 en uiteindelijk zal ik er 128 (=7bits) overhouden.
Ik gebruik daar een Labview programmaatje voor wat ik aanpas voor elk conversie type.
Maar ik maak ook gebruik van een website die wavetables kan leveren.
De eerste die ik gebruik is een zaagtand van 0 - 255, zodat input v= output.
 
Uiteindelijk zal ik minder dan 128 conversies overhouden, want ik realiseer me net dat, hoewel de Arduino Nano 32k aan flash geheugen heeft waar ik de conversies bewaar als het Eurorack uitstaat, van die 32k ook 2k gebruikt wordt door de bootloader. 🤔
 
Dat componeren van die conversies is een levenswerk op zich….

Daarom vroeg ik al eerder hoeveel processorcapaciteit je hebt. Er zijn wel manieren te bedenken om uit de gigantische hoeveelheid mogelijke conversies de meest nuttige te berekenen. Of, het zelfs dynamisch maken, afhankelijk van de input. Dat zou het veel interessanter maken.
 
Er huist een Arduino Nano in de module, dus processing power is minimaal.
In de flash van de Nano staan de conversies, dus het eerste wat de Nano moet doen ik de conversies vanuit de inwendige flash copiëren naar de RAM. Dat is milliseconden werk...
Het enige wat de Nano daarna verder doet, is uitlezen van rotaties van de Rotary Encoder, dit omzetten naar een 7bits woord (welke de conversie pagina aangeeft, én wat evt. cv-able te maken is...) en wat info op een Oled schermpje zet. Meer doet de Nano niet.
De conversies die ik componeer zijn hoofdzakelijk wat meer bekende golvormen zoals sin. cos. driehoek, zaagtand en dan in diverse frequenties en fases. Ook ben ik bezig met bit-crunching te implementeren (2-8 bits). Ruis zal ook wel komen, al weet ik nog niet of dat iets toevoegd aan het geheel.
Maar... het is een prototype, en ik kan er net zoveel aan veranderen als ik wil, en de RAM interactief vullen met een conversie behoort ook tot de mogelijkheden, alleen zal ik dan met een klik of plop aan de uitgang rekening moeten houden, want tijdens het schrijven van de RAM is er geen conversie vanaf de ADC (evt. wel van RAM data naar de DAC, zie schema).
 
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:

20240816_110606.jpg
 

Attachments

  • 20240816_104308.jpg
    20240816_104308.jpg
    254,9 KB · Bekeken: 75
  • 20240816_104315.jpg
    20240816_104315.jpg
    305,6 KB · Bekeken: 79
  • 20240816_104324.jpg
    20240816_104324.jpg
    165 KB · Bekeken: 79
  • 20240816_110919.jpg
    20240816_110919.jpg
    150,1 KB · Bekeken: 79
Back
Top