Witam pisze program który będzie sterował jednocześnie 6 silnikami krokowymi, miałem problemy z zaprojektowaniem takiego programu. Na początek napisałem program w którym podawało się który silnik w którą sitronę i ile razy ma się obrócić (ile ma zrobić kroków), problem polegał na tym że nie dało się w ten sposób sterować kilkoma silnikami na raz, na raz mógł działać tylko jeden silnik jak skończył całą pracę mógł pracować następny.
najlepiej było użyć licznika dla każdego silnika ale tyle timerów atmega16 nie ma :/
pomyślałem ze zrobię inaczej:
użyję jednego licznika do odmierzania 100µs, po każdym takim czasie zwiększane będą zmienne k1,k2,k3... które będą taki jak by licznikami dla każdego silnika.
pokażę to na przykładzie jednego silnika:
krok w tym silniku ma być co 2 ms, więc gdy zmienna k1 osiągnie wartość 20 (100µs * 20 = 2ms), wtedy zostanie ustawiona ustawiona zmienna a1 na wartość 0 a zmienna k1 wyzerowana. Zmienna a1 gdy będzie miała wartość 0 będzie to oznaczać zezwolenie na zmianę stanu wyjść co obróci silnik o jeden krok.
Każdy z silników bedzie sterowany przyciskami (później za pomocą programu)
więc żeby obrócić silnik na przykład w prawo, sprawdzam czy przycisk przyciśnięty następnie sprawdzam czy jest zezwolenie (czy a1==0) wtedy można wykonać jeden krok, a zmienna a1 zostaje ustawiona na wartośc różną od 0, następnie gdyby nie było opóźnienia w kolejnej pętli silnik znów chciał by zmienić swoje położenie (tak szybka zmiana stanów nie obróciła by silnika tylko by drgał), więc po kolejnej pętli programu sprawdzane jest znów czy wciśnięto przycisk i czy wartość a1==0 ale będzie ona różna od zera bo wyzeruje się dopiero po upływie 2ms
czy takie rozwiązanie problemu jest dobre? czy są lepsze metody?
na początku do jednego silnika wykorzystywał opóźnienia delay_ms ale jak wiadomo zatrzymywało to cały program a przy 6 silnikach tak być nie może
najlepiej było użyć licznika dla każdego silnika ale tyle timerów atmega16 nie ma :/
pomyślałem ze zrobię inaczej:
użyję jednego licznika do odmierzania 100µs, po każdym takim czasie zwiększane będą zmienne k1,k2,k3... które będą taki jak by licznikami dla każdego silnika.
pokażę to na przykładzie jednego silnika:
krok w tym silniku ma być co 2 ms, więc gdy zmienna k1 osiągnie wartość 20 (100µs * 20 = 2ms), wtedy zostanie ustawiona ustawiona zmienna a1 na wartość 0 a zmienna k1 wyzerowana. Zmienna a1 gdy będzie miała wartość 0 będzie to oznaczać zezwolenie na zmianę stanu wyjść co obróci silnik o jeden krok.
Każdy z silników bedzie sterowany przyciskami (później za pomocą programu)
więc żeby obrócić silnik na przykład w prawo, sprawdzam czy przycisk przyciśnięty następnie sprawdzam czy jest zezwolenie (czy a1==0) wtedy można wykonać jeden krok, a zmienna a1 zostaje ustawiona na wartośc różną od 0, następnie gdyby nie było opóźnienia w kolejnej pętli silnik znów chciał by zmienić swoje położenie (tak szybka zmiana stanów nie obróciła by silnika tylko by drgał), więc po kolejnej pętli programu sprawdzane jest znów czy wciśnięto przycisk i czy wartość a1==0 ale będzie ona różna od zera bo wyzeruje się dopiero po upływie 2ms
czy takie rozwiązanie problemu jest dobre? czy są lepsze metody?
na początku do jednego silnika wykorzystywał opóźnienia delay_ms ale jak wiadomo zatrzymywało to cały program a przy 6 silnikach tak być nie może