Bot mot fladdrig digital signal i C

Permalänk
Medlem

Bot mot fladdrig digital signal i C

Hej

Scenariot är följande:
En ljussensor används för att dimma en display när det är mörkt för att inte blända. Ljussensorn har ett justerbart omslagsvärde och ger låg vid mörker och hög vid ljus ovanför tröskeln. Det finns även möjlighet att plocka ut en analog signal för ljusstyrka.

Problemet är att ljussensorn gärna blir fladdrig kring omslagsområdet vilket leder till att displayen mer eller mindre flimmrar.

Jag funderar på att lägga in en lång fördröjning mellan avläsningarna med risken att den inte justerar sig tillräckligt fort. Kan jag åstadkomma något bättre antingen med den digitala eller analoga signalen?

Systemet i fråga är en PIC16.

Visa signatur

Det man inte vet, det lider man inte av.

Permalänk
Vila i frid

Integrera det samplade mätvärdet från ljussensorn dvs medevärdebilda ljussensorns signal istället för att jobba med enskilda mätvärden.

Permalänk
Medlem
Skrivet av hasenfrasen:

Integrera det samplade mätvärdet från ljussensorn dvs medevärdebilda ljussensorns signal istället för att jobba med enskilda mätvärden.

Att jag inte tänkte på det :s Tack!

Visa signatur

Det man inte vet, det lider man inte av.

Permalänk
Medlem

Ett sätt att medelvärdesbilda är ett MA (moving average) filter som blir en realisation av ett lågpassfilter.
Gör helt enkelt:

alpha=0.8; while(1) { new_value = read_sensor(); light = light*alpha + new_value*(1-alpha); dim_screen(light); ... }

Variera alpha som du vill. Ett stort alpha (nära 1.0) så tar du bara lite influenser från sensorn varje iteration. Litet värde på alpha (nära 0.0) så tar du stora influenser från sensorn i varje iteration.

Lycka till

Visa signatur

weeeee

Permalänk
Medlem

Går väl även att använda en bestämd toleransnivå; en viss procentsats av hela värdeskalan (som täcker in hela "fladder"-rangen), och inte växla läge förrän sensorns värde antingen överstiger (önskat värde + toleransnivå) eller understiger (önskat värde - toleransnivå). Då ska det aldrig bli något fladder, men om värdet fladdrar för kraftigt (väldigt stora steg) så kommer växlingen att bli för "trög" för att vara en godtagbar lösning.

Jag skulle nog kombinera medelvärdesbildning + toleransnivå.

Visa signatur

5950X, 3090

Permalänk
Medlem

Återigen, tack för mycket hjälpsamma tips. Det uppskattas!

Skrivet av mounte:

Ett sätt att medelvärdesbilda är ett MA (moving average) filter som blir en realisation av ett lågpassfilter.
Gör helt enkelt:

alpha=0.8; while(1) { new_value = read_sensor(); light = light*alpha + new_value*(1-alpha); dim_screen(light); ... }

Variera alpha som du vill. Ett stort alpha (nära 1.0) så tar du bara lite influenser från sensorn varje iteration. Litet värde på alpha (nära 0.0) så tar du stora influenser från sensorn i varje iteration.

Lycka till

Det här skulle också fungera, med ljusstyrkan konfigurerad som analog och analog input verkar det här vara en riktigt bra lösning.

Skrivet av backfeed:

Går väl även att använda en bestämd toleransnivå; en viss procentsats av hela värdeskalan (som täcker in hela "fladder"-rangen), och inte växla läge förrän sensorns värde antingen överstiger (önskat värde + toleransnivå) eller understiger (önskat värde - toleransnivå). Då ska det aldrig bli något fladder, men om värdet fladdrar för kraftigt (väldigt stora steg) så kommer växlingen att bli för "trög" för att vara en godtagbar lösning.

Jag skulle nog kombinera medelvärdesbildning + toleransnivå.

Kanske är dags att gå djupare in på applikationen för systemet. Syftet är att övervaka temperatur, tryck och spänning i en fordonskupé. Tunnlar, träd, gatljus och annat otyg ställer till det för ljussensorn, trots att den är placerad ganska lågt i kupén. Detta ger en störning utöver fladder kring omslagspunkten som kan vara lite problematisk.

Vad tror ni? Kanske vore det lämpligt att utvärdera båda metoderna för att få en inblick i vad som fungerar bäst, att nyttja analogvärde från sensorn verkar dock alla vara överens om!

Visa signatur

Det man inte vet, det lider man inte av.

Permalänk
Rekordmedlem

Du får implementera en normal pid regulator i mjukvaran och trimma in parametrarna http://sv.wikipedia.org/wiki/PID-regulator fråga inte mig om programeringskoden, för jag har bara använt dem inte programerat dem från grunden. men det kanske finns färdiga kodblock som ger funktionen, för de är ju vanliga i industriaplikationer.

Visa signatur

Ryzen 5 2400G, Asus ROG STRIX B350-F Gaming, 500GB Samsung 970EVO NVMe M.2 och en väldig massa masslagring. Seasonic Focus+ Gold 650W, Antec P 180 med Schyte o Sharkoon fläktar via en t-balancer, Tittar på en Acer ET430Kbmiippx 43" 4K
Främre ljudkanalerna återges via Behringer DCX2496, högtalare Truth B3031A, Truth B2092A Har också Oscilloskop, mätmikrofon och en Colorimeter.

Permalänk
Medlem
Skrivet av mrqaffe:

Du får implementera en normal pid regulator i mjukvaran och trimma in parametrarna http://sv.wikipedia.org/wiki/PID-regulator fråga inte mig om programeringskoden, för jag har bara använt dem inte programerat dem från grunden. men det kanske finns färdiga kodblock som ger funktionen, för de är ju vanliga i industriaplikationer.

Oj, nu är det dags att damma av regleren! Att programmera en PID är ju inte speciellt svårt, frågan är om det är rätt väg att gå. Vad väljer jag som referens i detta fall?

Vad jag menar är att referensen är det jag mäter och vad jag vill ha är beroende av mätsignalen dvs referensen.

Visa signatur

Det man inte vet, det lider man inte av.

Permalänk
Rekordmedlem

Referensvärdet borde väl i ditt fall vara att bilen står stilla så att sensorn ger ett stabilt värde som inte hoppar runt pga ändrade förhållanden ? Sedan gäller det bara att få fram en lagom tröghet i systemet.
Om du kollar på hur man löst det i bilarna från fabrik så har de ofta både en ljussensor som kollar kupeljuset och en ir sensor som känner av solen och sen kollar man på inställningen för ljusstyrkan för instrumentbelysningen för att få en "offset"
En del enheter använder även gps data för att kolla tid och plats och räknar ut vilken riktning solen står i (förväntat ljus och natt eller dag) för att förutsäga vinklarna på det infallande ljuset så att man kan anpassa sig efter det, men det är lite mer avancerat, moderna bilar har mycket trix för sig under skalet när det är "premium"

Visa signatur

Ryzen 5 2400G, Asus ROG STRIX B350-F Gaming, 500GB Samsung 970EVO NVMe M.2 och en väldig massa masslagring. Seasonic Focus+ Gold 650W, Antec P 180 med Schyte o Sharkoon fläktar via en t-balancer, Tittar på en Acer ET430Kbmiippx 43" 4K
Främre ljudkanalerna återges via Behringer DCX2496, högtalare Truth B3031A, Truth B2092A Har också Oscilloskop, mätmikrofon och en Colorimeter.

Permalänk
Medlem
Skrivet av mrqaffe:

Referensvärdet borde väl i ditt fall vara att bilen står stilla så att sensorn ger ett stabilt värde som inte hoppar runt pga ändrade förhållanden ? Sedan gäller det bara att få fram en lagom tröghet i systemet.
Om du kollar på hur man löst det i bilarna från fabrik så har de ofta både en ljussensor som kollar kupeljuset och en ir sensor som känner av solen och sen kollar man på inställningen för ljusstyrkan för instrumentbelysningen för att få en "offset"
En del enheter använder även gps data för att kolla tid och plats och räknar ut vilken riktning solen står i (förväntat ljus och natt eller dag) för att förutsäga vinklarna på det infallande ljuset så att man kan anpassa sig efter det, men det är lite mer avancerat, moderna bilar har mycket trix för sig under skalet när det är "premium"

Hm, ja det har du rätt i, det blir just trögheten som blir "problemet" här då. Jag är inte riktigt hemma på hur jag ska definera referensen rent praktiskt. Jag kan ju inte enbart titta på felet eftersom det blir lite svårdefinerat, så lösningen borde vara att titta på derivatan och försöka begränsa denna med PID alternativt PI, men för att jag inte bara ska få plus/minus jättesiffror (fladdrig signal) borde jag väl ändå utgå från derivatan av medelvärden?

Visa signatur

Det man inte vet, det lider man inte av.

Permalänk
Medlem

olafett, kan du inte publicera ett litet dataset så blir det mycket enklare att ge förslag på lösning.

Visa signatur

weeeee