Aktywne Wpisy
![reventon](https://wykop.pl/cdn/c3397992/reventon_TUmZsSwFS1,q60.jpg)
reventon +81
#niepopularnaopinia
#muzyka poważna to nadmuzyka i nikt nie może temu zaprzeczyć.
mowie to jako były wannabe-rock'n'rollowiec, gitarzysta, ktory za durnej młodości darzyl gleboka pogarda wszystko co nie polega na szarpaniu drotow, najlepiej z przesterem, za szczyt kompozycji uwazal zmienne metra dream theater, a piękna - ballady Stinga.
Odkrywam juz od paru lat wspaniałe dziedzictwo Europejskiej muzyki.
Zakochałem się w muzyce dawnej, śpiewie gregoriańskim, zachwyciłem Bachem, mszami Mozarta, uwielbiam koncerty schumanna i każdemu
#muzyka poważna to nadmuzyka i nikt nie może temu zaprzeczyć.
mowie to jako były wannabe-rock'n'rollowiec, gitarzysta, ktory za durnej młodości darzyl gleboka pogarda wszystko co nie polega na szarpaniu drotow, najlepiej z przesterem, za szczyt kompozycji uwazal zmienne metra dream theater, a piękna - ballady Stinga.
Odkrywam juz od paru lat wspaniałe dziedzictwo Europejskiej muzyki.
Zakochałem się w muzyce dawnej, śpiewie gregoriańskim, zachwyciłem Bachem, mszami Mozarta, uwielbiam koncerty schumanna i każdemu
![reventon - #niepopularnaopinia
#muzyka poważna to nadmuzyka i nikt nie może temu zapr...](https://wykop.pl/cdn/c3201142/a14b50e808749e2fbcad702cb7b474a47e285bc9c4e8ff3d08caa757d5aa7581,w150.jpg?author=reventon&auth=a83091885aa62ed138b4c5b4071d2478)
![marcinkox3](https://wykop.pl/cdn/c3397992/marcinkox3_tuSHq3X0d4,q60.jpg)
marcinkox3 +390
Siema Mirki, mam problem z programem na mikrokontroler PIC od Microchip. Generalnie rozchodzi się działania na zmiennych float. Mojemu ośmiobitowemu karakanowi zajmuje to za dużo czasu, przez co nie wyrabiam się w przerwaniu z obliczeniem regulatora. Miał ktoś kiedyś do czynienia z podobnym problemem i wie jak to obejść?
W obliczeniach zastępuj volty milivoltami, sekundy milisekundami itd.
np.
float voltage = 1.5 //V
zamień na
uint16_t voltage=1500 //mV
Jak wypisujesz to przez UART/na wyświetlacz, to rób tak:
printf("voltage= %u.%uV\n", voltage/1000, voltage%1000)
i dostaniesz
Masz tu ATMELowska notę aplikacyjną:
http://www.atmel.com/Images/Atmel-2558-Discrete-PID-Controller-on-tinyAVR-and-megaAVR_ApplicationNote_AVR221.pdf
i chyba kod regulatora z tego przykładu:
https://homepages.uni-regensburg.de/~erc24492/PID-Regler/AVR221/IAR/doxygen/pid_8c.html
Jeśli nie to szukaj tu:
http://start.atmel.com/#examples
Postaraj się przerobić pod siebie.
Albo taka moja pierwsza myśl:
y(k) = 0.007155e(k) - 0.0032e(k-1) - 0.003955e(k-2) + 2y(k-1) - y(k-2)
Rozpisz to tak:
y(k) = (7155*e(k) ) /10^6 - (32*e(k-1)) / 10^4 - (3955*e(k-2) )/ 10^6 + 2y(k-1) - y(k-2)
W sensie -
Oj, to żeby było szybciej, to albo szybsze taktowanie mikrokontrolera - inny kwarc, jak się da, albo ostatecznie wstawka assemblerowa, choć kompilatory dobrze optymalizują kod i cudów bym się nie spodziewał.
Sprawdź jeszcze czy w kompilatorze którego używasz masz poziomy optymalizacji. Nie znam się na PICach i nie wiem jakiego kompilatora tam sie używa.
W gcc masz poziomy od O0 do O3 albo Os z naciskiem na
switch(quater)
{
case 1:
Uref = 200 + sinus[phi];
break;
case 2:
Uref = 200 + sinus[99-phi];
break;
case 3:
Uref = 200 - sinus[phi];
break;
case 4:
Uref = 200 - sinus[99 - phi];
break;
default:
break;
}
e = Uref - Ur;
y = (((e<<5)+(e<<4)+(e<<3)+(e<<1)+e) - ((eprev<<4)+(eprev<<3)+(eprev<<1)) - ((eprev2<<5)+eprev2))>>13 + (yprev << 1) - yprev2;
if (y>=400)
y = 400;
else if
Dzielenie przez potęgi 2 możesz zrobić shiftując wartość w prawo, ale chyba to marna pociecha.
Jeszcze tak przy okazji.
if (phi >= 99)
{
if(quater == 4)
quater = 0;
phi = 0;
quater++;
}
else;
Może się mylę, ale jak quater dojdzie do 4, to po przejściu tego if'a jego wartość będzie 1 a nie 0. A chyba chcesz żeby szło po kolei.
Ja bym dał takie coś:
EDIT:
A nie. To tak miało być. Ewentualnie możesz zastąpić tak: