Nyt on CNC-foorumin tukeminen helppoa!
Maksu onnistuu PayPalin kautta myös kortilla
Konemies kiittää

AS5030 anturi

Aloittaja salmve, 18.04.12 - klo:10:33

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

salmve

Ei taaskaan ihan suoraan CNCtä mutta uskallan kysyä kuitenkin.
Ja tuolla DIY dro ketjussa tuntuisi olevan tietämystä.

Hommasin hetken mielijohteesta yhteen projektiin samplena tälläisiä piirejä:
http://www.austriamicrosystems.com/Products/Magnetic-Encoders/Rotary-Encoders/AS5030
Datasheetin saa ladattua tuolta.
Lutikasta saa ulos kulmatiedon pwmllä tai 8bit binääri. Sovelluksessa käyttäisin pwm lähtöä joten sarjamuotoa ei edes tarvitsisi osata :)
Piiriin nollapiste on ohjelmoitavissa ja siihen tarvitsisin apuja.

Kyselin apuja picaxe forumilta ja sainkin luvun toimimaan Picaxe piirillä.
Koodi siis lukee enkooderin AGCn ja kulmatiedon binäärimuodossa ja muuntaa
ne desimaalimuotoon 0-255. Lisäsin koekytkentään lcd näytön ja sen vaatimat rivit softaan sekä muunnoksen asteiksi. Puukotin vanhan potentiometrin jonka akselin päähän liimasin magneetin. Sopivalla kulmaraudalla sätös lutikan yläpuolelle ja testipenkki oli valmis.
Tässä toimiva koodi:
#PICAXE 08M2   'or 14M2  or 18M2, 20M2
'Example 2-wire read-only mode program for AS5030
'               Magnetic Rotary Encoder
'
#Terminal 4800

'  Definitions: Hardware Pins
'
   Symbol iData         = pinC.3     'You can define the pins to suit your own circuit layout
   Symbol oChipSelect   = C.4
   Symbol oClock        = C.2
'
'  Definitions: Registers
'
   Symbol bAGC          = b6 'Indication of magnetic field strength
   Symbol bAngle        = b7
   Symbol bCounter      = b8
   Symbol bMask = b9 'Mask to allow selective setting of bits
'
'Start of Program
'
'   Default speed of M2 chips is 4MHz
'
   Low oChipSelect, oClock
   Pause 100       
   Do
      High oChipSelect        'Enable the AS5030
      For bCounter = 0 to 4   'First, 5 clock cycles for command
         PulsOut oClock, 1    '10uS AS5030 receives a 5-bit "command" %00000
      Next bCounter
      '
      bAGC = 0                'Clear the gain control status byte
      bMask = %10000000 'Mask used to set bits where required
      For bCounter = 0 to 7   '8 clock cycles for command
         
         If iData = 1 Then          'If data bit is high...
            bAGC = bAGC Or bMask    '...write a '1' bit into the AGC status
         EndIf
         High oClock          'Rising edge of clock pulse
         Low oClock           'Falling edge of clock pulse
         bMask = bMask / 2 'Move the "1" bit to next position (left) for next loop
      Next bCounter           'Repeat 7 more times
      '
      bAngle = 0              'Clear the Angle Register (byte)
      bMask = %10000000 'Mask used to set bits where required
      For bCounter = 0 to 7   '8 clock cycles for command
         If iData = 1 Then           'If data bit is high...
            bAngle = bAngle Or bMask '...write a '1' bit into the Angle Register
         EndIf
         High oClock          'Rising edge of clock pulse
         Low oClock           'Falling edge of clock pulse
         bMask = bMask / 2 'Move the "1" bit to next position (left) for next loop
      Next bCounter           'Repeat 7 more times           
      Low oChipSelect         'Disable the AS5030
      w1 = bAngle * 14 / 10
      serout 1,N4800_4,(21,1)
      serout 1,N4800_4,(17,1)
      serout 1,N4800_4,(17,128,18,"KULMA=     DEG ")
      serout 1,N4800_4,(17,135,18,#w1)

      Pause 250
      Loop

     
      Periaate tuossa on selvillä. Ei vaan mene jakeluun nämä rivit
     
     
      bAngle = 0              'Clear the Angle Register (byte)
      bMask = %10000000 'Mask used to set bits where required
      For bCounter = 0 to 7   '8 clock cycles for command
         If iData = 1 Then           'If data bit is high...
            bAngle = bAngle Or bMask '...write a '1' bit into the Angle Register
         EndIf
         High oClock          'Rising edge of clock pulse
         Low oClock           'Falling edge of clock pulse
         bMask = bMask / 2 'Move the "1" bit to next position (left) for next loop
      Next bCounter           'Repeat 7 more times           
      Low oChipSelect         'Disable the AS5030]

     
      Eli jos joku voisi vääntää rautalangasta mitä noilla riveillä tapahtuu helpottaoisi elämää
      reilusti. Ymmärrän kyllä nuo kommentit, se ei ole ongelma.
     
      Saisin varmaan ruinuamalla koodin myös valmiina piirin ohjelmointiin mutta haluaisin oppia
      hiukan itsekkin.

Niin ja tähän olisi mennyt  se Tssop adapterikin. Tuli vaan ne tilatut etten ehtinyt kokeilla DIY. Kiitos vaan Kremmenille, kyllä sen vielä kokeilen.

Vekku
     

Kremmen

#1
Älä siitä adapterista huoli, se ei ollut suuri vaiva :)

Tuossa koodinpätkässä tapahtuu yksinkertainen juttu. Siinä kellotetaan sisään ulkoa tulevaa data tavun verran. Kun data tulee bitti kerrallaan, niin kukin sisääntuleva bitti pitää saada pudotettua oikealle paikalleen ohjelmassa varattuun tavuun (bAngle).

-ensin bAngle nollataan jotta edellinen arvo ei häiritse.
-sitten bMask asetetaan alkuarvoon. Tässä tavussa on yksi bitti pystyssä aina sillä kohdalla jota sisääntulevassa datassa tarkastellaan. Tuo prefiksi % tarkoittaa, että luku on ilmoitettu binäärinä ja %10000000 näyttääkin suoraan, että ylin bitti on ykkönen ja muut nollia. Oletettavasti siis data tulee sisään eniten merkitsevä bitti edellä.
-seuraavaksi kierretään silmukkaa 8 kierrosta, yksi varvi jokaista bittiä kohden. Eli se on tämä For bCounter....    ...Next bCounter looppi. Joka varvilla muutujaan bAngle tuodaan 1 bitti oikealle kohdalleen.
-silmukan alkaessa oletetaan (ylimmän)bitin olevan luettavissa muuttujassa iData. Jos arvo on 1 niin vastaava bitti muuttujassa bAngle pitää asettaa. Se tapahtuu yksinkertaisesti OR funktiolla bAnglen nykyisen arvon ja maskin bMask nykyisen arvon välillä. Lopputulos on, että muuttujassa bAngle asettuu ykköseksi se bitti, joka bMaskissa on sillä hetkellä 1. Alussahan se on ylin bitti.
-Seuraavaksi kellotetaan sisään seuraava bitti pulssittamalla kellosignaalia oClock. (low) -> High -> Low. eli oClock tekee _|¯|_ pulssin.
-Sitten pitää maskibitti siirtää seuraavaan bittipositioon. Kun se alussa oli vasemmalla ylimmässä bitissä, niin sitä pitää siirtää yksi positio oikealle. Jostain syystä tässä on valittu kahdella jako, joka on oikein, mutta ei niin havainnollinen kuin bit shift-operaatio. Käytetty kieli lienee joku Basicin versio joten ehkä siinä ei vaan ole bitin siirto-operaatioita. Joka tapauksessa kun binäärimuuttuja jaetaan kahdella, niin kaikki sen bitit siirtyvät yhden pykälän oikealle. Alussahan tuo muuttuja oli %10000000 eli desimaalisena 128. Se jaettuna kahdella on 64 joka taas binäärisenä on %01000000 eli juuri noin kävi. Jostain syystä rivillä oleva kommentti on juuri väärin päin (siirto muka vasemmalle mikä on väärin). Olisikohan tekijä alunperin luullut datan tulevan pienin bitti edellä ja tehnyt shifit ensin toiseen suuntaan. No, noin se joka tapauksessa toimii.
-lopuksi AS5030-piirin valinta poistetaan (Low oChipSelect). Sehän asetettiin huomattavasti aiemmin koodissa, jolloin piiri aktivoituu ja alkaa tottelemaan noita muita ohjaussignaaleja.

Muok: typoja korjailtu.
Nothing sings like a kilovolt
Dr W. Bishop

salmve

 :D :D :D

Kiitos


Jo toisen kerran tälle päivälle täytyy todeta että toiset ne vaan osaa! (Terve vaan Antti jos tätä satut lukemaan!)

LainaaJostain syystä rivillä oleva kommentti on juuri väärin päin (siirto muka vasemmalle mikä on väärin). Olisikohan tekijä alunperin luullut datan tulevan pienin bitti edellä ja tehnyt shifit ensin toiseen suuntaan.

Juuri noinhan siinä kävi. Kasasin testipenkin ja ajoin ohjelman Picaxeen, homma toimi hienosti paitsi minun silmissä ulostuleva data oli täyttä soopaa. Pyörittelin aikani ja kyselin apuja. Viimein keksin laittaa skoopin piirin pwm pinniin, näin löysin enkooderin nollapisteen. Lukemat  lcd näytössä meni lähellä nollapistettä seuraavasti: 191,127,255,0,128,64,192. Itse en tuosta vielä mitään tajunnut, mutta laitoin ne foorumille pureskeltavaksi. Siellä ongelma ratkesi heti. Bitit tulee ulos väärinpäin.
Sain ohjeet mitä muuttaa softassa. Eli se korjaus oli minun tekemä, en vain muistanut korjata sitä kommenttia.




Jotenkin jäi sellainen kutina että voisin saada täältäkin softan lutikan ohjelmointiin.
Ihan vaan vinkkinä datasheetin sivu 23 alkaen....


Kremmen

Vilkaisin tuon piirin linkkiä pikana tässä muiden hommien keskellä. Sieltä saa varsin standardin sarjadatan ulos ulkoisesti kellotettuna juuri kuten tuossa koodinpätkässä tehdäänkin. Koodi tosin tekee sen ns. bit banging teknikalla, eli kello ohjataan tavalisesta I/O-portista ja data luetaan toisesta bitti kerrallaan. Tässä tapauksessa se on tarpeettoman hankalaa ja työllistävää kun mikrokontrollerien standardi SPI-liityntä hoitaisi saman homman eleettömän kätevästi raudassa. Minulle on tutuimpia nuo Atmelin piirit ja niissä on piiristä riippuen useita SPI-portteja (eli ne MOSI/MISO/SCK/SS - signaalit). Idea on, että kontrolleri ajaa automaattisesti kellon ulos SCK-portista ja ottaa datan kiinni MOSI- tai MISO-portista riippuen siitä onko se master vai slave. Tässä kontrolleri olisi master. Homma siis toimii alustamalla SPI-rekisterit ja sen jälkeen riittää kun MOSI/MISO-rekisteriin kirjoitetaan jotain niin siirto rävähtää käyntiin. Kun SPI siirtää aina tavun masterilta slavelle ja toisen slavelta masterille, niin pelkkä vastaanotto onnistuu lähettämälllä masterilta soopaa tyhjään avaruuteen MOSI-portin (rekisterin) kautta ja lukemalla sisääntullut data MISO-portista (rekisteristä). Tuo olisi standardi tapa tehdä homma.
Nothing sings like a kilovolt
Dr W. Bishop

salmve

Moi

Mikähän olisi minimipaketti millä Atmelin piireillä tuon ohjelmointi onnistuisi?

Pelkästään tähän tarkoitukseen niitä ei varmaan kannata hankkia, mutta näyttää olevan aika suosittu ympäristö. Jospa sitä sitten tulisi hyödynnettyä muuhunkin.

Vanha pää ei vaan oikein enää säilytä opittua.......

Vekku

Kremmen

Jos ihan mikrokontrolleripiiristä puhutaan niin toki hiukan vaikea sanoa mikä olisi ehdoton minimipiiri. Sitä vähintä minimiä ei minusta kannattaisi edes hakeakaan kun hintaerot on aika mitättömiä. Itse en juuri tartu enää ATMega328-piiriä kevyempään. Ostinkin noita juuri männä viikolla taas viitisen kappaletta kun alan hieromaan sitä kuormanmittaussysteemiä tässä pikkuhiljaa. 328 löytyy 32-kinttuisessa TQFP-paketissa joka on oikein kätevä käsitellä. Siinä jalkaväli on vielä sen verran rouhea, että pinnit voi hyvin juotella yksitellen ihan millä vehkeillä vaan. Piirissä sisällä on sitten ihan mukavasti tilaa tehdä erilaisia asioita, ja siinä on nuo Atmelin uudemmat ohjelmointilitynnät käytettävissä. Itse olen mm. vallan siirtynyt Tag-connect -liittimen käyttöön (http://www.tag-connect.com/).

Jos et huoli lähteä ihan pelkkä prosessori kourassa miettimään toteutusta, niin sitten vetäisin hatusta tuon aina niin suositun Arduinon. Siinä on moottorina juurikin Mega328 mutta sen päälle on kyhätty koko kehitysympäristö joka tekee liikkeellelähdöstä lapsellisen helppoa. Mikä parasta, kaikki koodi on varsin vaivattomasti otettavissa mukaan jos päättää muuttaa toiseen pitäjään eli tehdä itse oman kortin. Arduinoa kun ohjelmoidaan C++:lla (tai saa siinä ihan pelkkää C:täkin käyttää) ja pohjalla oleva kääntyri on sama tuttu avr-gcc kuin Atmelin Studiossakin.

Mutta kuten sanottu mulla on käynnistymässä (tai jatkumassa, miten sen nyt ottaa) tuo mittauskorttiprojekti johon on tulossa nippu erilaisia mittausmoduleita. Joku niistä olisi helppo räätälöidä tähänkin käyttöön. Itse asiassa DRO:n lukijahan oli yksi niistä mittausyksiköistä siinä kuvassa jonka taannoin laitoin tänne.

Niin tai näin, 8-bittinen Mega328 on hyvä kompromissi suorituskyvyn ja mutkikkuuden suhteen. Pystyy moneen eikä ole ylivoimainen oppia. Että se olisi mun suositukseni. Siitä seuraava ylöspäin on 8/16-bittinen XMega128 joka on jo astetta mutkikkaampi ja lopulta 32-bittinen UC3A/B/C-perhe ja ARM:it jotka vaatii jo ammattilaisempia otteita mutta tarjoaakin sitten ihan eri suorituskyvyn.
Nothing sings like a kilovolt
Dr W. Bishop

Powered by EzPortal
SMF spam blocked by CleanTalk