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

DIY AC-Servo ajuri...

Aloittaja jyrki.j.koivisto, 23.10.10 - klo:17:53

« edellinen - seuraava »

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

jyrki.j.koivisto

Taas on virrannu vettä Lapuan joes kun viimeksi tätä pällistelin, on se hienoo kun on suuria suunnitelmia ja piäni pää... :) Asiaa ei tietenkään auta yhtään se että on jonkin sortin ADHD näiden projektien kans, mennään sinne ja tänne ja tullaan välillä takasiki.

Jollain ihme konstilla pitäs nämä Panasonicin servot saada pyörimään, joten koitetaas taas tällä konstilla.

Joitain mietteitä mitä tässä huomasin liittyen tuohon Fairchildin 3-vaihe palikkaan ja Allegron virtasensoreihin: ACS710 palikat on aivan liian hitaita, jotta niillä saisi ylivirtasuojan tehtyä sillalle, silta ei kestä juuri ollenkaan ylivirtaa vaan sanoo poks, ehkä jos laskisi virtarajan johkain 4 Ampeerin tienoille niin saattaisi käydä tuuri rajoituksen kanssa (mutta voi olla että oikosulusta johtuen virta saattaa keretä karkaamaan yli 3-vaihe palikan sietokyvyn) Voisihan virran nousua kait rajoittaa kelallakin välipiirissä sen verta että ehtivät mukaan, mutta tätäkään en ole kovin pähkäillyt.

Ny olis tarkotuksena ajella näillä Panasonicin servoilla sitä PCB-tulostinta, suunniteltu koko on vain hieman suurentunut. Voisihan sitä kyllä pätkyttää menemään askelmoottoreillakin, mutta lapsi on terve kun se leikkii ja typpilaseri on melkosen yksinkertanen vehe.

Hiekkaranta_92

Muistelin että koivisto oli tästä Etelä-Pohjanmaalta... Ilkassa oli hyvä teksti aiheesta keskittymis vaikeudet ja naeurologiset poikkeavuudet töiden edistäjänä, etenkin teknisillä aloilla. Eli toisin sanoen ennemmin hyöty ku haitta :)

jyrki.j.koivisto

#62
Laitetaas tämä tänne talteen ja jos joku Googlettelee tietoja  Panasonicin MSM022A2UE servosta niin voinee tämänkin sitte löytää.

Panasonic RX-/RX (purple/light blue) piuhoja myöten tulee siis nämä hall signaalit jotka kertoo kommutoinnin vaiheen, mutta ne on koodattuna yhteen eromuotoiseen piuhaan.

RX johtimesta katsoen sarjamuotoinen data alkaa aina 4us nolla jaksolla jota seuraa aina 1us positiivinen pulssi, asentotieto on koodattu tämän jälkeen seitsemällä 1us pulssilla jota seuraa heti perään uusi synkro jakso.

  [synkro]  [hall data]
1  00001    1010101     (kiilaura kello 12, 3, 6 ja 9 voi olla että tämä vaihtelee moottoreittain)
2  00001    1001100
3  00001    1101001     (Index pulssi pärähtää aivan tämän sekvenssin lopulla (kerran per moottorin kierros), mutta laskee kuitenkin takaisin ennen seuraavan alkua. Tämäkin voi olla moottorikohtainen)
4  00001    0101010
5  00001    0110011
6  00001    0010110     (1/4 kierrosta ja sekvenssi alkaa alusta)

Jatkoilua...

Lähti Microchipille tilaus muutamasta PIC12(L)F1840 prossusta, näillä pitäs saada luettua tuo signaali kolmeksi hall signaaliksi. PIC12F1840 on 8-pinninen prossu jonka voi kellottaa sisäisellä "oskillaattorilla" 32MHz:iin (/4), tämän pitäisi riittää ylisamplaukseen tuohon noin 1MHz:n koodattuun dataan. Purkukoodi pyörii busy loopissa odottaen synkronointia ja dataa. Bittien purku niin nopealla ylisamplauksella kuin tuo vermes pystyy (8 käskyä kerkee suorittaa yhden bitin aikana) jonka jälkeen kolmen ulostulon tilaa muutetaan sopivasti ja takasin odottamaan synkroa. Pinnit riittää tuolle RX-signaalille, hall-a-b-c ja vielä jollekin fault lähdölle. Tuon nyt luulisin ainakin saavan tehtyä, laitan koodin sitten jakoon jos joku tuommoista kaipaa, niin ei tarvi encooderille tinailla uusia johtoja joilla nuo "normaalit" hall signaalit saa pihalle.

Samalla lähti tilaus muutamalle DSPIC33EP256MU806 prossulle...

Jatkoilua... Tuossa Peetu Valkaman työn pohjalta tuo signaali purettuna hall tiedoiksi (http://peetuvalkama.blogspot.fi/2010/11/panasonic-ac-servo-motors.html) Näitä kuuden jaksoja on täydessä kierroksessa ne 4. Tuota viimmeistä bittiä voi kait käyttää jonkin sortin virheen sietoon...

                    A B C C B A ?
1  00001    1 0 1  0 1 0  1
2  00001    1 0 0  1 1 0  0
3  00001    1 1 0  1 0 0  1
4  00001    0 1 0  1 0 1  0
5  00001    0 1 1  0 0 1  1
6  00001    0 0 1  0 1 1  0

Jatkoilua... Tuo synkronointi saattaa tapahtua pelkästään tuolla 4u sekunnin nolla pulssilla ja tuo ensimmäinen aina päällä oleva bitti samoin kuin tuo vaihteleva viimmeinen bitti saattaa yhdessä invertoitujen ja invertoimattomien hall bittien kanssa muodostaa sen vikasiedon, vaikea tietää mitä Japanin pojat on miettinyt, mutta kyllä noilla tiedoilla saa melko suuren varmuuden onko kaikki bitit saapuneet oikein.

jyrki.j.koivisto

#63
Vielä hieman tuumailua asian tiimoilta. Nuo bitit kun invertoi (vaihtaa piuhat keskenään...) ja hieman niitä shiftailee (antaa uartin ootella start bittiä...) niin kas kummaa tuohan on aivan "normaalin" sarjaportin (6 bit + parity) koodaus start ja stop bitteineen... pic12f1840 tuntuisi noin niinkuin laskelmien puolesta jopa tuon nopeudenkin huolivan, tämä selviää jahka posti ne kiikuttaa.


                                S
                                t                    S
                                a                    t
                                r                    o
                                t       data      p
00001xxxxxxx ->11[0][xxxxxxx1][1]

Tuossa ylempänä olevassa postauksessa oleva kymysysmerkki bitti kertoo pitääkö olla parillinen vai pariton määrä hall signaaleja aktiivisena.

Picciprossun laskuri antaa 1000000 baudin (miljoonan baudin...  :-[) nopeudella virheeksi pyöreät 0,00%.  BRGH bitti 1 (16-bit timer) SPBRG arvolla 7

jyrki.j.koivisto

#64
Juu, Picit saapu ja protoilin äkkiseltään kasaan: http://www.youtube.com/watch?v=1hdetsDeUvA&feature=youtu.be

Mitään kovin ihmeellistä tuossa koodissa ei ole, heti resetin jälkeen porttien ja uartin asetukset kohilleen ja pyörimään busy loopissa ympyrää. Kaikki "äly" on uartin keskeytyksessä jonne kopsahdetaan aina uuden tavun saavuttua. Sopivasti portin bitit on samoilla paikoilla tuon saapuvan tavun mukaan. Mitään virheentarkistusta tuossa ei nyt ole mutta siihen ei montaa käskyä mene. Pic ei kovin montaa käskyä kerkeä tuossa ajassa muutenkaan suorittaa (reilusti kuitenkin, yli 90 jos en vaarin laskenut), pieni pelastus on kun keskeytyksessä ei tarvi huolehtia rekisterien ynnä muiden sisältöä talteen kun sen ulkopuolella pyöritään vain ympyrää.

Lisää tuumailua... Taulukolla tuo bittien varmistus käy kaikkein parhaiten/nopsimmin/varmimmin

Interrupt
   BANKSEL PIR1
   btfss   PIR1, RCIF
      goto   spurious

   BANKSEL RCREG
   movf RCREG, W
        bcf W,7
        call validate

   BANKSEL PORTA
   movwf PORTA

spurious
   retfie

validate
        addwf PCL,f
        retlw B'1000' ; non valid
       .... ;yhteensä 128 lukua

jyrki.j.koivisto

#65
Taulukon käyttäminen noiden bittien tarkistukseen olisi melko naiivi ratkaisu, joten tässä seuraava ehdotelma:
Lainaamovlw 0
   movwf temp2

   movlw b'10011001'   ;Testing validator routine
   movwf temp1

   clrc
   rrf temp1,1
   rlf temp2,1
   rrf temp1,1
   rlf temp2,1
   rrf temp1,1
   rlf temp2,1
   movf temp2,0
   xorwf temp1,0
   xorlw b'10111'

   rrf temp2
   skpc
   sublw 8

   rrf temp2
   skpc
   sublw 8

   rrf temp2
   skpc
   sublw 8

   bnz hall_error

   nop

hall_error

Nyt tuon pitäisi varmistaa että bitit on oikein (komplementit kohillaan) ja että viimeinen bitti on aina ylhäällä sekä tarkistaa pariteetti.

Jatkoilua... Tuossa koodin tynkä istutettuna keskeytyksiin ja näyttäs oikein muka toimivankin  ::)

LainaaInterrupt
   BANKSEL PIR1
   btfss PIR1, RCIF
   goto spurious      ; Tää ny ei ollu meille tää keskeytys (sarjaporttiin ei ole saapunut tavaritsia)

   movlw 0
   movwf temp2      ; Nollaillaan temppi2 rekisteri

   BANKSEL   RCREG
   movf RCREG, W   ; Otetaan saapunut data sarjaportista [1PabcCBA] W-rekisteriin

   BANKSEL temp1
   movwf temp1     ; Tungetaan se jonnekin talteen

        clrc                     ;Nollataan kantobitti                                                                                                                                                        C  76543210
        rrf temp1,1        ;Pyöräytetään temppiä yks bitti oikealle, alin bitti kopsahtaa kantobitille ja kantobitin arvo menee ylimmälle bitille -> [A][01PabcCB]
   rlf temp2,1        ;Lämäytetään temppi kakkosta yks bitti vasemmalle, ny siinä on alinna entinen temppi ykkösen alin bitti (kantobitin kautta) [000000A]
        rrf temp1,1       ;jne.
   rlf temp2,1
   rrf temp1,1       ;[0001Pabc]
   rlf temp2,1       ;[00000ABC]
   movf temp2,0  ;Tungetaan temppi2 W-rekisteriin
   xorwf temp1,0 ; Ny W on [11111] tahi [10111] riippuen oliko pariteetti bitti päällä vai ei ja oliko viimonen bitti varmasti päällä
   xorlw b'10111' ; No ny se on joko [01000] tai [00000], (tai sitten jotain aivan muuta jos komplementit ei täsmää tai viimonen bitti oli nolla) mite järkee tässä ny on, se selviää kohta...

   rrf temp2         ; Ny pyöritetään temppi kakkosta oikialle ja alin bitti menee kantobitille C-hall bitti (ei tosin väliä mikä se on)
   skpc                ; Tuota seuraavaa käskyä ei viittitä tehä jos kantobitti on päällä
   sublw 8           ; ny vähennetään kaheksan tuosta W-rekisteristä joka on joko [01000]=8 tai [00000]

   rrf temp2        ; Taas sama homma
   skpc
   sublw 8

   rrf temp2        ; Ja vielä kerran ???
   skpc
   sublw 8

   bnz hall_error ; Nyt jos päällä olevien bittien määrä täsmää pariteetin kanssa niin W-rekisterissä on nolla, jos ei oo niin huonompi homma

   movf temp1,0  ; Ny otetaan temppi ykkösen sisältö W-rekisteriin ja pistetään bitit portista pihalle. Ne on sopivassa järjektyksessä sielä.

   BANKSEL PORTA
   movwf PORTA         ; RA5= RX RA4=/FAULT RA3= /MCLR(don't care) RA2= Hall a RA1= Hall b RA0= Hall c (check if hall signals need inversion)
   retfie

hall_error
   movlw b'00000'

   BANKSEL PORTA
   movwf PORTA

spurious
   retfie

Jatkoilua... Tuossa koko tuotos

Lainaa

   PROCESSOR p12F1840

   #include <p12F1840.inc>

   CBLOCK 0x20
   temp1, temp2, errs
   ENDC

   ORG 0x0000
   GOTO Panasonic

   ORG 0x0004
   GOTO Interrupt

Interrupt
   BANKSEL PIR1
   btfss PIR1, RCIF
   goto spurious

   movlw 0
   movwf temp2

   BANKSEL   RCREG
   movf RCREG, W

   BANKSEL temp1
   movwf temp1

   clrc
   rrf temp1,1
   rlf temp2,1
   rrf temp1,1
   rlf temp2,1
   rrf temp1,1
   rlf temp2,1
   movf temp2,0
   xorwf temp1,0
   xorlw b'10111'

   rrf temp2,1
   skpc
   sublw 8

   rrf temp2,1
   skpc
   sublw 8

   rrf temp2,1
   skpc
   sublw 8

   bnz hall_error

   movf temp1,0

   BANKSEL PORTA
   movwf PORTA
   retfie

hall_error
   movlw b'00000'

   BANKSEL PORTA
   movwf PORTA

spurious
   retfie


Panasonic

   BANKSEL TRISA
   movlw b'100000'
   movwf TRISA

   BANKSEL ANSELA
   movwf ANSELA

   BANKSEL PORTA
   movlw   b'000'
   movwf   PORTA

   BANKSEL OSCCON
   movlw 0xF0
   movwf OSCCON

   BANKSEL OSCSTAT
unstable
   movfw   OSCSTAT
   andlw   H'79'
   xorlw   H'59'
   bnz unstable

   BANKSEL APFCON
   bsf   APFCON0,RXDTSEL

   BANKSEL BAUDCON
   bsf BAUDCON, BRG16 ; baudcon_brg16
   movlw 7
   movwf SPBRGL
   clrf SPBRGH

   bcf TXSTA, SYNC
   bsf RCSTA, SPEN
   bsf RCSTA, CREN
   bsf TXSTA, BRGH

   BANKSEL PIE1
   movlw b'00100000'
   movwf PIE1
   clrf  PIE2

   movlw b'11000000'
   movwf INTCON

Main
   goto Main

   end

Ja tuommoinen hurja määrä tavaraa siitä syntyy: Panasonic.hex

Lainaa:020000040000FA
:020000002B28AB
:0800080005282000911E2A28A2
:100010000030A100230019082000A0000310A00C4C
:10002000A10DA00CA10DA00CA10D21082006173ACE
:10003000A10C031C083CA10C031C083CA10C031CD4
:10004000083C031D2728200820008C0009000530EB
:1000500020008C000900210020308C0023008C003F
:10006000200000308C002100F030990021001A0897
:100070007939593A031D372822009D1723009F150F
:1000800007309B009C011E129D171D161E15210096
:0C009000203091009201C0308B004D2800
:00000001FF

Tämä siis korvaa tuon tuotteen: http://pico-systems.com/osc2.5/catalog/product_info.php?products_id=11

jyrki.j.koivisto

Jatketaas vielä hetken aikaa tätä älämölötystä nyt kun sain nuo hall-signaalit tuosta servosta pihalle.

Tuossa dsPic33:sessa on paranneltu QEI-moduuli jolla lukea enkooderia servolta. http://ww1.microchip.com/downloads/en/DeviceDoc/S15.pdf

Sivulla 4 kaaviossa 15-2 on esiteltynä tuo koko ihanuus. Moottorin nopeuden laskenta onnistuu HW-tasolla ja erikseen vielä todella hitaille nopeuksille on enkooderin pulssinleveyden mittaaminen, Microchip tekee loistavia oheispiirejä prossuihinsa.

Moottori PWM:mmässä on nyt seitsemän eri fault tuloa joten kaikista vaiheista saisi erikseen tiedon mikäli jokin menee ylivirralle ja välivirtapiirin haistelukin onnistuu sillä tarvittaessa, jarruvastus (http://www.vekoy.com/index.php?cPath=2368_2931) jos ei onnistu kiskomaan jännitettä tarpeeksi alhaalle tarpeeksi nopeasti niin optojen kautta tuohon voisi tulla pulssi joltain ennalta asetellulta jännitetasolta.

Hall-signaalien purku onnistunee jollain tuon dsPic33:sen sarjaporteillakin, mutta tämä tarkoittaisi melko suurta keskeytys määrää jota tuon prossun sitten pitäis palvella, parempi että sarjamuotoinen hall-data muutetaan erillisellä prossulla dsPic33:sen pinneille, josta ne voi sitten tarvittaessa lukea. Aikomuksena on käyttää pic12:sen koteloversiona QFN:nää samoin kuin dsPic33:sen kanssakin.

Kremmen

Oletko piirtänyt minkäänlaista lohkokaaviota tuosta ajurista? Sellainen jäsentäisi ajattelua ja siitä näkisi mitä ohjaimeen on tulossa ja miten ratkaisut on ajateltu toteuttaa.
Nothing sings like a kilovolt
Dr W. Bishop

jyrki.j.koivisto

#68
Tämä ny on vain taas tätä ajatusten heittelyä ja asioiden talteenlaittoa tänne foorumien syvyyksiin, innostus kun tähän projektiin menee mulla vähän aaltoina niin on sitten taas helpompi aloittaa kun sitä intoa löytyy.

Olen tässä päässyt pällistelemään Vaconin taajareiden sisuksia ja aiemmin näitä ABB:n luomuksia (periaatteessa sama lafka muttei kuitenkaan), kummassakin on hyvin paljon samaa (vanhoissa ABB:ssa ja näissä uudemmissa Vaconeissa)

Noiden pohjalta ajattelin jakaa homman pienempiin moduuleihin ohjaus, PSU ja IGBT palikat omilla korteilla. Ajatuksena olisi että siten noita voisi erikseen muokkailla tarpeen tullen eikä tarvisi aina tehdä koko piirilevyä uusiksi.

Ohjauskortilla olisi siis tämä dsPIC ja hall tietojen prossu sekä myös vastoin Kremmenin aiempaa tuumailua myös tämä virran mittaus vaiheista kolmella ACS710 piirille (Vaconit mittaa myös kaikkien vaiheiden virrat erikseen vaikka Ia+Ib+Ic=0)

Syy miksi heittelisin tuota moottorin virtoja kortilta toiselle on 2 kerroslevyjen ruuttauksen helpottaminen. Prossukortilla olisi siis nämä ACS710 palikat joiden IP+ ja IP- johtimet menisi ruuviliitoksilla alemmalle IGBT kortille. IGBT kortilla olisi myös moottorin vaihejohtojen liitin. ACS710 piirit olisi prossukortilla selvästi erotettu prossun käyttöjännitteistä ja majailisivat kortin toisessa reunassa.

Prossukortilla olisi myös välipiirinjännitteen mittaus. Tuon mittaamisen erottamiseen en ole keksinyt muuta keinoa kuin 5voltin DC-DC muunnin ja taasen kelloton pikku pic (tai spi väyläinen AD-muunnin) välipiirin jännite luetaan optoilla erotetun SPI-väylän kautta dsPIC:ille. Tuon DC-DC muuntimen käyttäminen yhdessä SPI-väyläisen AD-muuntimen kanssa mahdollistaisi myös vaihejännitteiden ja virtojen lukemisen, tällöin voisi käyttää myös jotain muuta kuin noita ACS710 piirejä ja galvaaninen erotus olisi taattu. Digitaalisen signaalin erottaminen optoilla on myös huomattavasti helpompaa kuin analogisignaalin. Mikäli sinne tulisi tuo AD-muunnin niin se voisi majailla omalla levyllä IGBT kortin ja prossukortin välissä.

Tuosta IGBT palikasta ei ole vielä mitään käsitystä että mikä se mahtaisi olla. Vaconeissa on Semikronin palikat ja hieman kaihertaisi niillä koittaa. Kivien ohjaus jännitteet näissä Vaconeissa samoin kuin ABB:n luomuksissa tehdään todella simppelisti joten ajattelin suoraan sen sieltä kopioida, samoin kuin IGBT ajuritkin.

Koitan piirustaa jotain vähän konkreettisempaa tässä joskus.

Pitäisi saada mitattua induktanssi näistä Vaconin käyttämistä muuntimista, onnistuisiko tämä Kremmeniltä? Kivien ohjausjännitteet luodaan pienillä muuntimilla mutta juuri näiden muuntimien datalehteä en ole löytänyt. VAC 5024x035 lukee purkin kyljessä http://www.haug-electronic.com/media/20090515/powerline_communcation.pdf ja näitä pätkytetään 200kHz taajuudella.





Erillisellä 8-kanavaisella AD-muuntimella voisi mitata (I/U)u, (I/U)v, (I/U)w, Udc+ ja IGBT:n lämmön. Analogi ja CPU korttien toiminnot voisi olla kyllä samassa levyssä.

Nuo moottorin vaiheet kun tuodaan ylös ja takasin alas IGBT kortille ruuviliitoksilla (pyöreä alumiini/kupari tanko jossa kierteet päissä niin näihin tankoihin voisi saada ferriittirenkaat ympärille jos se pienentäisi vaikka mittauksen kohinaa... ?

Powered by EzPortal
SMF spam blocked by CleanTalk