4 vezetékes rezisztív érintőképernyő olvasása

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kezdem kapisgálni, de még nem tudnám megvalósítani!

Maradjunk az FIR módszernél!
Az 5 lépéses módszer már egészen jó értékeket mutat.

(A következő probléma: hova tároljak 100 000 Wordot? Nincsen ennyi szabad helyem, na meg ezt 2* áthajtani az ADC-n ? )

Kezdjük kisebb tömbökkel.
Eltárok 100 mérést.
Azon Lefuttatom a Fir rutint. Az eredményt eltárolom Tömb(i) be
Ezt Megismétlem, mondjuk 5*
A kapott Tömb(5)-re megint rá eresztem az Fir rutinomat.

Nekem eddig valami ilyesmi jött le! Jól gondolkozom?

:?:

Kód: Egész kijelölése

Dim M(konvhossz) As Word                 ' minta vektor 
 Dim A(konvhossz) As Word                 'együttható vektor
Function Konvolval_fir()as Word 
      Local I As Byte 
      Local Er As Word 

      For I = 1 To Konvhossz 
          Er = M(i) * A(i) 
          Konvolval_fir = Konvolval_fir + Er 
      Next I 
 End Function
Csak még mindég nem tiszta az A tömbe mi kerül? :?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

A belinkelt "WINFILTER" is valami hasonló kódot generáltle:

Kód: Egész kijelölése

Filter model: Butterworth
Filter order: 1
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Coefficents Quantization: 16-bit

Z domain Zeros
z = -1.000000 + j 0.000000

Z domain Poles
z = 0.509525 + j -0.000000
***************************************************************/
#define Ntap 31

#define DCgain 65536

__int16 fir(__int16 NewSample) {
    __int16 FIRCoef[Ntap] = { 
           15,
          -16,
           20,
          -21,
           31,
          -25,
           58,
          -17,
          142,
           63,
          467,
          525,
         2011,
         3159,
        13525,
        25654,
        13525,
         3159,
         2011,
          525,
          467,
           63,
          142,
          -17,
           58,
          -25,
           31,
          -21,
           20,
          -16,
           15
    };

    static __int16 x[Ntap]; //input samples
    __int32 y=0;            //output sample
    int n;

    //shift the old samples
    for(n=Ntap-1; n>0; n--)
       x[n] = x[n-1];

    //Calculate the new output
    x[0] = NewSample;
    for(n=0; n<Ntap; n++)
        y += FIRCoef[n] * x[n];
    
    return y / DCgain;
}
Ezt kellene megvalósítani?
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Igen, csak neked az IIR jobb lenne, mert nagyságrenddel gyorsabb. A PIR az jóval pontosabb, de itt ez nem kritikus! A leírásokban megtalálod, mindkettő előnyét, hátrányát.

Mindkét esetben 1 lépcsős kell( Elsőfokú). Akkor kellene nagyobb rangú (fokú), ha pl egy marha pontos hőmérőt szeretnél csinálni!

Látom kezd tisztulni a kép!:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Sajnos, ha még az 1*1 et sem értem, nem tudok négyzetre emelni!
Enyit az IIR-röl!

Új gyakorlatnak Átraktam a fenti C-t Bascomba.
Ami gond, hogy még a WinFilter hez sem értek!
Amit ki adot álandókat a –értékek nem jók a Wordba!
Ezeket a –okat ki lehet szedni vagy válasszak másik változó típust?

Kód: Egész kijelölése

Const Ntap = 32
Const Dcgain = 65536

Dim Newsample(ntap) As Word

Dim Firx(ntap) As Word                                      '/ / Input Samples

Dim Firy(ntap) As Dword                                     ' //output sample


Dim N As Byte
Dim Fircoef(ntap) As Word
Fircoef(1) = 15
Fircoef(2) = -16
Fircoef(3) = 20
Fircoef(4) = -21
Fircoef(5) = 31
Fircoef(6) = -25
Fircoef(7) = 58
Fircoef(8) = -17
Fircoef(9) = 142
Fircoef(10) = 63
Fircoef(11) = 467
Fircoef(12) = 525
Fircoef(13) = 2011
Fircoef(14) = 3159
Fircoef(15) = 13525
Fircoef(16) = 25654
Fircoef(17) = 13525
Fircoef(18) = 3159
Fircoef(19) = 2011
Fircoef(20) = 525
Fircoef(21) = 467
Fircoef(22) = 63
Fircoef(23) = 142
Fircoef(24) = -17
Fircoef(25) = 58
Fircoef(26) = -25
Fircoef(27) = 31
Fircoef(28) = -21
Fircoef(29) = 20
Fircoef(30) = -16
Fircoef(31) = 15

Function Fir(dim Newsample As Word)as Word
   Local Er As Dword

'    //shift the old samples
   For N = Ntap -1 To 1 Step -1
       Firx(n) = Firx(n - 1)

   Next N

'  //Calculate the new output
   X(1) = Newsample
   For N = 1 To Ntap
       Er = Fircoef(n) * Firx(n)
       Firy = Firy + Er

   Next N
   Fir = Firy / Dcgain
End Function
Igy alakult!
De például Ez mi: Dcgain = 65536 ?
És ez: Filter model: Butterworth
Ezt hol tudom beállítani: "Mindkét esetben 1 lépcsős kell( Elsőfokú)"
:?:
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Majd érteni fogod! Én is így voltam vele.


Mert előjelesen kell kezelni.

A DC gain az egy erősítési tényező. Ez kicsi jeleknél illetve kis változásoknál lényeges. Belátható, hogy pl egy hőmérő esetén 0,001V/C fok(szándékosan eltúlzott a példa) felbontásnál, nehéz eldönteni, mi a zaj, mi a jel. Ezért erősíteni kell. A jellel együtt a zaj is erősödik, illetve a kettő közötti különbség is. Ezután már könnyebb szűrni. Érted?

A Butterworth egy modell. Ahogyan a Chebyshev és társai is.
Ezek lényegében szűrési modell függvények.
Ezeknek saját karakterisztikájuk van. Előnyökkel, hátrányokkal. Ezt meg kell érteni , tanulni.
Szemléletesebben:
Van egy sódercsomód. Neked abból csak a 3mm-es vagy nagyobb kavicsok kellenek. Tehát kell egy rosta, ami kiszűri a 3mm kisebbeket. Azt hogy milyen rostát használsz te döntöd el. Kör alakút (pl Butterworth) vagy négyzet alakút (Chebyshev).
Ráadásul rossz a szemed és nehezen látod a különbséget. Ezért szemüveg kell, ami felnagyítja a képet. Azaz DC GAIN.

Tudom hogy buta példa, de valahogy így tudom szemléltetni.

A filter order a rang. Az az hány lépcsőből áll. Mennyi szűrőt teszel egymás után! Ha 8-at akkor az 8-ad fokú/rangú lesz.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ez a magyarázat végre bejött nálam :)
Meg született a rutin:

Kód: Egész kijelölése

Const Ntap = 32
Const Dcgain = 65536

Dim Newsample As Word

Dim Firx(ntap) As Word                                      '/ / Input Samples

Dim Firy As Word                                            ' //output sample


Dim N As Byte
Dim Fircoef(ntap) As Integer
'
Fircoef(1) = 15
Fircoef(2) = -16
Fircoef(3) = 20
Fircoef(4) = -21
Fircoef(5) = 31
Fircoef(6) = -25
Fircoef(7) = 58
Fircoef(8) = -17
Fircoef(9) = 142
Fircoef(10) = 63
Fircoef(11) = 467
Fircoef(12) = 525
Fircoef(13) = 2011
Fircoef(14) = 3159
Fircoef(15) = 13525
Fircoef(16) = 25654
Fircoef(17) = 13525
Fircoef(18) = 3159
Fircoef(19) = 2011
Fircoef(20) = 525
Fircoef(21) = 467
Fircoef(22) = 63
Fircoef(23) = 142
Fircoef(24) = -17
Fircoef(25) = 58
Fircoef(26) = -25
Fircoef(27) = 31
Fircoef(28) = -21
Fircoef(29) = 20
Fircoef(30) = -16
Fircoef(31) = 15
Fircoef(32) = 0


Function Fir()as Word
   Local Er As Integer

'    //shift the old samples
   For N = 31 To 1 Step -1
       Firx(n) = Firx(n - 1)

   Next N

'  //Calculate the new output
   Firx(1) = Newsample
   For N = 1 To Ntap
       Er = Fircoef(n) * Firx(n)
       Firy = Firy + Er

   Next N
   Fir = Firy / Dcgain
End Function
Most akkor ezt így alkalmazom:

Kód: Egész kijelölése

For I = 1 To 32
   Newsample = Getadc(adcx)
   Fir

Next I
És az utolsó „Fir” értéke jó nekem?
Vagy még valami kel hozzá?

:lol:
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Örülök neki!

Így lesz a jó!:)

Elvileg nem kell semmi.
Kezdj el játszani a paraméterekkel. Akkor látni fogod, miként is működik.
Még jobban megérted az egészet!

A modelleket, pedig, meg kell tanulni , érteni. Azzal nem lehet mást tenni. Legalább nagy vonalakban, hogy melyik mire jó.
Nekem is sok fehér volt van még. Főleg a matek részében.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Futatnám csak most a Bascom tesz padlóra!

Mi a hiba az alábbi rutinban:
Error 242 a 38 sorra: Firw = Fir ?
Mind kettő Word!?

Kód: Egész kijelölése

'$regfile = "m128def.dat"
$regfile = "m64def.dat"

$crystal = 16000000

$hwstack = 174
$swstack = 174
$framesize = 174

Const Ntap = 32
Const Dcgain = 65536

'-------------------------------------------------------------------------------
'                                       ADC
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


Dim Newsample As Word

Dim Firx(ntap) As Word                                      '/ / Input Samples

Dim Firy As Word                                            ' //output sample


Dim N As Byte , I As Byte
Dim Fircoef(ntap) As Integer

Dim Firw As Word
Declare Function Fir()as Word

Do
For I = 1 To 32
   Newsample = Getadc(1)
   Firw = Fir()

Next I

Loop

End                                                         'end program

Function Fir()as Word
   Local Er As Integer

'    //shift the old samples
   For N = 31 To 1 Step -1
       Firx(n) = Firx(n - 1)

   Next N

'  //Calculate the new output
   Firx(1) = Newsample
   For N = 1 To Ntap
       Er = Fircoef(n) * Firx(n)
       Firy = Firy + Er

   Next N
   Fir = Firy / Dcgain
End Function
:evil:
Javítottam!
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 1. vasárnap, 16:56-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Forw=Fir()
Azaz a zárójel lemaradt!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Azt hiszem, már fáradok!
Tartani kel tea szünetet!
Pedig már látszik az alagút vége!
:lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az nem a vége:(
Az a vonat :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

VONAT?

Akkor már mind 1, azért is belevágok az IIR Szűrőbe!

8)

Ez lesz az alap:

Kód: Egész kijelölése

/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com

Filter type: Low Pass
Filter model: Butterworth
Filter order: 4
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Coefficents Quantization: 16-bit

Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000

Z domain Poles
z = 0.523942 + j -0.146505
z = 0.523942 + j 0.146505
z = 0.660811 + j -0.443178
z = 0.660811 + j 0.443178
***************************************************************/
#define NCoef 4
#define DCgain 128

__int16 iir(__int16 NewSample) {
    __int16 ACoef[NCoef+1] = {
         5055,
        20222,
        30333,
        20222,
         5055
    };

    __int16 BCoef[NCoef+1] = {
         8192,
        -19411,
        18956,
        -8639,
         1535
    };

    static __int32 y[NCoef+1]; //output samples
    //Warning!!!!!! This variable should be signed (input sample width + Coefs width + 4 )-bit width to avoid saturation.

    static __int16 x[NCoef+1]; //input samples
    int n;

    //shift the old samples
    for(n=NCoef; n>0; n--) {
       x[n] = x[n-1];
       y[n] = y[n-1];
    }

    //Calculate the new output
    x[0] = NewSample;
    y[0] = ACoef[0] * x[0];
    for(n=1; n<=NCoef; n++)
        y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];

    y[0] /= BCoef[0];
    
    return y[0] / DCgain;
}
:wink:
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

Hozzászólás Szerző: kovacsna »

Nagyon belejöttél!:)

Csak a rangot vedd le 1-re! Felesleges negyedfokú szűrő erre a feladatra szerintem.

Amúgy, hogy lásd mit is csinál valójában, tedd meg azt,
hogy terminálban, kiíratod a nyers és a szűrt értéket is.
Aztán ábrázold őket.
Válasz küldése