23 Nisan 2023 Pazar

Esp32 İle TV Tuner Radio Alıcısı

 Yıllar evvel aklıma gelen bir proje rf sinyallere olan merakım giderek artıyor ve şimdiki pcb üretimimde rf antenler konusuna bir tık daha fazla önem gösteriyorum bu arada yeni olmayan bu projeyi biraz daha geliştirdim daha önce bloğumda burada paylaştığım yapılmış olan projeye modern bir arayüz ile daha güzel oldu. 

Geniş bant radyo alıcı projesini esp32 ile modern bir hale getirdim şimdilik projenin sadece videosunu paylaşıyorum zaten devre çizimini yukarıdaki linkten paylaştım alt tarafta ise esp32 kodlarını görebilirsiniz.

Kod konusunda yardımcı olabilirim teknik destek için yorumlarda buluşabiliriz.



https://github.com/hmz06967/esp32-rf-tuner

10 Ocak 2023 Salı

Uçuş kontrolleri ve haberleşme protokelleri

Merhaba, bu yazımda haberleşme paketleri üzerinde konuşacağım, iha, siha, drone gibi cihazların hatta  uçakların bile kullandığı standart olan comunication packet language (CAN, RADİO, Seri haberleşme sistemleri de dahil) protokolleri üzerine değineceğiz, aralarında karşılaştıracak artı ve eksilerine bakacağız, haberleşme sırasında nasıl bir yöntem kullanıldığını anlatacağım. 

Ayrıca son üretilen geliştirme kartımın nasıl uçuş bilgisayarına (so drone) çevirdiğimi anlatarak bu yolda küçük çipleri zor ekonomik şartlarda nasıl limitleri zorladığıma değinmesem olmaz diye düşünüyorum, elinizde olan patlamış mısırla birlikte bir kaç dakikalık bu blog yazıma İnsansız hava araçları tanımıyla başlayalım.

İnsansız Hava Araçları (İHA)

Bir İHA iki şekilde çalıştırılabilir: bir kontrol sistemi kullanılarak
ve yer kontrol istasyonunu (GCS) kullanmak. Bir uzaktan kumanda sisteminde,
kullanıcı doğrudan İHA'ya bakar veya üzerine monte edilmiş bir kamerayı izler. Bunu çoğu zaman FPV dronlarında görüyoruz genelde 3 boyutlu gözlük kullanarak dronu akro mod ile kontrol edilebiliyor, gerçek zamanlı haberleşme için video vericisi kullanılıyor, kendiniz bir fvp dronu yapabilirsiniz. Çoğu hazır olmayan dronelar için wifi sinyalleri üzerinden iletim maliyetli olmakta ama siz özel video vericileride alabilirsiniz. 


Hem denetleyici hem de İHA, yürüten bir iletişim modülü aracılığıyla bağlanır
Özel yapılan fvp drone

Bu tarz drone'lar hazır uçuş kartları içerisinde bulunan UAVCAN vb iletişim protokolleri yardımıyla aralarındaki iletişim. Tipik olarak telemetri, Wi-Fi, ZigBee ve diğer birçok ağ aygıtı iletişim için kullanılmaktadır. Öte yandan, GCS tabanlı kontrol kullanır yazılımı İHA'ya bağlamak için bir bilgisayar, daha sonra kullanıcı tarafından yüklenen görev komutları. Çeşitli kaynaklardan bilgi toplayarak İHA üzerine kurulu sensörler, GCS gibi İHA durumlarını izleyebilir.
mevcut yükseklik, mesafe, harita konumu ve gerçek görev durumu [14].

İnsansız hava aracı sistemleri, sensörden oluşan farklı parçalar içerir.
Yerden yerleşik veya elektronik ekipman tarafından kontrol edilen faydalı yükler ve bir veya daha fazla yer kontrol istasyonu. uzaktan pilotlu araçlar (RPV'ler), bir yerden kontrol edilen İHA türleridir.
zemin ve bu amaç için optimum kablosuz iletişim gerektirir. Açık
Öte yandan, büyük İHA'ların yakından kontrol edilebilmesi için GKS'lere ihtiyaç duyulmaktadır.
Özel drone İHA

Menzil ve iletişim engellerini aşmak için, günümüzde İHA'lar, mürettebat üyelerine bilimsel, taktiksel, çevresel temelli uygulamalarda ve acil durum müdahale alanında yardımcı olmak için kullanılmaktadır. Onlar askeri uygulamalar gibi diğer uygulamalarda da destek sistemi olarak kullanılmaktadır.
Büyük iha modelleri

İHA'ların gelişen kullanımı: güvenli iletişim protokolü sorunları ve zorlukları 39 ticari uygulamalar. İHA'lar irtifa menzili, ağırlık, ve uçuş dayanıklılığı, genellikle küçük İHA'lar yer tarafından desteklenir
dizüstü bilgisayarlardan veya akıllı telefonlardan oluşan kontrol istasyonları ve diğer küçük
sırt çantalarında kolayca taşınabilen cihazlar. 

Ground control station (GCS)

GCS, bir işlem birimi, bir telemetri / uzaktan kumanda modülünden oluşur,  bir kullanıcı kontrol modülü, bir kablosuz veri bağlantısı alt sistemi ve terface veya komut satırı arabirimindeki wifi, radyo sinyalleri yada seri bağlantı noktaları ile İHA arasında iletişim kurar, genellikle uçuş cihazları için kablosuz veri bağlantısı alt sistemi yapılandırılmıştır alıcı ve verici sistemler hem mürettabatta hemde İHA içerisine yerleştirilmiştir. Telemetri / command, iha'dan yerleşik verileri indirmek ve yüklemek için kullanılır bu arada yukarıda bahsettiğim gibi ikili iletişim için haberleşme protokolleri arasında çevrim gerekir. 

Yüksek donanımlı İha'lar için Mobil yer kontrol sistemi

GCS ArduPilot

ArduPilot yazılım paketi, araçta (Helikopter, Uçak, Gezici, anten İzleyici veya Drone (İHA)) çalışan navigasyon yazılımından (mikrodenetleyici donanım hedefleri için ikili biçimde derlendiğinde tipik olarak bellenim olarak anılır) ve yer istasyonu kontrol yazılımından oluşur. Mission Planner, APM Planner, QGroundControl, MavProxy gibi özel yazılım araçlarından oluşur. Derlenmemiş haliyle github üzerinden bulabilirsiniz.

Yazılım paketi, Travis CI tarafından sağlanan sürekli entegrasyon ve birim testleri ve GNU çapraz platform derleyicisi ve Waf dahil olmak üzere bir derleme ve derleme ortamı ile her gece otomatik olarak oluşturulur. Çeşitli donanım platformlarında çalışan önceden derlenmiş ikili dosyalar, Ardupilot alt web sitelerinden kullanıcı tarafından indirilebilir.

Bu yer kontrol yazılımı ayrıca uçuş bilgisayarları (uçuş kartları) için gömülü yazılım desteği sunar bu konuyu uzun uzadıya araştırmıştım ama gördüğüm kadarıyla c++ için yazılan gömülü yazılım için epey parametre var bu sebeple yazılımın flash boyutu minimum 1kb o yüzden elimde bulunan flytracker kartım için  tersine mühendislik ile uğraşamayacağım kadar fazla vakit gerektirdiği için başka üst katman yazılım kullandım şimdi ardupilot hakkında biraz bilgi edinelim Mavlink haberleşme protokolünü kullanır kendi kartım içinde bu protokolü kullanacağım, hem öğrenmek hem de kolay ve güvenilir alt yapısı ile size zahmet vermeyecek hazır python dilinde yazılmış araçları ve custom dil için kolay okunur xml içeriği var.


Arduplot, Mission Planner yer kontrol yazılımı ve kontrolcü

Cleanflight, Betaflight

İnternette sağlam bilgi bulamadığım için kendi özelleştirdiğim Betaflight yazılım hakkında bir kaç bilgi yazmak istiyorum özel olarak paylaşacağım uçuş kontrol kartım üzerine yer kontrol veya uçuş konfigrasyon ayarları için kullandığım Nodejs yada javascript tabanlı kontrolcü yazılımından ibaret github üzerinden açık kaynak koduna ulaşabilirsiniz bir iha için 14 den fazla da uçuş cihaz modellerini destekler, Quad x, +, HexA, Y6, Tricopter ve bunun üzerine uçuş modları, telemetri, gps ve sensör okuma kamera ayarları veya osd gibi modülün desteklediği tüm ayarları konfigre edebilirsiniz onun dışında alıcı kumanda kontrolü ve motor çıkışlarını test edebilirsiniz.

Bu program MSP iletişim protokolünü kullanır, kendi projem için daha sonra Mavlink protokolünü destekleyen özel yazılımı paylaşacağım. Şuan için çoğu testleri tamamlanan Mavlink custom dil paketi ile haberleşen Betaflight üzerindeki yazılım için epey uğraştım. Dil paketinin tek bir js dosyası ile bütünleştiğinden özelleştirmek kolay oldu, örneğin ardupilot yazılımının desteklediği diğer kartları Betaflight ile de kontrol edebilirsiniz bunun üzerine custom dil paketiniz için Javascript dili biliyor olmanız gerekir kendi kartınızın desteklediği dil içeriği için Ardupilot'un Mavproxy yazılımı ile kendiniz üretebilirsiniz yazılım kendi içerisinde gömülü uçuş kontrolcü devre kartınızın dil paketini .js formatında ulaşulabilir kütüphaneye çeviriyor.

Betaflight GCS kontrolcü

Bir çok üretici kendi bünyesinde, Betaflight yada Cleanflight'ın gömülü devre kartları için çoğu Stm32f4 üzerindeki mikrodenetleyicilerin bulunduğu gömülü iha yazılımının açık halini github'a eklediğinden diğer insanların katılımı ile iha severlerin geniş ilgi alanına geliştiricileri toplamış durumda belkide Ardupilot kadar geniş yelpazesi yok henüz..  

Üreticiler kendi devre kartları için yazılıma vakit ayırmadan özel donanım yazılımı olan alt donanım katmanını bu dağıtım yazılımına ekleyerek uzaktan güncelleme gibi spot desteği de harika bir şekilde kullanmış oluyor. Buraya kadar tuhaf olan birşey olmasada hazırcılığa her geçen gün hayır çeken ben için biraz uğraşlar sonucu bu kontrolcü yazılımına haberleşme dil paketi desteğini ekledim. Mavlink adındanda anlaşılacağı üzere Ardupilot olarak tanınmış yer kontrol sistemlerinin usta yazılımında bulunan iletişim paketi geniş yelpazeli Betaflight konfigrasyon programında bu dil desteğinin olmaması şaşırtıcı değil çünkü adamlar kendi dağıtım dilini kullandığı özel işletim sistemi (üst katman donanım yazılımı) kullanıyor.

Uçuş kontrol bilgisayarı

Bu geçmite harika olan stm32f1 ailesinin şimdi pek yüzüne bakan yok çünkü özellikleri biraz eskidi ve hantal kaldı ee işe maliyet de girince eski çipleri değerlendirmek gerek konusu yine benim eylendiğim bir konuydu henüz bu denetleyici desteklemekten feregat eden iki büyük kontrolcü yazılımına öyle mi? derken bu mimariyi kullanan farklı bir üst katman yazılımını github da bulduktan sonra kendi donanım katman yazılımına uyarladım bu ayrıca drone kontrol kartlarının nasıl bir yaklaşım sağladığını kolay bir şekilde anlamama izin verdi. 

Şimdi elimde gerçekten çalışan bir drone kontrolcü kartı var ve bununla gurur duysamda bilgisayar kontrolcüsü konusunda sınıfta kalmıştı ayarlarını değiştirebileceğiniz bir lcd ye yada grafik arabirimine sahip olmayan ana kart.. Ya ana sistemin dil paketini değiştirecektim yada yeni kontrolcü yazılımı ile vaktimi biraz harcayaktım yada dadha iyi bir fikirle açık kaynak kodlu kontrolcü yazılımlarının birinin dil paketini değiştiricektim. 

Öyle yaptım Mavlink desteklemeyen **flight yazılımını kullanarak bu desteği bünyesine eklemiş oldum şimdi Ardupilot kullanan herhangi birisi daha güzel grafik arayüzüne sahip Betaflight yazılımı ile uçuş cihazının ayarlarını yapabilir. Yinede kullanmak için yazılımı kendi custom paketinize dahil etmeniz gerekir doğrudan Ardupilot iletişim dili (Mavlink özel mesajlara izin veren ancak hazır kodlayıcı yazılım dosyalarının bulunduğu bir haberleşme protokolü sunuyor) desteklenmesede benzer parametreleri kullanıyor. 

Haberleşme Protokolleri

Örneğin koordinat sistemini yada yeni motor hızı gibi bilgileri iki cihaz arasındaki bağlantı bozulsa bile eksiksiz göndermek çok daha önemli oluyor cihazınızın yanlış yere yönlenmesini istemeyiz. Tek kablo ile çalışan seri haberleşme donanımı UART %100 güvenli bir iletişim topolojisi sağlamaz.  Pcb kartları, geliştirme kartları, gömülü sistemler, gps modülleri, özel araçlar çoğu cihaz ASCI tablosunu kullanır ama bunun bir dezavantajı sınırlı bant genişliğine sahip olmasıdır (yaklaşık 64 byte sınırlı kodlama sağlar) bu doğruluk tablosu gömülü sistemlerde hazır dönüşebiliyor olsa da iletişim kanalının  sadece 1/4 oranında faydalanmış oluyoruz bunun yerine haberleşme protokolleri ile tek bir paket üzerinden çok fazla veriyi doğru şekilde iletebiliriz ve bant genişliğinin tamamını (256 byte) kullanabiliriz. Bu sebeple doğrudan bilgisayardan aktarım bilgisini gönderirken taşıyıcı modülasyonuna ihtiyaç duyuyoruz ki Modülasyon diyorum çünkü karşı tarafta da kod çözücü olması gerek.

Şuna benzetebiliriz insanlar arası iletişimde kullanılan dil bir araç olmakla birlikte ne kadar fazla aracı eden kelime türleri olursa derdimizi o kadar kolay anlatabiliriz günümüz Türkçesinde bilmediğimiz veya adını hatırlamadığımız herhangi bir somut yada somut örnek için "şey" kelimesini kullanırız bu o anda karşı tarafın ne demek istediğimizi anlamasına da pek şaşırmayız çünkü insan doğası henüz bilgisayarların ulaşamadığı bir yerde, doğrusu aynı dili konuşurken insanların yaptığı genelleme ile yada duygu durumunu da işin içine katarak 6. bir haberleşme yayınında sörf yapabiliriz. 

Konuyu uzatmadan söylemek istediğim bir paket dil sisteminde haberleşen kelime karşı tarafta doğrulamaya sokulmak yerine toplu bir iletişim sonunda 1 yada 2 byte toplamında olan checksum ile metnimizi doğrulayan bilgi şifresini de paylaşmış oluruz böylelikle karşı taraf paketi aldığında hem şifreyi kendi yeniden hesaplar ki bu çok kolay bir yöntem olan; "özel veya" chekcsum ^= "A" denklemi bu işi çözer. Anahtar şifre paketin sonundan alınarak mobil paketteki dahil edilen her bir bilgiyi yeniden hesapladığı yeni şifre ile karşılaştırarak iletişimin bozulmadığını anlayabilir.

Paket sistemini anladığımıza göre bu şekilde çalışan toplu haberleşme protokollerine ve illetişim methotlarına doğrudan bakalım.

MAVLINK



MAVLink veya Micro Air Vehicle Link, küçük insansız araçlarla iletişim için bir protokoldür. Yalnızca başlık içeren bir ileti sıralama kitaplığı olarak tasarlanmıştır. MAVLink ilk olarak 2009 yılının başlarında Lorenz Meier tarafından LGPL lisansı altında piyasaya sürüldü...

Mavlink protokolü için paket tanımı

STX, Yeni bir paketin başlangıcını belirtmek için kullanılan protokole özgü metin başlangıcı (STX) işaretçisi. Protokol sürümünü anlamayan herhangi bir sistem paketi atlayacaktır.

LEN, Aşağıdaki yük bölümünün uzunluğunu gösterir

INC FLAGS, MAVLink uyumluluğu için anlaşılması gereken bayraklar (uygulama, bayrağı anlamıyorsa paketi atar).

CMP FLAGS,  Anlaşılmadığı takdirde göz ardı edilebilecek bayraklar (uygulama, bayrağı anlamasa bile paketi yine de işleyebilir). 

SEQ, Paket kaybını algılamak için kullanılır. Bileşenler, gönderilen her mesaj için değeri artırır.

SYS ID, Mesajı gönderen sistemin (araç) kimliği. Ağdaki sistemleri ayırt etmek için kullanılır. Geçersiz bir kaynak adresi olduğu için yayın adresi 0'ın bu alanda kullanılamayacağını unutmayın.

COMP ID, Mesajı gönderen bileşenin kimliği.

MSG ID, Yükteki mesaj tipinin D'si. Verilerin mesaj nesnesine geri kodunu çözmek için kullanılır.

DATA (PAYLOAD), Mesaj verileri. Mesaj türüne (yani Mesaj Kimliği) ve içeriğine bağlıdır.

CS,  Checksum doğrulama fonksiyonu ile oluşturulmuş packet şifresi gömülü kart ile doğrulanmak için tekrar kullanılır.

MSP MULTIWII

MSP, tüm Betaflight'tan türetilmiş uçuş yığınları tarafından kullanılan ana iletişim protokolüdür. Kontrol, telemetri ve sensörler için kullanılan ikili mesaj tabanlı bir protokoldür. 

İlk olarak, MSP'nin nasıl çalıştığına bakalım. Bunu anlamak için bu bağlantıyı (alternatif bağlantı burada ) çok yararlı buldum, ancak burada özetleyeceğim. Gönderilebilecek üç tür mesaj vardır.

Command -- gönderilecek bazı bilgileri içeren uçuş kontrolörüne gönderilen bir mesaj.
Request -- uçuş kontrolörüne gönderilen ve bazı bilgilerin geri verilmesini isteyen bir mesaj.
Response -- uçuş kontrolörü tarafından bir talebe yanıt veren bilgilerle birlikte gönderilen bir mesaj.
MSP mesajlarının belirli bir yapısı vardır. Bu sırayla bir başlık, boyut, tür, veri ve sağlama toplamı vardır.
Komut yapısı
Mesaj içeriği

Header, Başlık üç bayttır ve "$M" mesaj başlangıç ​​karakterlerini ve mesajın hangi yöne gittiğini gösteren bir karakteri içerir. "<", uçuş kontrolörüne gitmeyi (komut ve istek), ">", uçuş kontrolöründen gelmeyi (yanıt) belirtir.

Size, Dördüncü bayt, veri bölümünün uzunluğudur (bayt olarak). Örneğin, veri bölümünde üç INT 16 değişkeni varsa, boyut baytı 6 olur.

Type, Tip baytı, mesajda hangi bilgilerin gönderildiğini belirtir. Türlerin bir listesini burada bulabilirsiniz . Bunun bir örneği, tip numarası 108 olan MSP_ATTITUDE olacaktır.

Data, Veriler, tüm bilgilerin gönderildiği yerdir. İstek mesajlarında veri yoktur. Bilgi içerdikleri için komutlar ve yanıtlar bunu yapar. Döndürülen veri türleri yine burada bulunabilir .

Veri bölümünün zor kısmı, baytların sırayla ters çevrilmiş olmasıdır ve bu, son derece zayıf bir şekilde belgelenmiştir. Örneğin, aşağıdaki iki baytı bu sırayla alırsam:

10011010
01001111

int16_t roll;
byte c;                       // The current byte we read in.
c = mspSerial.read();         // The first sent byte of the number.
roll = c;                     // Put the first sent byte into the second byte of the int 16.
c = mspSerial.read();         // The second sent byte of the number.
roll <<= 8;                   // Move the first sent byte into the first byte of the int16.
roll += c;                    // Put the second sent byte into the second byte of the int 16.
roll = (roll & 0xFF00) >> 8 | (roll & 0x00FF) << 8; // Reverse the order of bytes in the int 16.

Checksum, Bir MSP mesajının son baytı sağlama toplamıdır. "Sağlama toplamı, boyut, tür ve yük baytlarının XOR'udur". Bir istek mesajı için sağlama toplamı türe eşittir.

Özetle bir "MSP_ATTITUDE" isteği için örnek bir yanıt mesajı aşağıdaki gibi

    1. 00100100 -- '$' - Byte 1 of the header.
    2. 01001101 -- 'M' - Byte 2 of the header.
    3. 00111110 -- '>' - Byte 3 of the header.
    4. 00000110 -- '6' - The size byte.
    5. 01101100 -- '108' - The type number corresponding to "MSP_ATTITUDE".
    6. 11100010 -- The first sent byte of the roll INT16.
    7. 11111111 -- The second sent byte of the roll INT16.
    8. 00010010 -- The first sent byte of the pitch INT16.
    9. 00000000 -- The second sent byte of the pitch INT16.
    10. 11000010 -- The first sent byte of the yaw INT16.
    11. 00000000 -- The second sent byte of the yaw INT16.
    12. 10100111 -- The checksum byte.

Rulo şöyle olurdu: 11111111 11100010 = -30. Pitch şöyle olurdu: 00000000 00010010 = 18. Yaw olur: 11000010 00000000 = 194.

Burada belgelendiği gibi , dönüş ve eğim bir derecenin 1/10'u cinsindendir. Yani nihai değerler aşağıdaki gibi olacaktır:

Roll = -3.0
Pitch = 1.8
Yaw = 194

 

URANUSLINK

Temsili Uranuslink bağlantı şeması


UranusLink, paket odaklı bir protokol olarak güvenilmez ve güvenilir hizmetler sağlamak için oluşturulmuştur. Protokol paket yapısını belirler ve  iletilen veri gösterimi. Genel çalışma mekanizması ve UranusLink protokolünün açıklaması aşağıda yer almaktadır.

Paket yapısı 
Her pakette altı alan vardır:
1. önsöz (PRE),
2. sıra numarası (SQN),
3. mesaj tanımlama (MID),
4. veri uzunluğu (LEN),
5. genel mesajlar, parametreler, dinamik donanım bilgileri, cihaz status bilgilerini vb içerir(DATA)
6. sağlama toplamı (CS).

Uranuslink paket tanımı 

Uranüs Bağlantı protokolü, radyoda kullanılmak üzere özel olarak tasarlanmıştır. Telsiz iletişiminde normalde veri kayıpları ve yanlış veriler alma gerçekleşebilir. 

PRE, Paketin ilk alanı önsözdür bu  veri paketi her zaman böyle bir değerle (0xFD) başlar ve genellikle  giriş arabelleğindeki bir paketin geçerliliğini sağlamak için paket verileri ile alıcı taraf için ara numarasıdır (SQN). Her zaman bir  ”çift" sayı ve paketin sonunda sağlama toplamıdır. İyi  protokol arasındaki belirli ortam, yük e bağlantı kapasitesindeki dengeyi sağlamak için girişlere sağlama toplamları uzunluğu seçilmiştir.

SQN, bir protokolün paketlerdeki arızaları tanımlamasına sadece en güncel bilgiler, İHA iletişim sorunlarını tespit edebilmeli ve devam ederse uygun şekilde yanıt verebilmelidir. Alıcı tarafında, verilen SQN satırında eksik bir sayı arsa, paket kaybolmuş veya çok yollu bilgi bağlantıları mümkünse, bu paketler yanlış sırada gelebilir. Çünkü İHA'nın kontrolü ile en son veriler her zaman önemlidir, sahip olan bir paket gelirse düşecektir.

MID, paketin bilgi bölümündeki verilerin yorumlanmasını belirler. iha'da şu anda tespit edilen sekiz tür mesaj var yön ve baz veya kontrol istasyonu yönünde 16. Önemli olan 
türleri şunlardır: (1) yer istasyonundan iha'ya bağlantı ve (2) 
iha'dan yer istasyonuna bağlantısı için diğer bilgiler.

Avantaj

Son teknoloji, Uranüs Bağlantısı mevcut protokollerle çoğu
İHA ve düşük genel giderlerle etkileşim için MAVLink protokolünü yaygın olarak kullanr. Bununla birlikte,% 33'e varan ek ek yüke sahiptir, iha için bu cpu çalışma yükü olarak fazla gelebilir ama son zamanlarda üretilen çipler bunun üstesinden gelebilir.

UAVCAN

Boing uçağını hackleyen bir mühendisi duymuşsunuzdur, koltuğun yanında bulunan düğmeleri sökerek CAN hattına bağlanıp özel internet ağının şifresini çözerek uçuş bilgilerine ulaşır ve  hatta değiştirmektedir, ama ne güzeldir ki sadece hacklemek ile kalmış olan abimiz güvenliği riske atmadan bunu yetkililere bildirmiş. Şimdi bu güvenliği konusunda endişe duyacağımız CAN hattı için iha'larda durum nasıl bir bakalım.

UAVCAN, havacılıktaki CAN hattı gibi motorlu araçlarda sıkca kullanılan, sağlam araç ağları üzerinden güvenli bağlantı sağlamak için tasarlanmış açık kaynaklı bir protokoldür ve 
robotik uygulamalar. İHA protokolü yayınla-abone ol mimarisi üzerinde çalışır. Ana düğümü yoktur ve tüm düğümler aynı haklara sahiptir, bilgileri rastgele sıra ile sıralanır buda; 
tek bir başarısızlık noktası olmadığı anlamına gelir. Bu protokol aynı zamanda birden çok düğümü ve birden çok arabirimi de destekler; bu özellik normalde güvenlik endişesi uygulamalarında gereklidir. İHA ağ gibi standart üst düzey hizmetleri ve iletişimleri tanımlar 
keşif, düğüm kurulumu, ürün yazılımı düğümü yükseltmesi, düğüm durumunun izlenmesi, 
ağ genelinde zaman senkronizasyonu ve uyarlanabilir düğüm kimliği tahsisi (aka. 
tak ve çalıştır), vb. 

Bu protokol hafiftir kolayca iletilebilir doğrulanabilir Protokoldür. İHA'lar için uygun olan gerçek zamanlı sistemler. MIT lisansı, yüksek kaliteli açık kaynaklı referansların uygulanmasını öngörmektedir.

UAVCan protokolü, CAN veri yoluna (denetleyici alan ağına) dayanmaktadır., 
ana bilgisayar olmadan cihazlar e mikrodenetleyiciler arasındaki diğer uygulamalarda iletişime izin ermek için standart bir tasarım olarak çalışır. Başlangıçta protokol, multipleks elektrik tesisatı için oto cep telefonlarındaki bakırdan tasarruf etmek için tasarlanmıştı, ancak bahsedilen özelliklerden dolayı diğer alanlarda da yaygın olarak kullanılmaktadır 

Her UAVCAN düğümünün benzersiz bir veri yolu kimliği vardır. Aralıktaki tamsayıdır 
{1 – 127}, burada 1 değeri genellikle otopilot veya başka bir tür merkezdir 
kontrol ünitesi ve 126 ve 127 değerleri genellikle bir hata ayıklama veya izlemedir 
sistem. 1 Değeri, UAVCAN düğümünün en sık kullanılan değeridir.

MAVLink veya İHA aracılığıyla iletişim kurabilen herhangi bir birim aynı MAVLink Bileşen Kimliği (COMPID) numarasının yanı sıra UAVCAN Düğüm Kimliği farklıdr; aksi takdirde ciddi tutarsızlıklar oluşabilir. İçinde normal durumda, tek bir yedek olmayan otopilot mevcutsa, İHA Düğümü Kimliği ve MAVLink bileşeninin kimliği 1 (bir) olarak ayarlanacaktır.Giden / gelen mavlink'in her mesajı / komutu hakkında bir UAVCAN düğümü, COMPID alanı ile aynı değere ayarlanacaktır. 

Sonuçlar 

UranusLink, radyo yolları için tasarlanmıştır.
veri kaybı ve yanlış veri alımı olabilir. Sağlama toplamını şu şekilde içerir:
orijinal mesajın alınıp alınmadığını kontrol etmek için bileşen.
Sağlama toplamı yalnızca orijinal iletinin değiştirilip değiştirilmediğini doğrulayabilir
ya da değil. Bununla birlikte, iha'larda, bir davetsiz misafir bu hassas bilgileri okursa
bir görev başarısızlığına neden olur. Güvenlik konsunda sınıfta kalmıştır tıpkı bahsettiğim gibi ağa sızan hackerin bilgileri okuduğu gibi Bu nedenle komutların gizliliği
iha'larda çok önemlidir ve davetsiz misafirin işini zorlaştırmak için güvende olması gerekir
paketi okumak ve mesajı anlamak için. Basit sağlama toplamı değil
verilerin gizliliğini ve bütünlüğünü sağlamak gerekir.

UAVCan, kritik olmayan robotlar ve havacılık için tasarlanmıştır. Bu
uavcan'ın orijinal şartname belgesi, protokol pro'nun koruma sağlamadığını ve kritik görev ve güvenlik açısından kritik sistemler için önerilmediğini belirtir.

MAVLink, MSP iletisi üstbilgiyi temel aldığından, iletiyi veri paketinin ilk alanında (çerçeve) değerlendirir ve sınıflandırır. İlk çerçeve
Bu nedenle STX değeri doğrulanır ve değere dayanarak, bir değer olup olmadığına karar verir.
MAVLink paketi olsun ya da olmasın. Aktarım hızını ve verimliliğini artırmak için
iletişim için Mavlink'te doğrudan şifreleme mekanizması yoktur.
Ayrıca, mesaj şifrelenirse, başlık değeri değişir ve böylece bir
sistem bir MAVLink paketi olup olmadığını tanıyamaz. Bunun anlamı, rağmen
MAVLink daha iyi iletişim sağlar, ancak güvenlik mekanizmasından yoksundur.

UranusLink ve İHA için. MAVLink, UAVCan ve uranuslink'e kıyasla yaygın olarak kullanılan ve iyi bilinen bir protokoldür. Veri kaybı ve mavlink'teki gecikme, UAVCan gibi diğer protokollere göre rapor edilir.UranusLink protokolü küçük yükü olan İHA'lar için uygundur. Ancak, daha az ampirik var
uygulanabilirliği ve geliştirilmesiyle ilgili kanıtlar var. MAVLink  ve MSP daha fazlasına izin verir, daha eşzamanlı sistemlere izin verir ve birçok program ming dilini destekler. 

Buna karşılık UranusLink'in İHA desteği yok birden çok dil ve eşzamanlılık için. Bunların genel karşılaştırması
protokoller Tablo'da sunulmuştur.

Protocols

Artılar

Eksiler

Yok

UranusLink

Açık kaynak

• Hafif araçlar yerine havacılık ve

robotik uygulamalar için tasarlandı.

• İkili destekler

• Açık kaynak değil

 

Daha az ampirik kanıt

• Çoklu programlama dili desteği yok

• Eşzamanlı desteklemez.

• Ölçeklenebilir değil

• Güvenlik yok

• Yüksek gecikme süresi

• Daha az ampirik kanıt

• Yaygın olarak kullanılmaz

• Çoklu destek yok

Programlama dilleri

• Destek yok

• Ölçeklenebilir değil

•Sadece İHA'lar için tasarlandı

• Doğrulama mesajı yok paket güvenilir olmayabilir ve eski bir protokol

UAVCan

Açık kaynak

• Hafiflik

* Düşük gecikme süresi

* Algılama yeteneği daha hızlı

Daha az ampirik kanıt

* Yaygın olarak kullanılmaz

* programlama dilleri Çoklu destek yok

* Eşzamanlı değil

* Ölçeklenebilir değil

* İHA'lar için tasarlandı

* Sınırlı şifreleme

• Güvenlik mekanızması yok.

MAVLink

• Yaygın olarak kabul edilen dil

* Ölçeklenebilir

* çoklu dili destekler

* Eşzamanlı iletişim destekler

* Büyük ampirik kanıtı

• Hafiflik

* Açık kaynak

* Düşük gecikme süresi

 

• Güvenlik mekanızması yok.

MSP

 

 

 

 

Bu araştırma çalışması şunları önermektedir
belirtilen sorunun üstesinden gelen İHA'lar için yeni bir güvenlik protokolü tasarlamak ve geliştirmek.

Tartışma

İHA'ların hem askeri hem de sivil uygulamalarda genel önemini sunmaktadır. Geçmişte İHA'lar çoğunlukla askeri uygulamalar için kullanılıyordu, ancak kısa süre sonra İHA'ların sivil uygulamalarda kullanılması  askeri kullanımı aşacak. Teknolojinin ilk aşamalarında olduğu gibi 
uygulamalardaki gelişim ve yeni alanlar her geçen gün araştırılıyor, 
bu, bilgisayar korsanlarını ve saldırganları güvenliklerini tehlikeye atmaya çekti 
çeşitli amaçlanan amaçlar. Güvenlik saldırıları normalde gerçekleştirilir 
iletişim protokollerine karşı. Bu bölümde farklı sundum, her ne kadar bazı bilgileri alıntılamış olsamda doğrudan kaynak paylaşımı için çekinmiyorum. 

Mavlink'in İHA iletişimi için en yaygın kullanılan protokoll olduğu tespit edilmiştir. Ancak MAVLink, CAN daha iyi iletişim sağlasa da, mesajları şifrelemek için güvenlik mekanizmasından yoksundur ve  ciddi sonuçlara yol açabilir. Bu nedenle belirtilen sorunun üstesinden gelebilecek yeni ve güvenli iletişim diline ihtiyaç var.

Configrator

Rosflight için kontroller kodlarını yazdım mavlink üzerinden haberleşme kuruyor
https://github.com/hmz06967/rosflight-configrator

#kaynak

file:///C:/Users/flyozkan/Downloads/10.1016B978-0-12-819972-5.00003-3.pdf
https://en.wikipedia.org/wiki/ArduPilot
https://stackoverflow.com/questions/42877001/how-do-i-read-gyro-information-from-cleanflight-using-msp

21 Ekim 2022 Cuma

Stm32 Mcu ile 60 Amper Electronic Speed Controller (ESC)

Merhabalar, bu günlerde ihtiyacım olduğu kolay üretim şekli ve çalışma algoritmasıyla motorları çılgına çeviren elektronik kartın şahsen üretimi ile karşınızdayım evet başlıkta da okunduğu gibi droneleri şaha kaldıran ESC motor hız kontrolcüsü yapmak için işe koyulalım. 

ESC kullanım şekli


Tasarım konusunda piyasadakilerden çok da ödün vermeden konuya gireyim istetim, aslında boş bir zamanın ardından ve kırık bir ayak ile evde sıkılmaktansa bilgisayarda bir kaç proje fena olmazdı diye düşünerek daha evvel tasarlamış olduğum İvme sensörü destekli flytracker projesine uygun bir proje olması da gerekiyordu bu projeyi drone ile test ederken neden başka bir ekipmanını sıfırdan tasarlamayayım ? evet gene söylemek istiyorum Amerikayı baştan keşfetmek için biraz geç kaldım. Sonunda ESC yapmak için harekete geçtim evet.. Çok şaşırdığım fvp droncuların hazır aldıkları sistemleri kapitalist bir yaklaşımla konuyu sadece kınamak istemedim sonuçta bizde bu sistemin bir parçasıyız ve alt parçaları da olabiliriz. Yakınsamaktan çok bu projeye neden ihtiyacım var olduğunu düşünmem için bir kaç saat film izlemiş olabilirim ve yapmak için işe koyuldum Bir devre kartı tasarlarken o kartın ne iş yapacağı sadece bir fikir tarafı: %50 iş bitirme gerçekleştirmesi diğer yanı ise pcb tasarım işi, kod analizi, elektiriksel  hesaplamalar, kullanılacak eleman seçimleri, mosfet ve gate sürücü hesaplamaları gibi bir takım ve listeyi uzatan seçimlerin yapıldığı.. durun işte aynen böyle; ıslak uyanılmış bir rüya dan sonra yatağın diğer tarafının boş kalması ile aynı sıkıntılı durumu anlatıyor olsa gerek (özgürlük ve ciddiyet bazen iş kaçırabilir)  diye düşünerek..

Tasarım ve fikir zaten hali hazırda mevcut olabileceği ve benim durumuma ek bir özellik gerektirmeyeceği için orayı es geçerek anlatacağım gate sürücüleri de anlatmak isterim fakat orayı da alıntılıyabilrim çünkü üzerine durduğum tek yer yazılım ve donanım üretimi olduğu yüksek akım tasarlarken signal kablosu kullandığınız bir devre kartında 2 katlı bir pcb nin yeterli olabileceğini ama elektromanyetik uyumluluk EMI ve girşimleri EMC çok fazla kafaya takmadan yapılabilecek bir proje olmasından dolayı orayı da es geçtim aslında yazılım dışında çok zorlanmadığım bir tasarım furyasına giriş yapmak üzere olduğumu farkettim yüksek frekanslı faraday kafesi gerektirecek bir verici devre kartı tasarlamıyorsun Hamza diyerek işe koyulmanın önceden yapılacak hesaplamaları bile es geçmeme sebep verebilir. ( EMC ve EMI hakkında uzun soluklu  proje için bilgi tazelemek benim fena olmazdı.) başlayalım.


ESC Çalışma Yöntemi

Üç fazlı fırçasız DA motorun şematik diyagramı 

..Fırçasız DA motorunun geçiş yerlerini, Hall Effect sinyallerini çözerek belirlenmektedir. Altı aşamalı değiştirme tekniği, fırçasız DA motorun üç fazlı motor sürücünün altı adet MOSFET sırasıyla değiştirmek amacıyla kullanılmaktadır. Belirtilen bu yöntemle, her bir sinyal çıkışlarında MOSFET’ler üç fazdan iki tanesini enerjilendirirken tek faz pasif konumda kalmaktadır. Anahtarlama dizilerinin ters çevrilmesi motorun dönüş yönünü değiştirir. Motorun hızı, Hall Effect sensörü sinyallerinin genişliği ile doğru orantılıdır. İdeal hat gerilimleri, geri EMF gerilimleri, komütasyon sinyalleri, faz akımları ve üç fazlı fırçasız DA motorun altı kademeli anahtarlaması şekil’ de gösterilmiştir.



Üç fazlı fırçasız DA motor sinyalleri ve anahtarlama örüntüsü 





Fırçasız DA Motorlarda Manyetik Alan Ve Manyetik Akı Hesaplamaları 

H=N*I/L Burada, H manyetik alan şiddeti, 

N sarım sayısı, I akım şiddeti, 

L stator kol uzunluğu B= µ *H veya B= µ (H+M) 

Burada, B manyetik akı yoğunluğu, µ = 4π* 10-7 manyetik akı geçirgenliği, 

M silisyumlu sacın manyetik geçirgenliği.

 

Mcu Seçimi 

Esc, için mcu seçiminde dikkat edilmesi gerekilen nokta giriş ve çıkışları belirleme ve ardından bu gereksinimleri sağlayacak ucuz mikroişlemci seçimi yapmak bunun için genelde arm mimari kullanılan mcu işimi görecektir sonuçta kahve makinesinden farksız daha az pid gereksinimi duyan pwm üreticisine ihtiyacım var aslında analog entegreler bile bunun için yeterli olabilir fakat birden fazla entegre ve kalabalık bir devre kartı herhalde günümüz elektronik furyasında biraz iyk olurdu. 

Atmega8 - 328, Silaps, Attiny veya Stm32 mikroişlemcileri Arm tabanlı birden fazla Timer içeren basit yapılı beyinleri işimi göreceğinden dolayı piyasa fiyatı 20 - 30 TL ile 4 adet ESC için baştan kendime bir fiyat düzeni uyguladım, kısaca STM32F051'in iyi bir seçenek olacağını düşündüm. 

FIRÇASIZ MOTOR

Fırçasız motor iç gösterimi

Rotor tarafından oluşturulan dönen manyetik alan fırçalar ve komütatör yardımı ile meydana gelir. Komütatör ve fırçalar rotorun pozisyonuna göre rotor sargısı üzerinden geçen akımın yönünü değiştirerek dönen manyetik alanı oluşturur.
Şekilde gösterildiği gibi motorun iç yapısını gösteriyor genelde drone veya quadcopter gibi rc araçlarda bu motorlar sıkça kullanılır tabi benzinli olanları ayrı bir dünya..

Resimdeki motorda  6 dan fazla komütatör var fakat normalde 6 komütatör kullanılmaktadır. Bu motorlar genel bir tabirle az ekmek çok iş yapabilen AC 3 faz (phase) sinüs dalgasıyla çalışmayı destekler ve böylelikle verimlilik ve potansiyel kazanç fazladır ayrıca yüksek hızlara ulaşabilir. (24k Rpm)

BEMF

BEMF veya Geri Elektro-Motive Kuvveti, bir manyetik alanda bir bobinin dönüşü ile oluşturulan, polaritede zıt olan, çok işlevli bir kod çözücü tarafından ölçülebilen ve geri besleme olarak kullanılabilen bir voltajdır. Bu alıntı bilgi ile emf yi net olarak tanımladık şimdi nasıl yaptığımıza bakalım.

Bir motor tarafından geliştirilen maksimum tork, E BEMF = V Besleme ÷ 2 denklemine eşittir .


Rotor pozisyonunu belirlerken stator sargılarında indüklenen zıt emk’ya göre bu dedektörlerden faydalanmak mümkün olmaktadır. Sıfır geçiş dedektörü motor sürücüsüne bağlıdır ve rotorun konumunu belirlemek için, besleme gerilim değerinin yarısı ile statordaki faz sargılarına uygulanan gerilimi karşılaştırmak gerekir. Bu sensörlerin avantajı, hareket eden parçasının olmaması ve motordaki hareket eden diğer parçalarla bağlantısının olmamasıdır. Aşağıdaki şekilde bu dedektöre ait yapısı ile bağlantısı gösterilmiştir.

Açıklamaya göre, rotor pozisyonu belirlenerek çıkış pwm sinyalleri yani hangi mosfetin açılıp kapanacağı gibi bazı sorular için bize bir cevap olur.

Gate Sürücüler
Boostrap gate driver

Projede IR2101S kullanılmaktadır.

Mosfet sürücü bu projede çok önemli bir yerde çünkü pwm sinyalini motora göndermek için bir mosfetin nasıl kullanılacağı ve sinyalin frekans yada duty cevabına göre doyumda olup olmaması çekilecek akımı doğrudan etkiler ve motora gönderilen akımın doğrudan akmasına veya kısmen akmasına sebep olacak olan high side ve low side durumlarını bir ele alamamız gerekiyor sonuçta patlamış mısıra dönmüş pahalı kuzucuklar için üzülmemiz gerekmiyor bir çaresi var bla bla...

Burası biraz sıkıcı gibi geldi sonuçta amerikayı tekrar keşfe çıkmak elbette sıkıcı bir iş gibi gözükmeyebilir ama öyle 

https://www.firatdeveci.com/dikkat-high-side-gate-driver/

Mosfet Seçimi

.... 80 amperin üzerinde, düşük Rds ON değerine sahip NPM kanallı 25 volt üsttünde herhangi bir mosfet seçebilirsiniz 

Pwm sinyali, Dshot, Multishot , TIMER Zamanlayıcı

Haberleşme protokolleri esc ler için geliştirilmiş hali hazırda modulasyon sinyali olan bütün donanım/yazılımların adeta virgülü haline gelen PWM sinyali ve diğer sinyaller, bu haberleşmek için sinyalin dutty değeri ile Usart benzeri sabit hızları olan sinyaller veya dijital sinyaller olabilir ESC işlemcimiz ana görevini icra ederken bir yandan da girişi dinleyerek çıkışa yönlendirmek zorunda eğer giriş sinyali bir şekilde kaybolursa Esc, çıkış modulasyonunu durduracaktır bu iletişim kopukluğu, uçuğu sırasında yaşanırsa facia olabilir yüksek mertebede duran motorların cihazın bir kaç saniye sonra üreticisine söverek parça arayan drone sahibi ile aramızda bir diyalogu başlatabilir bunun olmasını istemeyerek bu konuyu biraz anlatmak istiyorum..

Timer bizim için biçilmiş kaftan donanım üreticilerin bulduğu, şekersiz çay olur mu diyenleri anlamamı sağlayacak bir donanım yönetim sistemi kendi başına bir roma imparotoru ve bunun içinde biraz adil bir sistem. Bu donanım, içeride gerekli olan İnput sinyalini (yukarıda zaten bahsettik biraz da aşağıda değineceğiz) DMA kullanarak yakalamak ve anlamak ve bu sinyalden yola çıkarak motorumuzun hızını değiştirmek için rotor konumu hakkında bilgi toplayacak anında pwm pulse sinyali için için yardımcı bir görev olarak çalışacak, CPU ana loop, bilgiyi toplama konusunda vakit kaybetmeyecek ve ana döngü ile yakalayıcı donanımların frekansları karışmayacak herkez musmutlu evine dönecek.. ııg ıgmm. 

PWM motor frekansı için çok fazla PWM sinyalinin periyodu 2ms bu giriş sinyalinin frekansını bize söylese de yakalayıcı timerların, ana döngüden bağımsız bir frekansta çalışması gerektiğini anlatyor ve bu duruma hak veren diğer sinyaller, Dshot, Multishot iletişim protokollerinde paket boyutu yaklaşık 25us civarında bu sinyal frekansının 1mhz'e yakınlığını anlattığı için giriş modunda timer frekansını belirleyici etki sağlayacaktır. 

Bir diğer nokta GPIO çıkışları direkt cpu ana program fonksiyonu ile kontrol etmek yerine yerine PWM sinyal çıkışı  verebilen işlemciyi yormayan görevli meleklerimiz Timer PWM genaratör leri kullanacağız, toplamda 6 çıkış var 3 Pozitif ve diğer 3 ü ölü zaman farkı ile negatifi. Böylece işlemci giriş sinyalinin hesabı, rotor dönüş yönü, akım yada gerilimler, adım bilgisi verilerini işlerken arka planda zamanlayıcımız gate sürücüsüne gerekli pwm çıkışı vererek hem doğru iş yapacaklar hem de sinyale ara vermeyecek, mosfetlerimiz yumurta pişirmemiş olacaklar. 

Sistem bekçisi Whatcdog ana döngüde yolunda gitmeyen durum fark ettiğinde kısaca 24 khz frekansında başa dönmediği zaman bir terslik olduğunu farz ederek işlemciye reset atacak böylece çıkışı durduracak hem mosfetleri hemde motoru veya ters bir durumda çıkışımızı koruyacak bunun dışında sistemde akım ve gerilim okumaları eklersek çıkış akımı veya ters akım koruma alt sistemleri de ekleyerek ESC yi daha güvenli hale getirebiliriz ama ben son 2 koruma devresini dahil etmedim.
Koruma derken es geçmeyelim havada  yanmaya başlamış bir drona henüz rastlamamış olsamda mosfetler yüzünden ısınan dış kablolar yangına müsait bir ortam yaratabilir mosfet sıcaklığını bile sisteme dahil edebiliriz.... bla bla 
  

Final! PCB kart tasarımı 

İşte bu bebeğim astavista!!! 

Gel gelelim işin en çılgın noktasına bu tasarım şuan da inanılmaz gözüküyor evet lehim yerlerini adeta patlayacak şelale gibi açılımda bulunarak biraz olsun gevşemeye hazır bir canlıya çevirdim, adeta evrimin sırlarını açıklayacak nitelikte kontrolcü, evlenmeden önce sizi bekarlığa veda partisinde gazlayan eküriniz gibi durmuyor mu ? hadi oğlum bu tam senlik diyen amcanızın sizi gazladığı gibi ahenkle güç verecek gibi duruyor, baktığımızda bir şeylerin yerden havalandığını fark ettiyseniz.. 

Sözün özü tasarladığımız proje aşağıda arkadaşlar şimdi ise test ve yazılımı kontrol etmede....
Espride geri kalmadığım durumların işimi son derece sevdiğimi anlatmama gerek olmadığı kaanatindeyim ama açıklamak istiyorum v1.0  hali ile EAGLE ile tasarladığım bu pcb için eleştiriler son derece önemli.

Malzeme listesi

STM32f051 LQFP-32 kılıfında bir ic, 
3 adet mosfet sürücü IR2101S,
P-TDSON-8 kılıfında 85 Ampher 30 volt 3.2 mohm N channel 6 adet mosfet ,
 BEMF devresi için 3x10k, 6x33k, pull res. 10k, 
8 mhz kristal 20pf ,
5 volt için 2x78m05 
mcu beslemesi için L11173v3 ldo entegresi kullandım 12, 5, 3.3 gerilim hattları için 22uf, 100nf kondansatörler kullandım.  hepsi bu kadar gelecek projede görüşmek üzere sağlıkla kalın.

Özet

Bu yazının asıl amacının bu projeyi sadece yazı veya referans görsellerle bırakmamak kaydıyla bir işe koyulmanın ilk adımı diyebilirim, çok özverili bir şekilde yapmaya başladığım yaparken hem anlayıp hemde anladıklarınızı bir yazıya dökmeniz oldukça zaman gerektiren kıymetli şeyler bu postu yazarken çoğu es geçtiğim önemli detayların aslında altını çizmek için bir fırsat totemi olarak düşünüyorum sonuçta kıymetli olanın pek de üzerine düşmediğimiz gerçeğinin bir insan doğası olduğunu kabullenmem sadece bu posta özel bir durum değil anlayışınıza sunarım.
Üst görünüm

Alt görünüm mosfetle birlikte

Kod

Özel tasarlanmış pcb için özel tasarlanmış yazılım olmak zorunda değil sonuçta aynı görevi olan bir mikroişlemcinin yazılımda sadece gpio farkı olur veya özel olarak eklenecek devrenin örneğin akım okuma, led çıkışı hall efecct sensörü okuma veya multishot, oneshot  protokol desteği yazılıma eklenebilir. Kullandığım MCu bu proje için diğer stm32f0xx lerden tek farkı paket boyutu LQFP-32 olmasından dolayı yazılımda hiç bir değişiklik yapmayacağımı anladığımda piyasada ki çoğu esc firmware yazılımlarının aynı mantıkla çalıştığını biliyoruz böyelikle sözün linki aşağıda..

Runn!


.

# kaynak

22 Mart 2022 Salı

Altium ile 74hc595 16 Bit DAC Tasarımı

 Merhaba arkadaşlar daha önceki yazımda size 16 Bit  için teorik olarak Dijital Analog Converter dizaynı yapmıştık  Arduino mikrodenetleyicisi ile kontrol edebildik bugün ise bu tasarımın devre şemasını ve Altium çizimini sizinle paylaşmak istiyorum. 480 Khz sinyal için diffarantiel pair olayına girmedim her bir direnç arasındaki mv cinsinden kaybı yazılım ile tolere edebiliriz. Bu devre kartının malzeme fiyatı  yaklaşık 10 lira günümüzde 16 bit D/A için 10 dolar üzerinde entegre/modül fiyatı bulunuyor.

Çıkışında Low pass filter var 47nF bir kondasatör için 1 Khz de orjinal sinyale çok yakın bir görünüm veriyor yakın bir zamanda kartı sipariş edip testlerini yapacağım. Onun dışında delikli pertinax ile deneysel bir devre tasarımı yaparak deneyebiliriz.

16 Bit Dac üst görünüm 

16 Bit Dac alt görünüm 


20 Mart 2022 Pazar

DAC Nedir ? Entegreleri neden pahalı ? Ucuz Ve Kaliteli DAC Yapalım

Merhaba arkadaşlar, bugün Mikroişlemci ve elektronik dünyasının vazgeçilmez çevrim işlemi olan dijital bir verinin analog olarak çıkış yönteminden bahsedeceğim. 

Günümüz dünyasında haberleşmenin elektronik için önemi büyük basit bir örnek ile açıklayım mikrofondan gelen analog sinyali uzaya taşımak istiyoruz ama bu datayı kimse çözemesin? analog olan bu sinyalin sayısal bir karşılığını kullanarak bu veriyi kripto edebiliriz karşı taraf da bunu tekrar çözüp ses sinyaline çevirmesi gerek. 

Eğer elektroniğe meraklı ve yeni öğrenen biriyseniz çoğu terime yabancılık çektiniz o halde Analog ve dijital sinyalden bahsedelim. 

Ucuz yöntemle kaliteli dac işlemi
DAC akış gösterimi

Analog Sinyal

Fiziksel sistemlerdeki ısı, sıcaklık, basınç, ağırlık, nem oranı, ışık şiddeti, ses şiddeti gibi büyüklükler olarak değişirler nedir bu analog? Bu büyüklükler elektronik ortama aktarmak için bazı enstrümanlar kullanırız mikrofon, sıcaklık sensörü yada bir kamera cihazı; ses, ısı, ışık gibi büyüklükleri genlik, akım, faz açısı veya frekans gibi elektriksel sinyallere çevirirler bu sinyaller anlık olarak düzgün olmazlar çok fazla gürültülü olabilirler iki kablo içerisindeki sinyal birbirine manyetik & endüktif  etkiye sebep olur birbirini bozabilir iyide dijital sinyal de böyle bir problem yok mu? yüksek frekansta çalışıyorsak var tabi şş orası sonra.. :) . 

Analog sinyallerde bir ortamdan başka bir ortama taşınırken elektriksel özellikleri kolay değişebilir, kayıp yaşanabilir  bozuk sinyal işimize pek yaramaz dijital sinyal ise az bozulmaya uğrar kısaca hdmi ile svideo sinyali arasındaki fark gibi püf noktamız bu olsun. 

Analog sinyaller sadece duyulabilir sinyaller olmayabilir eskiden teknoloji bu kadar gelişmiş değildi analog sinyaller kendi aralarında çevrimi yapılıyordu yani modüle edebiliyorduk yada genlik ile oynuyor faz açısını değiştiyor yada filtre ediyorduk ama bu analog in out için biraz mekaşetli ve pahalıydı çok fazla devre elemanı gerekiyordu  eski radyoların içini açın birde şimdiki radyoları boyutları epey küçüldü işte sebebi herşeyin dijital olması bu sinyallerin işlenebilmesi için devre elemanına ihtiyacımız yok. Mesela yeni nesil radyolarda rezanatör devresi bile yok çünkü mikroişlemciler geliştiğinden beri yazılım ile sayısal veriler ile oynamak kolay. Lütfen SDR için bir araştırma yapın ne dediğimi anlayacaksınız:) şimdi dijital sinyali kavrayalım. 


Analog sinyal gösterimi


Analog sinyal, T zaman aralığında [v1, v2, .. vn] kadar gerilim değeri alabilir bu gerilim kümesi iki referans gerilimin arasında zamana bağlı olarak değişir örn 3.567 volt olabilir. 

Az önce farkettiğimiz gibi 3.567 volt bir gerilim değeri ve T zaman aralığında, onlarca değerden bir tanesi, zamanı ne kadar daraltırsak virgülden sonraki sayılar giderek sabitleşir. Analog sinyalin bir frekans oluşundan kaynaklı olmakla frekansın  değişken özellikte olması bu gerilim değerinin zaman içerisindeki değişimi ile doğru orantlıdır. f = 1/T formülü ile T yani zamanın bize frekansı verdiğni anlarız. 

Bu blog yazısı DAC için yüzeysel formüller mantık anlatımı ve resim destekli similasyon çalışması içerir. 

Dijital Sinyal 

Dijital sinyal gösterimi


Yukarıdaki görsel dijital sinyali görüyoruz bu sinyal yani bu veri kümesi elektrikte 1 açık ve 0 kapalı anlamına gelen 2 lik koddan oluşur matematik modellemede binary taban sayısıdır. Dijital sinyal T zaman aralığında, TTL veya CMOS transistör modellemesinde 5.0 veya 3.3 voltdur mesela TLL de' [1:5 Volt 0: 0 volt]  olmak üzere 2 farklı değer alabilir.. 

Örnek, 256 decimal (10luk taban) Binary karşılığı 11111111 olarak kodlanmıştır 256 = 2^8 in karşılığıdır. 
Burada görüleceği üzere 256 Decimal sayısının karşılığı ikilik düzeyde 8 Bit anlamına gelir, her bir bit ikili sayıdan oluşur 1 ve 0 mikroişlemcilerin anlayacağı elektriksel dilin matematik gösterimidir.
 
Örneğin, ilk kez makine diline çevrilmiş meşhur 2 kelimeden oluşan Hello World ikilik koda çevrilirse:
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
Şeklinde olur. Her bir karakter 8 bit uzunluğundadır ASCII kodu olarak tanınır latin alfabesinin 7 bitlik bir karakter kümesidir İlk kez 1963 yılında ANSI tarafından standart olarak sunulmuştur.

Elbette aranızda bilenler vardır binary ikilik kod sistemi yazılım dilinde byte olarak tanınır ve her zaman hex veya decimal karşılığı bulunur 8 bit 1 bayttır matematikte anlatılan taban sistemi olan bu bilgileri lütfen araştırın.. 

İkilik kod, açık ve kapalı şeklinde olup elektrikte kullanabiliyoruz kapı devreleri, sayıcılar, register, flip flop vb transistör devreleri bir araya geldiklerinde veri depolayabilirler toplama, çıkarma veya diğer işlemleri yapabilirler. Matematik işlemini  1 mhz hızda yapabilen bir işlemci 1960 lı yıllarda çalışıyordu tek yapmamız gereken matematik modellerini dijital ortama aktarıp işlemek bir ses sinyali işleme fikrini geliştirmek o yüzden uzun sürmedi zaman geçtikte transistörler arttı ve mikroişlemcilerin işlem kapasitesi ve hızı da arttı şuanda Ghz seviyesinde. 

Şimdiye kadar sadece matematik ve bilgisayar dilinden bahsettik sayısal veriyi anlamış olduk bilgisayarların ve transistörlerin aç ve kapa özelliği ile aritmetik işlemler yapabilen yonga setlerine kısaca mikroişlemcilerin dünyasına teorik olarak göz attık bu yazı epey uzun soluklu olabilirdi henüz işin matematik tarafındayız. 
Fakat bu yonga setlerinin nasıl çalıştığı ram, rom, cpu, io, saat frekansı, timer... Gibi kavramlarını başka bir makalede ele alabiliriz. 

Şekil 2 Dijital Analog sinyal

Analog ve dijital sinyali anladık şimdi ise dijital sinyali nasıl analog sinyale pekala DAC nın ne olduğuna bakmanın tam sırası.. 

Kısaca DAC Nedir ?  

Başlıkta da yazığı gibi yukarda yazılanlardan yola çıkarak Şekil 2'deki sinyal tablosunun  sağdan sola Dijital sinyalin (DACD/AD2A, veya D-to-AAnalog sinyale dönüştürme veya birbirine çevrimi diyebiliriz. Örneğin, MP3 dosyasını insan kulağının anlayacağı şekle yani ses dalgalarına büründürmek gibi.. 

Dijital çıkış verebilen bir mikrodenetleyici ile başlayalım bu çok bildiğiniz Arduino Uno kartı işlemcisi olan Atmega328; seçimi ile bugünkü projede kullanacağız. Donanım konusunda iyi şirketlerin kullandığı Stm32, Arçelik gibi firmaların kullandığı AT80xx işlemciler olabilir ve çoğunun giriş çıkış, hız vb donanım özellikler değişkende olsa amaçları aynı. 

Mikroişlemci ile ürettiğimiz dijital SİNÜS sinyalinin bozulmaya uğramadan osiloskopta görmek için bazı donanımlar kullanmamız gerekir. Bu harici donanımlara genelde DAC entegreleri diyoruz. Bu makaleyi yazmamdaki olay hikayesi, tonlarca DAC anlatımı blog hatta haber siteleri olsa da teknik olarak inceleyip gerçek bir deney ile minumum 3 dolar olan bu entegreleri nasıl 1 dolara imal edebiliriz sorusu ile başladı. 

İşlemci üzerindeki dahili donanımlar gerçek proccessing işlemleri için yeterli değil Arduino gibi bir geliştirme kartı DAC İşlemi için PWM yöntemi kullandığını anladığımızda bu iki noktanın kavramını bu makalede anlayabileceğiz çünkü, DAC için mutlaka harici donanım kullanacağız LPF de dahil. 

Nasıl ? 



Analog değerler zamana göre sürekli (kesintisiz) olduğundan, bütün zaman dilimlerine karşılık gelen bir analog gerilim değeri vardır. Her analog değer için bir dijital değer oluşturmak karmaşık ve maliyetli olacaktır. Bu nedenle analog değer üzerinden belirlenmiş zaman aralıklarında örnekler alınır. Her örnek için seviyesine göre kodlanmış dijital bir değer üretilir.

Referans gerilim değeri bu yüzden vardır -Ref ve +Ref sinyal üretilen analog sinyalin minumun ve maksimum değerini ifade eder.

Şekil 3 DAC matematiksel modeli 


DAC işleminini matematiksel ifadeler ile doğrudan anlayalım  Şekil 3'e bakacak olursak sol taraftaki n kadar bit uzunluğunda dijital binary kodlaması görülüyor. Yukarıda anlattığım gibi örneğin n=16 bit sinyal 65536 farklı değer alabilir (2^n) bu 16 sıralanmış ikilik koddan oluşur.  DAC işleminde gerçek analog sinyale ne kadar çok yaklaşırsak çözünürlük dediğimiz resolution yani n o kadar artar ve sinyali daha kaliteli elde edebiliriz. 

Grafikte okunnduğu gibi, negatif ve pozitif referans değeri arasındaki çözünürlük;

V+ref = 5.0 volt
V-ref = 0 volt
n = 8 bit
Q = (V+ref - V-ref ) / 2^n = (5-0)/256 
Q = 0.01953125 volt
Tablo 1 8 bitlik bir DAC için çıkış değerleri


Her bir adım yaklaşık 0.02 volta karşılık gelmektedir. Kısa bir deyişle 0-5 volt aralığını n=8 bit, 256 adet eşit aralığa bölmüş olduk. İşte kavranması gereken nokta burası çözünürlük n kadar bit değeri ile doğrudan ifade edilmesinin sebebi ref gerilimin adım aralığı ile artıyor.  Tablo 1'de örnek değerler gösterilmiştir.

Vmax değeri maksimum digital kodun (n=8, 256) max referans gerilimin 1 bit aşağısında kalmaktadır.

(256)10 = (11111111)2 sayısı yaklaşık 4.98 volt analog çıkış gerilimi ile ifade edilmektedir. bu hata örnekleme hatası olarak adlandırılmaktadır.

Vmax = 5 volt ve n = 16 bit olduğunda 65536 farklı sayısal kod farklı gerilim değerini ifade eder adım aralığı artmış olur. Dezavantajı çözünürlük maliyet ile doğru orantılıdır günümüzde 16 bit DAC entegreleri minumum 5$ dan aşağı satılmazlar. 

Çıkış gerilimi V(x), ile x burada digital kodun decimal karşılığı anlamına gelir. 
V(256) = x*Q = 256*0.01953 =  4.9800 volt

R-2R Kedi Merdiveni

R-2R yöntemi op-amp ile beraber direncin gerilim bölücü özelliği kullanılarak D/A dönüşümü yapılabilir her bir R-2R direnç bölmesi Şekil 4'deki gibi birbirine seri bağlanarak (n kadar bağlantı, n kadar çözünürlük ifade eder) şekildeki anahtar doğrudan işlemcinin dijital pinine bağlanır bu 4 bit bir D/A çevirici yani;
Vref = 5, 
n = 4, 
Q = 5/2^n 
Q = 0.3125

V(x) = x*Q

16 adımlık dijital çevirici V(x) sinyali, x değerlerinin 16 farklı değeri ile analog sinyali bulabiliriz.  

Şekil 4 Dört bitlik ikilik ağırlıklı direnç D/A çevirici

Bu tip D/A çeviricilerin bir dezavantajı direnç değerleri aralığının ve sayısının farklı olmasıdır. Örneğin sekiz bitlik bir D/A çevirici için sekiz direnç kullanılmalı ve bu dirençlerin değerleri R ile 128R arasında olmalıdır. Direncin, toleransları ve sıcaklığa bağlı olan değişimlerine bağlı olarak sonuç değişeceğinden, kararlılığı düşüktür. 

R direnç değerleri, devrede R = 1k olabilir bu akımı etkiler D/A için gerilim değeri önemlidir ki zaten op-amp  burada akım değerini absorve edecektir.

Vo = -Vref * (8D3 + 4D2 +2D1 +D0) * 1/16
Tablo 2 4 bitlik R-2R D/A çıkış değerleri


Tablo 2 4 bitlik, ikilik ağırlıklı D/A çeviricinin sayısal veriye ait çıkış gerilim değerlerini göstermektedir




LFP (Low Pass Filter) Mantığı 


RC devresi adı geçen, genelde aktif ve pasif olmak üzere LPF olarak kullanılan şekildeki devre örneklerinden çok fazla var, aktif olanlar gerilim kazancı ile filtre edilmiş analog sinyalin gerilim  kaybını önler hatta yükseltebilir. Ses frekans endüstrisinde bass filtresi olarak adı geçtiği için zamanında çok fazlaca kurduğum bir devre, op-amp ile aktif filtre devresi yapılabiliyor  kondasatör seçimi ile giriş sinyalinin filtre edilecek frekansı belirlenebiliyor.

fc = 1/(2.π.R.C)  


 

LPF ile dijital sinyalin analog benzetimi sağlanabilir aşağıdaki şekilde bulunan STM32 den alınmış PWM sinyalin duty oranına göre LPF devresi ekleyerek analog gerilim benzetimi blog şeması gösteriliyor.



İşlemcilerin dijital pinlerinden doğrudan Analog sinyal çıkışı alamayız. PWM çıkışları ise duty cycle değeri ayarlanmış dijital bir sinyaldir ki bu sinyallerde LPF (Low Pass Filter) Devreleri ile analog sinyal değerleri PWM sinyalin duty ayarı ile yaklaşık tahmini yapılıyor fakat tahmin yanı sıra analog çıkış sinyali benzetimi için bu filtre devresini kullanmak gerekli sayılabilir.

Tek başına 2-2R Kedi merdiveni devresinden daha az performanslıdır 8bit 2-2R devresinin çıkışına bu devreden koymak yine yanlış olmaz sinyali analog sinyale yaklaştırmamız harmonikleri engeller ve temiz bir çıkış sağlar. 

Harici Donanım "DAC"


Çok popüler ve ucuz bir entegre devre D/A çevirici MC1408 veya eşdeğeri olan DAC0808 ‘dir. MC1408 standart 16 bacaklı DIP paket olarak gelir ve +5V ’luk Vcc ile minimum -5V, maximum -15V ‘luk VEE gerilimi gerektirir. MC1408’de, bir R/2R merdiven tipi D/A çevirici, akım yükseltecinden gelen referans akımını, 8 ikilik ağırlıklı akıma böler. Bipolar transistör anahtarlar (A1-A8), girişlerindeki ikilik bilgiye göre ikilik ağırlıklı akımları çıkış hattına bağlar. En yüksek değerlikli biti taşıyan girişin A1, en düşük değerlikli taşıyan girişin A8 ile gösterilmiştir. MSB ve LSB etiketlendirilmeleri normal etiketlendirilmenin tersinedir. Bu nedenle kullanılacak bir entegrenin veri sayfası dikkatle incelenmelidir. Şekil 19 MC1408’in blok diyagramını, bacak bağlantısını ve tipik uygulamasını göstermektedir.


I2C, SPI Haberleşmeli D/A 
Mcp4725 DAC Modülü



Örneğin yukarıdaki şekilde MCP4725 bulduğum en ucuz entegre, günümüz dolar kuru (15.00)  ile 29.99  (2$) gibi bir fiyatı var ; 12 bit (4096 örnekleme) olması aslında orta düzey işlerde yeterli çıkışta bir RC filtre ile tadından yenmez ve haberleşme protokolü desteklemesi hız olarak da yeterli özellikle SPI 4 mbit hatta 12 mbit'e kadar hız destekler. 

Onun dışında söylemek istediğim, çoğu entegre kedi merdiveni devresi kullanır pahalı olmasına sebep veren şey entegrenin üretim şekli olabilir. İçerisinde bulunan dirençlerin çok az toleranslı olması çıkış sinyalindeki kaybı aza indirmesi ile doğru orantılı olduğu için iyi bir direnç seçilmesi bu kaliteyi etkileyen bir faktördür.

MAX5891 RC filtre çıkışlı block diagramı 


MAX5891 16-Bit, 600Msps Destekleyen yüksek çözünürlük D/A entegresidir şuanda günümüzde 65 $ civarı fiyatı bulunmakta CMOS seviyesinde çalışmaktadır haberleşme olarak paralel port LVDS destekler 


Ucuz Yöntem



74HC595 Shift Register entegresini çoğunuz biliyorsunuz eminim. Bu entegre digital bir sinyali 8 bit çıkışa ayırır. Ve günümüzde fiyatı 1 lira civarında olması çok iyi alternatif, 2 adet 74hc595 ile 16 bit çözünürlüklü R2R yöntemini kullanarak DAC tasarımı yapacağız. Yukarıdaki görsel bu tasarıma ait yüzeysel block şemayı gösteriyor Mikroişlemci olarak Arduino'dan faydanalabiliriz. Stm32 deki gibi fazla kod gürültüsü ile uğraşmadan temiz bir kod ile amacımız 16 bit çözünürlüklü sinyal oluşturmak. Aynı devre ile 4, 8, 12 ve 16 bit D/A için deneyler yapmak istiyorum. 

Aşağıda D/A devre şemasının tam halini sizinle paylaştım bu şemayı bread-board üzerinde deneyeceğiz. n = 16 bit için toplamda 32 adet direnç kullandık. Hazır entegrelerden kabaca farkı giriş sinyalinin  clock sinyali ile alıyor bu clock sinyalinin maksimum fc frekansını hesaplayıp, hali hazırda devrenin gerçek değerlerini ve toleranslarını hesaba katarak çıkıştaki gerilim kaybını ölçeceğiz. Pahalı olan 16 bit entegre ile sinyal farkını göreceğiz.. MAX5891 Entegresi ile çıkış özelliklerini teorik olarak karşılaştıracağım.




Arduino'ya 2^16 / 96 =  682 adımlı bir kod yazdım bu kod 16 bitlik D/A için 682 adımlık analog gerilim sinyali üretecek proteus'daki ideal opamp -15, +15 besleme gerilimi değerine ayarlandı op-amp besleme geriliminde evirmeyen girişini yükseltiği için ;
V+ref = 15 volt
V-ref = -15 volt
n = 16 bit
Q = (V+ref - V-ref ) / 2^n = (15-(-15))/65536 
Q =  0.000457763672
Burada dikkat etmemiz gereken nokta 65536 adımın 682 adıma düşmesi yazılım ile adım aralığını düşürdüğümüzden dolayı her bir Q değeri aralığı yukardaki grafiğimize göre 0.04394 volt olmalı 

Dönüştürülmüş analog sinyalden kesit
Yukarıdaki (Volt-Time) sinyal grafiğine baktığımda müthiş hissetim adeta yarım dolarlık bir D/A entegresi tasarlamış oldum. İşlemini kabaca anlatabilirim aslında grafik testere uçlu bir sinyali gösteriyor olsa da aklınıza gelebilecek her türlü analog sinyalini üretebiliriz. Ses sinyali de buna dahil olsa da kaliteli bir ses frekansı alabilmemiz için bazı detaylara takılmak gerek PCMXX entegrelerinin neden pahalı olduklarına da hiç şaşmamalı.
Dönüştürülmüş analog sinyal çıktısı







Biraz amatör bir iş yapmış da olsam 16 bit D/A elde etmiş oldum yüksek sıcaklıklarda ve düşük sıcaklıklarda bu devreyi pratikte deneyerek kontrol etmek istiyorum. 

0 ile 65536/96 aralığında decimal dijital sayının 0 - (-15) volt aralığındaki dönüştürülmüş gerilim grafiğini clock, data, latch sinyali ile birlikte göstermektedir. Bir üstteki sinyal grafiği zoomlanmış hali olanı gösteriyor bariz farkla dijital kodun shift register aracılığı ile her latch ediltikten sonra sinyalin referans sinyale bölünmüş oranını aynı şekilde gösteriyor. Kabaca 0, -15 volt gerilimi  65536/96 oranında bölmektedir.

Bir problem var !

f = 1/T 
fc = 16Mhz = 62.5 ns

Ts - Ti = 249.143 - 249.368 
Ts- Ti = 0.225 ms 

=  225us 
f = 1/225us  = 4.444 Khz

Hesapladığımız zaman 62.5 ns mikroişlemcinin (Arduino UNO Atmega 328) saat darbe frekansı yani zaman aşımı süresi. 
 
Proteus similasyon aracında (ideal ortam) Arduino ile 74hc595 için haberleşme hızını 225 us zaman aşımı süresi ölçtüm. Ölü zaman aralığı olduğundan; çıkıştaki analog sinyal bu süre boyunca bir önceki durumu ile değerini çıkışta korur zaten arada op-amp devresi buffer olarak çalıştığı için sürekli olan sinyalde kopmalar olmaz register bir sonraki data için durumunu koruyor. 
Mesele şu ki 4.44 Khz Bant genişliğimiz bulunmakta bir ses örneklemesi 44.1 Khz bant genişliğinde çalışır yani bu değerin 10 katı. 74hc595 ile haberleşme süresi Arduino'nun çıkış zaman aralığı ile bağlantılıdır. Yazılımda shiftOut fonksiyonunu kullandık Arduino kütüphanesinin hazır bir fonksiyonu olmasından dolayı aşımını değiştirmek için kodu yeniden düzeltmemiz gerekiyor. Bildiğim kadarıyla ardunio dijital pin çıkışı frekansı 8 Mhz kadar destekleyebilir. 16 Bit ses sinyali işlemek için bir yöntem olması gerek yoksa bir işe yaramaz tabiki en azından ses üzerinden örnek verdiysem de sinyalin 4.4 Khz ile sınırlı kalmaması gerek.

74HC'nin datasheet incelemesinde giriş ile çıkış arasındaki zaman aşımı 1us yani 1 Mhz hızına kadar çalışabiliyor.  Buda bir ses frekansı işlemek için çok çok yeterli. Hatta bir video sinyali bile işleyebiliriz.!!

Çözüm: SPI Donanımı ile haberleşmek

Diğer çoğu d/a entegrelerinde olduğu gibi donanım yüksek frekansta haberleştiği için bant genişliği yeterli. 

Arduino forum sayfasında 74x595 için digitalWrite komutu haricinde maksimum 32 Khz civarı bir hıza ulaşıldığı tartışılmış, bu fonksiyon komutunun dışında bir kod ile sağlanmış shiftOut fonksiyonu da aynı şekilde digitalWrite fonksiyonunu kullanıyor buda hızı sınırlıyor.

f = 1/T 

Ts - Ti = 77.28520 - 77.28280
Ts- Ti = 0.0024 ms 

=  2.4us 
f = 1/2.4us  = 450 Khz

#digitalwrite speed
t = 4.64us 

Sonunda SPI ile 450 Khz haberleşme hızına ulaştım. Müthişşş!!!
16bit Latch Clock, Data dijital port çıkış grafiği

Grafikte en üstteki latch sinyali dijitalWrite komutu yavaş olduğundan spi data gönderme işlemi bittiği halde zaman kaybı yaratıyor az da değil 4.64us o yüzden Arduino kodu dışında farklı bir yöntemle latch yapmamız gerekiyor. Belki Ardinonun frameworkü bu bakımdan tercih edilmeyebilir.. 

Stm32 için özür dileyebilirim bir kaç sigorta ayarı, spi ile sağlam bir iş çıkartabilirmişiz. Cortex M ile awr ailesi tartışmamalı.. :)

  digitalWrite(pin_latch, LOW);
  SPI.transfer16(val); 
  digitalWrite(pin_latch, HIGH);


Final: Çıkışa LPF Ekleyelim 

Sonuca ulaştığımıza göre gözle göremeyecek kadar küçük bir sinyal olmasına karşın eğer çıkış frekansımız belli ise de çıkışta bir LPF kullanabiliriz neden olmasın. Genelde aktif LPF kulladığımdan bu projede de bir opamp olmasından dolayı sadece 1 kondasatör bu işi çözebilir mi ? evet bence çözebilir.. 

        
Aktif LPF Op-amp 


1/2πR37C1 frekans hesabı ile 500 Hz altıdaki sinyale 47nF kondasatör ekleyelim..




Low Pass Filter eklenmiş sinyal görüntüsü

Bakın bakın sinyalin analog sinyale ne kadar yakınlaştığına bakın ve böylelikle teorik olarak projeyi tamamladık bir sonraki yazıda bu projenin deneyini yapacağım elimdeki osiloskop bu iş için gayet yeterli diyede düşünüyorum.. Teşekkürler.




  • Arduino kodunu aşağıda bulabilirsiniz.
#include <SPI.h>
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))

int pin_latch = 10,
    pin_clock = 13,
    pin_data  = 11;

void setup() {
  // put your setup code here, to run once:
  pinMode(pin_latch ,OUTPUT);
  pinMode(pin_clock, OUTPUT);
  pinMode(pin_data, OUTPUT);
  
  //SPI.setClockDivider(SPI_CLOCK_DIV2);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.begin();

  
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i< 65536; i=i+1){
    shift_out(i);
    delay(1);
  }
}

void shift_out(int val){
   /*digitalWrite(pin_latch, LOW);
   shiftOut(pin_data, pin_clock, MSBFIRST, val>>8);
   shiftOut(pin_data, pin_clock, MSBFIRST, val);
   digitalWrite(pin_latch, HIGH);*/


  //digitalWrite(pin_latch, LOW);
  cbi(PORTB, 2);
  SPI.transfer16(val); 
  sbi(PORTB, 2);
  //digitalWrite(pin_latch, HIGH);
   
}

Deney yazım yakında..


Referanslar

https://www.youtube.com/watch?v=gYmY3izes8g
http://ee.tek.firat.edu.tr/sites/ee.tek.firat.edu.tr/files/LJ1B5_%20ADC_DAC_2.pdf