Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Een uiterst nauwkeurige golfvorm genereren met behulp van een DAC en een aangepaste PCB

In dit artikel gaan we' Ik zal firmware ontwikkelen die als basis zal dienen voor zeer nauwkeurige, snelle signaalgeneratie.

Ik heb onlangs een AWG-printplaat (arbitrary waveform generator) ontworpen die is gebouwd rond een C8051F360microcontroller en een TxDAC van Analog Devices.

Deze twee IC's communiceren via een parallelle interface waarmee ik analoge signalen met een hogere frequentie kan genereren door de maximale snelheid te zoeken waarmee de microcontroller gegevens naar de DAC kan verplaatsen.

In dit artikel zal ik niet mijn best doen om aspecten van het hardware-ontwerp uit te leggen, omdat ik het schema en de lay-out uitgebreid heb besproken in een reeks voorbereidende technische artikelen. Drie van deze artikelen richten zich op een bepaald gedeelte van het schema (namelijk de microcontroller, de DAC en het uitgangscircuit van de DAC), en het vierde behandelt de lay-out.

Het doel

Het doel van dit project is om het firmwareframework te creëren waarmee we gemakkelijk digitale gegevens van de microcontroller naar de DAC kunnen verplaatsen en deze gegevens vervolgens kunnen omzetten in een analoog signaal. Dit AWG-bord heeft het potentieel voor een aantal interessante functionaliteit, maar de belangrijkste stap is om een ​​betrouwbare, uitbreidbare, zeer nauwkeurige interface tussen de MCU en de DAC tot stand te brengen. We zullen deze interface verifiëren door een hellingsgolfvorm te genereren en door een oscilloscoopanalyse uit te voeren.

De vereisten

Hoge precisie timing

Veel microcontroller-toepassingen hebben weinig of geen behoefte aan zeer nauwkeurige timing. Dit is de reden waarom we zo vaak succesvolle apparaten kunnen maken waarin de enige klokbron de lage-precisie interne oscillator van de MCU is. Maar de AWG is anders. We willen signalen genereren die zo consistent mogelijk zijn met de geïdealiseerde wiskundige golfvormen die als bronmateriaal dienen, en dit betekent dat we voorspelbare signaalfrequenties en een consistente DAC-bemonsteringsfrequentie nodig hebben.

Efficiënt gebruik van de processor

Hoewel deze specifieke PCB bijna volledig is gewijd aan het genereren van golfvormen, moeten we ervoor zorgen dat dit firmware-plus-hardware-framework gemakkelijk kan worden opgenomen in andere toepassingen. Daarom willen we dat onze firmware stabiele, zeer nauwkeurige golfvormen kan genereren, maar zonder dat de processor volledig onbeschikbaar wordt voor andere taken.

Maximale snelheid

We leven in een hoogfrequente wereld, en deze AWG heeft weinig zin als hij maximaal 1 kHz bereikt. In alle eerlijkheid is dit een eenvoudig, goedkoop ontwerp en we kunnen niet verwachten dat het 915 MHz DQPSK-golfvormen creëert die klaar zijn voor ISM-bandtransmissie. Maar we willen zoveel mogelijk bandbreedte uit dit apparaat halen, en dit is des te uitdagender als we bedenken dat de bemonsteringsfrequentie aanzienlijk hoger is dan de werkelijke signaalfrequentie. Ondanks de stelling van Nyquist-Shannon, wil ik ten minste vijf monsters per cyclus, en tien heeft mijn voorkeur. Dus zelfs als het ons lukt om de bemonsteringsfrequentie tot 10 MHz te verhogen, zullen onze golfvormen in het bereik van 1-2 MHz liggen.

Het hardware-ontwerp weerspiegelt al het belang van optimalisatie voor snelheid:ik koos voor een microcontroller die werkt op kernfrequenties tot 100 MHz, en ik implementeerde een parallelle bus die de overhead minimaliseert die nodig is om gegevens van het geheugen van de MCU naar de DAC-ingangspinnen te verplaatsen.

Samplefrequentie

Het AWG-bord heeft een krachtige klokbron (een MEMS-oscillator met een algemene frequentiestabiliteit van ± 50 ppm). De firmware moet deze tijdbasis gebruiken om een ​​stabiel kloksignaal te creëren dat het updatecircuit van de DAC aanstuurt. Als ik timingsignalen van hoge kwaliteit wil, wend ik me altijd tot hardware, en in dit geval gebruik ik de programmeerbare teller-array (PCA) om een ​​500 kHz-klok te genereren uit de 10 MHz externe oscillator.

Ik heb het programma Silicon Labs Config2 gebruikt voor mijn hardwareconfiguratie, omdat de C8051F360 niet wordt ondersteund door de configuratietool die is ingebouwd in Simplicity Studio. Hier is de algemene configuratie voor de PCA-module:

De PCA is ingeschakeld en de tijdbasis is de systeemklok. Op dit punt is de systeemklokfrequentie hetzelfde als de externe oscillatorfrequentie (10 MHz), maar later zullen we de fasevergrendelde lus van de microcontroller gebruiken om een ​​hogere kernfrequentie te verkrijgen. Het kloksignaal van de DAC wordt gegenereerd door PCA-module 0 die is geconfigureerd voor de modus "frequentie-uitgang":

Laten we eens kijken naar de sample-rate klok. Mijn MDO3104-scope van Tektronix heeft een aantal redelijk geavanceerde meetmogelijkheden die ons zullen helpen om de kwaliteit ervan te beoordelen.

Zoals bevestigd door de metingen die onderaan de scope-opname worden weergegeven, is de frequentie precies zoals verwacht (500 kHz), en hebben we ook een perfecte 50% duty cycle; bovendien geven de "Min"- en "Max"-statistieken aan dat de frequentie en inschakelduur stabiel zijn in de tijd.

Een bijzonder nuttige toevoeging aan deze meetfunctionaliteit is de standaarddeviatie (“Std Dev”). Standaarddeviatie geeft aan hoeveel de waarden de neiging hebben om af te wijken van het gemiddelde, en in deze situatie is het een snelle en gemakkelijke manier om onvolkomenheden in de frequentie en werkcyclus van het kloksignaal te beoordelen. Beide standaarddeviaties zijn erg laag:13,54 Hz is 0,0027% van de nominale frequentie en 2,117×10 –3 is slechts 0,0042% van de typische inschakelduur.

We kunnen een stap verder gaan in deze analyse door naar het histogram van een van de klokflanken te kijken. Als we het bereik instellen om te triggeren op de dalende flank en vervolgens inzoomen op de stijgende flank, verschuift de positie van de stijgende flank volgens de jitter van het signaal. We kunnen dan een horizontaal golfvormhistogram toevoegen om deze jitter te volgen en de distributie ervan te onthullen. In dit geval is er echter niet veel te zien, omdat de jitter zo laag is.

De externe onderbreking

We hebben nu een blokgolf die het uitgangscircuit van de DAC bestuurt; de volgende taak is om de gegevensupdates van de MCU te synchroniseren met deze blokgolf. We doen dit door een externe interrupt aan te sluiten op de PCA-pin die het kloksignaal uitvoert. De DAC vergrendelt de invoergegevens op de stijgende rand van de klok, dus we willen de datasignalen op de vallende . updaten kant. Deze techniek aan de andere kant is de fundamentele manier om ervoor te zorgen dat digitale gegevens worden bijgewerkt en gestabiliseerd voordat het invoerapparaat de actieve klokflank ontvangt.

Dus ik schakelde externe interrupt 0 in (aangeduid met /INT0), bevestigde het aan de kloksignaaluitgangspin (P0.7) en maakte het gevoelig voor de dalende flank.

U bent waarschijnlijk gewend aan het gebruik van een externe interrupt om een invoer . te controleren signaal, maar in dit geval kan het net zo effectief firmware-gebeurtenissen synchroniseren met een signaal dat door de microcontroller zelf wordt gegenereerd. Dit is eigenlijk een bijzonder handige strategie wanneer je te maken hebt met een timing-kritieke taak, omdat externe interrupt 0 de interrupt met de hoogste prioriteit is, en omdat de interrupt-in afwachting van de vlag automatisch wordt gewist door hardware (wat alle tijd elimineert die nodig zou zijn om de vlag te wissen met behulp van een firmware-statement).

De ISR

De belangrijkste actie vindt plaats in de /INT0 interruptserviceroutine. De volgende DAC-gegevensbyte wordt opgehaald uit het geheugen (of rechtstreeks gegenereerd door de microcontroller) en vervolgens naar P2 gestuurd; Ik heb een #define-statement gebruikt om van "DAC_WORD" een alternatief voor "P2" te maken:

SI_INTERRUPT(INT0_ISR, INT0_IRQn)
{
DAC_WORD–;
}

De kritische variabele in de poging om de DAC-updatesnelheid te maximaliseren, is de hoeveelheid tijd die nodig is om de instructies in de ISR uit te voeren. (In dit voorbeeld hebben we maar één instructie, maar dat zal niet altijd het geval zijn.) De ISR moet één keer worden aangeroepen voor elke actieve flank van de DAC-klok, en we kunnen de ISR niet aanroepen voordat deze is uitgevoerd. Dus wanneer we onze bandbreedte tot het maximum proberen te pushen, zullen we er alles aan moeten doen om de uitvoeringstijd van de ISR te minimaliseren, en dan zullen we onze DAC-klokfrequentie dienovereenkomstig instellen.

De enkele instructie die hierboven wordt weergegeven (DAC_WORD–) creëert een hellingsgolfvorm, omdat de DAC-waarde lineair naar nul daalt en vervolgens doorrolt naar 255 en weer begint af te nemen. Hier is de output van de DAC:

Het is je misschien opgevallen dat de analoge opritsecties toenemen richting de maximale spanning, terwijl de DAC-waarden verlagen richting nul. Dit gebeurt omdat de uitgangsversterker van de DAC een inverterende configuratie gebruikt.

Laten we nog een laatste scope-opname bekijken voordat we klaar zijn.

Lees meer informatie….

Een zeer nauwkeurige golfvorm genereren met behulp van een DAC en een aangepaste PCB


Productieproces

  1. Python- en Raspberry Pi-temperatuursensor
  2. Een vochtigheidssensor controleren en kalibreren
  3. Een uiterst nauwkeurige golfvorm genereren met behulp van een DAC en een aangepaste PCB
  4. DIY voltmeter met Arduino en smartphone
  5. FM-radio met Arduino en RDA8057M
  6. Nauwkeurige klok alleen met behulp van een Arduino
  7. Hoe maak je een kompas met Arduino en Processing IDE?
  8. Hoe een PCB-prototypefabricagebedrijf te kiezen?
  9. Hoe is PCB-productie zo nauwkeurig?
  10. Veelvoorkomende fouten bij de fabricage van PCB's en hoe ze te verhelpen
  11. Printplaten en hoe ze werken?