RAMPA na ARDUINO

Dyskusje na temat silników krokowych i sterowników silników krokowych.

GSM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 8
Posty: 183
Rejestracja: 01 kwie 2007, 21:05
Lokalizacja: Warszawa

#91

Post napisał: GSM » 19 kwie 2012, 02:11

Czego chcesz od vim-a, dobry edytor.
Eclipse i Code::Blocks, jedna krowa większa od drugiej...
Ociężałe, wielkie bydlaki, ja tam wole lekkie środowiska - co chodzą sprawnie na komputerze sprzed 4 lat. Zresztą poco komu takie zaawansowane IDE do pisania jakiś drobnych pierdół.

Pozdrawiam,
GSM



Awatar użytkownika

blue_17
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 14
Posty: 1715
Rejestracja: 16 kwie 2009, 07:55
Lokalizacja: Kraków/Kornatka

#92

Post napisał: blue_17 » 19 kwie 2012, 02:16

Taki żarcik sam korzystałem i korzystam z VIM-a na linuxie bo jak pozna się jego nieco możliwości to inne edytory konsolowe wydają się denne

niewątpliwa jego zaletą jest że można z niego od razu wykonywać programy a nie trzeba przełączać się do konsoli i wiele innych jak wbudowane kolorowanie składni i porównywanie dokumentów dowolne otwieranie plików w pionie czy też w poziomie :)

Pozdrawiam :)
"I siedzieli oni razem pod nagim DOS-em i nie wstydzili sie tego." :D


GSM
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 8
Posty: 183
Rejestracja: 01 kwie 2007, 21:05
Lokalizacja: Warszawa

#93

Post napisał: GSM » 19 kwie 2012, 02:23

I do tego chodzi na na Pentium 133 Mhz jak marzenie.
Podświetlanie składni i wyszukiwanie po wyrażeniach regularnych i już jestem szczęśliwy. :smile:
No znalazłem jeszcze jakiśkolwiek driver do krokowca więc można zaczynać zabawę w rampowanie. :cool:

Pozdrawiam,
GSM

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3962
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#94

Post napisał: markcomp77 » 19 kwie 2012, 09:02

blue_17 pisze:
markcomp77 pisze:a ja chce to robić jedynie pod linuksem...


z tego co przeczytałem -- wynika, że GCC pod linuksem na ARMa w pełni może wykorzystać możliwości cortexowości
W Code::blocks albo w eclipse możesz pod linuxem pisać dla armów :)

Chyba że wolisz VIM-a :P
Edytor tekstów... mniej lub bardziej rozwinięty z paroma dodatkowymi przyciskami to tylko otoczka.

Najistotniejszy jest kompilator + sposób/metoda zrzutu danych do uC...

[ Dodano: 2012-04-19, 11:25 ]
na moim ubuntu 11.10 poszedł ten opis budowy:

Kod: Zaznacz cały

$ sudo apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev
libmpc-dev autoconf texinfo build-essential libftdi-dev
$ git clone https://github.com/esden/summon-arm-toolchain.git
$ cd summon-arm-toolchain
$ sudo ./summon-arm-toolchain
$ cd ..
$ sudo apt-get install libsgutils2-dev libusb-1.0-dev
$ git clone https://github.com/texane/stlink.git
$ cd stlink
$ make
teraz zobaczę czy to działa...

[ Dodano: 2012-04-19, 11:38 ]

Kod: Zaznacz cały

smark@hpecik:~/ARM/stlink$ sudo ./gdbserver/st-util fu bar
non-option ARGV-elements: fu bar 
2012-04-19T11:36:28 INFO src/stlink-usb.c: -- exit_dfu_mode
2012-04-19T11:36:28 INFO src/stlink-common.c: Loading device parameters....
2012-04-19T11:36:28 INFO src/stlink-common.c: Device connected is: F4 device, id 0x20006411
2012-04-19T11:36:28 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
Chip ID is 00000413, Core ID is  2ba01477.
KARL - should read back as 0x03, not 60 02 00 00
init watchpoints
Listening at *:4242...
no i chyba łączność działa...
teraz trzeba pouczyć się JAK ;)

[ Dodano: 2012-04-19, 11:44 ]
http://youtu.be/Jh58kwllU0s

[ Dodano: 2012-04-19, 12:28 ]
kompilacja przykładu

Kod: Zaznacz cały

$ EXPORT PATH=~/sat/bin:$PATH
$ cd stlink/examples/blink
$ make CONFIG_STM32F4_DISCOVERY=1
działa :)

przykład (tylko wersja F4):

Kod: Zaznacz cały

/* missing type */
typedef unsigned int uint32_t; 


/* hardware configuration */
#define GPIOD 0x40020C00              /* port D */
#define GPIOD_MODER (GPIOD + 0x00)    /* port mode register */
#define LED_PORT_ODR (GPIOD + 0x14)   /* port output data register */
#define LED_GREEN (1 << 12)           /* port D, pin 12 */
#define LED_ORANGE (1 << 13)          /* port D, pin 13 */
#define LED_RED (1 << 14)             /* port D, pin 14 */
#define LED_BLUE (1 << 15)            /* port D, pin 15 */

void _tmain(void) { 
	main(); 
} 
static inline void setup_leds(void) 
{ 
  *(volatile uint32_t*)GPIOD_MODER |= (1 << (12 * 2)) | (1 << (13 * 2)) |
  	(1 << (13 * 2)) | (1 << (14 * 2)) | (1 << (15 * 2)); 
} 


static inline void switch_leds_on(void) 
{ 
  *(volatile uint32_t*)LED_PORT_ODR = LED_BLUE | LED_GREEN | LED_ORANGE | LED_RED; 
} 

static inline void switch_leds_off(void) 
{ 
  *(volatile uint32_t*)LED_PORT_ODR = 0; 
} 

#define delay()						            \
do {							                \
  register unsigned int i;				        \
  for (i = 0; i < 1000000; ++i)				    \
    __asm__ __volatile__ ("nop\n\t":::"memory");\
} while (0) 

/* static void __attribute__((naked)) __attribute__((used)) main(void) */
void main(void) 
{ 
  setup_leds(); 

  while (1) 
  { 
    switch_leds_on(); 
    delay(); 
    switch_leds_off(); 
    delay(); 
  } 
} 

trochę tego więcej niż w Arduino...

jak to wrzucić do ARMka:

Kod: Zaznacz cały

$ arm-none-eabi-gdb
(gdb) target extended localhost:4242
(gdb) load blink_F4.elf
(gdb) continue


[ Dodano: 2012-04-19, 12:29 ]
PUNKT dla jarekk --- modulik jest miodzio pod linuksem!
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm

Awatar użytkownika

blue_17
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 14
Posty: 1715
Rejestracja: 16 kwie 2009, 07:55
Lokalizacja: Kraków/Kornatka

#95

Post napisał: blue_17 » 21 kwie 2012, 13:59

Może kolega pokazać jeszcze jak debbugować pod linuxem dla pełności opisu :)
"I siedzieli oni razem pod nagim DOS-em i nie wstydzili sie tego." :D

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3962
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#96

Post napisał: markcomp77 » 21 kwie 2012, 22:37

blue_17 pisze:Może kolega pokazać jeszcze jak debbugować pod linuxem dla pełności opisu
postaram się...

choć chciałem jeszcze poinformować o problemie jaki powstał... podczas pierwszych prób z podłączeniem -- problem jest TRYWIALNY -- kabel USB
na pierwszym -działało...
na drugim.. który wyglądał lepiej - NIE

nie działało tak

Kod: Zaznacz cały

sudo ./gdbserver/st-util fu bar
non-option ARGV-elements: fu bar 
2012-04-21T22:14:13 WARN src/stlink-usb.c: Couldn't find any ST-Link/V2 devicesm
na dobrym kablu - połączenie się po prosty pojawia:

Kod: Zaznacz cały

sudo ./gdbserver/st-util fu bar
non-option ARGV-elements: fu bar 
2012-04-21T22:18:25 INFO src/stlink-usb.c: -- exit_dfu_mode
2012-04-21T22:18:25 INFO src/stlink-common.c: Loading device parameters....
2012-04-21T22:18:25 INFO src/stlink-common.c: Device connected is: F4 device, id 0x20006411
2012-04-21T22:18:25 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
Chip ID is 00000413, Core ID is  2ba01477.
KARL - should read back as 0x03, not 60 02 00 00
init watchpoints
Listening at *:4242...


to połączenie warunkuje pracę z debuggerem (gdb - The GNU Debugger), który robi za ładowacz kodu...

Kod: Zaznacz cały

mark@hpecik:~/ARM/stlink/example/blink$ arm-none-eabi-gdb
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying" 
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-none-eabi".
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) target extended localhost:4242
Remote debugging using localhost:4242
0x0800788c in ?? () 
(gdb) load blink_
blink_32L.elf   blink_32VL.elf  blink_F4.elf    
(gdb) load blink_F4.elf 
Loading section .text, size 0x48 lma 0x20000000
Start address 0x20000000, load size 72
Transfer rate: 900 bytes/sec, 72 bytes/write.
(gdb) continue 
istotne jest przyłączenie się debuggera do moduły za pomocą łącza zbudowanego wcześniej

Kod: Zaznacz cały

st-util fu bar
[...] 
Listening at *:4242...
4242 - słucha.. więc my do niego będziemy gadać:

Kod: Zaznacz cały

target extended localhost:4242
a następnie - ładujemy skompilowany wcześniej kod przykładu

Kod: Zaznacz cały

load blink_F4.elf
make przykładu wygenerował: blink_32L.elf blink_32VL.elf blink_F4.elf
wybrałem F4 -- bo nasz cortex jest 4

następne polecenie powoduje rozpoczęcie wykonywania kodu (ale z możliwością zatrzymania)

Kod: Zaznacz cały

continue

inne polecenia... dokładny opis można uzyskać

Kod: Zaznacz cały

man arm-none-eabi-gdb


[ Dodano: 2012-04-21, 22:46 ]
albo http://sitarz.sdf-eu.org/labs/procedura ... index.html
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4463
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#97

Post napisał: pitsa » 22 kwie 2012, 01:22

Korzystając z porady Yogi_ zrobiłem arkusz z kombinacją instrukcji warunkowych i dodawania na liczbach całkowitych (czas między krokami w mikrosekundach): rampa4.ods (wykres na przykładzie hamowania).

Kod: Zaznacz cały

// rampa opracowana metodą przyrostu przyrostu
void ramppp(int steps, int KR1, int KR2, int KR3, int usmax, int usmin){ 
  int przerwa=0;                     //
  int PR=0;                          // przyrost
  int pip = 20;                      // 20us - impuls step
  int dir = (steps > 0)? HIGH:LOW; 
  steps = abs(steps);                // wyciągnięcie kierunku z podanej liczby kroków.
  digitalWrite(DIR_PIN,dir);         // ustaw kierunek
  
  // pętla przyspieszanie
  int poziomo = steps - 2 * (KR3 + 4 * KR1 + 2 * KR2) ; 
  PR = 0; 
  for(int KR = 1; KR < (KR3 + 4 * KR1 + 2 * KR2); KR++){ 
    PR = PR + 1;                                    // etap1
    if ( KR > KR1 ) {PR = PR + 1 ; } ;                 // etap2
    if ( KR > ( KR1 + KR2) ) {PR = PR + 1 ; } ;          // etap3
    if ( KR > ( 2 * KR1 + KR2 ) ) {PR = PR + 1 ; } ;       // etap4
    if ( KR > ( 2 * KR1 + KR2 + KR3 ) ) {PR = PR + 1 ; } ;   //etap5
    if ( KR > ( 3 * KR1 + KR2 + KR3 ) ) {PR = PR + 1 ; } ;     //etap6
    if ( KR > ( 3 * KR1 + 2* KR2 + KR3 ) ) {PR = PR + 1 ; } ;    //etap7
    przerwa = usmin - PR ; 
    if ( przerwa < usmax ) { przerwa = usmax ; } ; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  }   
    
  // jazda na pełnej prędkości
    for(int FF = 1; FF < poziomo ; FF++ ){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
   }  

  // pętla hamowania
  PR = 0; 
  for(int KR = 1; KR < (KR3 + 4*KR1 + 2*KR2); KR++){ 
    PR = PR + 1;                                    // etap1
    if ( KR > KR1 ) {PR = PR + 1 ; } ;                 // etap2
    if ( KR > ( KR1 + KR2) ) {PR = PR + 1 ; } ;          // etap3
    if ( KR > ( 2 * KR1 + KR2 ) ) {PR = PR + 1 ; } ;       // etap4
    if ( KR > ( 2 * KR1 + KR2 + KR3 ) ) {PR = PR + 1 ; } ;   //etap5
    if ( KR > ( 3 * KR1 + KR2 + KR3 ) ) {PR = PR + 1 ; } ;     //etap6
    if ( KR > ( 3 * KR1 + 2* KR2 + KR3 ) ) {PR = PR + 1 ; } ;    //etap7
    przerwa = PR + usmax ; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  } 
przykładowe użycie:

for (int k =1; k<20 ; k++){
ramppp(-10000, k* 60, 0, 200, 500, 1000);
ramppp(10000, k* 60, 0, 200, 500, 1000);
}


Jest jeszcze parę drobnych błędów (liczba kroków całej rampy i brak wyliczenia prędkości startu) z powodu których działa dobrze tylko hamowanie:

http://youtu.be/vahPeqZsCB0

Wcześniej były zbyt duże uderzenia na początku rampy hamowania i końcu przyspieszania:

http://youtu.be/Q-80IXh8vf4
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 21
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#98

Post napisał: jarekk » 22 kwie 2012, 10:45

blue_17 pisze:Może kolega pokazać jeszcze jak debbugować pod linuxem dla pełności opisu :)

Kolega markcomp77 robi debuggowanie na "twardziela". Nie lepiej odpalić Eclipse'a albo Rowley Crossworks ( też jest po linuksa)

http://linuxfreak.pl/elektronika/debugg ... slackware/
http://www.yagarto.de/
http://www.rowley.co.uk/arm/releases.htm ( wymaga licencji - można dostać na 30 dni)

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3962
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#99

Post napisał: markcomp77 » 22 kwie 2012, 23:02

jarekk pisze:Kolega markcomp77 robi
środowisko pracy za free i do nieszkodliwej zabawy ;)

zainstalowałem CrossStudio for ARM 2.2 - robi niezłe wrażenie... jeszcze nie aktywowałem tych 30dni
jednak - cena aktywacji bezterminowej jest powalająca... i raczej zniechęca do tracenia czasu na oprogramowanie na, które nie będę chciał przeznaczyć tylu środków...

wciąż podoba mi się to "twarde" odpalanie...
pobawię się jutro tym opisem z linku pierwszego...
http://linuxfreak.pl/elektronika/debugg ... slackware/



---
dotarł też do mnie Arduino -- więc dołączę do testów w realu kodu kolegi pitsa
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4463
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#100

Post napisał: pitsa » 29 kwie 2012, 22:34

Rampy w Arduino ciąg dalszy.
Tym razem inna prosta metoda i szybka rampa bez zbędnego bujania się na małej prędkości. W rampie są oba przegięcia, o których była wcześniej mowa. Do funkcji wykonującej rampę podaję trzy parametry:

przerwa_startowa - np. 10000 mikrosekund - odpowiada to około 4 obr/minutę
przerwa_przelotu - np. 50 mikrosekund - ponad 600 obr/minutę
wspolczynnik_lagodnosci - liczba całkowita od 3 (ostro) do 8 (łagodnie)

Przerwę między krokami zmniejszam zaczynając od przerwy startowej o wartość wyliczoną wzorem:

int ( aktualna_przerwa - przerwa_przelotu ) / wspolczynnik_lagodnosci ) + 1

aż do osiągnięcia przerwy równej przerwie przelotu.

Obliczenia i wykres prędkości i przyspieszeń tutaj: rampa5.ods.
Rampa jest symetryczna - przerwy podczas startu są zapamiętywane w tabeli przerw i przy lądowaniu odtwarzane.

Kod: Zaznacz cały

// rampa metodą podziału przez n
void rampan(int steps, int NN, int usmax, int usmin){ 
         // steps - liczba krokow do wykonania 
         // NN    - parametr podziału, od 3 do 8, 8 - lagodnie, 3 ostro
         // usmax - przerwa us przy maksymalnej prędkości 
         // usmin - przerwa us przy najmniejszej prędkości 
  int przerwa = usmin;               // przerwa początkowa
  int poziomo ;                      // licznik kroków na pełnej prędkości  
  int licznik=0;                     // licznik elementów tabeli przerw
  int pip = 20;                      // 20us - impuls step
  int dir = (steps > 0)? HIGH:LOW;   // 
  steps = abs(steps);                // wyciągnięcie kierunku z podanej liczby kroków.
  digitalWrite(DIR_PIN,dir);         // ustaw kierunek
   //  start rampy
   do { 
    licznik = licznik + 1; 
    przerwa = przerwa - int(( przerwa - usmax ) / NN) - 1 ; 
    if ( przerwa < usmax ) { przerwa = usmax ; } ; 
    tabela[licznik] = przerwa ; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  } while(przerwa > usmax) ; 
    // jazda na pełnej prędkości
    poziomo = steps - 2 * licznik;    
    przerwa=usmax; 
    for(int FF = 1; FF  <  poziomo ; FF++ ){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
   }  
  // pętla hamowania
    for(int KK = licznik; KK > 1 ; KK-- ){ 
    przerwa=tabela[KK]; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  } 
} 
przykładowe użycie:

Kod: Zaznacz cały

    rampan(-1600, 8, 100, 10000); 
    rampan(1600, 8, 100, 10000); 
Pełny gotowy kod w załączonym arkuszu kalkulacyjnym: rampa5.ods.
Brakuje jedynie sprawdzenia "czy warto się rozpędzać" gdy podana liczba kroków jest za mała do wejścia na pełne obroty.
Tym razem nie ma co filmować i pokazywać, bo szybko wchodzi na obroty i hamuje.
Ta krótka rampa może być przydatna do wykonywania silnikiem szybkich ruchów po zastąpieniu delayMicroseconds obsługą timera.
Przy współczynniku łagodności 12 wychodzi 80 kroków:
Obrazek
Wykres przedstawia unormowaną prędkość i przyspieszenie. Patrząc od prawej do lewej, schody na przyspieszeniu są związane ze zmianą przerwy między krokami kolejno o 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6 itd..
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Silniki Krokowe / Sterowniki Silników Krokowych”