Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Patrick de Zeester
Golden Member
Je hoeft niet perse alle 255 waardes te gebruiken.
Ik zou overigens een tabel met 256 waardes verwachten (is gemakkelijker op 8-bitter), en dan afhankelijk van de frequentie die wilt genereren de stap grootte waarmee je door de tabel loopt bepalen (in jou voorbeeld zal je dus een aantal waarden in de tabel overslaan)
[Bericht gewijzigd door Patrick de Zeester op (73%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Patrick de Zeester
Golden Member
Op 20 februari 2023 17:03:25 schreef Patrick de Zeester:
Je hoeft niet perse alle 255 waardes te gebruiken.
Ik denk dat dat inderdaad het geval zal zijn ..anders kan het simpelweg niet.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Nu is een 12F683 ook niet de beste keuze voor hoge frequenties, bij iedere interrupt ben je minstens 14 instructiecycles extra kwijt voor save/restore.
Beter dan een modernere als de 16F1709 of 1847 nemen, die heeft dat niet.
Voor sine tables genereren gebruik ik deze altijd: https://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
HI,
Dit is een passief 700Hz 12dB/Oct Low Pass filter, deze heb ik hetest met een 700Hz blokgolf, dit is niet genoeg voor een schone Sinus.
Zover ik begrepen heb, heb je nu je PWM op 33KHZ draaien dat is veel gunstiger en dit filter haalt alle 33KHz prut goed weg.

Omdat de 33KHz PWM veel verder weg ligt van de 700Hz grondgolf zou je de condensatoren een beetje kunnen schalen zodat je minder demping van de 700Hz hebt.
u68 kan dan u33 worden en u1 woord dan 47nF.
Hou er ook rekening mee dat de uitgang imedantie van het filter ongeveer 1,5K is en je het minstens met een 5x hogere impedantie moet afsluiten, dat is de vervelende eigenschap van dt sort filters.
Ik heb het filter al iets minder optimaal opgebouw om de uitgang impedantie zo laag magelijk te houden, bij 33KHZ PWM moet dit goed werken.
Groet,
Bram
Ik zal je passieve filter met deze waardes straks eens nabouwen en kijken of ik tevreden kan zijn met de sinus-achtige gelijkenis met de blokgolf als input.
Met 47 punten een sinus definieren lijkt me ook nog niet eens zo heel slecht
en evt daarna nog een passief filter.
Kan weer even verder gaan prutsen boven.
Patrick de Zeester
Golden Member
Hier kan je zien wat Bram's passieve filter ongeveer gaat doen:
https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWEBmaC…
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Nu ken ik die hele PIC niet (ik doe niets met PICs, alleen andere, moderne microcontrollers), maar kun je geen DMA gebruiken om die PWM generator van nieuwe samples te voorzien?
Daarbij moet je bedenken dat je maar 20MHz hebt om te verdelen; op zeg 40kHz heb je dus een resolutie van 500 stappen, zou je naar 180kHz gaan dan is de resolutie nog maar 111 stappen.
edit: Een snelle blik op de datasheet geeft geen resultaat op "DMA", en het ding loopt intern maar op 5MHz. Waarom zou je daar nog iets mee maken? Er zijn moderne controllers die veel meer kunnen een waarschijnlijk nog goedkoper zijn ook.
[Bericht gewijzigd door SparkyGSX op (25%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De PIC24 en 30/33 hebben ook allemaal DMA, dus dat kan ook...
(5MHz instruction clock is trouwens niks mis mee voor meeste applicaties, een goed geschreven programma werkt daar uitstekend op...)
Een CD speelt Audio af tot 20kHz met een 44.1 kHz samplerate.
Die gaat dus ook niet alle 255 sinus waarden doorlopen voor die 20 kHz. De truc is dat je wel de hele tabel gebruikt, maar niet telkens vooraan begint.
Stel je hebt een tabel met 300 stappen.
En je hebt een samplefrequentie van 30kHz.
Als je alle samples steeds afloopt op 30 kHz dan krijg je een sinus van 30000 / 300 = 100 Hz. Voor 700 Hz moet je dus elke 7de sample nemen : sample[0], sample[7] ..enz. Na 42 stappen zit je dan op sample[294]. De volgende sample wordt dan sample[301] maar die valt buiten de tabel dus dan moet je modulo 300 terug naar sample[1] dan sample[8] enz.
Uiteindelijk gebruik je dus wel alle samples, maar dan verspreid over meerdere perioden. Op die manier kun je wel veel hogere frequenties genereren op dezelfde samplefrequentie.
Een DDS chip werkt ook zo. Die kan daarmee ook een sinus generen tot 30% van zijn klokfrequentie.
@deKees .. geweldig! Dit is prima te programmeren zoals jij t beschrijft.
Klaarblijkelijk is het dan ook nog een gangbare methode.
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Ik ben met je eens dat 5MHz voor veel toepassingen genoeg kan zijn, zeker op zo'n kleine controller, maar er zijn ook genoeg toepassingen waarvoor dat echt niet toereikend is, hoe goed je ook schrijft. Uiteraard is een snellere controller nooit de goede oplossing voor slecht geschreven software.
De PIC 24 en later zijn relatief moderne microcontrollers, ik zou eerder tijd investeren om die goed te leren kennen, en niet blijven hangen op technologie van 25+ jaar geleden. Alsnog hebben PICs wat mij betreft teveel rare quirks, en gebruik ik liever gewoon ARM cores, maar dat is meer een persoonlijke voorkeur, en met moderne ontwikkeltools zijn die quirks toch grotendeels verborgen.
Nog een toevoeging op het verhaal van DeKees: er zijn natuurlijk ook situaties waar je niet precies een integer deling krijgt (7 in dat voorbeeld); in dat geval kun je de stapgrootte variëren, je zet dan bijvoorbeeld 7, 7, 6, 7, 7, 6... stappen in de tabel. Je kunt dat doen door eerst de kleinste stapgrootte uit te rekenen (6 in dit geval), en dan een lopend totaal van de fout bij te houden. Zodra die fout groter wordt dan de grenswaarde, zet je in die cyclus een stapje extra.
[Bericht gewijzigd door SparkyGSX op (26%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Zo wordt 't eigenlijk altijd gedaan...
Anders zou het zeer lastig worden als je meerdere tonen tegelijk op moet wekken (bijv. DTMF). Je zou dan een tabel per toon moeten hebben.
Nog een toevoeging op het verhaal van DeKees: er zijn natuurlijk ook situaties waar je niet precies een integer deling krijgt (7 in dat voorbeeld); in dat geval kun je de stapgrootte variëren, je zet dan bijvoorbeeld 7, 7, 6, 7, 7, 6... stappen in de tabel. Je kunt dat doen door eerst de kleinste stapgrootte uit te rekenen (6 in dit geval), en dan een lopend totaal van de fout bij te houden. Zodra die fout groter wordt dan de grenswaarde, zet je in die cyclus een stapje extra.
De DDS chip doet dat in hardware. Stel je gebruikt een teller van 16 bits. Elke stap tel je een vast getal bij de teller. Een groter getal geeft een hogere frequentie. Dan gebruik je de hoogste 8 bits als index in de lookup tabel. De rest van de teller geeft dan de lopende fout.
Dat werkt natuurlijk alleen als de tabel-grootte een macht van 2 is.
Patrick de Zeester
Golden Member
Tijdens mijn studie (vorige eeuw) heb ik een functie generator gemaakt volgens het principe dat deKees beschrijft met TTL & EPROM chips. In de EPROM waren de golfvormen geprogrammeerd, de digitale logica bestond een full-adder (ik geloof iets van 24 bits, het is alweer heel lang geleden), wat latches om de ingestelde frequentie en het laatste resultaat van de full-adder vast te houden en een D/A converter. De full-adder telde de ingestelde frequentie op bij het laatst geproduceerde resultaat en de meest significante bits werden gebruikt als adres voor de EPROM. In de basis heel simpel maar wel een groot breadbord vol IC's. Tegenwoordig kan je zoiets reduceren tot een eenvoudige microcontroller.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Als het niet goed lukt de Sinus tabel in je processor te krijgen en je hebt SPI beschikbaar dan is onderstaand printje een goed optie.
https://webshop.domoticx.nl/index.php?route=product/product&product_id…
Groet,
Bram
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Op 21 februari 2023 10:51:48 schreef blackdog:
Hi,Als het niet goed lukt de Sinus tabel in je processor te krijgen en je hebt i2c beschikbaar dan is onderstaand printje ee ngoed optie...
De 9833 is geen I2C, maar SPI... (werkt wel prima verder. gebruik hem regelmatig)
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Arco, 
Je hebt gelijk het is SPI bij de AD9833!
Ik heb mijn post hierover aangepast, dank voor het melden van het foutje.
Groet,
Bram
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
