Liczba postów: 856
Liczba wątków: 2
Dołączył: Nov 2017
Użyłbym I2C bo wszystko spina się dwoma drutami. Jak potrzebne większe prędkości to USART. W przypadku ARM sprawa prosta, linie TX slave ustawia się w OC(OD) i po robocie, w AVR trzeba dodać bramki OC np 74HC07.
Nie pokazałeś programu a ide o zakład, że da się wszystko ogarnąć jednym AVR o ile wystarczy PWMów. Jeśli jest ich za mało, można dać PWM po I2C. Łatwiej jest pisać soft na jeden uC niż na kilka.
Liczba postów: 856
Liczba wątków: 2
Dołączył: Nov 2017
30-12-2018, 13:05
(Ten post był ostatnio modyfikowany: 30-12-2018, 13:20 przez es2.)
(30-12-2018, 02:44)owerel209 napisał(a): Zostałbym w tym wypadku przy i2c ale jak to zrobić skoro 4x dostępne dla MEGA ? Jak nie I2C to USART?
Jakie 4 I2C dla Mega? Tam jest jeden I2C, nie zmienia to faktu po co kilka I2C?
Co do pozostałych możliwości to juz wymieniłem wszystkie rozsadne rozwiązania. Wszystko zależy od wymaganej szybkości transmisji, której nie jesteś w stanie nawet oszacować.
Gwarantuję też, że na jednym AVR da się zrobić nie tylko sterowanie regulatorami ale także i same regulatory (poza końcówką mocy oczywiście) dla 4 silników BLDC (Mega ma tylko 12 PWM, w ARM nie byłoby problemu).
Niewątpliwie platforma sprzętowa została wybrana źle i Arduino jest otoczone niepotrzebna elektroniką. Wystarczył by mały ARM choćby F103R8 gdzie 16 PWM to nie problem. Skoro sprzęt został wybrany źle, to i można zakładać, ze program jest napisany źle i dlatego autor tak broni się przed jego pokazaniem. Jeśli program napisany jest źle, to dodanie setki dodatkowych uC nic nie da, bo na nie program też będzie napisany źle.
Liczba postów: 856
Liczba wątków: 2
Dołączył: Nov 2017
30-12-2018, 20:46
(Ten post był ostatnio modyfikowany: 30-12-2018, 20:48 przez es2.)
owerel209 napisał(a):Nie ja pisałem kod, nie mam do niego nawet wglądu nawet.
Wcześniej czytam
owerel209 napisał(a):Witam, dostałem projekt na studiach związany z Arduino. Moją częścią projektu jest zaimplementowanie komunikacji pomiędzy Arduino Mega, a Arduino Nano.
Jakim cudem, chcesz zmodyfikować program nie mając go?
Ściemniasz coś kolego!
Liczba postów: 71
Liczba wątków: 2
Dołączył: Oct 2018
Reputacja:
1
Moze chodzi o teotetyczne rozwiazanie na kartce..fajne studia i zaliczenie..
Jak tak wyglada dzis ksztalcenie inzynierow, to ja dziekuje..;/
Wysłane z mojego SM-G950F przy użyciu Tapatalka
Liczba postów: 856
Liczba wątków: 2
Dołączył: Nov 2017
(30-12-2018, 21:26)wchpikus napisał(a): Jak tak wyglada dzis ksztalcenie inzynierow, to ja dziekuje..;/
Często, bardzo często, wygląda znacznie gorzej. Do dyspozycji sa zestawy (proponuje usiąść) na 8051 :-) Piszą w ASM :-)
Ale, zdarza się (tak często jak 6 w lotka), ze mają zestawy na ARM.
Tam gdzie jest 8051, ok, brak kasy, chęci, wiedzy wykładowców.
Tam gdzie Arduinio? Tego nie rozumie. AVR jest drogi, nierozwojowy, Arduino nie wspiera debugowania. Po co więc Arduino?
Prosty program migający LEDem na przerwaniach, prześledzony debugerem, jest bardziej wartościowy niż jakiś zegarek z dziesiątką dodatkowych układów (do LED, USB, klawiatury pojemnościowej, które w ARM już są) z blokującymi bibliotekami, których Arduinowiec nie rozumie, ba nawet nie próbuje zrozumieć, ne zagląda do nich, nie próbuje ich poprawić.
Liczba postów: 2,365
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Jeśli 40us dla jednego int (nie polecenia - cała paczka komunikacji może trwać nawet 10x tyle z jednym modułem) to za długo użyj SPI. I2C jest OK bo 2 kabelkami obsługuje wiele SLAVE, ale to trwa i jak jest więcej modułów to SLAVE najpierw musi wiedzieć, że do niego gadasz (dlatego 1 interfejs I2C wystarcza dla 6 slave), potem gadasz, potem kończysz, to więcej niż wysłanie 16bitów. SPI może być 10x szybsze przy przesyłaniu i SLAVE od razu wie, że z nim gadasz, ale to kosztuje 1 dodatkową IO + 1 na każdy SLAVE. Arduino ma zegar 16MHz, niektórych rzeczy nie przeskoczysz, jak ma zebrać dane z czujników, przeliczyć, wysłać nastawy to trochę to zajmie, jeden cykl zegara to 0.06us, byle jaka funkcja Arduino to już czas liczony w us. Raczej nie sterowałbym tego 7 Arduino, jak już to zbierałbym tylko dane tymi 6 NANO, MEGA przeliczał i sterował bezpośrednio silnikami (w sensie sterownikami śliników) i to tylko wtedy jeśli pomiar prędkości silników jest czasochłonny lub jest za mało sprzętu w MEGA by mierzyć kilka silników. Wysłanie danych do sterowania może być dłuższe niż wysterowanie z MEGA przez PWM - slave najpierw musi dane odebrać, a potem wykonać, czas 6x. SPI nawet na 8MHz samo wysłanie 12 int do 6 slave to z 20us, wysterowanie 6PWM to z 2us. Koncepcja wg mnie bez sensu. Algorytm sterowania jest do bani to podzielenie obliczeń na 7 rdzeni może tylko pogorszyć sytuację i dodać plątaninę kabli, przecież jak SLAVE coś liczy to jeszcze musi dać znać, że skończył, Master musi to zsynchronizować dla 6 sztuk. Jak MEGA nie daje rady z obliczeniami to na pewno prościej jest użyć 1 procka 10x szybszego (np. ESP32 240MHz, 32bity i czasami nawet 1000x szybszy) niż 10 procków w zamian, szczególnie jak to ma latać i masa ma znaczenie. Jak praca ma być tylko teoretyczna to raczej użyj SPI.
Arduino jest dla hobbystów i jego główną zaleta jest to, że nie wymaga zrozumienia jak działa procesor. Przynajmniej przy kopiowaniu projektów. Samą płytkę można wykorzystać jak się chce i w czym się chce co jest związane z AVR - korzyć to cena dzięki produkcji w milionach. Jak ktoś woli to może sobie kupić płytki prototypowe po 300zł z Atmegą 32.
Mój kuzyn właśnie rozpoczął pracę w Anglii, tam też studiował, pracę dyplomową robił na Arduino. W pracy za wspomnienie o Arduino może dostać wpierdziel - oczywiście żart, praca na zachodzie to inna bajka, ale temat Arduino jest faktycznie tabu.
Liczba postów: 856
Liczba wątków: 2
Dołączył: Nov 2017
(02-01-2019, 14:32)kaczakat napisał(a): Jeśli 40us dla jednego int (nie polecenia - cała paczka komunikacji może trwać nawet 10x tyle z jednym modułem) to za długo użyj SPI.
Jak policzyłeś te 40us?
Mnie, przy 400kHz, dla przesłania 2 bajtów wychodzi 45us bez START i STOP:
1/(400000/(9*2)) 400kHz / 9 bit na bajt * 2 bajty
Gdy dodam start i stop to 50us:
1/(400000/(9*2+2))
Cała ramka, razem z adresem 7-bit oraz start/stop to 75,5us:
1/(400000/(9*3+2))
Przypuśćmy, że chce adresować bajtem nr zapisywanego rejestru (choć może adres rejestru być zawarty w adresie slave jak w eeprom >256b <= 4k) wtedy wysyła łącznie 4 bajty co daje 95us:
1/(400000/(9*4+2))
Nie wyszło mi więc 40us dla 2 bajtów ii nie wiem dlaczego ma wyjść 10 razy dłużej dla całej ramki? Co by tam jeszcze przesyłał? CRC? Przecież Arduinowcy nie akceptują pojęcia CRC, dla nich to zbędny dodatek.