Die zal ook wel filteren: zonder filter gaat het signaal nooit echt mooi worden...

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%)]

Met een fatsoenlijk filter is een tabel van 64 net zo schoon als eentje van 256...

@Arco met een heel goed filter heb geen tabel nodig en kan je met een blokgolf volstaan :-)

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.

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

Dat is een hele leuke tip Arco, dank!

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.

https://www.bramcam.nl/Diversen/700Hz-PWM-Filter.png

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.

Feitelijk goed genoeg ....

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%)]

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.

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%)]

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.

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.

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

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)

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

Ik gebruik de AD9833 o.a. voor het opwekken van sinus tot 10kHz met een 0.001Hz resolutie... ;)

TS ben je bezig met de CW-Morse call gever van PI4RAZ ?

Nee, volledig eigen ontwerp.

Doet PI4RAZ dat toevallig ook met deze PIC?