DDS met een 12F683: doel sinus 700Hz

EgbertG

Golden Member

Hallo,

Ben bezig met een CW-Morse call gever te maken in een microcontroller de 12f683.
Het werkt, maar er komt nu een 700Hz blokgolf uit.

Nu ben ik bezig uit te zoeken of het zou lukken om middels het regelen van de
duty cycle een fatsoenlijke sinus te genereren.

Heb begrepen dat met een tabel met 255 waardes dat aardig lukt. Maarrr ... en hier
ga ik denk ik fout:

Als ik in 1,4 ms ( 700 Hz periode tijd ) 255x de duty cycle moet zetten dan
moet de Inter.Serv.Routine op 255x 700 Hz lopen? ( 180khz )

Sine

Moderator

De makkelijke manier is een filtertje er achter plakken.

Maar dat is misschien een tikje smerig ;)

EgbertG

Golden Member

Ja, een RC maakt t al stuk beter en desnoods stuur ik een dedicated 2 transistor oscillator trapje aan, maar ..... ik moet mezelf ook uitdagen he? ;-)

Patrick de Zeester

Golden Member

De vraag is hoe zuiver de sinus moet zijn, wat kan je aan harmonischen hebben? Dit is een belangrijk criterium voor het bepalen van de PWM frequentie, PWM resolutie en de filtering.

EgbertG

Golden Member

Met een PWM frequentie van 33Khz worden al goede resultaten behaald.

De uitdaging zit m meer in hoe ik die 255 waardes in die korte tijd van
1.4 ms doorgeef .....

Ik kan me bijna niet voorstellen dat de methode die ik beschreef de
juiste is.

maar misschien ook wel en is deze PIC gewoon te traag!

Patrick de Zeester

Golden Member

Met een PWM frequentie van 33kHz heeft het natuurlijk geen zin om op 180 kHz de duty cycle aan te passen. Bij 33 kHz heb je ongeveer 47 samples per 700 Hz periode. Ik ben niet bekend met de PIC, maar kan deze geen interrupt genereren als bij het begin van elke PWM cycle?

De vraag blijft wat is aan harmonischen acceptabel? Dit is bepalen of je überhaupt PWM en/of filtering nodig hebt en hoeveel.

JoWi

Special Member

Als je filtert kan de PWM frequentie flink omlaag.
Hier een software DDS die ik gebruikte om CTSS toontjes te maken:
http://pe1grl.khds.nl/ctcss/ctcss.htm
Filter was 2 weerstandjes en 2 condensatoren.

Ooit ook eens een audio recorder / playback gemaakt met een PIC, die moest een paar kHz doen (Weersatelliet APT signaal) en daar gebruikte ik een PWM frequentie van 78,125 kHz maar een sample frequentie van 9764 Hz.
[Ging wel door een derde orde Chebysev met een LM324]

Je namelijk kunt ook 64 stappen doen per sinus ipv 255. Nyquist is your friend.

Ignorance is bliss
Arco

Special Member

Ik gebruik meestal een 64 byte tabel met een PWM frequentie van 10kHz (180kHz is veel te hoog en heeft ook geen nut.)
Ik zet er wel een 2 of 4 pole filter achter...

(met een 12f683 op 20MHz heb je maar hooguit 9 instructiecycles beschikbaar in de interrupt bij 180kHz)
Da's te weinig om veel zinvols te kunnen doen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
EgbertG

Golden Member

Ja, ik kan nu inderdaad een ISR aftrappen na elke PWM cycle.

Met die 47 cycles van 33 Khz kan ik niet eens de hele tabel met 255
waardes doorlopen. Dat heb je me nu doen inzien! Dankje.

Hoe iemand anders dat dan wel doet snap ik niet. Die heeft een
envelope van 700 Hz rond 33 Khz PWM en gebruikt die tabel met 255 waardes.

Arco

Special Member

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

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 maandag 20 februari 2023 17:06:11 (73%)

Arco

Special Member

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

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Patrick de Zeester

Golden Member

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

EgbertG

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

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

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
EgbertG

Golden Member

Dat is een hele leuke tip Arco, dank!

blackdog

Golden Member

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

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
EgbertG

Golden Member

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.

EgbertG

Golden Member

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 maandag 20 februari 2023 19:09:10 (25%)

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Arco

Special Member

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...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

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.

EgbertG

Golden Member

@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 maandag 20 februari 2023 19:53:01 (26%)

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken