Sunday, November 2, 2008

Hyd-R X Motor Driver & Controller

1 Sene önce Shell Eco Marathon Yarışına katıldığımızda Motor sürücülerini Maxon ADS50/10 olarak satın almıştık. 3 Adet motoru sürebilmek için 3 adet te sürücü gerekiyordu. Ayrıca bu sürücüleri kontrol edebilmek için 2 adet PIC16f877 tabanlı kart ve 1 adet te sponsorumuz olan MOXA nın gönderdiği endüstriyel PC lerden olan W341 kullanmamız gerekmişti.

Bu sene ise geçen seneden farklı olarak 3 adet kart 3 adet motor sürücüsü ve bir bilgisayarın yaptığı işleri yapacak olan bir kart tasarlamak istedik. Nedeni gereksiz olarak yer kaplamaları ve kablo karmaşasına yol açmaları idi. Bu sebeble aşağıda Proteus çizimleri bulunan kartı çizdim.

Bu karttan ufak ufak bahsetmek gerekirse Fuel cell den cıkan voltaj 40-50 V civarlarında dolaşıyor o nedenle bunu 15V ve 5V a regüle etmemiz gerekiyor ki kart elemanlarını besleyebilelim. Bunu da LM2575HV-5V ve LM2575HV-15V ile yapıyoruz. HV işareti 2575 standartlardan farklı olarak bu elemanların 60V a kadar dayanabileceğini gösteriyor. Aslında bu elemanlar birer buck converter fakat geleneksel buck converterlar gibi ayrı ayrı elemanların toplanmış ve tek bir paket içerisine gömülmüş halleri. içlerinde mosfetleri voltaj referansları pwm cıkışları mevcut. Siz sadece giriş kapasitesi, çıkış kapasitesi, endüktansı ve diyodunu bağlamakla yetiniyorsunuz.

Kartın başka bir bölümüde RS485 Bus sisteminin kartın değişik sistemleri arasında haberleşmeyi sağlayacak kısmı. Bu kısımda kart üzerindeki her bir cpu yu bus a bağlayan bir RS485 Transreceiver bulunuyor. RS485 Diferansiyel bir bus olduğundan ve elektriksel olarak PIC MCU ların verebildiğinden farklı bir elektriksel işarete ihtiyaç duyduğundan bu şekilde bir ceviriciye ihtiyac duyuluyor. RS485 bus hakkında daha fazla bilgi almak için tıklayın. Bu bus üzerinden hangi motorun nekadar akım cektiği Fuelcell voltajı LCD de gösterilmesi gereken bilgiler vs. gibi datalar geziniyor. Bu datalar bir mcu tarafından gönderildiğinde diğer tüm mcu lar tarafından alınıyor. O yüzden sadece kendilerini ilgilendiren bilgilere cevap verebilmeleri için gönderilen datanın ne ile ilgili olduğununda bus üzerindeki veriye eklenmesi gerekiyor. Bunun için $#senderid#dataid#datalen#data#crc16#$ şeklinde bir data formatı kullanılıyor. sender id datayı gönderen MCU nun kendine özel tanımlama kodu. Örneğin Motor1 in MCU su data gönderirken senderid yerine 0x10 yazıyor. Dataid ise gönderilen datanın ne olduğunu tanımlayan bir byte örneğin LCD kontrol kartı aynı zamanda Fuelcell votlajını da ölçüyor bunu gönderirken de 0x12 kodunu kullanıyor. Fakat bu datanın her bir motor kontrol MCU su tarafından kullanılması alınması gerekiyor. O yüzden dataid de 0x12 gören Motor MCU ları bunu alıp kullanıyor. Datalen ise datanın kaç byte uzunluğunda olduğunu gösteren bir byte.Bu uzunluğun içerisine crc16 hesaplaması dahil değil. CRC16 ise datanın gerçekliğinin (düzgün alınıp alınmadığının) testinin yapılmasını sağlayan 2 byte uzunluğunda bir veri. CRC16 hakkında daha fazla bilgi için tıklayın.

3 adet motorumuz var dedik. Motorların üçüde aynı dişli üzerinde bağlı olduklarından tamamen aynı hızda dönmeleri gerekiyor yoksa birbirlerini frenleyerek boşu boşune enerji harcarlar. Bu da istenen bir durum olmadığı için motorların hızlarını kontrol edebilmek için PID algoritması kullanıldı. Peki motorların hızlarını ölçmemiz gerekiyor bunun için ne yapabiliriz. Bunun içinde encoder kullanabiliriz. Maxonun MR32 encoderları bizim için yeterli olacaktır. Cizime bakarsanız Encoderların sadece 1 kanallarının işlemciye girildiğini göreceksiniz. Bunun nedeni de motorlar sadece 1 yönde dönecekler yarışta geri geri gitmek yasak olduğu için bu şekilde oluyor :). Ayrıca ikinci kanalı işlemciye girersek boşu boşuna (kullanmayacağımız halde) kesme üreterek işlemcinin yapması gereken işleri yavaşlatmış oluruz. Ayrıca cizimde m1tom2 m2tom3 m3tom2 m2tom1 şeklinde bağlantılar gözüküyor. Bu bağlantılar ise motorların zorlandığı durumlarda logic1 yapılarak diğer işlemcinin uyarılmasını sağlıyor (m1tom2 m2tom3). Aynısı ama tersi şeklinde m3tom2 m2tom1 de motorun zorlanmasının sona erdiğini ve gerekirse bir önceki motoru kontrol eden CPU tarafından motorun kapatılabileceği sinyali için kullanılıyor. Pekala bunları RS485 bus üzerinden de yapabilirdik fakat niye yapmadık?. Çünkü RS485 bus kilitlenebilir ya da bir şekilde parazit alıp bütün motorların aniden devreye girip aniden devreden cıkmasına neden olabilir. O yüzden RS485 bus ile bunu yapmadık. Ayrıca her üç motor MCUsuna giren Pot isimli bir giriş gözüküyor. Bu giriş pilotun elinde bulunan bir potansiyometre ile motorların hızının ayarlanmasını sağlıyor. Her üç MCU da da bu analog girişlere bağlanmış durumda ve 10 bit digital olarak ölçüm yapılıyor.

Son olarak motorların sürücü tarafı. Yani power katmanı. Bu katmanda MCU dan alınan pwm tc4422 olarak secilen yüksek hızlı yüksek akımlı low side mosfet sürücü tarafından mosfet e besleniyor. Ayrıca toprak tarafından gözüken 0.024R lik direnc akımın ölçülebilmesi için kullanılıyor. Fakat bu direnç üzerinde oluşan voltaj çok düşük mV seviyelerinde olduğu için önce opamp ile yükseltilmesi gerekiyor. Bunun içinde AD820 olarak secilen yüksek hızlı rail-to-rail opamp kullanıldı. PWM ve opamplar hakkında daha fazla bilgi için isimlerinin üzerine tıklayın.

No comments: