私のプロジェクトのマイクロコントローラーの要件のリストをどのように考え出すのですか?どうすれば適合するマイクロコントローラーを見つけることができますか?


20

Arduino MEGA2560でeBike制御プロジェクトに取り組んでいます。このプログラムは、3つのPID制御ループ、1つのバッテリー容量制御ループ(ルックアップテーブルに基づく補間)、速度計(リードスイッチに基づくサンプル)、および情報を表示するLCD画面を実行します。その入力は3つのアナログ信号です:バッテリー電圧、電流、ユーザースロットル入力、およびデジタル入力:速度計(リードスイッチ)オン/オフ信号。現在、これらすべてが「長い」演算で実行されているため、Arduinoは1秒あたり10ループを完了することができます。TFT LCDスクリーンは非常に多くの計算能力を必要とするため、英数字スクリーンに置き換えることを考えています。

出力は、モーターコントローラーへのアナログスロットル信号、LCD画面、および場合によってはアナログ信号を必要とする他のいくつかのデバイスで構成されます。したがって、ADCコンバーターは不可欠であり、現在RCローパスフィルターでArduino PWM出力を使用していますが、DACは非常に便利です。同様に、プロセッサを中断することなくデジタルおよびアナログ信号を読み取る能力は素晴らしいでしょう。

私は潜在的にこれから消費者向け製品を作りたいと思っています。したがって、毎秒少なくとも100サンプル(Arduinoが達成しているものの10倍)を与えることができる別のマイクロコントローラーでゼロから独自のプラットフォームを構築したいと思います。また、浮動小数点を回避するために、私の計算では長い変数を使用し、結果として16ビットより大きい数値を使用するため、32ビットMCUを使用することをお勧めします。また、浮動小数点計算を実行できるMCUは、コード内の数学を単純化するために興味深い場合があります。

最終的に、これらの要件を満たし、Arduino環境からの迅速な移行を可能にするMCUを探し始める方法がわかりません。そのようなMCUを見つける方法についてのガイダンスは大歓迎です!


1
私は必ずしも推奨部品になりたくはありませんが、方法やプラットフォーム、または必要なプラットフォームを見つける方法に関するガイダンスにすぎません。
エリオットW

5
これは前の質問よりもはるかに優れていますが、それでも非常に広範であり、要件のいくつかの点が明確ではありません。たとえば、「プロセッサを中断することなく」とはどういう意味ですか?ポーリングI / Oも実行したくないと思います。また、サンプルの各セットで実行する必要がある計算量を正確に把握する必要があります。
デイブツイード

1
整数演算の使用を検討する必要があります。それは正しいことです。
スコットサイドマン


4
整数演算(長整数型または短整数型)は、浮動小数点よりもはるかに高速です。また、プロセッサの「ネイティブ」ビット深度よりも長い整数演算も遅くなります。したがって、32ビットは非常に良いアイデアのように聞こえます。おそらく「DSP」タイプのデバイスの1つでしょう。
pjc50

回答:


18

(これは一般的なガイドです。コードの最適化の恩恵も受けられると思いますが、それはこのWebサイトの範囲外です。)

ステップ1:大まかなサイジング、予算、ベンダー

次のいずれかを選択します。

  • コンピューター(Raspberry Pi、Beagleboard、PC104ボード、Intel Edisonなど)。汎用オペレーティングシステムを起動し、大量の処理能力を備えています。より高価で電力を消費します。10〜100ドル。

  • 大型MCU。ARM Cortex-A / PIC32 / dsPIC / AVR32 / TI CシリーズDSPなど。適切な計算能力、OSはオプション。〜5ドル。

  • 小型MCU。Cortex-M / PIC16。本当のOSには十分なスペースがありません。たぶん、単なる軽量のタスクスケジューラです。〜$ 2。

  • 小さなMCU。本当に最後のマイクロアンペアの消費電力を気にするアプリケーションにのみ。〜$ 1以下。

また、この段階で、どのベンダーとツールチェーンが好きか嫌いかを検討する必要があります。インサーキットデバッグデバイスやIDEなどのコストをご覧ください。

ステップ2:最小周辺機器

USBのようなものが必要ですか?PCI?HDMI?SATA?異常に高速なADCまたはDACですか?USBはかなり広く利用可能ですが、ほとんどすべての「小さな」または「小さな」カテゴリにはこれらがありません。

ステップ3:プロトタイプ

上記の基準を満たすものを選択し、必要に応じてランダムに開始し、それがどの程度実現可能か、必要なスペース/処理能力を調べます。あなたはすでにこれのいくつかをしました。Cで記述すると、ロジックの多くが移植可能になります。

プロトタイプができたら、「このようなものが必要ですが、Xがもっと必要です」と自分自身に言って、それがあなたの決定を導くようにします。

ステップ4:縮小

一般に、CPUファミリの最大(ほとんどのフラッシュとRAM)のメンバーから開始し、アプリケーションのv1を作成してから、小さくて安価なものを選択する方が簡単です。また、ソフトウェアをより少ないリソースに収める技術に時間を費やすこともできます。価値のあるものは、何個のユニットを作成するかによって異なります。


14
ステップ0:ツールチェーン(ファームウェア開発環境)。 あなたのために働くことができる開発環境を見つけてください。これが勝ち負けです。完全にフィットするシリコンを使用していても、ファームウェア開発環境を(何らかの理由で)機能させることができない場合でも、プロジェクトは着手できません。(適切な事例:Arduino IDEはArduinoベースのプロトタイプを開発しました。)
ニックアレクセエフ

8
Cortex-Mを「小型MCU」として、PIC32 / AVR32を「大型MCU」として分類するのは少し残念なようです。私は個人的にPIC32 / AVR32を使用したことはありませんが、仕様の範囲をひと目見れば、それらはすべて同じブラケット内にあるべきだと思います。(> 200MHzで動作し、多くのメガバイトのフラッシュと0.5メガバイト以上のRAMを搭載したCortex-M MCUがあります)
Aleksi Torhamo

13

素敵なプロジェクト。ここにいくつかのヒントがありますが、すべてのプロジェクトでこれを一般化するのは難しいでしょう。

計算要件から始めます

これにより、必要なコアの種類とMCUの一般的なパフォーマンスがわかります。周辺機器とは異なり、明らかに外部コンポーネントを使用して拡張することはできないため、これから始めることをお勧めします。

まず、ループ内で大きな整数を使用する重い数学演算を使用しているようです。したがって、あなたが提案したように、ここでは32ビットが有用であるため、ARMは理想的な候補となります。動作周波数については、現在、Arduino MEGA2560(16MHzで動作していると思われます)を使用しており、10ループ/秒を作成できます。100ループ/秒を達成したい場合は、100MHz以上の範囲のCortex-M3 / M4で十分です(概算)。Cortex-M4Fには浮動小数点ユニットがあることに注意してください。

すでに選択範囲を絞り込んでいます。

メモリ要件

これは簡単です。プロトタイプ用にその範囲の中で最も多くのRAM /フラッシュを持っているMCUを選択してください。プロトタイプを検証したら、正確な要件がわかったので、十分なRAM /フラッシュがある同じ範囲からMCUに切り替えます。

アプリケーションが驚くほどのメモリを必要とするわけではないことに注意してください。

今、周辺機器

絶対にADCが必要です。検討している範囲のすべてのMCUにはいくつかのMCUがあるため、有用な基準ではありません。非常に多数のデジタル入出力が必要な場合を除いて、デジタル入出力もありません(これはあなたのケースではないようです)。

DACが必要なようです。ただし、これは実際には簡単に見つけることができないものであり、候補を絞り込みすぎます。そのため、この要件を維持せず、PWMとローパス(実際には確かに許容されます)のままにします。

LCD(後で説明します)以外の通信インターフェースについては言及しません。とにかく、すべてのMCUにはI2C / SPI / UART /があります(必要な場合)。

液晶

MCUにはまったく異なる要件を課すさまざまなソリューションがあるため、これは扱いにくいものです。ただし、MCUによってはLCDを選択しないでください。製品に必要なLCDを選択し、それを効率的に駆動するMCUを選択します。

  • キャラクターLCDが必要な場合:MCUの最も簡単で制約の少ないLCDは、シリアルインターフェイス(多くの場合SPI)を介して対話することです。この方法では、あまり多くのPINを使用せず、より小型/安価なMCUを使用でき、速度は問題になりません。
  • グラフィックTFT LCDが必要な場合:小さい場合でも、シリアルリンクは適切です。ただし、320x200以上の場合、優れたグラフィカルインターフェイスが必要な場合は、パラレルインターフェイスとの通信を開始します。この場合、何らかのGPIOを使用します(ただし、制御線を少し強打する必要があるため、MCUにより多くの負荷がかかります)か、専用のLCDインターフェイスを備えたMCUを選択します(多くの場合、外部メモリインターフェイス)。この最後のものは、MCUの選択に強い制約を課しますが、他の強い制約はないので...

今、あなたは選ぶ

ST Micro / NXP / Atmel Webサイトにアクセスし、MCU選択ツールを使用します。データシートの読み取りにも多くの時間を費やします。この時間を取ります。無駄ではありません。ここで学習することは、たとえこのプロジェクト専用に使用しなくても有用です。

この時点で、実際に必要なPINの数を確認し、選択したMCU候補の多重化スキームを確認して、必要なすべてのPIN機能を使用できることを確認する必要があります。明らかに、要件を満たすピンの数が最も少ないMCUを使用することをお勧めします(コスト/ PCBの理由により)。

Mouser / Digikeyの価格/可用性を確認してください。ただし、ここで特に高価なものは必要ありません。たぶん5€かそこら。

LCDコントロールに関する最後のこと

LCDの更新はメインループの一部であるようです。すべきではありません。特に、1秒間に100回ループしている場合は役に立ちません。制御ループですべてを計算し、各反復でモーターコマンドを調整しますが、値を更新してメモリのどこかに表示するだけです。次に、優先度の低い別のループで、これ以上重要なことはないときにこの情報をユーザーに表示します。

理想的には、いくつかのタスクの切り替えなどが必要です。実際のOS(実際には、FreeRTOS、Coocox OS、Nuttxなどを検索します。これらは非常に小さく、主にCortex-Mで使用され、必要なマルチタスクメカニズムを提供します)。


包括的な回答をありがとうございました!ARM Cortex MCUはすべて3.3Vで機能することに気付きました。スロットル信号は1〜5Vの範囲でスケーリングする必要があります。ARMコントローラーを使用する場合、MCUから3.3Vで上限が設定されるため、電圧を上げる方法を見つける必要があると思いますか?
エリオットW

はい。スロットル信号はアナログ出力ですよね?その場合、オペアンプを使用して増幅できます。
薄暗い

「本当のOS」を要求することに関する最後の文に同意するかどうかはわかりません。私はそれがあなたが望む既製のソリューションの点でどれくらいに依存すると思います。ビジネスロジックを落とし込んでユニットを打ち破ることができるものが必要な場合は、はい、本格的なOS(これはWindowsやLinuxのようなものを意味する必要はないことに注意してください!)
CVn

1
@MichaelKjörlingはもちろん、Linuxのようにリモートでも何かを意味していませんでした。むしろ、例えばFreeRTOS、Coocox OS、Nuttxなどです。これらは非常に小さなものですが、実際の OS と考えています。確かに、ベアメタルでこれを行うには時間がかかり、デバッグするのに苦労し、柔軟性が低下するためです。そして、Arduino環境(私はこれに関する専門家とは程遠いですが)は、タスクメカニズムを提供していないようです(したがって、私はそれを実際の OS とは考えていません)。
薄暗い

1
あ。それでは、「本当の」部分を誤解しています。時折ここにたどり着くアウトランダーの利益のために、あなたは答えのその部分を明確にすることを検討したいかもしれません。
CVn

4

これは幅広い主題であり、複数の(主観的な)アプローチを使用して正しく回答できることに注意してください。

また、stackexchange形式は問題の解決策を設計するのが得意ではありません。たとえば、ハードウェアを設計するために人々を獲得することはめったにありません。むしろ、ハードウェア設計を提案し、それについて質問します。

とはいえ...

変更できないプロセッサの機能から始めます。速度やメモリ(該当する場合)サイズなど。割り込みが必要かどうか、および割り込み処理の複雑さを調査します。

ADCやDACなどの周辺機器のサポートが必要な場合、状況はより複雑です。これらの機能をプロセッサに組み込むか、プロセッサの外部に配置する必要があります。価格、精度、さらにはノイズもこの決定の要因です。

外部周辺機器をサポートする場合は、必要なシリアル通信の種類を検討してください。外部ハードウェアには、SPI、I2C、またはその他のタイプのUARTが必要になる場合があります。データレートが高い場合は、シリアル通信ポートに関連付けられたDMA機能を備えたプロセッサを見つけるのが最善かもしれません。

最後に、これが組み込みプロセッサアプリケーション(通常はタスク専用のプロセッサを意味する)である場合、要件をいくつかのグループに分割し、それぞれにプロセッサを割り当てることを検討してください。たとえば、GUIディスプレイプロセッサはADC機能を必要としません。問題を解決するためのこの客観的なアプローチは、ソフトウェアで成功していることが証明されており、プロセッサの価格を下げることで、ハードウェアにも適用できます。

現実の世界では、このアプローチは反復的です。つまり、多くのプロジェクトは1つのプロセッサから始まり、ハードウェアやソフトウェアの問題が発生したり、プロジェクトの範囲が変わったりすると、異なるプロセッサを交換します。


コンパイラーよりも、予想される数値のタイプを判断する方が適切です。私はフロートを使用する一般的なアプローチを避けます。たとえば、フロートの結果は異なるプラットフォーム間で同じではない可能性があります!整数演算を使用して、ニーズに合わせてソリューションを調整します。
st2000

3

ツールのコストに言及する人は誰もいませんでした。私の会社はTI CC2541を選択し、それが$ 4k IARコンパイラーのみでコンパイルされていることを発見しました。プログラマーも。20ドル以上になる場合があります。安価なツールは今や標準になっているように見えるので、多分これはすぐに過去のものになるでしょう。

また、自分でリフローする場合、TQFPなどのパッケージは、たとえばBGAよりも簡単です。個人の経験からすると、大きなBGAを正しく取得するのは困難です。


2

製品が比較的価格に敏感で、まともな開発資金がある場合は、評価ボードをたくさん調達し、それぞれのコードをプロファイリングしてアイデアを得ることができます。コードが移植可能なCで記述されている場合、それはかなり簡単です。マイクロ以外は、IARやKeilなどの本格的なIDEのコストを削減する前に、デモバージョンでツールチェーンを評価します。場合によっては、ハードウェアなしでIDEで直接ボトルネックコードをプロファイルできます。

開発コストが厳しく制限されている場合は、開発セットアップにそれほど費用がかからないものを見つけるために妥協する必要があります。

たとえば、STには、100ドル未満の素敵なカラーディスプレイを備えたARM Cortex M7評価ボードがあります。DSP機能を備えたFPUを搭載しているので、簡単に話したことは何でもできます。おそらく、100Hzではなく100kHZでPIDループを実行してください。その表示が優先事項でない限り、おそらく過剰です。

FPUのない安価なプロセッサを目指している場合、おそらく完成したフォームでPIDコードをプロファイルする必要があります。すべてのスケーリングと線形化、およびキャリブレーション係数が含まれていることを確認してください。これらの係数は処理時間の観点から加算される可能性があります。

多くの場合、周辺機器と関連するミドルウェアの品質と可用性(およびライセンス条件)は、選択に大きく影響します。サムドライブまたは高速SDインターフェイスに保存するためにBTまたはWifiまたはUSBホストモードとFATファイルが必要な場合、これらはすべて重要な要素になります。一部のチップには、比較的安価なTFTパネルを使用できるオンボードLCDコントローラーとデジタイザーコントローラーがあります。時々高いライセンス料を見落とさないでください。

必要なプログラムメモリ、処理速度、および周辺機器(この中にFPUを含む)について何らかの考えがある場合は、データシートにドリルダウンする前にディストリビューターでパラメトリック検索を実行できます。制約が厳しすぎるものには、スルーホールパッケージ、内部DAC、内部イーサネットPHY、FPUなどがあります。これらはどれもおそらく必要ではなく、あなたの選択を時期尚早に制約するかもしれません。

幸運を祈ります。これを適切に行うのは大変な作業です。私の経験では、新製品に近づきすぎるのは間違った経済です。なぜなら、顧客はあなたが予期していなかったものを必然的に求めてくるからです。一方、製品の価格が高すぎると、ビジネスを維持するのに十分なマージンで十分な販売ができなくなります。


1

Arduinos、PICマイクロコントローラー、FPGAなど、さまざまなプラットフォームがあります。私は過去にArduinosで働いていましたが、74kS / sを達成できるADCポートを備えています。1秒あたり100サンプルは非常に遅いので、どうやってそれを見つけたのでしょうか?一方、SPI、CAN、I2C、またはUARTなどの種類のインターフェイスが必要かどうかを自問する必要があります。彼らはすべて彼ら自身の利益を得ることができ、あなたが1人以上の奴隷と話をするかどうかを自分で検討することです。最後の、おそらく最も重要なステップは、使用する必要があるマイクロコントローラーのピン数を推測することです。

「プロセッサを中断することなく、アナログ信号からデジタル信号を読み取る能力は素晴らしいでしょう。」データを循環させ、データ処理の速度を低下させる可能性のある外部または内部バッファを処理したくないと言うことで、私は思いがけない推測をすることができます。そうですか?もしそうなら、それはあなたがするためのより多くのプログラミングですが、プロセッサーは通常100サンプル/秒の速度を処理することができます。クロック、サンプリングレート、その他をプログラムするのはあなた次第です。

また、データを継続的にサンプリングし、フラグが立てられたときに他のタスクを実行する場合は、プログラムの割り込みを検討してください。


2
ポイントを逃したと思います。彼はArduino上にプロトタイプを構築しています。サンプリングは遅くありません。制御ループは遅いです。彼は、Arduinoの浮動小数点を使用して計算されている3つのPIDコントローラーを持っているため、南極の冬の糖蜜よりも遅いです。したがって、サンプリングは問題ではありません。非効率的なコードは。
JRE

あなたはそれについて正しいです。
12Lappie

はい、問題は、ループが浮動小数点ではなく長い算術演算であるにもかかわらず、非常に多くの計算が行われるため、Arduinoがループごとに1回サンプルを取得するため、サンプルレートが非常に小さいことです(現在1秒あたり20サンプル) 。
エリオットW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.