Forum: Mikrocontroller und Digitale Elektronik FreeRTOS Timer mit 44.1KHz (LPC1769 LPCXPresso)


von Henrik P. (henrik84)


Lesenswert?

Hi,

mein Ziel ist es, in einem FreeRTOS-Projekt den ADC genau 44100 mal in 
der Sekunde auszulesen. Mein erster Ansatz, den Systick auf 44,1kHz 
einzustellen, war wohl nichts - man muss wohl über einer Millisekunde 
bleiben, sonst funktionieren zumindest die Makros in FreeRTOS nicht 
mehr. In die anderen Timer muss ich mich noch einlesen, bin jetzt aber 
davon ausgegangen, dass die sich alle auf den Systick beziehen müssen.

Wie realisiert man sowas typischerweise - zusätzliche Taktquelle? Oder 
ADC mit eigenem Takt, der dann ein Interrupt auslöst?

Gruß Henrik

von Sina A. (sinapse)


Lesenswert?

mojn,

gibt mehrere moeglichkeiten... aber wenn du dein OS nach dem ADC takten 
wolltest, nehme ich an, dein ganzes programm macht nichts anderes, als 
den ADC auszulesen? dann ist es einfacher ohne OS zu arbeiten und in 
einer main loop einfach zu warten mit ner nop-schleife bis zum nächsten 
ADC-auslesevorgang.

ansonsten nimm einen timer (einen echten und nicht einen OS-timer), der 
periodisch einen interrupt auslöst. in der interrupt service routine 
loest du dann das ADC-auslesen aus.

guck mal ob der ADC auf deinem uC auch ueber einen event getriggert 
werden kann. dann kann der timer den ADC-auslesevorgang direkt ausloesen 
ohne einen interrupt. damit spart man sich die ausfuehrung einer 
interrupt service routine.

lg

von Philip S. (phs)


Lesenswert?

Hallo Henrik,

 Ich habe so etwas ähnliches mit einem STM32F4 gemacht. Zwar keine 
44,1kHz aber das Prinzip bleibt gleich. Mein Ansatz war es, einen der 
Hardware-Timer zu verwenden, und den A/D Wandler per Timer-Interrupt zu 
triggern. Dazu habe ich außerdem den A/D Wandler so aufgesetzt, dass er 
die Samples per DMA überträgt. So brauchte ich nur auf den Completion 
Interrupt des DMA Streams zu reagieren.

von Jojo S. (Gast)


Angehängte Dateien:

Lesenswert?

ich habe das auch mal mit dem LPC1769 gemacht. Als Übung um mal den LPC 
und RTOS zu testen, deshalb ist der Code etwas unaufgeräumt und es 
stimmen nicht alle Kommentare was die Frequenzen angeht. Enthält aber 
die nötigen Initialisierungen und auch das RTOS Interrupthandling, 
vielleicht hilft es.
Zustätzlich habe ich ein OLED Display dran und die FFT vom 
Eingangssignal dargestellt, das kann natürlich raus. Für die FFT habe 
ich die CMSIS Lib verwendet.

von Jim M. (turboj)


Lesenswert?

Henrik P. schrieb:
> In die anderen Timer muss ich mich noch einlesen, bin jetzt aber
> davon ausgegangen, dass die sich alle auf den Systick beziehen müssen

Nö, müssen sie nich. Die beziehen sich auf den (evtl. via PCLKSELx 
geteilten) Systemtakt oder haben die Möglichkeit eines externen Eingangs 
für den Zähler.

Übrigens kann man den ADC via Timer auch ohne Interrupt triggern - dazu 
sollte man aber das Errata-sheet konsultieren, es funktioniert nicht 
ganz alles was im Handbuch beschrieben wird.

von Philip S. (phs)


Lesenswert?

Jim Meba schrieb:
[...]
> Übrigens kann man den ADC via Timer auch ohne Interrupt triggern - dazu
> sollte man aber das Errata-sheet konsultieren, es funktioniert nicht
> ganz alles was im Handbuch beschrieben wird.

Dass man den ADC via Timer direkt triggern kann, das wusste ich. Nach 
Deinem Kommentar habe ich auch nochmal in den Errata nachgeschaut, aber 
nichts gefunden, was ich jetzt direkt dem Thema "ADC via Timer triggern" 
in Verbindung bringen konnte. War das jetzt ein eher allgemeiner Hinweis 
oder gibt's da tatsächlich Probleme, die ich evtl. übersehen habe?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.