Projem için bir mikrodenetleyici için bir gereksinimler listesi nasıl bulabilirim? Daha sonra uygun mikrodenetleyicileri nasıl bulabilirim?


20

Arduino MEGA2560 üzerinde bir eBike kontrol projesi üzerinde çalışıyorum. Program 3x PID kontrol döngüleri, bir pil kapasitesi kontrol döngüsü (arama tablolarına dayalı enterpolasyon), bir hız göstergesi (kamış anahtarına dayalı örnekler) ve bilgileri görüntülemek için bir LCD ekran çalıştırır. Girişleri 3 analog sinyaldir: akü voltajı, akım ve kullanıcı gaz girişi ve dijital giriş: hız göstergesi (reed anahtarı) açma / kapama sinyali. Şu anda, tüm bunlar "uzun" aritmetik üzerinde çalışırken, Arduino saniyede 10 döngüyü tamamlamayı başarıyor. TFT LCD ekran muazzam miktarda hesaplama gücü aldığından, alfanümerik bir ekranla değiştirmeyi düşünüyorum.

Çıkışlar, bir motor kontrolörüne giden bir analog gaz kelebeği sinyalinden, LCD ekrana ve potansiyel olarak analog sinyaller gerektiren birkaç cihazdan oluşur. Bu nedenle, şu anda bir RC düşük geçiş filtresi ile Arduino PWM çıkışını kullanmama rağmen ADC dönüştürücüler önemlidir ve DAC çok yararlı olacaktır. Benzer şekilde, işlemciyi kesintiye uğratmadan dijital ve analog sinyalleri okuma kapasitesi çok iyi olurdu.

Potansiyel olarak bundan bir tüketici ürünü yapmak istiyorum, bu yüzden kendi platformumu sıfırdan farklı bir mikrodenetleyici ile saniyede en az 100 örnek (Arduino'nun elde ettiği şeyin 10 katı) verebilir. Ayrıca, kayan noktalardan kaçınmak için, hesaplamalarım uzun değişkenler kullanır ve sonuç olarak 16 bit'ten büyük sayılar kullanır, bu yüzden 32bit MCU'nun iyi bir fikir olacağını varsayıyorum. Ayrıca, kayan nokta hesaplamaları yapabilen bir MCU, koddaki matematiği basitleştirmek için ilginç olabilir.

Sonunda, bu gereksinimleri karşılayacak ve Arduino ortamından hızlı bir geçişe izin verecek MCU'ları aramaya nasıl başlayacağımdan emin değilim. Bu tür MCU'ların nasıl bulunacağı konusunda herhangi bir rehberlik çok takdir edilecektir!


1
Mutlaka tavsiye edilen parçalar olmak istemiyorum, sadece ihtiyacım olan platformu nasıl bulacağım konusunda bir yöntem ya da platform ya da herhangi bir rehberlik istiyorum.
Eliott K

5
Bu, önceki sorunuzdan çok daha iyidir, ancak yine de çok geniştir ve gereksinimlerinizdeki bazı noktalar net değildir. Örneğin, "işlemciyi kesmeden" ne demek istiyorsun? Ben de yoklamalı G / Ç yapmak istemediğinizi tahmin ediyorum. Ayrıca, her bir örnek kümesinde tam olarak ne kadar bilgi işlem yapılması gerektiğine ilişkin daha iyi bir başa çıkmanız gerekir.
Dave Tweed

1
Tamsayı matematik kullanmayı düşünmelisiniz. Yapılması gereken doğru şey bu.
Scott Seidman


4
Tamsayı matematik, uzun veya kısa, kayan noktadan çok daha hızlıdır; ve işlemcinin "doğal" bit derinliğinden daha uzun tam sayı matematiği de yavaş olacaktır. 32-bit, çok iyi bir fikir gibi geliyor, belki "DSP" tipi cihazlardan biri.
pjc50

Yanıtlar:


18

(Bu genel bir kılavuzdur. Kod optimizasyonundan da yararlanabileceğinizden şüpheleniyorum, ancak bu web sitesinin kapsamı dışında.)

Adım 1: Kaba boyutlandırma, bütçe, satıcı

Şunlardan birini seçin:

  • Bilgisayar (Raspberry Pi, Beagleboard, PC104 kartı, Intel Edison, vb.). Genel amaçlı bir işletim sistemini başlatır ve çok fazla işlem gücüne sahiptir. Daha pahalı ve güce aç. $ 10- $ 100.

  • Büyük MCU. ARM Cortex-A / PIC32 / dsPIC / AVR32 / TI C serisi DSP vs. İyi bilgi işlem gücü, OS isteğe bağlı. ~ 5 $.

  • Küçük MCU. Korteks-M / PIC16. Gerçek bir işletim sistemi için gerçekten yeterli alan değil, belki sadece hafif bir görev zamanlayıcı. ~ 2 $.

  • Küçük MCU. Sadece gerçekten güç tüketiminin son mikroamperini önemsediğiniz uygulamalar için. ~ 1 $ veya daha az.

Bu aşamada hangi satıcıları ve takım zincirlerini beğendiğinizi ve beğenmediğinizi de düşünmelisiniz. Devre içi hata ayıklama cihazları ve IDE'ler gibi maliyetlere bir göz atın.

2. Adım: Minimum Çevre Birimleri

USB gibi şeylere mi ihtiyacınız var? PCI? HDMI? SATA? Alışılmadık derecede hızlı ADC'ler veya DAC'ler? "Oldukça küçük" veya "küçük" kategorilerin neredeyse tamamı bunlara sahip değildir, ancak USB oldukça yaygın bir şekilde bulunur.

3. Adım: Prototip

Yukarıdaki kriterleri karşılayan bir şey seçin , gerekirse rastgele bir başlangıç ​​yapın, ne kadar uygun olduğunu ve ne kadar alan / işleme gücüne ihtiyacınız olduğunu öğrenin. Bunlardan bazılarını zaten yaptınız. C ile yazmak mantığın çoğunu taşınabilir yapmalıdır.

Prototipi aldıktan sonra kendinize, "Böyle bir şeye ihtiyacım var, ama daha fazla X ile" diyebilir ve kararlarınızı yönlendirmesine izin verebilirsiniz.

4. Adım: Küçült

Bir CPU ailesinin en büyük (en Flash ve RAM) üyesi ile başlamak, uygulamanızın v1'ini yazmak ve daha sonra sığacak daha küçük, daha ucuz bir tane seçmek genellikle daha kolaydır. Yazılımı daha az kaynağa yerleştirme konusunda da zaman harcayabilirsiniz. Değerli olan kaç tane birim yapacağınıza bağlıdır.


14
Adım 0: Takım zinciri (bellenim geliştirme ortamı). Sizin için çalışabileceğiniz geliştirme ortamlarını bulun. Burası kazanıldığı veya kaybolduğu yerdir. Mükemmel uyum sağlayan bir silikonunuz olsa da, ürün yazılımı geliştirme ortamını çalıştıramazsanız (herhangi bir nedenle), projeniz yerden kalkmaz. (Burada örnek: Arduino IDE, Arduino tabanlı prototipinizi yerden
kaldırmıştır

8
Cortex-M'yi "Küçük MCU" ve PIC32 / AVR32'yi "Büyük MCU" lar olarak sınıflandırmak biraz talihsiz görünüyor. Kişisel olarak PIC32 / AVR32 kullanmadım, ancak teknik özelliklere hızlı bir bakışta dayanarak, hepsinin aynı parantez içinde olması gerektiğini söyleyebilirim. (> 200MHz'de çalışan, birçok megabayt flaş ve yarım megabayttan fazla RAM'e sahip olan Cortex-M
MCU'lar vardır

13

Güzel bir proje. İşte birkaç ipucu, ancak bunu her proje için genelleştirmek zor olacaktır.

Hesaplama gereksinimleriyle başlayın

Bu, ne tür bir çekirdeğe ihtiyacınız olduğunu ve MCU'nun genel performanslarını size söyleyecektir. Bununla başlamanızı öneririm, çünkü çevre birimlerinin aksine harici bileşenler kullanılarak genişletilemez.

İlk olarak, döngü içinde büyük tamsayılarla ağır matematiksel işlemler kullandığınız anlaşılıyor. Bu nedenle, önerdiğiniz gibi, 32 bit burada yararlı olacaktır, bu nedenle ARM ideal bir aday olarak gelir. Çalışma sıklığına gelince: şu anda bir Arduino MEGA2560 kullanıyorsunuz (16MHz'de çalışıyor, sanırım) ve 10 döngü / s yapabilirsiniz. 100 döngü / s elde etmek istiyorsanız, 100MHz veya daha fazla bir Cortex-M3 / M4 ile iyi olmalısınız (kaba tahmin). Cortex-M4F'nin bir kayan nokta birimine sahip olduğunu unutmayın.

Seçimi zaten daralttık.

Bellek gereksinimleri

Bu kolaydır: prototip için aralığının en fazla RAM / Flash'ına sahip MCU'yu seçin. Prototipi doğruladıktan sonra, tam gereksinimlerinizi bildiğiniz için, yeterli RAM / Flash'a sahip olan aynı aralıktan MCU'ya geçin.

Uygulamanızın inanılmaz miktarda belleğe ihtiyacı olmadığını düşünüyorum.

Şimdi, çevre birimleri

Kesinlikle biraz ADC'ye ihtiyacınız var. İncelediğimiz aralıktaki tüm MCU'ların bir kısmı var, bu yüzden yararlı bir kriter değil. Dijital giriş / çıkışlar da çok fazla değildir (çok fazla sayıda ihtiyacınız olması dışında (sizin durumunuz gibi görünmüyor).

DAC'a ihtiyacınız var gibi görünüyor. Ancak, bu aslında kolayca bulamayacağınız ve adayları çok fazla daraltacağınız bir şeydir. Yani bu şartı tutmuyoruz ve bir PWM ve lowpass (kesinlikle kabul edilebilir) ile kalacağız.

LCD dışında herhangi bir iletişim arabiriminden bahsetmezsiniz (daha sonra). Her neyse, tüm MCU'larda I2C / SPI / UART / ... var.

LCD

Bu daha zor, çünkü MCU'ya tamamen farklı gereksinimleri koyan birçok farklı çözüm var. Ancak MCU'ya bağlı olarak LCD'yi seçmeyin. Ürününüz için istediğiniz LCD'yi seçin ve ardından verimli bir şekilde çalıştıracak MCU'yu seçin.

  • Bir karakter LCD'si istiyorsanız: MCU için en kolay ve en az kısıtlayıcı, bazı seri arabirimler (genellikle SPI) aracılığıyla onunla konuşmaktır. Bu şekilde çok fazla PIN kullanmaz, daha küçük / daha ucuz MCU'lar kullanabilirsiniz ve hız bir sorun değildir.
  • Grafik TFT LCD istiyorsanız: küçükse, seri bağlantı hala uygun olabilir. Bununla birlikte, 320x200 veya daha büyük sürümler için ve hoş bir grafik arayüze sahip olmak istiyorsanız, paralel arayüzle iletişim kurmak isteyeceksiniz. Bu durumda, ya bir GPIO kullanırsınız (ancak MCU'ya daha fazla yük katar, çünkü kontrol hatlarını bitirmek zorunda kalacaksınız) ya da özel bir LCD arayüzü olan (genellikle aynı harici bellek arayüzü). Bu sonuncusu MCU seçiminde güçlü bir kısıtlama getiriyor, ancak başka güçlü kısıtlamalarınız yok, bu yüzden ...

Şimdi sen seç

ST Micro / NXP / Atmel web sitesine gidin ve MCU seçim araçlarını kullanın. Veri sayfalarını okumak için de çok zaman harcayacaksınız. Bu zamanı al. Boşa gitmiyor. Burada öğreneceğiniz her şey, özellikle bu proje için kullanmasanız bile, yararlı olabilir.

Bu noktada, gerçekten ihtiyacınız olan PIN sayısına da bakmanız ve ihtiyacınız olan tüm PIN işlevlerini kullanabileceğinizi doğrulamak için seçilen MCU adaylarının çoğullama şemasını kontrol etmeniz gerekir. Çünkü açıkçası, MCU'ları gereksinimlerinizi karşılayan en düşük sayıda pime sahip olmak isteyeceksiniz (maliyet / PCB gayrimenkul nedenleriyle).

Fiyat / fiyat ve Mouser / Digikey Ama burada özellikle pahalı bir şeye ihtiyacınız yok. Belki 5 € ya da öylesine.

LCD kontrolü ile ilgili son şey

LCD'nin güncellenmesi ana döngünüzün bir parçası gibi görünüyor. Olmamalı. Özellikle saniyede 100 kez dönüyorsanız, işe yaramaz. Kontrol döngüsünü her şeyi hesaplayın ve her yinelemede motor komutunu ayarlayın, ancak değerleri bellekte bir yerde görüntülenecek şekilde güncelleyin. Ardından, daha önemli bir şey olmadığında, daha düşük önceliğe sahip başka bir döngü bu bilgileri kullanıcıya gösterir.

Evet, ideal olarak, görev değiştirme ve benzeri şeyler gerektirir. Gerçek bir işletim sistemi, aslında (FreeRTOS, Coocox OS, Nuttx, ... aramaları çok küçüktür, büyük ölçüde Cortex-M'de kullanılır ve gerekli çoklu görev mekanizmalarını sağlar).


Kapsamlı cevabınız için çok teşekkür ederim! ARM Cortex MCU'ların hepsinin 3.3V'da çalıştığını fark ediyorum. Gaz kelebeği sinyalimin 1 ile 5V arasında ölçeklenmesi gerekiyor. Bir ARM kontrol cihazı kullanmak istersem MCU'dan 3.3V'da kapatılacağı için voltajı yükseltmenin bir yolunu bulmam gerektiğini tahmin ediyorum.
Eliott W

Evet. Gaz kelebeği sinyali analog çıkış, değil mi? Bu durumda yükseltmek için bir opamp kullanabilirsiniz.
dim

"Gerçek bir işletim sistemi" istemekle ilgili son cümleyi kabul ettiğimden emin değilim. Sanırım ne kadar hazır çözüm istediğinize bağlı. Sadece iş mantığınıza düşüp birimleri vurmaya başlayabileceğiniz bir şey istiyorsanız, evet, tam gelişmiş bir işletim sistemi (bunun Windows veya hatta Linux gibi bir şey anlamına gelmediğine dikkat edin!) Kesinlikle yararlıdır.
CVn

1
@ MichaelKjörling, elbette Linux gibi uzaktan bile bir şey demek istemedim. Ama daha çok örneğin FreeRTOS, Coocox OS veya Nuttx gibi bir şey. Bunlar çok küçük olmasına rağmen gerçek işletim sistemi olarak değerlendirdiğim şeyler . Bunu yazdım çünkü gerçekten, bunu çıplak metal üzerinde yapmak daha fazla zaman alacak, hata ayıklamak için bir acı olacak ve daha az esnek olacak. Ve Arduino ortamı (bu konuda bir uzmandan uzak olmama rağmen) görev mekanizmaları sağlamıyor gibi görünüyor (ve bu yüzden bunu gerçek bir işletim sistemi olarak görmüyorum ).
dim

1
Ah. O zaman "gerçek" kısmı yanlış okudum. Sadece zaman zaman buraya gelen yabancıların yararı için, cevabınızda bu kısmı açıklığa kavuşturmak isteyebilirsiniz.
CVn

4

Bunun, çoklu (öznel) yaklaşımlar kullanılarak doğru bir şekilde cevaplanabilecek geniş bir konu olduğuna dikkat edin.

Ayrıca, stackexchange biçimi sorunlara çözüm tasarlamada iyi değildir. Örneğin, nadiren insanların sizin için donanım tasarlamalarını sağlayabilirsiniz. Aksine bir donanım tasarımı önerir ve bu konuda sorular sorarsınız.

Bahsedilen...

Değiştiremediğiniz işlemcinin özellikleriyle başlayın. Hız ve bellek (varsa) boyutu gibi. Kesmelere ihtiyacınız olup olmadığını ve kesme işleminin ne kadar karmaşık olması gerektiğini araştırın.

ADC veya DAC gibi çevresel desteğe ihtiyacınız varsa, durum daha karmaşıktır. Bu özellikler işlemcinin içine yerleştirilmiş veya işlemciden harici olmalıdır. Fiyat, doğruluk ve hatta gürültü bu kararın faktörleridir.

Harici çevre birimleri desteklenecekse, gerekli olan seri iletişim türünü göz önünde bulundurun. Harici donanım SPI, I2C veya başka bir UART tipine ihtiyaç duyabilir. Veri hızı yüksekse, seri iletişim portlarıyla ilişkili DMA özelliklerine sahip bir işlemci bulmak en iyisi olabilir.

Son olarak, bu gömülü bir işlemci uygulamasıysa (normalde bir göreve ayrılmış bir işlemci anlamına gelir), gereksinimleri birkaç gruba ayırmayı ve her birine bir işlemci atamayı düşünün. Örneğin, bir GUI görüntü işlemcisi muhtemelen bir ADC özelliğine ihtiyaç duymaz. Sorunları çözmeye yönelik bu nesnel yaklaşımın yazılımda başarılı olduğu kanıtlanmıştır ve işlemci fiyatlarının düşürülmesi de donanıma uygulanabilir.

Gerçek dünyada bu yaklaşım yinelemelidir. Yani, birçok proje bir işlemci ile başlar ve donanım ve / veya yazılım sorunları ortaya çıktığında veya projenin kapsamı değiştikçe farklı işlemcileri değiştirir.


Ne tür sayıların beklendiğini derleyiciden daha iyi değerlendirirsin. Şamandıra kullanma genel yaklaşımından kaçınırım. Örneğin, float sonuçları farklı platformlarda aynı olmayabilir! Tamsayı aritmetik kullanır ve çözümü ihtiyaçlarınıza göre uyarlarım.
st2000

3

Kimsenin araç maliyetinden bahsettiğini görmedim. Şirketim bir TI CC2541 seçti ve sadece bir 4k $ IAR derleyici ile derledi, kesinlikle bir hobi için bir gösteri tıpa. Ayrıca programcı. 20 $ veya daha fazla olabilir. Daha ucuz araçlar artık daha fazla norm gibi görünüyor, bu yüzden bu yakında geçmişte kalacak.

Ayrıca, kendiniz yeniden düzenlerseniz, TQFP gibi paketler, örneğin BGA'dan daha kolaydır. Kişisel deneyime dayanarak büyük bir BGA'nın doğru şekilde elde edilmesi zordur.


2

Ürün nispeten fiyat açısından hassassa ve iyi bir geliştirme fonuna sahipseniz, bir fikir değerlendirme panosu tedarik edebilir ve bir fikir edinmek için her birinin kodunu profilleyebilirsiniz. Kodunuz taşınabilir C ile yazılmışsa, bu oldukça basit olmalıdır. Mikro dışında, IAR veya Keil gibi tam gelişmiş bir IDE'nin maliyetini ortadan kaldırmadan önce demo sürümlü araç zincirlerini değerlendireceksiniz. Bazı durumlarda, darboğaz kodunu donanım olmadan doğrudan IDE'de profil oluşturabilirsiniz.

Geliştirme maliyetiyle sıkı bir şekilde kısıtlanmışsanız, geliştirme kurulumu için çok pahalı olmayan bir şey bulmaktan ödün vermeniz gerekebilir.

Örneğin, ST'nin güzel bir renkli gösterimi <100 $ olan bir ARM Cortex M7 değerlendirme kartı var. DSP özellikli bir FPU'ya sahiptir, böylece kolayca konuştuğunuz her şeyi yapabilirsiniz - muhtemelen sadece 100Hz yerine 100kHZ'de bir PID döngüsü çalıştırın. Bu ekran bir öncelik olmadığı sürece büyük olasılıkla aşırıya kaçacaktır.

FPU'suz daha ucuz bir işlemci hedefliyorsanız, muhtemelen PID kodunu bitmiş formda profillemek istersiniz. Tüm ölçekleme ve doğrusallaştırma ve kalibrasyon faktörlerinin dahil edildiğinden emin olun, çünkü işlem süresi açısından eklenebilirler.

Genellikle çevre birimleri ve ilgili ara katman kalitesi ve kullanılabilirliği (ve lisans koşulları) seçiminizi güçlü bir şekilde etkiler. Başparmak sürücüsünde veya hızlı bir SD arayüzünde depolamak için BT veya Wifi veya USB ana bilgisayar moduna ve FAT dosyalarına ihtiyacınız varsa, bunların hepsi önemli faktörler olacaktır. Bazı yongalarda, nispeten ucuz bir TFT panelin kullanılmasına izin verebilen yerleşik bir LCD denetleyici ve sayısallaştırıcı denetleyici bulunur. Bazen yüksek lisans ücretlerini göz ardı etmeyin.

Gerekli program belleği, işlem hızı ve çevre birimleri hakkında bir fikriniz varsa (buna FPU ekleyin) veri sayfalarına gitmeden önce distribütörde parametrik arama yapabilirsiniz. Çok kısıtlayıcı olan bazı şeyler olabilir - delikli paket, dahili DAC, dahili Ethernet PHY, FPU. Bunların hiçbiri muhtemelen gerekli değildir ve seçimlerinizi zamanından önce kısıtlayabilir.

İyi şanslar, bunu düzgün yapmak çok iş. Deneyimlerime göre, yeni bir ürüne çok yakın kesmek yanlış bir ekonomidir, çünkü müşteriler (ler) kaçınılmaz olarak beklemediğiniz şeyleri soracak ve baştan başlamadan tedarik etmek için bir miktar yedek kapasiteye sahip olmak isteyeceksiniz. Öte yandan, ürün çok pahalıysa, işi sürdürmek için yeterli marjlarda satış yapamazsınız.


1

Arduinos, PIC mikrodenetleyicileri, FPGA'lar ve çok daha fazlası gibi bakmaya başlayabileceğiniz birden fazla farklı platform var. Geçmişte Arduinos ile çalıştım ve 74kS / s'ye ulaşabilen bir ADC limanı var. Saniyede 100 numune son derece yavaş ve bunu nasıl bulduğunuzu merak ediyorum. Öte yandan, kendinize SPI, CAN, I2C veya UART gibi herhangi bir arabirime ihtiyacınız olup olmadığını sormak istersiniz. Hepsinin kendi faydaları olabilir ve bir veya daha fazla köleyle konuşup konuşmayacağınızı kendiniz düşünebilirsiniz. Son fakat muhtemelen en önemli adım, mikrodenetleyicide kaç tane pim kullanmanız gerektiğini tahmin etmektir.

"İşlemciyi kesmeden analog-dijital sinyalleri okuma kapasitesi çok iyi olurdu." Verilerinizi dolaştıracak ve potansiyel olarak veri işlemenizi yavaşlatacak harici veya dahili arabelleklerle uğraşmak istemediğinizi söyleyerek vahşi bir tahmin yapabilirim. Bu doğru mu? Öyleyse, bu sizin için daha fazla programlamadır, ancak işlemciler genellikle saniyede 100 örneğin hızını işleme kapasitesine sahiptir. Saati, örnekleme hızını ve geri kalanını programlamak size kalmış.

Ayrıca, örnekleme verilerini sürekli olarak tutmak ve bir bayrak kaldırıldığında diğer görevleri gerçekleştirmek istiyorsanız programınızdaki kesintileri göz önünde bulundurun.


2
Sanırım bu noktayı kaçırdınız. Arduino üzerine kurulu bir prototipi var. Örnekleme yavaş değildir. Kontrol döngüleri yavaştır. Arduino'da kayan nokta kullanılarak hesaplanan üç PID kontrolörü var, bu yüzden antarktika kış aylarında pekmezden daha yavaşlar. Yani, örnekleme problem değil. Verimsiz kod.
JRE

Bu konuda haklısın.
12Lappie

Evet, sorun, döngülerimin uzun aritmetik olmasına ve kayan noktalara sahip olmamasına rağmen, Arduino'nun döngü başına bir örnek aldığı için örnek oranımın çok küçük olduğu (şu anda saniyede 20 örnek) yapılması gereken çok fazla hesaplama var. .
Eliott W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.