Sterowanie silnikiem krokowym (bascom)

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Sterowanie silnikiem krokowym (bascom)

Post autor: Jasam » 07 mar 2008, 19:26

Kod: Zaznacz cały

$regfile= "attiny26.dat"
$crystal = 4000000

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pina.0 = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Rc5 = Pina.7

Config Timer0 = Timer , Prescale = 256
Enable Timer0 : Enable Interrupts
On Timer0 Przerwanie

Declare Sub Silnikb(byval krokb As Integer , byval Ilekrokowb As Integer)


Do
  Wait 1
  Silnikb 1 , 10
  Wait 1
  Silnikb -1 , 10
Loop


Przerwanie:
Return


Sub Silnikb(byval Krokb As Integer , Byval Ilekrokowb As Integer)
Local Numerb As Integer , I As Integer

For I = 0 To Ilekrokowb
 Portb.0 = 0
 Portb.1 = 0
 Portb.2 = 0
 Portb.3 = 0
 Portb.numerb = 1
 Numerb = Numerb + Krokb
 If Numerb > 3 Then
  Numerb = 0
 End If
 If Numerb < 0 Then
  Numerb = 3
 End If
 Waitms 200
 Next I
End Sub
Chciałem napisać sobie taki programik do sterowania silnikiem krokowym. Kolejne cewki przez bufory są załączane gdy na ktorymś z kolejnych wyjść B.0 do B.3 znajduje się logiczna jedynka. Więc logiczna jedynka powinna się przemieszczac przez kolejne porty w kierunku od b.0 do b.3 (lub przeciwnie- w zależności od wartości zmiennej krokb. jesli wynosi ona 1 to w jedna strone, jesli -1 to w przeciwną), o tyle kroków ile wynosi wartość ilekrokowb. Przerwanie od timera ma slużyć do czegoś innego. Gdzie tutaj jest błąd?
Ostatnio zmieniony 07 mar 2008, 20:33 przez Jasam, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 07 mar 2008, 20:18

Zmienna lokalna NumerB jest nie zainicowana. Zatem numer bitu jest błędny.

A silnikiem krokowym nie steruje się w ten sposób.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 07 mar 2008, 20:26

Gdzie zainicjować tą zmienią żeby było dobrze?
I dlaczego nie tak sterowac tym silnikiem? sprawdzalem już ten sam mechanizm sterowania tylko napisany w inny prymitywniejszy sposob i śmigało aż miło

ZbeeGin

Post autor: ZbeeGin » 07 mar 2008, 20:31

Dopisać na początku:

Kod: Zaznacz cały

$framesize = 32
$swstack = 20
$hwstack = 32
A w procedurze dodać:

Kod: Zaznacz cały

Sub Silnikb(krokb As Integer , Ilekrokowb As Integer)
Local Numerb As Integer , I As Integer

Numerb = 0    '<<<<<<<<
For I = 0 To Ilekrokowb
(...)
Skoro twierdzisz, że taki sposób sterowania jest poprawny...

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 07 mar 2008, 20:34

Jeśli smiga i to bardzo dobrze z wykorzystaniem sterownika mocy mojego pomysłu to znaczy że działa. Procesor ma dostarczyć tylko odpowiedniej sekwencji sygnałów.

Dzięki.

ODPOWIEDZ