Monday, 14 August 2017

Glidande Medelvärde Pid


Jag har provat några löpande medelvärden för att utjämna ändringen i ADC-data i AtMega48 för att styra ljus PWM när man roterar en pott ADC. Filtret pseudokoder. Jag observerade att filtren är väldigt trevliga Men långsam som svar som förväntas. Jag letar för en teknik som Exponentiell rörligt medelvärde Sagt för att vara mer lyhörd Är det något annat som det här Som det står. Var är mellan 0 och 1.Hur kodar och optimerar de kodvisa utan att använda floats Eller hur skulle jag konvertera flottorna till motsvarande heltal för att göra kod liten, snabb och lyhörd en. och jag höll 1.Andra då kommer det inte fungera som förväntat eftersom jag kan ändra alla variabler för att flyta. Behaga inte koncentrera mig på följande uttalande för tillfället men observera Hålla flottor I min kodbas fyller programminnet från 45 till 137, om du kan implementera. Med minimala överhead genom att begränsa binära fraktioner har jag använt detta med bra resultat. Ta det befintliga resultatet, Skift det N placerar ri Ght att dela med 2 N Ta bort det från det befintliga resultatet Lägg till nya data. Detta är inte så snabbt att byta med en stegändring i ingångsdata som du kanske önskar, men är lätt att implementera och effektivt som ett filter i många fall . Du kan påskynda sitt svar genom att göra informella beslut om sitt beteende i fall som är för olika, t. ex. upprätthålla ett antal sekventiella ingångar som är mer än en gräns som är annorlunda än det befintliga resultatet. Om denna räkning överstiger ett tröskelvärde ändrar du N-klyftan Förhållande med någon faktor. eg N är vanligtvis 4- resultat förskjuts rätt 4 gånger 16 dividerad Om inmatning är mer än xxx bort från svaret gör endast två skiftningar rätt och multiplicera nytt prov med 4 innan add. answered 4 okt 12 kl 6 08 . Detta är Modification 2 i en större serie om att skriva en solid PID-algoritm. Problemet. Denna modifikation kommer att finjustera derivatperioden en bit. Målet är att eliminera ett fenomen som kallas Derivative Kick. Bilden ovan illustrerar problemet eftersom felBörvärdesinmatning, eventuell ändring i börvärdet orsakar en omedelbar förändring av felet Derivatet av denna förändring är oändlighet i praktiken, eftersom dt isn t 0 det bara blir ett riktigt stort tal. Detta nummer matas in i pid-ekvationen, vilket resulterar i en oönskad spik i utmatningen Det finns lyckligtvis ett enkelt sätt att bli av med. Lösningen. Det visar sig att derivatet av felet är lika med negativt derivat av ingång, med undantag av när börvärdet ändras. Detta blir en perfekt lösning I stället för att lägga till Kd-derivat av fel, subtraherar vi Kd-derivat av Input. Det här är känt som att använda derivat på mätning. Ändringarna här är ganska enkla. Vi ersätter dError med - Dinput. Istället för att komma ihåg sistaError, kommer vi nu ihåg senasteInput. Here S vad dessa modifieringar får oss Observera att ingången fortfarande ser ungefär ut. Så vi får samma prestanda, men vi skickar inte ut en enorm Output spike varje gång börvärdet ändras. Det kan eller kanske inte vara b ea big deal Det beror helt på hur känslig din ansökan är att producera spikar. Hur jag ser det men det tar inte mer jobb att göra det utan att sparka så varför gör inte saker rätt. Nästa. Denna post skrevs på fredagen den april 15th 2011 kl 03 02 och är arkiverad under kodning PID Du kan följa några svar på denna post via RSS 2 0 feed Du kan lämna ett svar eller trackback från din egen site.9 Svar på att förbättra nybörjarens PID Derivative Kick. Medeltal Enkelt glidande medelvärde. Medeltal Enkelt glidande medelvärde Du uppmanas att lösa uppgiften enligt uppgiftsbeskrivningen, med vilket språk du kanske vet om det enkla glidande medlet av en serie siffror. Skapa en stateful-funktionsklass förekomst som tar en period och returnerar en rutin som tar ett tal som argument och returnerar ett enkelt glidande medelvärde av dess argument hittills. Ett enkelt glidande medelvärde är en metod för att beräkna ett medelvärde av en ström av siffror genom att endast medelvärda de senaste P-numren från st ream, där P är känd som period. It kan implementeras genom att anropa en initialiseringsrutin med P som dess argument, IP, som då ska returnera en rutin som när den kallas med enskilda successiva medlemmar i en ström av tal, beräknar medelvärdet upp till den sista P av dem kan vi ringa den här SMA. Ordet stateful i uppgiftsbeskrivningen hänvisar till behovet av SMA att komma ihåg viss information mellan samtal till den. Perioden, P. En beställd behållare av minst den sista P-tal från var och en av sina enskilda samtal. Stabilt betyder också att successiva samtal till jag, initialiseraren, ska returnera separata rutiner som inte delar sparad status så att de kan användas på två oberoende dataströmmar. Pseudo-kod för en implementering av SMA är. Denna version använder en ihållande kö för att hålla de senaste p-värdena. Varje funktion som returneras från init-moving-genomsnittet har sitt tillstånd i en atom som håller ett kövärde. Denna implementering använder en cirkellista för att lagra siffrorna i fönstret vidbörjan på varje iterationspekare hänvisar till listcellen som håller värdet som bara flyttar ut ur fönstret och ersätts med det justerade värdet. Användning av en Closure edit. Currently kan denna sma inte vara nog eftersom den tilldelar en nedläggning på höjden Några escapeanalyser kunde ta bort höjningsallokering. Använda en strukturredigering. Den här versionen undviker höjningsallokering av förslutningen och håller data i stapelramen för huvudfunktionen Samma utmatning. För att undvika att de flytande punktens approximationer fortsätter att växa upp och växa , Skulle koden kunna utföra en periodisk summa för hela cirkulärkö-matrisen. Denna implementering producerar två delningsstatus för objektobjekt. Det är idiomatiskt i E för att separera inmatning från utgångsläsning från skriv istället för att kombinera dem i ett objekt. Strukturen är densamma som Implementeringen av standardavvikelse E. elixirprogrammet nedan genererar en anonym funktion med en inbäddad period p, vilken används som perioden för det enkla glidande medlet jon läser numerisk inmatning och skickar den till den nyupprettade anonyma funktionen och inspekterar sedan resultatet till STDOUT. Utsignalen visas nedan, med medelvärdet följt av den grupperade ingången, som utgör grunden för varje glidande medelvärde. Den har stängningar, men oföränderliga variabler En lösning är då att använda processer och ett enkelt meddelande som passerar baserade API. Matrix-språk har rutiner för att beräkna glidningsavvikelserna för en given sekvens av objekt. Det är mindre effektivt att slinga som i följande kommandon. Behörigt uppmanar till en inmatning I som läggs till i slutet av en lista L1 L1 kan hittas genom att trycka på 2ND 1 och medelvärden finns i List OPS. Press ON för att avsluta programmet. Funktion som returnerar en lista som innehåller medelvärdet för det medföljande argumentet. Program som returnerar ett enkelt värde vid varje invocation. list är listan som medelvärde p är perioden 5 returnerar den genomsnittliga listan. Exempel 2 Använda programmet movinav2 i, 5 - Initiera glidande medelberäkning och definiera perio D av 5 movinav2 3, xx - nya data i listvärdet 3 och resultatet lagras på variabel x och visas movinav2 4, xx - nytt datavärde 4 och det nya resultatet lagras på variabel x och visas 4 3 2.Beskrivning av funktionen movinavg variabel r - är resultatet den genomsnittliga listan som kommer att returneras variabel i - är indexvariabeln och den pekar på slutet av dellistan listan är medelvärdesvariabler z - en hjälpar variabel. Funktionen använder variabel i för att bestämma vilka värden av listan som kommer att beaktas i nästa genomsnittliga beräkning Vid varje iteration pekar variabeln i till det sista värdet i listan som ska användas i medelberäkningen Så vi behöver bara se Ut som kommer att vara det första värdet i listan Vanligtvis måste vi överväga p-element, så det första elementet kommer att vara det som indexeras av ip 1 Men vid de första iterationerna kommer denna beräkning vanligen att vara negativ, så följande ekvation kommer att undvika negativ index max ip 1,1 eller a räkna ekvationen, max ip, 0 1 Men antalet element på de första iterationerna kommer också att vara mindre, det korrekta värdet blir slutindex - börja index 1 eller ordna ekvationen, i - max ip, 0 1 1 och då, i-max ip, 0 Variabel z håller det vanliga värdet max ip, 0 så startindex blir z 1 och nummerfältet blir iz. mid list, z 1, iz kommer att returnera listan över värde som kommer att vara medelvärde Kommer att summera dem summa iz ri kommer att genomsyra dem och lagra resultatet på lämpligt ställe i resultatlistan. Fp1 skapar en partiell applikation som fastställer i detta fall andra och tredje parametrar.

No comments:

Post a Comment