Jei norėčiau perkelti seniau aprašytus algoritmus į kokį mikrokontrolerį, viskas lengvai nusikopijuotu. Juk šiuolaikinis gcc puikiausiai palaiko slankiojo kablelio matematiką (float). Tačiau float yra lėtai ir užima daug vietos. Ypač dalyba. Net naudojant integer matematiką, dalyba yra toks nerekomenduojamas reikalas.
Ar tikrai reikia dalybos? Prisimenam formulę:
Čia dalyba yra tik pačioje dešinėje, kur dalinasi iš dt. O jei pas mumi dt = 1? Kas sako, kad reikia skaičiuoti realiom sekundėm? Kas draudžia skaičiuoti kokiais nors išgalvotais, santykiniais vienetais. O jei tikrai reikia, kas draudžia funkciją skaičiuoti kitokiu dažniu. Išpaprastinam dt.
O dabar ar tikrai reikia float? Kas trugdo skaičiuoti viską integer? Gal koeficientai Kp, Ki, Kd? O kas trugdo juos padidinti šimtus kartų? Niekas. O kodėl šimtus? O kodėl ne 256 kartus? Ar 2^15 kartų? Svarbu, kad tik rezultatas tilptu į procesoriuko integer talpą. Viską skaičiuojam dideliais skaičiais ir jau galutinį rezultatą vėl sumažinam kažkiek kartų. Svarbu tik atburti koeficientus.
Čia visiškai ta pati programa, tik pats PID kontroleris veikia su 64 bitų integer matematika. O delta T yra vienetas. (Šildymo modelis tebeveikia su float matematika). Aišku čia kiek nepataikiau su koeficientais ir sunkiai susistabilizavo. Bet veikia!
Private Sub DoPID() Dim P_error As Int64 Dim P_proportional As Int64 Dim P_deritative As Int64 Dim sp As Int64 = CInt(setpoint) << 16 Dim m As Int64 = CInt(measured) << 16 P_error = sp - m P_proportional = P_error P_integral = P_integral + P_error * pid_dt P_deritative = (P_error - P_previous_error) / pid_dt output = (pid_kp * P_proportional + pid_ki * P_integral + pid_kd * P_deritative) >> 28 If output > outmax Then output = outmax If output < 0 Then output = 0 P_previous_error = P_error End Sub
Dar kiek pažaisiu su bitais ir koeficientais. Bus daugiau.
Naudojant 8 bitų mikrovaldiklį gal ir yra prasmė vietoje float naudoti integer. Bet perėjus ant 32 bitų mikrovaldiklių, ypač kur slankaus kablelio palaikymas yra “įsiūtas geležyje” – išlošimo jokio. Įvertinus tai, kad pvz. STM32F4xx mikrovaldikliai seniai ne deficitas, paprasčiau nebenaudoti 8 bitų mikrovaldiklių 🙂