組み込みエンジニアのためのマイコン周辺の基礎知識【初心者必見】
マイコン周辺のハードとソフト
マイコン自体はどんな構成でどのような機能をもったものでしょうか。
コンピュータが存在する以前の世界は身の回りはハードウェアばかりでした。電気製品においてもテレビなどは機能をすべて電気・電子回路のハードウェアで構成していました。自動車においてもそうです。すべて機械部品のハードウェアで構成されていました。
コンピュータが登場して、ソフトウェアという概念ができました。コンピュータは自然界のアナログ的(物理的)なもの、例えば光の強さや音の大きさなどをセンサーなどの入力機器を介して取り込み、内部でデジタルに変換してからコンピュータプログラムによりさまざまな機能を付加して求められている形態で出力するものです。
このコンピュータプログラムがソフトウェアと呼ばれているものです。ハードウェアのような形はありません。
そのため、コンピュータのサイズが小さくなればなるほど、同じ機能をもったハードウェアだけで構成されていたものより小型になり機械的な部品点数が減るため、故障も少なくなり量産しやすく価格も下がるのです。
マイコン(マイクロコントローラ)はコンピュータの中でも電気機器を制御するのに特化したコンピュータで頭脳の役割であるCPUのほか、アナログ、デジタル的な信号の入出力、タイマ・カウンタ、シリアル通信機能などが内蔵されており、開発者は実際の入出力の信号との間に必要最低限のインターフェース回路を付加するだけで簡単に高機能な電気機器を開発できるようになりました。
機能はソフトウェアと呼ばれるプログラムにより作成されます。プログラマーの腕のみせどころです。
ゆえにマイコンのプログラマーはプログラム言語の知識のみならず、マイコンの機能、周辺回路(インターフェース)などハードウェアの知識・経験が必要となってきます。
ハードウェアの知識も一昔前とは違い、インターネットを活用するとかなりの情報が得られます。この知識を活かして実際にハードウェアなる回路を自分で組むことは理解を深めることへの近道です。
組み込み技能はソフトウェア(プログラミング)だけを扱って実物(ハードウェア)を知らなければまったく身につきませんし、役にもたたないでしょう。実際にプログラミングしながら、入力や出力を計測しながら完成度を高めていくことが組み込みの醍醐味、魅力なのです。
マイコンの基本構造
マイコンはCPU, ROM, RAM, I/Oポート その他各種機能で構成されています。
CPU :
マイコンの頭脳にあたる部分でプログラムの命令を実行して演算したり機能を実現したりします。
ROM :
記憶部分であるメモリのうち、読み出し専用(Read Only Memory)でプログラムや実行中に変更する必要のない定数などのデータを格納するところです。電源を切ってもデータは消えず、マイコンが起動してからプログラムを読み出して実行します。
RAM :
記憶部分であるメモリのうち、読み書き可能(Randam Accessy Memory)でデータ(変数)を一時的に保管する場所。電源を切ったら内容も消えてしまいます。
IOポート :
マイコンと外部部品との信号を読み取る機能を行う部分(端子)です。Iが入力(Input)、Oが出力(Output)です。
周辺機能 :
マイコンにはAD/DAコンバータ、タイマ・カウンタ、シリアル通信などアプリケーションで使用するさまざまな機能(ハードウェア回路)が内蔵されています。ペリフェラルと呼ばれます。
レジスタとメモリ(少し専門的な話)
レジスタは主にマイコンの状態を保存および確認するための特殊なメモリです。CPUのレジスタではCPUの状態を保存および確認するのに使われます。具体的には演算途中のデータ、割り込みやサブルーチンでプログラムが分岐した時の戻り先アドレス、演算結果が負値、ゼロになった場合の情報や桁上がり値などです。
CPUの汎用レジスタはハードウェアでCPUに直結しているので、内部バスを経由してデータにアクセスするRAMよりも高速アクセスできます。
周辺機能の制御レジスタでは汎用入出力GPIOとよばれるI/Oポート、タイマ、シリアル通信、ADコンバータ、DAコンバータなどの周辺機能を設定するのに使われます。
周辺機能の状態を示すステータスレジスタやADコンバータの変換結果を保存しておく結果レジスタや通信機能では送受信データを保存する送受信データレジスタなどがあります。
直接プログラムからレジスタを設定することもできますが、通常はメーカーから提供されているファームウェアライブラリ(デバイスドライバ)を使用しますのでレジスタは直接意識せず、間接的に設定することになります。
ただし、ある程度理解ができたところで仕様書などにかかれている各レジスタに目を通しておくことは理解を深める上でおすすめします。「ARMマイコンSTM32レジスタマップの見方」を参照してください。
マイコンに内蔵されている周辺機能の紹介
マイコンにはたくさんの足(ピン)があります。マイコンのデータシートをみると各ピンにいろいろな機能が割り当てられているのが確認できます。
いろいろな機能とはアプリケーションで使用する汎用I/Oポート、AD/DAコンバータ、タイマ・カウンタ、シリアル通信などの便利な機能のことです。
マイコンのピン数は限られているので一つのピンに複数の機能を割り当てられていてソフトウェアで使用する機能を選択できるようになっています。
各種機能を以下に紹介しますのでここでそれぞれの概念を理解してください。
汎用I/Oポート(GPIO) :
スイッチ、センサーなどなんらかの信号を入力するのが入力(I)ポートで、LEDなどの負荷を駆動する出力をあたえるのが出力(O)ポートです。ポートとは入出力の窓口であるピン(端子)のことです。GPIO(General Purpose Input/Output)とも呼ばれます。
GPIOはリファレンス・マニュアルや図面上では「PA1」で略記されていることがあります。PA1は「GPIOポートAの1番目のピン」を意味します。
入力ポートと出力ポートは兼用されていることが多く、レジスタ設定により切り替えることができます。GPIOはデジタル方式の入出力ポートですので入力の場合、入力された電圧に応じて0か1を判別し、出力であれば0か1の状態を与えます。
電源電圧が3.3Vのマイコンであれば上基準値約2V以上でHレベル、下基準値約0.8V以下でLレベルとなります。通常、マイコン内部ではHレベルを1、Lレベルを0として表現します。Hレベルで1、Lレベルで0を正論理、Hレベルで0、Lレベルで1を負論理といいます。プログラムを作成にあたっては出力などではこの論理を反転して使うことも多いです。
入出力ポートの一部にアナログ信号を扱えるものもあります。使用できるポート(ピン)は限られていますので、設計段階で仕様書をよく確認しながら割当をします。
当サイトで採用しているSTM32のGPIOについては「汎用入出力【STM32のGPIO使い方詳細】」を参考にしてください。
タイマ・カウンタ :
水晶振動子などのクロック発生装置から発生した一定周期の信号をシステムクロックといいます。このシステムクロックを任意に分周したクロック信号とカウンタを組み合わせたものが周辺機能のタイマ・カウンタです。
分周とはクロックの周波数が高い場合に例えば1MHzクロックを1/1000に下げて1kHzクロックにすることです。
クロック(クロックパルス)は単純にHレベルとLレベルを一定周期で繰り返すデジタル信号です。クロックを自動的にカウントして設定した経過時間後に通知する機能がマイコンのタイマ・カウンタ機能です。
タイマ・カウンタを利用した信号出力の例を見てみましょう。この例はタイマ用に1kHzに分周したクロックを使って任意の一定間隔の出力を作り出すものです。
ここではクロックをカウントするのにアップカウンタを使っています。アップカウンタは0から設定した値まで入力クロック(パルス)を増やす方へカウントし、設定値に達すると0に戻ってまたカウントを繰り返します。
設定値に達した時の通知として出力状態を反転(ここではHレベルとLレベルを入れ替える)する例です。
クロック周期は1msですのでカウンタに50を設定すると50ms毎にカウント値は到達してからリセットされるのを繰り返します。この例ではカウンタリセット毎に出力状態を反転させるため、100msサイクルのパルス出力となります。
ここではタイマ・カウンタを利用した信号出力を例に挙げましたが、作成するアプリケーションにおいて時間にかかわる処理はすべてタイマ・カウンタで実現できます。
タイマ・カウンタはCPUとは独立したハードウェア回路による機能なのでCPUには負担を与えず高度な処理を行うことができます。タイマ機能の中でも応用用途の広い便利なPWMをもったマイコンもあります(PWMについては後に詳細を解説します)。
当サイトで採用しているSTM32のタイマについては「タイマ・カウンタ【STM32の高機能・汎用タイマ詳細】」を参考にしてください。
ADコンバータ :
GPIOによる入力は通常はデジタルで電圧の1か0の判断だけするのですが、ポートの一部にアナログ信号を扱えるものがありADコンバータ機能を使用することができます。使用できるポート(ピン)は限られていますので、設計段階で仕様書をよく確認しながら割当し、入力ポートの仕様をアナログ信号入力の設定にすればよいだけです。
ADコンバータ(Analog-Digital変換)はマイコン仕様で決められている範囲レベルのアナログ信号電圧を入力ポートから読み込み、マイコン内部で設定された方式でデジタル値に変換するものです。
例えば入力最大電圧が5Vで12ビットの分解能を持つADコンバータに0-5Vのアナログ信号を入力する場合は、分解能は4096(212)なので入力が5Vのとき4096のデジタルデータとなります。半分の2.5Vでは2048です。こうして、マイコン内ではアナログ信号が分解能の範囲でデジタル化されましたので数値として扱えるようになります。
マイコン自体はデジタル信号を扱うものですが、アプリケーションにおいては音、光、温度などアナログ的な信号を扱う用途は多々あります。ADコンバータはアナログ信号をマイコンが処理できるデジタル信号に変換する必要不可欠な機能といえるでしょう。
当サイトで採用しているSTM32のADコンバータについては「ADコンバータ【STM32のADコンバータ詳細】」を参考にしてください。
DAコンバータ :
DAコンバータ(Digital-Analog変換)はADコンバータの逆でマイコン内のデジタル値をアナログ信号に変換して出力するものです。例えば音声信号を出力したい場合は音声の波形を表現する必要がありますが、波形はまさに連続したアナログ信号です。
このようなアナログ信号を出力する場合にDAコンバータを使用します。出力基準電圧が5Vで12ビットの分解能を持つDAコンバータでは基準電圧を4096(212)等分していずれかの電圧を出力します。例えば、デジタル値が4096のとき出力は5V、半分の2048では2.5Vです。
こうして、DAコンバータを使うとマイコン内のデジタル化した数値をアナログ信号として出力できます。
シリアル通信 :
マイコンでは例えば8ビットデータを複数(8個)の端子で一度に伝送するパラレル通信に対してデータを直線に並べて順次伝送する方式のシリアル通信機能をもっています。文字列”ABC”の通信する場合、パラレル通信では各文字を同時に送信するのに対して、シリアル通信では’A’から順に’B’,’C’と1文字ずつ送信するイメージです。
シリアル通信は伝送するデータのビット数によらないため端子数は少なくてすみます。
シリアル通信のなかで非同期(調歩同期)式と呼ばれる開始を意味する「スタートビット」と終わりを意味する「ストップビット」でデータを挟んで伝送する同期信号が不要のUART通信がありモニター用機器や無線LANモジュールなどのインターフェースに一般的に使用されます。
USART通信はUARTを発展させて同期式通信にも対応したものでマイコンにはUSART通信がペリフェラルとして内蔵されています。また、産業機器で一般的につかわれているRS232CやRS485,RS422などは信号レベルの規格が異なりますが親戚みたいなものです。レベル変換ICを外付け回路として加えると使用できるようになります。
同期信号を必要とするクロック同期式シリアル通信にはI2CとSPI通信があります。EEPROMなどのインターフェースによく用いられています。
UART-USB変換ケーブルを使用するとPCともつなげてフリーのシリアルターミナルソフトや専用のアプリを作成すると操作やモニターが簡単にできます。このようにUSART通信は用途がいろいろなアプリケーションに広がるためぜひ習得してほしい機能です。
当サイトで採用しているSTM32のUSART通信についてはシリアル通信USART【STM32のUSART詳細】、I2C通信についてはシリアル通信I2C【STM32のI2C詳細】、SPI通信についてはシリアル通信SPC【STM32のSPI詳細】を参考にしてください。
割り込み :
組み込み制御には割り込みの概念がかかせません。
例えば不定期に入力される外部からの信号やUSART通信などで受信完了などの通知を検知するのに割り込みを使用しなければ、常に定期的にその信号の入力や機能終了通知をチェックしなければいけません。割り込みを使うと何らかの処理が発生したとき(イベントが発生)のみ、割り込みとして処理すればよいのでプログラムは無駄がなく簡素化し、消費電力も節約できます。
タイマ、シリアル通信など各ペリフェラルには割り込みイベントと呼ばれる機能が多数あり、ハードウェアによる割り込みが発生するたびに割り込みハンドラと呼ばれる処理内容を記載した機能ブロックが呼び出されて割り込み処理が実行されます。
割り込みを使用しない場合はポーリングと呼ばれる方式で発生したイベントを定期的に監視して、必要に応じて処理をするものです。これはソフトウェアだけで実装できる気軽さはあるのですが、どんなタイミングで発生するかわからないようなイベントを定期的に監視するのは効率が悪いことに加え、処理タイミングが遅れるデメリットがあります。また、ポーリング監視期間外で発生したイベントには対応できません。
定期的で頻繁に起こるようなイベントに対してはポーリング処理でよく、発生頻度の低いイベントで確実に処理タイミングを厳密に合わせたい場合はハードウェアによる割り込みが向いています。アプリケーションに合わせて使い分けるとバランスのとれたシステムが構築できます。
当サイトで採用しているSTM32の割り込みについては「さまざまな割り込み【STM32の割り込み詳細】」を参考にしてください。
DMA :
DMAはDirect Memory Accessの略でCPUを使わずに、バスを通じて周辺機能(ADコンバータ、UART通信など)とメモリ間(ROM、RAM)のデータ転送を直接行う機能のことです。
通常、データ転送はCPUが行いますが、DMAを搭載しているマイコンでは、DMAがCPUに代わって、データを転送してくれます。
そのためCPUは演算などのCPUでしかできない仕事だけすればよくなります。DMAを搭載することで、マイコンの負担(消費電力)を減らし、パフォーマンスを挙げることになります。
ADコンバータやUART通信などの周辺機能と組み合わせて使うと効果的です。画像や音声転送など大量のデータを通信で扱う場合にはDMA機能を積極的に使用すればよいです。
DMA機能はマイコンアプリケーションを作成する上では必須の機能ではありませんが、CPUの負担を減らし、アプリケーションのパフォーマンスをより向上させたい場合に活用するとよいでしょう。
ADコンバータを使用する用途で複数のチャネルで信号を取り込みたい場合などはDMAとの組み合わせは必須です。
当サイトでは 「シリアル通信USART【STM32のUSART詳細】」 および「ADコンバータ【STM32のADコンバータ詳細】」それぞれの周辺機能でDMAの使い方を解説しています。
各ピンの構成する基本回路
マイコンの機能は色々あるのですが、各ピンを構成する回路はほぼ共通です。I/Oポート(GPIO)のレジスタを設定することで機能を割り当てます。これら各機能については後ほど詳細に解説しますのでここでは割愛しますが、これらを利用するための基本回路[詳細はこちら]をとりあげてみます。
入力プルアップ・プルダウン抵抗 :
ピンを汎用入力ポートと定義したとき入力は電源電圧Vddがかかった状態の1(HIGH)、Vss(GND)につながり0Vになった状態が0(LOW)の2通りです。いわゆるデジタル入力です。
入力プルアップ・プルダウン抵抗はマイコンにスイッチやセンサーなど外部信号をとしての入力に必要な抵抗です。このとき、プルアップまたはプルダウン抵抗がないと入力が0(L)でも1(H)でもない「浮いている」状態になってしまいます。どっちつかずの場合はノイズなどの影響も受けやすくなるため、誤作動の原因ともなりえます。
入力がなくても 1に固定するためのものは入力プルアップ抵抗、 0に固定するものは入力プルダウン抵抗となります。
プッシュプル出力(電圧出力)・オープンドレイン出力 :
ピンを汎用出力ポートと定義したとき出力はC-MOSとよばれるスイッチング素子で構成される回路に切り替わりONかOFFのデジタル出力で負荷を駆動します。例えば負荷がLEDの場合は点灯、消灯を切り替えます。
出力にはプッシュプルタイプとオープンドレインタイプがあります。
マイコンが出力を0(L)に指定しているとき出力ピンがVss(GND)で、1(H)に指定しているとき電源電圧Vddとなるものがプッシュプルタイプです。
マイコンが出力を0(L)に指定しているとき出力ピンがVss(GND)で、1(H)に指定しているとき電源電圧VddでもVss(GND)でもないものがオープンドレインタイプです。
通常はプッシュプル出力を使うことが多いですがオープンドレインは出力ロジックの電圧レベルの変換やワイヤードORとして使われます。C-MOS出力同士の接続はショート防止のため禁止ですが、オープンドレイン出力の場合はショートしませんのでワイヤードORとして接続できます。
オープンドレイン出力にプルアップ抵抗を介して別電源をつなぐと電圧レベルが別電源のレベルに変換されます。
ワイヤードORとは実際の結線で論理回路のORと同じ機能を持ったものです。
ここでC-MOSがでてきましたがこれはComplementary MOSとよばれるものでP型MOSFETとN型MOSFETを相補的に組み合わせた論理回路のスイッチング素子の一種です。
システムクロック :
マイコンのクロック信号は水晶振動子などの外部発振回路から供給される外部クロックタイプと、マイコンに内蔵されているRC発振回路(内部発振回路)から外付け部品なしで供給される内部クロックタイプがあります。内部クロックタイプは外付け部品が少ない分コスト低減などの利点があります。
ただし、内部発振回路は外部水晶振動子に比べて精度のばらづきなどで周波数の安定性は多少さがります。
UART通信など外部機器とのタイミングとの整合が必要な機器のシステムを設計する場合には周波数の安定する外部振動子を使用することをおすすめします。
実際に設計の段階で水晶振動子を選択する場合は厳密にいうとマイコンとの相性もありますので試作の段階で動作確認をする必要はあります。
このクロック信号源をベースにタイマ、ADコンバータ、UART通信など各周辺機能には適切に分周した周波数になるクロックを設定します。タイマ、ADコンバータ、UART通信など各周辺機能にはシステムクロック源のままであると高速すぎるために適切に分周した周波数に設定してクロックをコントロールすると消費電力を節約することもできます。
プログラムの流れ
マイコンでは電源投入直後、メモリに書き込まれているプログラムを開始位置から順次実行していきます。
実行手順として、初期設定たとえば、ポート定義、使用する周辺機器(ペリフェラル)の定義などを行います。
準備ができたところで、メインループと呼ばれるところでアプリケーションの処理を定期的に繰り返し実行します。この繰り返しの周期をプログラムのサイクルタイムといいます。
様々なアプリケーションに必要な複数の処理を順次実行してサイクルタイム毎に繰り返します。サイクルタイムは処理の内容によりかわってきます。比較的単純なアプリケーションではこれでも問題ありません。
割り込み信号を外部から定期的に与えるとサブルーチンや割り込みハンドラと呼ばれる処理ブロックを決まった間隔で実行させることができます。後ほど説明するOS(オペレーションシステム)を使用すると、処理ごとにタスクと呼ばれるブロックにわけて定期的に優先順位を設けて実行させることもできます。
モータ制御などの速度を算出する処理などは比較的高速でサイクルタイムは短めであることが必要ですが(10ms以下)、モニター表示などは長めのものでも問題ありません(100ms程度)。
さまざまな処理が複雑に絡み合うアプリケーションではOSを使用すると効率よくプログラムが構成できるようになりますのでOSを使用することは組み込みには必須なスキルでしょう。