mrfrenzy skrev: ↑27 november 2021, 20:43:25
För en Arduino med klen CPU och som saknar matteprocessor för flyttalsberäkningar är det mycket lämpligare med en översättningstabell än att ha en formel som beräknar.
Även om jag förstår att det känns elegantare och trevligare med en formel, det kan du använda om du kör någon STM32-baserad arduino med hundratals MHz.
För att skapa en formel använder jag då ofta exempelvis
https://mycurvefit.com/
Alternativa metoder att beräkna syrehalten
Det är sant, men...
Tabellen tar plats. Jag tror inte att jag kommer att få utrymmesbrist, men vem vet?
En Mega 2560, om det blir en sådan, har 256 KB flash, 4 KB EEPOM och 8 KB RAM, så där kan jag väl lägga in några spel tillsammans med styrningen av pannan om bara processorn räcker till...
Jag har egentligen tre alternativ som jag överväger.
1. Tabellen från Bylund.
2. En formel som Bosch har publicerat.
3. En formel som jag tagit fram från publicerade data som jag hittade.
Jag behöver ta fram syrehalten baserat på lambdasignalen kanske en gång varannan eller var femte sekund. I varje fall inte oftare än en gång per sekund. Med en formel som innehåller en multiplikation, en division och ett par subtraktioner.
Jag har några Mega 2560 ligger, så kanske tar jag en sådan.
Här är några tider för flyttalsberäkningar i Mega 2560. Tiderna är i mikrosekunder.
+: 13 µs
*: 15 µs
/: 34 µs
Lite akademiskt här, men här är siffrorna i alla fall:
sqrt: 50 µs
sin: 110 µs
log: 150 µs
Tiderna hittade jag här, men det är ju enkelt att göra en liten snurra och testa själv.
https://forum.arduino.cc/t/math-executi ... ino/191501
Hur som, med en Mega 2560 tar min eller Boschs beräkning knappt 100 µs. Jag kan göra 10000 sådana beräkningar på en sekund. Men det räcker gott med 1 beräkning per sekund för mig.
Flera orsaker att räkna istället för att använda en tabell
Jag har "simulerat" resultatet med dom tre metoderna ovan. Bosch formel och den jag använt ger nästan identiska resultat. Bylunds tabell är lika de två formlerna nära 0% och 20,95% syre, men avviker en hel del i hela intervallet däremellan. Det är delvis därför jag vill kalibrera så att jag vet att det jag får fram är den faktiska syrehalten. Jag vet ju inte vad om är rätt och vad som är fel, om jag inte har något att stämma av emot. Atmosfärens syrehalt, 20,95% syre har jag runt omkring mig, men hur ska jag göra för att kalibrera mot t.ex. 6-7% syrehalt? Utan att leta på någon som har en professionell kalibreringsutrustning.
Kalibrering som resulterar i att ett par parametrar i en formel ska justeras kan enkelt göras internt i Arduinon. Om kalibrering resulterar i att en konstanttabell med 548 flyttal ska beräknas så ligger det kanske nära till hands att göra det utanför Arduinon. En olägenhet om man t.ex. vill kolla kalibreringen i samband med sotning. I mitt fall troligen oftare, när jag håller på och labbar.
Man kan IOFS argumentera att absoluta värdet på syrehalten är inte så viktig, bara det brinner bra. Men, jag vill gärna veta vad jag gör och att det jag gör ska vara repetitivt. Om jag gör det igen, t.ex. på en annan panna med en annan lambda, så ska jag veta vilken syrehalt jag har i rökgaserna jämfört med vad jag vill ha.
Jag kommer ju troligen att initialt experiementera med lite olika syrehalter för att se hur resultatet varierar. Då vill jag att det ska vara den korrekta syrehalten som jag för till protokollet och inte ett värde som kan ha ett fel på flera procent.
Ungefär så har jag tänkt...
Men, som jag skrev tidigare. Att ta Bylunds tabell rakt av är ju ett sätt att enkelt komma igång. "Förfining" med lambdakalibrering kan ju läggas till senare. Styralgoritmen kommer att ha "börvärde O2" som en parameter som kommer att vara lätt att ändra. I alla fall när jag testar ut styralgoritmen.
/Pi