Hallo Leute,
ich habe mir die folgende schaltung:
http://www.roboternetz.de/bilder/l298standard.gif
aus dem roboternetz
für eine schrittmotoransteuerung aufgebaut und habe dazu eine kurze
frage:
ich habe alles fertig und den eingang clock mal mit einem tastimpuls
beschalter ->
bit_is_clear -> impuls
bit_is_set rücksetzen des pins.
und getestet, wenn ich also n mal drücke dreht er sich ein wenig weiter
ich benötige also einen taktgenerator, der mir definiert impulse
ausgibt.
wie gehe ich am besten vor?
wie definiere ich einen schritt?
wenn ich weiß was ein schritt ist, also was ich dafür tun muss, dann
finde ich sicherlich heraus, wie ich n schritte mache.
aber im moment stehe ich aufm schlauch.
gruß sven
Sven Weinmann schrieb:> ich benötige also einen taktgenerator, der mir definiert impulse> ausgibt.
Die Roboter wird doch bestimmt von einem Controller gesteuert, der macht
auch die Impulse
>>> wie gehe ich am besten vor?
tue es
>> wie definiere ich einen schritt?
??? jeder Schritt macht ein paar Grad Radumdrehung
ich nutze einen atmega 8 µC keinen roboter. der gibt ja nicht einfach
impulse aus!
ich kenne von der sps programmierung die möglichkeit sowas mit zwei
zeitgliedern zu bauen.
beim µC weiß ich jedoch nicht wie ich anfangen soll
Sven Weinmann schrieb:> ich nutze einen atmega 8 µC keinen roboter. der gibt ja nicht einfach> impulse aus!
Warum nicht?
Pin ist auf Ausgang programmiert
Pin auf 1 setzen
bischen warten
Pin auf 0 setzen
und schon hast du deinen Puls.
Wo ist da jetzt das Problem?
zu ersten Testzwecken
1
....
2
3
4
intmain()
5
{
6
DDR...=.....// Pin auf ausgang setzen
7
8
while(1){
9
PORT...|=(1<<Pinnummer);
10
_delay_ms(500);
11
PORT...&=~(1<<Pinnummer);
12
_delay_ms(500);
13
}
14
}
Wie hast du denn in deinen Sturm und Drang Jahren eine LED zum Blinken
gebracht? Genau das ist das Erzeugen von Pulsen. Da hat halt eine LED
einmal geleuchtet und dann wieder nicht geleuchtet und jetzt reagiert
halt ein Schrittmotortreiber auf die Abfolge von 0 und 1 am Portpin.
hm...
ich habe neulich in einem anderen thema auch delay´s benutzt, da ist man
fast umgefallen, ich solle mich davon lösen, das wäre nicht gut für c
programme usw, weil es zeit benötige und und und....
da ging es darum, dass mein interupt das programm abbrechen solle....
Sven Weinmann schrieb:> hm...>> ich habe neulich in einem anderen thema auch delay´s benutzt, da ist man> fast umgefallen, ich solle mich davon lösen, das wäre nicht gut für c> programme usw, weil es zeit benötige und und und....
Ist es auch.
Für ein erstes Testprogramm kannst du es benutzen.
Aber im Endeffekt wirst da das natürlich durch eine Timersteuerung
ersetzen. Aber so wie ich das sehe, ist es ja schon mal ein
Erfoglserlebnis, wenn sich der Motor erst mal überhaupt dreht. Auch Rom
ist nicht an einem Tag erbaut worden.
Nur wenn du schon so fragst "Wie erzeuge ich einen Puls", dann muss ich
davon ausgehen, dass dein Wissen noch nicht allzugroß ist. Denn sonst
hättest du etwas spezifischer gefragt.
vielen dank.
ich habe nun ein script, mit dem ich nun den timer ein wenig
kennenlerne.
ich teste gerade die prescaler aus.
bei einem schrittmotor kommt es mir garnicht auf die geschwindigkeit an,
vielmehr auf den schritt den er macht und dass ich diesen n-mal
wiederholen lasse.
wie lege ich denn mit einem funktionierenden timer einen schritt fest?
oder macht man in der praxis den schritt anhand einer umdrehung aus?
Sven Weinmann schrieb:> vielen dank.>> ich habe nun ein script, mit dem ich nun den timer ein wenig> kennenlerne.>> ich teste gerade die prescaler aus.>> bei einem schrittmotor kommt es mir garnicht auf die geschwindigkeit an,> vielmehr auf den schritt den er macht und dass ich diesen n-mal> wiederholen lasse.
Na, ja.
Zu schnell dürfen die Schritte dann auch nicht sein. Sonst kommt der
Motor nicht mehr mit.
Und wenn er wegstartet müssen die Schritte langsamer kommen. Denn erst
mal muss ja der Motor seine träge Masse erst mal in Schwung bringen.
> wie lege ich denn mit einem funktionierenden timer einen schritt fest?
Bei jedem Aufruf der Timer-ISR ganz einfach den Ausgangspin umschalten.
So wie eine LED zum blinken gebracht wird, nur eben ein wenig schneller.
ja das ist alles schon am laufen
nun habe ich einen timer, der läuft und bringt mit bei
CPU: 3686400Hz und einem Prescaler von 8
-> 3686400 / 8 = 460800
bei 256 Schritten macht das 460800 / 256 = 1800 Overflows pro Sekunde.
damit dreht sich der motor kontinuierlich. in einer undefinierbaren
geschwindigkeit. d.h. nicht schnell aber auch nicht langsam.
da der motor ein getriebe vorgeschaltet hat und ein ca 1,5cm breites
zahnrad (durchmesser) drann sitzt sieht das relativ träge aus!
nun möchte ich aber nicht, dass er sich kontinuierlich dreht, sondern
nur einen zahn weiter. d.h. ich muss die CS bits auf 0 setzen, damit ich
ihn starte/stoppe
die frage ist nur, wie lange lasse ich ihn laufen damit er eine von mir
festgelegte drehung dreht? also wie definiere ich das er z.b. eine
viertelumdrehung macht?
benötige ich dafür eine PWM zusätzlich zum timer, um mir diese umdrehung
zu definieren?
Sven Weinmann schrieb:> nun möchte ich aber nicht, dass er sich kontinuierlich dreht, sondern> nur einen zahn weiter. d.h. ich muss die CS bits auf 0 setzen, damit ich> ihn starte/stoppe
kannst du. Musst du aber nicht.
Der Timer kann ja auch weiterlaufen. Lediglich das Pingewackel in der
ISR muss zur rechten Zeit (bzw. nach der richtigen Anzahl
Wackeloperationen) aufhören.
> die frage ist nur, wie lange lasse ich ihn laufen damit er eine von mir> festgelegte drehung dreht? also wie definiere ich das er z.b. eine> viertelumdrehung macht?
Indem du die Schritte mitzählst und nach einer definierten Anzahl
aufhörst den Pin zu toggeln?
1
volatileuint16_tSchritte;
2
3
ISR(....)
4
{
5
if(Schritte>0)
6
{
7
Schritte--;
8
PORT...^=(1<<Pinnummer);
9
}
10
}
11
12
intmain()
13
{
14
....
15
16
sei();
17
18
while(1)
19
{
20
if(irgendwas)
21
{
22
cli();
23
Schritte=800;// Lass den Motor 400 Schritte machen
Sven Weinmann schrieb:> hm wie soll ich denn die schritte mitzählen bei 1/1800 Hz?? :)
DU WEISST DOCH WO DU DIE SCHRITTIMPULSE GENERIERST !
>> so sieht mein quellcode aus, aber ich frage mcih, wo ich da was toggeln> soll
Na hier toggelst du den Pin, an dem der Pulseingang vom Motortreiber
drann hängt
> ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector> {> PORTB ^= _BV(PB1); // Pin B5 invertieren bei jeden Aufruf> }
Da zählst du einfach mit, wie oft das gemacht wird
(oder zählst von der gewünschten Anzahl runter bis 0 erreicht ist.)
Und wenn die Anzahl erreicht ist (oder 0) dann wird eben nicht mehr
getoggelt
1
volatileuint16_tSchritte;
2
3
ISR(....)
4
{
5
if(Schritte>0)
6
{
7
Schritte--;
8
PORTB^=_BV(PB1);
9
}
10
}
11
12
intmain()
13
{
14
....
15
16
sei();
17
18
while(1)
19
{
20
if(irgendwas)
21
{
22
cli();
23
Schritte=800;// Lass den Motor 400 Schritte machen
Sven Weinmann schrieb im Beitrag #2849185:
> woran liegt es eigentlich, dass der schrittmotor so pfeift?
Da passt dann die Schrittfrequenz nicht ganz bzw. liegt auf einer
Frequenz bei der es im Motor zu Resonanzen kommt. Probier einfach mal
eine etwas andere Timergeschwindigkeit.
ich habe gerade davon gelesen, dass das Pfeifen vom Chopper kommt.
Beitrag "Schrittmotoren Pfeifen / Summen"
ich habe den ton nur im "Stillstand" ich probiere einfach die frequenz
ein wenig anzupassen