Bilgisayarla iletişim için USB kullanmak istiyorsunuz. Çok sayıda mikro denetleyiciniz varsa, büyük olasılıkla mikro denetleyicilerden yalnızca birini doğrudan bilgisayara bağlayacaksınız. Diğer mikrodenetleyicilerin komutlarını ana mikrodenetleyiciden almaları gerekir.
Seçtiğiniz iletişim bir dizi faktöre bağlı olacaktır:
- gerekli bant genişliği (bunları 16MHz'de çalıştırdığınızı varsayacağız)
- karmaşıklık (kablolama ve kodlama)
- iki yönlü veya usta köle
Hemen hemen tüm seçeneklerin AVR mikrodenetleyici üzerinde yerleşik desteği vardır. Ek donanım gerektiren yerleşik seçeneklere göre makul bir şekilde tercih edebileceğiniz bir seçenek yoktur. Yerleşik desteğe sahip oldukları için, yazılım karmaşıklığı benzerdir, sadece bağlantı noktasını yapılandırmanız (kayıtları kullanarak), verileri başka bir kayıt defterine iletmeniz, ardından başka bir kayıt defterinde biraz ayarlayarak iletimi tetiklemenizdir. Alınan tüm veriler başka bir kayıtta bulunur ve işleyebilmeniz için bir kesinti tetiklenir. Hangi seçeneği seçerseniz seçin, tek fark kayıt konumlarındaki değişiklik ve yapılandırma kayıtlarındaki bazı değişikliklerdir.
Bir USART döngüsü aşağıdaki özelliklere sahiptir:
- 90KB / s civarında aktarım hızı olan maksimum CLK / 16 = 1MHz (16MHz saatte) baud hızı
- tamamen çift yönlü iletişim (master veya slave tanımlaması yok)
- her bir mikro denetleyici çifti arasında ayrı kablolar gerektirir - Atmega32u4, pratikte bir ağa bağlayabileceğiniz mikro denetleyici sayısını sınırlandırarak (veya bağlantılı bir listeye bağlı olarak uzun bir mikro denetleyici dizisiyle sonuçlanır) yerel olarak iki USART bağlantı noktasını destekler. tavır)
Not: RS232 iletişimi elde etmek için kullanacağınız şey budur, ancak RS232 10V gerektirdiğinden, bu voltaj seviyelerini almak için bir sürücü gerektirir. Mikrodenetleyiciler arasındaki iletişim için bu yararlı değildir (sadece voltaj seviyeleri değiştirilir).
RS485:
- Esasen, USART portunu farklı bir modda kullanırsınız - bant genişliğinde bir avantaj yoktur ve kablolamayı sadece biraz basitleştirebilir, ancak aynı zamanda karmaşık hale getirir. Bu önerilmez.
İki telli arayüz:
Buna I2C de denir. Bu, tüm cihazların aynı iki kabloyu paylaştığı anlamına gelir.
Her iki kabloda bir çekme direncine ihtiyacınız var
Yavaştır (çünkü çekme dirençlerinin değeri sınırlıdır ve cihaz sayısı arttıkça ve kablo uzunluğu arttıkça kapasitans artar). Bu AVR mikro denetleyici için, hız 400 kHz'e kadar - USART'tan daha yavaş (ancak bu hız kapasitansınızı sınırlamaya bağlıdır). Bunun nedeni, bir cihaz veri telini düşük sürmesine rağmen, ters geçiş, telin tekrar yükselmesini sağlayarak (çekme direnci) gerçekleştirilir.
ALL iletişiminin aynı sınırlı bant genişliğini paylaştığını düşündüğünüzde daha da yavaştır. Tüm iletişim aynı sınırlı bant genişliğini paylaştığından, gönderilmeden önce ağın boşta kalana kadar verilerin beklemesi gereken iletişimde gecikmeler olabilir. Sürekli olarak başka veriler gönderiliyorsa, verilerin gönderilmesini de engelleyebilir.
Bir master-slave protokolüne dayanır, burada master bir slave'e hitap eder, daha sonra bir komut / istek gönderir ve daha sonra slave cevaplar. Bir seferde yalnızca bir cihaz iletişim kurabilir, bu nedenle slave'in master'ın bitmesini beklemesi gerekir.
Herhangi bir cihaz hem master hem de slave olarak hareket edebilir ve bu da onu oldukça esnek hale getirir.
SPI
Mikrodenetleyiciler arasındaki genel iletişim için önerdiğim / kullandığım budur.
Yüksek hız - CLK / 2 = 8MHz'e kadar (16MHz'de CLK için), en hızlı yöntem haline getirir. Bu, sadece saat için ayrı telinden dolayı elde edilebilir.
MOSI, MISO verileri ve SCK saat kabloları tüm ağda paylaşılır, bu da daha basit kablolamaya sahip olduğu anlamına gelir.
Bu bir master-slave biçimidir, ancak herhangi bir cihaz bir master ve / veya slave olabilir. Ancak, slave select komplikasyonları nedeniyle, paylaşılan kablolama için (ağ içinde), onu sadece hiyerarşik bir şekilde kullanmalısınız (iki telli arayüzün aksine). IE. tüm aygıtları bir ağaçta düzenlerseniz, aygıtın yalnızca çocuklarına hakim olması ve yalnızca üst öğesinin köle olması gerekir. Bu, bağımlı modda, bir cihazın her zaman aynı master'a sahip olacağı anlamına gelir. Ayrıca, bunu doğru bir şekilde yapmak için, akış yukarı master'a MISO / MOSI / SCK'ya dirençler eklemeniz gerekir, böylece cihaz aşağı yönde iletişim kurarsa (köle olarak seçilmediğinde) iletişim, diğer bölümlerdeki iletişimleri etkilemez. ağ (dirençleri kullanarak bunu yapabileceğiniz düzeylerin sayısının sınırlı olduğunu unutmayın, her iki SPI bağlantı noktasını kullanarak daha iyi çözüm için aşağıya bakın).
AVR mikrodenetleyici, bağımlı seçildiğinde MOSI sinyalini otomatik olarak üç durumlu hale getirebilir ve bağımlı moduna geçebilir (master ise).
Hiyerarşik bir ağ gerektirse de, çoğu ağ ağaç benzeri bir şekilde organize edilebilir, bu nedenle genellikle önemli bir sınırlama değildir
Yukarıdakiler hafifçe gevşetilebilir, çünkü her AVR mikrodenetleyici iki ayrı SPI portunu destekler, böylece her cihaz iki farklı ağda farklı konumlara sahip olabilir.
Bunu söyledikten sonra, ağacınızda / hiyerarşinizde birçok seviyeye ihtiyacınız varsa (2'den fazla), dirençleri kullanan yukarıdaki çözüm işe yaramayacaktır. Bu durumda, ağacın her katmanı arasındaki SPI ağını değiştirmelisiniz. Bu, her cihazın bir SPI ağındaki çocuklarına ve diğer SPI ağındaki üst öğelerine bağlanacağı anlamına gelir. Her ne kadar yalnızca tek bir bağlantı ağacınız olduğu anlamına gelse de, avantaj, bir cihazın hem çocuklarından biri hem de ebeveyniyle aynı anda iletişim kurabilmesi ve sağlam dirençlere sahip olmamanızdır (doğru değerleri seçmek her zaman zordur) .
Ayrı MOSI ve MISO kabloları olduğundan, hem master hem de slave aynı anda iletişim kurabilir ve bu da hızda iki artış artışı potansiyeli verir. Her ek slave için slave seçimi için ekstra bir pim gereklidir, ancak bu büyük bir yük değildir, 10 farklı slave bile sadece 10 ekstra pim gerektirir, bu da tipik bir AVR mikrodenetleyicisine kolayca yerleştirilebilir.
CAN , belirttiğiniz AVR mikro denetleyici tarafından desteklenmiyor. Başka iyi seçenekler olduğu için, muhtemelen bu durumda önemli değildir.
Öneri SPI'dır , çünkü hızlıdır, kablolama çok karmaşık değildir ve sıkıca yukarı çeken dirençler gerektirmez. SPI'nin ihtiyaçlarınızı tam olarak karşılamadığı nadir durumlarda (muhtemelen daha karmaşık ağlarda), birden fazla seçenek kullanabilirsiniz (örneğin, iki kablolu arabirim ile birlikte her iki SPI bağlantı noktasını kullanın ve bazı mikro denetleyicileri eşleştirin) USART döngüsü kullanarak!)
Sizin durumunuzda, SPI kullanmak, doğal olarak, bilgisayara USB bağlantısı olan mikrodenetleyicinin ana olabileceği anlamına gelir ve ilgili komutları bilgisayardan her bağımlı cihaza iletebilir. Ayrıca her bir slave'den gelen güncellemeleri / ölçümleri okuyabilir ve bunları bilgisayara gönderebilir.
8MHz ve 0.5m kablo uzunluğunda, bunun bir sorun olacağını düşünmüyorum. Ancak öyleyse, kapasitansa daha dikkatli olun (toprak ve sinyal kablolarını çok yakın tutun ve ayrıca farklı iletkenler arasındaki bağlantılara dikkat edin) ve ayrıca sinyal sonlandırma. Olası bir durumda, saat hızını düşürebilirsiniz, ancak gerekli olduğunu düşünmüyorum.