TMC 239 sterowanie ISP

Rozmowy na temat układów elektronicznych sterowania obrabiarek CNC

Autor tematu
mag32
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 9
Posty: 391
Rejestracja: 31 paź 2004, 13:34
Lokalizacja: Bytom
Kontakt:

TMC 239 sterowanie ISP

#1

Post napisał: mag32 » 13 mar 2006, 20:10

Witam.
Skonstruowałem sterownik silnika krokowego oparty o TMC 239, korzystając z noty aplikacyjnej producenta i schematu o zwiękrzonej mocy.
Ale nie w tym rzecz.
Problem polega na tym, że wysyłam do układu polecenia z procesora AVR AtMega128, a silnik zachowuje się jakby miał czkawkę, nie obraca się tylko przeskakuje po różnych trudnych do określenia pozycjach.

Wobec tego moje pytanie:
» Jak powinna wyglądać transmisja z procesora do tego układu tak by kręcić silnikiem półkrokami ? [na przykład, choć niekoniecznie]
» Z jaką prędkością można przesyłać dane do układu, CPU prauje na 8MHz

Widziałem plik przygotowany przez Markompa gdzieś w innym wątku z podziałem 1/8 ale gdy wysyłam te sekwencje to dzieje się właśnie to co opisałem wcześniej, chociaż wydaje mi się iż błędu tam nie ma.



Tagi:


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 9
Posty: 687
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#2

Post napisał: Adalber » 13 mar 2006, 20:32

Napisz więcej jak wysyłasz dane do procka ,korzystasz ze sprzętowego SPI czy wysyłasz po bicie? . Jeśli korzystasz ze sprzętowego SPI jak wyglądają bajty?


Luki
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 1
Posty: 68
Rejestracja: 06 gru 2004, 18:31
Lokalizacja: Wieliczka

#3

Post napisał: Luki » 13 mar 2006, 20:35

W czym napisałeś program sterujący do at128 ( C czy BASCOM )?


Autor tematu
mag32
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 9
Posty: 391
Rejestracja: 31 paź 2004, 13:34
Lokalizacja: Bytom
Kontakt:

#4

Post napisał: mag32 » 13 mar 2006, 21:04

Program jest w C, korzystam ze sprzętowego ISPa wysyłam najpierw część starszą uzupełnioną od lewej zerami a potem drugibajt.
Czyli 0b00001111,0b10111110 na przykład.
Pierwsze 4 zera powinny być przez tmc239 ignorowane.

Jak wyglądają bajty ?

11 10 9 8 7 6 5 4 3 2 1 0 Nr bitu


1 0 0 0 0 0 1 1 1 1 1 0
1 0 0 1 1 0 1 1 1 1 1 0
1 0 1 1 0 0 1 1 1 1 0 0
1 1 0 0 0 0 1 1 1 0 1 0
1 1 0 1 1 0 1 1 0 1 1 0
1 1 1 0 1 0 1 1 0 0 0 0
1 1 1 1 0 0 1 0 1 1 0 0
1 1 1 1 1 0 1 0 0 1 1 0
1 1 1 1 1 0 1 0 0 0 0 0
1 1 1 1 1 0 1 0 0 1 1 1
1 1 1 1 0 0 1 0 1 1 0 1
1 1 1 0 1 0 1 1 0 0 0 1
1 1 0 1 1 0 1 1 0 1 1 1
1 1 0 0 0 0 1 1 1 0 1 1
1 0 1 1 0 0 1 1 1 1 0 1
1 0 0 1 1 0 1 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1 1 1
1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 1 1 1 1 0 1
1 1 0 0 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 0 1 1 1
1 1 1 0 1 1 1 1 0 0 0 1
1 1 1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 0 0 0 0 1
1 1 1 1 1 1 1 0 0 1 1 0
1 1 1 1 0 1 1 0 1 1 0 0
1 1 1 0 1 1 1 1 0 0 0 0
1 1 0 1 1 1 1 1 0 1 1 0
1 1 0 0 0 1 1 1 1 0 1 0
1 0 1 1 0 1 1 1 1 1 0 0
1 0 0 1 1 1 1 1 1 1 1 0


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 9
Posty: 687
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#5

Post napisał: Adalber » 13 mar 2006, 21:30

Te dane które zamieściłeś to moja robota,ale to nie ma znaczenia silnik powinien się kręcić będzie tylko głośniej piszczał (jest błąd -ciągle włączone bity MDA i MDB).
Po wysłaniu 2 bajtów zmieniasz stan linii CSN na wysoki ?


Autor tematu
mag32
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 9
Posty: 391
Rejestracja: 31 paź 2004, 13:34
Lokalizacja: Bytom
Kontakt:

#6

Post napisał: mag32 » 14 mar 2006, 08:49

CSN jest zmieniane co 2 bajty, wygląda to tak

portb0_l; //CSN=0
SPDR=0b00001111;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b10111110;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h; //CSN=1
delayms(200); //Przerwa przed wysłaniem kolejnej instrukcji

A co mam w takim razie zrobić z tym MDA i MDB :?:


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 9
Posty: 687
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#7

Post napisał: Adalber » 14 mar 2006, 10:03

Co do bitów MDA i MDB to dłuższa opowieść generalnie bity te ustawiamy gdy napięcie wyjściowe ma "schodzić w strone zera".Przeglądnij wątek tmc239 na stronie 2 masz trochę opisane na ten temat .Przyglądnij się dokładnie kolorowym tabelom zamieszczonym przez markcomp77.Jak coś nie będzie jasne to pytaj.(w tych tabelach masz gotowe dane do pracy półkrokowej)
W SPI sprawdziłeś ustawienie fazy i polaryzacji sygnału zegarowego?


Autor tematu
mag32
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 9
Posty: 391
Rejestracja: 31 paź 2004, 13:34
Lokalizacja: Bytom
Kontakt:

#8

Post napisał: mag32 » 14 mar 2006, 10:20

W SPI sprawdziłeś ustawienie fazy i polaryzacji sygnału zegarowego?

Nie sprawdzałem, a możesz mi to przybliżyć, nie za bardzo wiem o co chodzi.

...MDA i MDB to dłuższa opowieść...

Właśnie sprawdzam / przeglądam.

[ Dodano: 2006-03-14, 10:58 ]
Jak to jest z tym PHA, PHB ? Co one dokładnie powodują ?
Rozumiem to tak, że podanie na PHA jedynki spowoduje załączenie górnej pary tranzystorów mostka A, czyli jak się to ma do przepływu prądu przez uzwojenia, jakoś nie mogę tego za bardzo zrozumieć, a to podstawa sensu uruchomienia tego sterownika.

[ Dodano: 2006-03-14, 13:59 ]
Program wygląda tak jak poniżej, sekwencja jest według tabeli z tematu TMC239.

int main(void)
{
DDRB=_BV(0)|_BV(1)|_BV(2);
PORTB=_BV(PB0);
SPCR=_BV(MSTR)|_BV(SPR0)|_BV(SPE)|_BV(CPHA)|_BV(CPOL);
unsigned char odp;
for(;;)
{
portb0_l;
SPDR=0b00000000;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b10011110;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00000101;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b10110100;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00000111;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b10000011;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00001101;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b00010111;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00000000;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b11011111;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00000101;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b11110101;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00000111;//7
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b11000010;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;

portb0_l;
SPDR=0b00001101;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
SPDR=0b01010110;
while(!(SPSR|(1<<SPIF)));
odp=SPDR;
portb0_h;
opoznienie;
}
}

Mimo to silnik się nie obraca, czuć drgania, i trzyma dość mocno ale w jednej pozycji.

dołączam też schemat z Eagla.
Załączniki
tmc.zip
spakowany tmc.sch dla eagle4.15
(39.15 KiB) Pobrany 256 razy


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 9
Posty: 687
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#9

Post napisał: Adalber » 14 mar 2006, 14:13

Nie znam procesorów ATmega i nie wiem jak tam rozwiązany jest interfejs SPI ,jakie wartości bitów sterujących tym interfejsem są domyślne musisz poczytać odpowiedniego PDFa w at89s8252 jest to zrobione pewnie podobnie bo to ta sama firma .Generalnie chodzi o to czy zegar w stanie spoczynku ma wartość 1 czy 0 .Tmc odczytuje wartość bitu gdy jest zbocze narastające SCK .
Jeśli chodzi o PHA to działanie jest następujące,oczywiście upraszczam PHA =1 wtedy "otwierają" się tranzystory lewy górny i prawy dolny ,prąd przez cewkę płynie w prawo ,gdy PHA=0 to otwiera się prawy górny i lewy dolny i prąd płynie w drugą stronę .Tak byłoby dokładnie gdyby nie czoper .
Ściagnij sobie note aplikacyjną układu LMD18245.pdf na stronie 7 jest zasada działania czopera ,można przyjąc ,że jeśli PHA jet=1 to mamy wykres nad osią gdy PHA=0 to pod.
Załączniki
SPI.rar
(175.89 KiB) Pobrany 257 razy


Autor tematu
mag32
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 9
Posty: 391
Rejestracja: 31 paź 2004, 13:34
Lokalizacja: Bytom
Kontakt:

#10

Post napisał: mag32 » 14 mar 2006, 14:27

Coraz więcej rozumiem.
Jak wg Ciebie powinien zachować się TNC239 gdy jest włączony ENN-GND a nie dostaje żadnych informacji z CPU.
Wygląda na to że trzyma Silnik w jednej pozycji. Zgadza się ? Słychać wtedy cichy Pisk - pewnie Chopper.
Mierz co mierzalne,
a niemierzalne uczyń także mierzalnym"
(Galileo Galilei)

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Elektronika CNC”