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.