algoritmus
Nya'ri Viktor
office at flexelec.hu
Fri Aug 5 08:17:57 CEST 2005
> Adott egy fototranyo amelyik nez bele a nagyvilagba. Amelyik villog. :)
> Vagy sotetke van, vagy vilagoska.
> Milyen otletetek van egy olyan ontanulo algoritmusra, amelyik megtanulja
> hogy mennyi a sotetke, mennyi a vilagoska.
> Kulonbseget tud tenni.
> De nem szall el idovel, es nekem sem kell kezdoertekeket adni neki.
>
> ADC labon van a fototranyo.
> 2.8V a sotet
> 2V a vilagos fesz most epp, ebben a konfigban.
>
> De tranyo szorasoktol, a vizsgalt fenyviszonyoktol fuggoen ez nagyon mas is
> lehet.
>
> A sotetke/vilagoska kitoltese osszevissza...
>
> Otlet?
> Minel egyszerubb lenne jo...
>
> Kösz,
> Arnold
>
Hali!
Csináltam ilyesmit, de ott nem fototranyo volt, hanem egy soros
kommunikáció vevője, ahol a jelszint is, meg az egyenkomponens is
összevissza mászkált, és abból kellett kiszürni a hasznos 1 vagy 0
szinteket.
Folyamatosan, ciklikusan olvasom be az A/D értékét, mondjuk ad_now
valtozóba, valamint van egy ad_min meg egy ad_max változóm, amit szintén
ciklikusan frissitek:
get_ad_now();
if (ad_min<ad_now)
{ad_min=ad_now}
if (ad_max>ad_now)
{ad_max=ad_now}
Mondjuk hogy ne kelljen kézzel kalibrálni, program induláskor ad_min=0;
ad_max=0x03FF (10 bites ad esetén). Pár ciklus alatt, amikor nem két
ugyanolyan érteket olvas be, már meg is van a ket szélsöértékem.
A komparálásási érték (ad_min+ad_max)/2.
Namost, azt tudod, hogy várhatóan milyen gyakran fog változni a max és
min értékek között, valamint mennyi a max és min érték várható
különbsége, így be lehet tenni egy olyat is, hogy bizonyos időnként
(mondjuk minden ezredik ciklusban, vagy ahogy a leglassabb változás
megkívánja):
if (ad_min<(ad_now-1))
{ad_min++;}
if (ad_max>(ad_now+1))
{ad_max--;}
Azaz szép lassan közelitem a két szélsöértéket egymáshoz (de _összeérni_
nem fognak, így a rendszer önbeálló, tehát menet közbeni kalibrációra
sincs szükség.
Mondjuk a jelenlegi konfigodban, 10 bites A/D esetén, 5V tápnál van 0.8V
felbontásod, vagyis kb. 163 érték különbséged az ad_min és ad_max
értékek között. Így akár így is nézhet ki a dolog:
if (ad_min<(ad_now-10))
{ad_min++;}
if (ad_max>(ad_now+10))
{ad_max--;}
És akkor marad még tartalék egy szép kis hiszterézisnek is az ad_min és
ad_max értékek között.
A többi már feladatspecifikus.
Viktor
More information about the Elektro
mailing list