Ich verwende TI Tiva C TM4C123GH6PM auf einem Launchpad in Kombination mit einem AD 9850 DDS, um einen Frequenzmodulator zu erstellen.
Derzeit habe ich ein extrem einfaches Programm, das im Grunde die Peripheriegeräte des Mikrocontrollers und den AD9850 einrichtet und dann in eine Schleife übergeht, in der das zum ADC des Mikrocontrollers kommende Audiosignal abgetastet und basierend auf den Ergebnissen die Ausgangsfrequenz von angepasst wird das DDS.
Mein Problem ist, dass die Ausführungszeit der Schleife nicht konstant ist.
Die Schleife ist in drei grundlegende Teile unterteilt: Im ersten Teil erhalte ich ein Beispiel vom ADC Im zweiten Teil werden die erforderlichen Einstellungen für den AD9850 berechnet und im dritten Teil werden diese Einstellungen an den AD9850 gesendet.
Nach einigen Zykluszählungen stellt sich heraus, dass der zweite und dritte Teil immer 2670 Taktzyklen dauern. Dies lässt mich mit dem einzigen Verdächtigen zurück, der der erste Teil ist.
Nachdem ich die Ausführungszeit des ersten Teils allein gemessen habe, habe ich festgestellt, dass sie von nur 100 Zyklen bis zu 8000 variiert Fahrräder.
Hier ist ein schönes Diagramm, das ich vom Debugger erhalten habe und das zeigt, wie sich die Anzahl der Zyklen mit der Zeit ändert:
Ich habe in das Datenblatt von geschaut Der Teil und in das Benutzerhandbuch der Tivaware Peripheral Driver Library und ich konnten keinen Grund finden, warum das Sampling so drastischen Jitter haben würde. Die ADC-Abtastung plus Konvertierungszeit wird als 1 Mikrosekunde angegeben, was ungefähr 80 Prozessorzyklen entspricht, da ich mit einer Taktfrequenz von 80 MHz arbeite. Dadurch sieht die Schleifendauer im Bereich von etwa 100 bis 200 Zyklen in Ordnung aus, aber ich habe absolut keine Ahnung, was in dem Fall passiert, wenn die Zeit in Tausenden von Zyklen liegt.
Ich habe auch die Errata für den ADC gelesen und soweit ich sehen kann, trifft keines der zahlreichen Probleme auf meinen Fall zu. Außerdem ist der Teil, den ich habe, ein tatsächlicher TM4-Teil, kein experimenteller XM4-Teil.
Hier ist der problematische Teil des Codes:
c_start = HWREG (DWT_BASE + DWT_O_CYCCNT); // startet die Zykluszählung
ROM_ADCIntClear (ADC0_BASE, 3); // löscht das Interrupt-FlagADCProcessorTrigger (ADC0_BASE, 1); // Auslösen der Sequenz 1while (! ROM_ADCIntStatus (ADC0_BASE, 3, false)) // Wartet, bis der ADC die Konvertierung abgeschlossen hat {// Besetzt warten, um ersetzt zu werden mit einem ISR irgendwann} ROM_ADCSequenceDataGet (ADC0_BASE, 3, adcData); // AdcData-Zeiger auf Speicherort // zum Speichern von Ergebnissenc_stop = HWREG (DWT_BASE + DWT_O_CYCCNT); // Beendet den Zyklus countc_dur = c_stop-c_start; // Gibt die Anzahl der Zyklen an. Der Aktualisierungs-Haltepunkt wird hier angezeigt.
Hier ist der ADC-Setup-Code:
ROM_SysCtlPeripheralEnable ( SYSCTL_PERIPH_ADC0); // Pin ist PD1 = >channel. AIN6ROM_ADCHardwareOversampleConfigure (ADC0_BASE, 64); 0x40; // Dies aktiviert das Hardware-DitheringADCSequenceConfigure (ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0); // Verwendet ADC0, Sequenz 3 = >FIFO mit einer Länge von eins, höchste Priorität ADCSeCence_te_ Erster und letzter Schritt, wählt ADC0, Sequenz 3, Schritt Null, Kanal 6, // aktiviert Interrupt und beendet SequenzADCSequenceEnable (ADC0_BASE, 3); // Aktiviert Sequenz
UPDATE: Ich habe den Test mit Pin Wiggling durchgeführt und relativ ähnliche Ergebnisse erzielt. Auf diesem Bild geht ein Pin hoch und dann sofort niedrig, sobald der ADC abgeschlossen ist. Dies erfolgt bei deaktiviertem Dithering und Hardware-Oversampling mit einer Abtastrate von 1 MSa / s und einer FIFO-Puffertiefe von 1.