AS5040 magnetic rotary encoder OFFSET

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

AS5040 magnetic rotary encoder OFFSET

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

Tisztelet az Uraknak!

A jelen projekt az austriamicrosystems AS5040 tipusjelzésű mágneses szögelfordulásérzékelőjének felhasználása. Maga az eszköz működik szépen, (azt leszámítva, hogy az állítólagos 10 bites eszköz, nekem 11 bites értéket ad vissza)

Ez ugyebár úgy működik, hogy az eszköz középpontjához teszünk egy radiál mágnest, aminek az egyik félköre az északi, a másik félköre pedig a déli pólus és az IC ennek a mágnesnek az elfordulását érzékeli.
Az SSI interfészen keresztül kiolvasható a mért adat meg némi státus jelzőbit. Saját rendszeremet tekintve, ez 0-2048-ig terjedő értéket ad, a mágnes teljes körbefordulása esetén.

A kérdés, hogy amennyiben egy adott nyugalmi pozíciótól szeretnék egyik és másik irányba mérni, akkor hogyan adjam meg a mágnes pozíciójától függetlenül (lévén, nem tudom, milyen polaritásállásban szerelődik be a mágnes a helyére), hogy a nyugalmi helyzet legyen a mérés középpont?

Tegyük fel, egyik és másik irányba is mehet a rendszer 90°-90°-ot (Mondjuk egy függőlegesen álló kart lehet elforgatni mindkét vízszintes irányba egy negyed körívnyit, ennek a karnak a forgásközéppontjánál van a mágnes és a szenzorom.). Akkor ideális esetben, középponti állapotban a kiolvasott érték 1024 lenne (lévén, nálam 11bites érték olvasható ki). Innen mehetne a mérés 512 (-90°) és 1536 (+90°) tartományok között.
De vegyük a nem ideális esetet: A középponti állapotban a kapott érték mondjuk 384. Akkor +90°-nál a kapott érték 860 lesz, -90°-nál viszont 1920.
Mert ha offszettel hozzá adok a 384-hez 640-et, akkor a +90°-nál nincs is semmi gond, de negatív iránynál:

360°/ 2048 = ~0.175°
Tehát, amikor 0-értéket olvasok ki az IC-ből, akkor még csak 0.175 * 384 = -67.2°-nál járok. Ezután viszont a következő kiolvasott érték az IC-ből 2048 lesz(67.025°), de ha ehhez adom hozzá az offset értéket (640), akkor 2688-at fogok kapni.


Hogyan kezelhetem le ezt a problémát?



Így kezelem az eszközt:

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

' ----->>>>>  Absolute Angular Position Data
Dim Apd As Word                                              'Angular Position Data (D9-D0)- 10bit
Dim Ocf As Bit                                                  'Offset Compensation Finished - 11.bit
Dim Cof As Bit                                                  'Cordic Overflow              - 12.bit
Dim Lin As Bit                                                   'Linear Alarm                 - 13.bit
Dim Mag_inc As Bit                                           'Magnitude Increase           - 14.bit
Dim Mag_dec As Bit                                          'Magnitude Decrease           - 15.bit
Dim Even_par As Bit                                         'Transmission error detection - 16.bit

...

Do

   Call Get_angular_data

Loop

...

Sub Get_angular_data
Local I As Byte

   Apd = 0

   Reset Csn
   Waitms 1

   Reset Clk
   Waitus 10                                                 'wait tCLK (min 500ns)

   For I = 1 To 16 Step 1
      Set Clk
      Waitus 10

      If I < 11 Then
         If D0 = 1 Then Apd = Apd + 1
         Shift Apd , Left , 1
      End If

      Select Case I
         Case 11 : Ocf = D0
         Case 12 : Cof = D0
         Case 13 : Lin = D0
         Case 14 : Mag_inc = D0
         Case 15 : Mag_dec = D0
         Case 16 : Even_par = D0
      End Select

      Reset Clk
      Waitus 10
   Next

   Set Csn
   Waitus 10

End Sub

Remélem nem volt nagyon érthetetlen a leírásom...

Előre is köszönöm a válaszokat.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

Nem linkelted az eszköz adatlapját?

Így csak találgatok!

Szerintem a 11.bitet túlcsordulás jelzőnek fogd fel.
Vagyis számolj 10 bites értékekkel, és a 11.Bit bekapcsolása esetén kivonsz az offset értékből.
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

Íme az adatlap.
http://cds.linear.com/docs/en/datasheet/3639fc.pdf

Ámbár nem is azzal van a gondom, hogy 10 bit helyett 11 bitet olvasok ki... Mert amúgy így is remekül működik a kiolvasás. (Mitöbb, kezdem azt hinni, hogy ez valóban 11 bites verzió :) )
Inkább az, hogy szoftveresen hogyan toljam el a kiolvasott értéket, hogy "ne forduljon át a számlálóm".
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

HPMaster írta:...Tegyük fel, egyik és másik irányba is mehet a rendszer 90°-90°-ot...
Hogyan kezelhetem le ezt a problémát?
A leggyorsaban talán egy lookup táblával tudnád megoldani, illetve első bekapcsoláskor "kalibrálod" a középre állított kar állásával a szenzor értéket a tábla kívánt (pl. középső) pontjához... de biztosan meg lehet oldani matekkal is :-)


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

Re: AS5040 magnetic rotary encoder OFFSET

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

Nem tudom ezt láttad e?
AS5040.cpp:
https://github.com/georgeredinger/CantK ... AS5040.cpp

Szerintem elég könnyű értelmezni, és át írni Bascomra.
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

Rájöttem, hol a hiba.

Azért volt nálam 11 bites az érték, mert minden egyes bit APD változóba történő beírása után SHIFT-eltem egyet balra.

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

      If I < 11 Then
         If D0 = 1 Then Apd = Apd + 1
         Shift Apd , Left , 1
      End If
Most felcseréltem a sorrendet, hogy először shifteljen, és így már a kívánt módon működik a ketyere.

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

      If I < 11 Then
         Shift Apd , Left , 1
         If D0 = 1 Then Apd = Apd + 1
      End If
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Re: AS5040 magnetic rotary encoder OFFSET

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

Íme a megoldás:

A kiolvasás az AS5040 magnetic rotary encoder-ből:

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

' ----->>>>>  Absolute Angular Position Data
Dim Apd As Word                                             'Angular Position Data (D9-D0)- 10bit
Dim Ocf As Bit                                              'Offset Compensation Finished - 11.bit
Dim Cof As Bit                                              'Cordic Overflow              - 12.bit
Dim Lin As Bit                                              'Linear Alarm                 - 13.bit
Dim Mag_inc As Bit                                          'Magnitude Increase           - 14.bit
Dim Mag_dec As Bit                                          'Magnitude Decrease           - 15.bit
Dim Even_par As Bit                                         'Transmission error detection - 16.bit

Declare Sub Get_angular_data
...
Sub Get_angular_data
Local I As Byte

   Apd = 0

   Reset Csn
   Waitus 5

   Reset Clk
   Waitus 5                                                 'wait tCLK (min 500ns)

   For I = 1 To 16 Step 1
      Set Clk
      Waitus 5

      If I < 11 Then
         Shift Apd , Left , 1
         If D0 = 1 Then Apd = Apd + 1
      End If

      Select Case I
         Case 11 : Ocf = D0
         Case 12 : Cof = D0
         Case 13 : Lin = D0
         Case 14 : Mag_inc = D0
         Case 15 : Mag_dec = D0
         Case 16 : Even_par = D0
      End Select

      If I < 16 Then Reset Clk
      Waitus 10
   Next

   Set Csn
   Waitus 10

   Call Get_active_position

' DEBUG
   Print "APD: " ; Apd ; " (" ; Offset_apd ; ")  " ; Active_pos   

End Sub
Az OFFSET kezelés:

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

Dim Active_pos As Integer                                   'Relatív mágnes-pozíció
Dim Offset_apd As Word                                      'OFFSET-el módosított valós érték

Declare Sub Get_active_position
...
Sub Get_active_position

   Offset_apd = Apd + Offset

   If Offset_apd >= 1023 And Offset_apd < 10000 Then
      Offset_apd = Offset_apd - 1023
   End If
   If Offset_apd > 60000 Then
      Offset_apd = Offset_apd + 1024
   End If

   Active_pos = Offset_apd - 512

End Sub
Köszönöm a figyelmet és a segítő hozzászólásokat Uraim!
Válasz küldése