Hallo!
Ich habe mir RN-Stepp297 zugelegt. Da ich meinen µC in C Programmiere, musste ich die Ansteuerung für RN-Stepp auch mit C schreiben. Aber da ich kein Beispielprogramm dafür gefunden habe, habe ich mir gedacht, ich bastel mal eines Zusammen. Hier ist das ergebnis:
(Dateien als Anhang zum Dowload)
Code:
/*
###################################################
Profanter Stefan - 12.09.07 - RN-Stepp.c
---------------------------------------------------
Schrittmotoransteuerung mit RN-Control und
Ansteuerungsboard RN-Stepp297
RN-Stepp297 ist die bekannte Standardschaltung
mit L297 und L298 (Bausatz)
Achtung:
Als Grundlage für dieses Demo wurde der Bascom-Code von Frank
und einige Teile sowie die Header-Datei des RN-Control Beispiels von Georg Richter verwendet
(zu finden auf Robotikhardware-CD oder auf http://www.Roboternetz.de)
Diese Demo ist mit WinAVR Compiler 20070525 getestet
RN-Stepp297 wird wie folgt angeschlossen
Bezeichnung RN-Stepp -> RN-Control
----------------------------------------------
U+ JP1 (1) -> 5V+
U- JP1 (2) -> GND
Enable JP1 (3) -> PA0
Richtung JP1 (4) -> PA1
Takt JP1 (5) -> PA2
Aufgabe:
Dieses Testprogramm zeigt wie man RN-Stepp297
über Takt- und Richtungsleitung ansteuert
Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
Taste 1: Schaltet Motorstrom ein (Stellung wird gehalten)
Taste 2: Bewegt Motor genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren)
Taste 3: Bewegt Motor schneller genau 400 Halbschritte
Taste 4: Ändert die Drehrichtung
Taste 5: Schaltet Motor aus
Autor: Profanter Stefan
Weitere Beispiele und Beschreibung der Hardware
in der Anleitung zu RN-Stepp297
Anleitung findet man unter http://www.Roboternetz.de im Download Bereich
oder www.robotikhardware.de
Weitere Beispiele sind im Roboternetz gerne willkommen!
##############################################################
*/
// -------------- RN-Control übliche _____________________
#include <stdlib.h>
#include <avr/io.h>
#include <rncontrol.h>
// Schaltet den Motostrom ein
void stepperEnable(void)
{
setportaon(0); //PA0 auf 1 setzten
}
// Schaltet den Motostrom aus
void stepperDisable(void)
{
setportaoff(0); //PA0 auf 0 setzten
}
// Ändert die Drehrichtung
void changeDirection(void)
{
if (bit_is_set (PINA,PA1)) //überprüfung, ob PA1 gesetzt
setportaoff(1); //PA1 auf 0 setzten
else
setportaon(1); //PA1 auf 1 setzten
waitms(1000); //Um ungewolltes ändern zu verhindern, da längeres Drücken der Taste die Funktion immer erneut aufruft
}
// Bewegt den Motor um steps Schritte mit einer Wartezeit zwischen den Schritten von waitTime Millisekunden
void stepping(uint16_t steps, uint16_t waitTime){
for (uint16_t i=0; i<steps; i++)
{
setportaoff(2); //PA2 auf 0 setzten
waitms(1);
setportaon(2); //PA2 auf 1 setzten
waitms(waitTime);
}
}
/*### Hauptschleife ###*/
int main(void)
{
/*###Initialisierungsphase###*/
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
DDRA |= 0x07; //00000111 -> PORTA.0 bis PORTA.2 als Ausgänge
DDRC |= 0xFF; //11111111 -> Ports für Led
//Initialisierungen
setportcon(0); setportcon(1); setportcon(2); setportcon(3); setportcon(4); setportcon(5); //LEDs ausschalten
setportdoff(7); //Speaker aus
/*###Hauptschleife###*/
// Endlosschleife zum Abfragen der Tasten
while(1)
{
switch(button())
{
case 1: stepperEnable(); break; //Motorstrom einschalten
case 2: stepping(400, 30); break; //Bewegt Motor langsam genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren)
case 3: stepping(400, 1); break; //Bewegt Motor schneller 400 Halbschritte
case 4: changeDirection(); break; //Ändert Drehrichtung
case 5: stepperDisable(); break; //Motorstrom ausschalten
default: break;
}
}
return 0;
}
Habt ihr Verbesserungsvorschläge?
Danke!
Lesezeichen