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