Buduję napęd silnika prądu stałego oparty na Atmedze8. I moim problemem jest implementacja algorytmu kaskadowego do sterowania silnikiem, a dokładniej regulatorów PI. (przepraszam za takie "mądre" określenie problemu, ale w ten sposób najłatwiej mi to opisać. Tak czy owak potrzebuje stworzyć program w asemblerze na Atmegę który wykona zadanie regulatora PI.
Przechodząc do sedna sprawy muszę wykonać następujące operacje:
1. Obliczyć błąd uchybu e=Y0-Y (gdzie: Y0 to wartość zadana (8bitów) Y wartość zmierzona (też 8bitów)
2. X1 = e pomnożone razy stałą wartość K1 (8 bitów).
3. X2= e pomnożone razy druga stała K2 (8 bitów)
4. In = I(n-1) + X2 // I(n-1) to wartość In z poprzedniej pętli algorytmu
5 U=X1+I(n-1)
Wynik musi być 8bitowy.
No i problem dla mnie stanowi rozwiązanie kwestii przepełnień przy dodawaniu i określenia znaku przy czym wartości Y0, Y, U są zapisane w zwykłym kodzie dwójkowym.
No i pozostaje problem mnożeń. Skoro pomnożę 2 liczby 8bitowe wynik otrzymam 16 bitowy żeby tego uniknąć musiałbym na początku zamienić wszystkie bajty na (w jakiś sposób) odpowiadające im liczby w kodzie 1N.7Q wykonać obliczenia i spowrotem wrócić do normalnego kodu dwójkowego. Tylko nigdzie nie mogę znaleźć sposobu takiej konwersji:(.
Jest wogóle jakiś sposób na przechodzenie między tymi sposobami reprezentacji liczb? (Zdaję sobie sprawę że chcę zamienić liczby z przedziału (0,255) na liczby z przedziału (-1,0.99) dlatego piszę o liczbach "w jakiś sposób odpowiadających".
Dodano po 3 [godziny] 53 [minuty]:
Narazie mam coś takiego, (pkt1 czyli obliczenie uchybu):
ldi R16, 100 ; ladowanie przykladowych wartosci Y0
ldi R17, 130 ; i Y
cp R16, R17 ; porównanie odjemnej i odjemnika
brlo e_ujemne
sub R16, R17 ; jesli wynik jest dodatni
mov R18, R16
e_ujemne:
sub R17, R16 ; jesli wynik jest ujemny
mov R18, R17
Przechodząc do sedna sprawy muszę wykonać następujące operacje:
1. Obliczyć błąd uchybu e=Y0-Y (gdzie: Y0 to wartość zadana (8bitów) Y wartość zmierzona (też 8bitów)
2. X1 = e pomnożone razy stałą wartość K1 (8 bitów).
3. X2= e pomnożone razy druga stała K2 (8 bitów)
4. In = I(n-1) + X2 // I(n-1) to wartość In z poprzedniej pętli algorytmu
5 U=X1+I(n-1)
Wynik musi być 8bitowy.
No i problem dla mnie stanowi rozwiązanie kwestii przepełnień przy dodawaniu i określenia znaku przy czym wartości Y0, Y, U są zapisane w zwykłym kodzie dwójkowym.
No i pozostaje problem mnożeń. Skoro pomnożę 2 liczby 8bitowe wynik otrzymam 16 bitowy żeby tego uniknąć musiałbym na początku zamienić wszystkie bajty na (w jakiś sposób) odpowiadające im liczby w kodzie 1N.7Q wykonać obliczenia i spowrotem wrócić do normalnego kodu dwójkowego. Tylko nigdzie nie mogę znaleźć sposobu takiej konwersji:(.
Jest wogóle jakiś sposób na przechodzenie między tymi sposobami reprezentacji liczb? (Zdaję sobie sprawę że chcę zamienić liczby z przedziału (0,255) na liczby z przedziału (-1,0.99) dlatego piszę o liczbach "w jakiś sposób odpowiadających".
Dodano po 3 [godziny] 53 [minuty]:
Narazie mam coś takiego, (pkt1 czyli obliczenie uchybu):
ldi R16, 100 ; ladowanie przykladowych wartosci Y0
ldi R17, 130 ; i Y
cp R16, R17 ; porównanie odjemnej i odjemnika
brlo e_ujemne
sub R16, R17 ; jesli wynik jest dodatni
mov R18, R16
e_ujemne:
sub R17, R16 ; jesli wynik jest ujemny
mov R18, R17