Wer einen Schrittmotor über einen L298-Treiber an den STM32F4 anschließen will, kann diese Library dazu benutzen.
Ich habe das L298-Treiber-Modul und den Schrittmotor von “Joerg” zur Verfügung gestellt bekommen….Danke nochmal dafür.
Der L298N kann entweder einen 6pol Unipolaren oder einen 4pol Bipolaren Schrittmotor ansteuern (5pol Unipolare funktionieren nicht !!).
Beim Init der Library kann angegeben werden in welchem Mode der Schrittmotor betrieben werden soll (HalfStep, FullStep, WaveStep)
Die CPU simuliert einen L297 und wird über 6 Leitungen mit dem L298 verbunden.
Hinweis: im FullStep-Mode werden die beiden Leitungen “ENA” und “ENB” eigentlich nicht benötigt und könnten am L298 fix auf Vcc gelegt werden. So könnte man zwei Pins an der CPU einsparen wenn man nur diesen Mode benutzt.
Ich habe die Library so einfach wie möglich gehalten und auf eine Beschleunigungs- und Abbrems-Rampe verzichtet.
Im H-File muss für alle 3 Modis das kleinste Delay (in us) von einem Schritt zum nächsten eingestellt werden (das ist Motorabhängig). Der Wert muss durch ausprobieren rausgefunden werden und zwar so das der Motor keine Schritte verschluckt oder überspringt.
Alle Geschwindigkeitsangaben in den Funktionen beziehen sich dann auf dieses kleinste Delay.
Es gibt zwei Funktionen um den Schrittmotor eine einstellbare Anzahl von Schritten nach links oder rechts laufen zu lassen. (Wenn Anzahl = 0, dann läuft der Schrittmotor permanent)
Mit einer Funktion kann getestet werden ob der Motor noch läuft (um zu testen ob er seine Zielposition erreicht hat) und mit einer anderen kann er gestoppt werden.
Mit der Funktion “UB_L298_StepTo” kann eine bestimmte Position angefahren werden. Der Motor dreht dann solange nach rechts oder links, bis die Position erreicht ist.
Es gibt auch eine Pausen-Funktion (in us) die man benutzen kann.
Bilder :
im Beispiel hängt der L298 an Port-E :
1 2 3 4 5 6 | PE4 -> L298_IN1 (Pin5) PE5 -> L298_IN2 (Pin7) PE6 -> L298_IN3 (Pin10) PE7 -> L298_IN4 (Pin12) PE8 -> L298_ENA (Pin6) PE9 -> L298_ENB (Pin11) |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, TIM, MISC Benutzte Librarys : keine |
Enumerationen :
1 2 3 4 5 | typedef enum { L298_HALF_STEP = 0, // Halb-Schritt-Mode L298_FULL_STEP, // Voll-Schritt-Mode L298_WAVE_STEP // Wave-Mode }L298_Mode_t; |
Funktionen :
1 2 3 4 5 6 7 8 | void UB_L298_Init(L298_Mode_t mode); // zum init vom L298 void UB_L298_StepRight(uint32_t speed, uint32_t cnt); // rechts drehen void UB_L298_StepLeft(uint32_t speed, uint32_t cnt); // links drehen void UB_L298_StepTo(uint32_t speed, uint32_t pos); // eine position anfahren void UB_L298_Stop(void); // motor anhalten bool UB_L298_StopCheck(void); // test ob motor steht void UB_L298_SetZeroPos(void); // null-position setzen void UB_L298_Pause_us(uint32_t cnt); // pausenfunktion |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | //-------------------------------------------------------------- // File : main.c // Datum : 07.12.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der L298-Stepper-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_l298_stepper.h" int main(void) { SystemInit(); // Quarz Einstellungen aktivieren // init vom L298 im FullStep-Mode UB_L298_Init(L298_FULL_STEP); while(1) { // 1sec warten UB_L298_Pause_us(1000000); // Schrittmotor 30 Schritte nach rechts // mit 80% Speed UB_L298_StepRight(80,30); // 1sec warten UB_L298_Pause_us(1000000); // Schrittmotor 30 Schritte nach links // mit 35% Speed UB_L298_StepLeft(35,30); } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
STM32F407 Demo Projekt um zwei L298 Schrittmotoren gleichzeitig anzubinden.
Hier der komplette CooCox-Projektordner zum Download.
Ungetestet, bitte Feedback geben ob alles funktioniert.
Hallo,
ist es auch möglich mit zwei Treibern gleichzeitig zu arbeiten mit der Libary ? Und wenn ja wie ?
Gruß Pascale
Hallo Pascale,
wie du aus dem Schaltplan entnehmen kannst, werden die 6 freien Pins PE4 bis PE9 des STM32F4-Discovery-Board verwendet, um den L298-Treiber zu steuern.
Wenn du zusätzlich einen zweiten L298-Treiber verwenden willst, dann könnte diese an den freien Pins PE10 bis PE15 verschaltet werden.
Allerdings sind die Library Funktionen nicht darauf ausgelegt mit zwei L298-Treibern zu arbeiten.
Deshalb würde ich wie folgt vorgehen:
1.) Kopiere die stm32_ub_l298_stepper.h Datei zur stm32_ub_l298_2_stepper.h
2.) Bearbeite die Datei zur stm32_ub_l298_2_stepper.h:
2.1) Suche alle stm32_ub_l298_stepper.h und ersetze stm32_ub_l298_2_stepper.h (1 Treffer)
2.2) Suche alle (großgeschriebene) L298 und ersetze L298_2 (60 Treffer)
2.3) Definiere die neuen Port-Pins PE10 bis PE15(Zeile 59 bis 81)
2.4) Verwende bei der Timer Definition dem Timer TIM3 (Zeile 90 bis 95)
3.) Kopiere die stm32_ub_l298_stepper.c Datei zur stm32_ub_l298_2_stepper.c
4.) Bearbeite die Datei zur stm32_ub_l298_2_stepper.c:
4.1) Suche alle stm32_ub_l298_stepper.c und ersetze stm32_ub_l298_2_stepper.c (1 Treffer)
4.2) Suche alle stm32_ub_l298_stepper.h und ersetze stm32_ub_l298_2_stepper.h (1 Treffer)
4.3) Suche alle (großgeschriebene) L298 und ersetze L298_2 (286 Treffer)
5.) Binde beide Dateien in deinem Projekt ein.
6.) Includiere in deinem Main.c die neue header Datei: #include „stm32_ub_l298_2_stepper.h“)
7.) Rufe in deinem Main.c zusätzlich die Init Funktion auf: UB_L298_2_Init(L298_2_FULL_STEP);
8.) Rufe in deinem Main.c zusätzlich die neuen Funktionen auf: UB_L298_2_StepRight(80,30);
Ist zwar nicht die eleganteste Methode da einige Defines und Strukturen eigentlich nicht kopiert werden müssten, aber es sollte funktionieren.
Viel Erfolg
Sehr geehrter Herr Becker,
erst einmal vielen lieben Dank für das tolle Kommentar über die Anleitung der zweiten Libary für die Schrittmotoren. Allerdings klappt bei mir noch nicht die Interupt Funktion. Er meckert immer in der HAL_Datei. Die Funktion „TIM_GetITStatus“ findet er leider gar nicht, deshalb versuch ich gerade ein wenig mit der HAL rum zu spielen. Als Fehler in der stm32f4xx_hal_time.h gibt er mir immer folgendes aus: ‚TIM_TypeDef {aka struct }‘ has no member named ‚Instance‘. Über ihrer Hilfe würde ich mich sehr freuen.
Danach probier ich das mit dem zweiten Schrittmotor aus, sobald der erste läuft 🙂
Mit freundlichen Grüßen
Pascale
Sehr geehrter Herr Becker,
erst einmal vielen lieben Dank für das tolle Kommentar über die Anleitung der zweiten Libary für die Schrittmotoren. Allerdings klappt bei mir noch nicht die Interupt Funktion. Er meckert immer in der HAL_Datei. Die Funktion „TIM_GetITStatus“ findet er leider gar nicht, deshalb versuch ich gerade ein wenig mit der HAL rum zu spielen. Als Fehler in der stm32f4xx_hal_time.h gibt er mir immer folgendes aus: ‚TIM_TypeDef {aka struct }‘ has no member named ‚Instance‘. Über ihrer Hilfe würde ich mich sehr freuen.
Danach probier ich das mit dem zweiten Schrittmotor aus, sobald der erste läuft 🙂
Mit freundlichen Grüßen
Pascale
Hallo Pascale,
ich habe ein neues Demo Projekt hochgeladen (Downloadlink siehe oben).
Probier das mal aus. Bei mir gab es keine Compilerfehler.
Viel Erfolg,
Manfred
Hallo Manfred,
vielen lieben Dank für deine Mühe. Allerdings benutze ich das Nucleo F401Re Board mit dem Programm System Workbench for STM32 und STM32 CubeMX. Hab alles schon so weit angepasst das keine Compiler Fehler mehr erscheinen außer in der Funktion :void L298_TIM_ISR_HANDLER(void). Dort kennt er beide Funktionen nicht:
1 ) TIM_GetITStatus
2) TIM_ClearITPendingBit
Sobald ich hier versuche die HAL Funktion von der ersten zu nehmen, spuckt er mir ein Fehler in der stm32f4xx_hal_tim.h.
Hast du vielleicht ein schlauen Tipp wie ich die Interupt Funktion anders schreiben kann bzw. den Fehler beheben kann ?
Gruß Pascale
Oh, keine Ahnung, aber schau mal hier:
https://www.mikrocontroller.net/topic/380483
bzw. hier:
https://arm-stm.blogspot.com/2015/12/timer-interrupt-on-stm32f4-using-hal.html