Hallo allerseits,
ich habe einen STM32F407 mit einem LIS3DSH Beschleunigungssensor. Mein
Ziel ist es, die Beschleunigungsdaten in 3 Achsen in 1ms-Abstand in ein
Array zu schreiben.
Leider mein erster Micocontroller (außer Arduino) den ich programmiere,
und jetzt steh ich gewaltig auf dem Schlauch...
Ich lasse Timer7 mit einer 1us takten. LED blinken lassen, etc. hat
alles soweit funktioniert, mit dem Beschleunigungssensor komme ich aber
auf keinen grünen Zweig...
also habe ich hier:
http://mikrocontroller.bplaced.net/wordpress/?page_id=3932
eine library runtergeladen und an mein Programm angepasst, check.
Im Beispiel geht die LED an, in welche Richtung man die Platine kippt,
check.
Jetzt will ich die Daten abspeichern, dafür möchte ich aber die 1,6kHz
data rate einstellen, diese ist aber in der lib nicht beachtet.
Im Allgemeinen kann ich da nur sehr wage nachvollziehen, was der Autor
so gemacht hat und deshalb die Frage,
ist es nicht den Beschleunigungssensor ähnlich wie eine LED zu
initialisieren? etwa:
Da fehlt aber die Routine get_time_us(). Wie sieht die denn aus? Timer
Updates sind eine spassige Sache beim F407 und gehen nicht immer sofort.
Am sinnvollsten erscheint mir im Moment, Timer7 beim gewünschten
Zeitpunkt einen (Overflow) Interrupt ausführen zu lassen, der dir ein
Flag setzt, welches du in der Zeile
1
while(Timer_us<=get_time_us()){}
abfragst.
Man könnte auch SysTick() benutzen, wenns richtig initialisiert ist.
Die Routine für den Timer und die Funktion sehen so aus:
1
voidTIM7_IRQHandler(void)
2
{
3
interrupt_timer7_us++;
4
TIM_ClearITPendingBit(TIM7,TIM_IT_Update);
5
}
6
unsignedintget_time_us(void)
7
{
8
returninterrupt_timer7_us;
9
}
Das mit dem Timer funktioniert im Moment aber eigentlich ganz gut,
soweit ich das bewerten kann.
Das Problem ist, dass ich die Datenrate vom Beschleunigungssensor auf
1,6kHz setzen muss, dass ich im ms-Takt Daten abfragen kann, ohne
mehrmals den selber Wert hintereinander zu bekommen.
Warum nutzt Du nicht die Interrupt Möglichkeiten des LIS3DSH?
Dann brauchst Du nur Daten einlesen wenn sich Werte geändert haben und
die dann ggf mit Zeitstempel abzuspeichern.
Den Sensor mit einem Interrupt zu betreiben habe ich mir auch schon
überlegt, habe aber Bedenken, dass ich bei evtl. noch schnelleren
Abtastraten zu lange für die jeweilige Routine brauche.
Außerdem muss mein Sensor trotzdem auf die 1,6kHz gestellt werden, dass
sich der Wert mind. 1000x pro Sek verändern kann.
Da ich die Daten für ein anschließende FFT-Analyse nutzen möchte, hat es
auch keinen Sinn nur Veränderung abzurufen.
Servus,
> ich habe einen STM32F407 mit einem LIS3DSH Beschleunigungssensor. Mein> Ziel ist es, die Beschleunigungsdaten in 3 Achsen in 1ms-Abstand in ein> Array zu schreiben.> Leider mein erster Micocontroller (außer Arduino) den ich programmiere,> und jetzt steh ich gewaltig auf dem Schlauch...
Du meinst eher dich damit.
> Ich lasse Timer7 mit einer 1us takten. LED blinken lassen, etc. hat> alles soweit funktioniert, mit dem Beschleunigungssensor komme ich aber> auf keinen grünen Zweig...
wie kommst du auf 1µs timer? Wenn man etwas Kopfrechnen kann, dann merkt
man, dass der F4 nichts anderes tut außer im ISR zeit zu verbringen.
> Jetzt will ich die Daten abspeichern, dafür möchte ich aber die 1,6kHz> data rate einstellen, diese ist aber in der lib nicht beachtet.
Was willst du jetzt 1khz oder 1,6khz?
So, wie ich das auf die schnelle überblicke pollt Uwe die Daten. Bei 1ms
kannst du den SysTick Handler nehmen nehmen.
Auch bei 1khz rauschen die Daten ungemein, sonst nehme einen Timer den
du auf 1µs konfig hast und setzen den auf deine gewünschte Zeit und
kopiere dort die Daten in ein Array.
mfg
mfg
mit einer Basis von 84MHz
Prescaler 0 (also intern dann 1) -> immernoch 84MHz
dann lasse ich bis 84 (dauert 1us) hochzählen bis der Interrupt
ausgelöst wird
so habe ich das zumindest mal verstanden und die zeit passt so auch.
> Was willst du jetzt 1khz oder 1,6khz?
Ich möchte Daten mit 1kHz abtasten (Sampletime), der Sensor ist aber nur
mit 800Hz oder eben 1,6kHz Datenrate skalierbar.
> Auch bei 1khz rauschen die Daten ungemein
Hier gehts um meine Bachelorarbeit, die Auswertung sollte für
entsprechendes Raschen ausgelegt sein ;)
> ändere im H-File den Define :>> #define LIS3DSH_PWR 0x67 // Power-On (100Hz,X,Y,Z)>> in :>> #define LIS3DSH_PWR 0x97 // Power-On (1600Hz,X,Y,Z)
perfekt, das suche ich schon seit Stunden, vielen vielen Dank!!