モータの鳴らし方byHanDen

電子工作の初心者がモータを演奏したりVVVF音を再現したりする方法を紹介するブログ ホビー向けの電子工作を基礎から書いていきます 記事のミス等のお問い合わせはTwitterにてお願いします。 当ブログを参考に製作をする際は必ず自己責任にて行ってください 当ブログを参考にしたことによる損害等の責任は一切負いません ドメイン取得につきURLを http://vvvf.blog.jp から http://blog.henden.net に変更しました

制御編 第6回 Atmel Studioでのファイル作成とFuse設定

今回はプログラミングを始める最初の作業である、ファイルの作成とマイコンのFuse設定のお話をします。

 

まずは、デスクトップかスタートメニュのアイコンから「Atmel Studio 7」を起動させます。

 
32

起動したら、「ファイル」メニューの「新規作成」、「プロジェクト」をクリックして、ファイル作成画面へと進みます。

33
ここで、プログラムの種類を選びます。AVRマイコンのプログラミングでは「Executable Project」を選択します。Executable project にもC言語とC++言語の2つから選べます。必要に応じて選択をしてください。(通常はC言語の範囲のプログラミングが多いと思いますが、C++言語にしてもC言語の機能は基本的に使えるので特に気にしなければどちらでもよいです。)また、この時下部の「名前」のボックスにファイル名を、「場所」のボックスにはファイルの保存先を設定します。

34

次に、使用するマイコンの種類を選択します。今回は「ATmega328P」を使用するので、「ATmega328P」を選択します。選ぶときには、上部のプルダウンメニューから「ATmega」を選択すると、選択肢が減って選びやすくなります。または、次の右上の検索欄に「328」と入れて検索すると下図のように絞り込みができます。
35
基本的には、検索をした方が速いと思います。使用するマイコンが選べたら右下の「Ok」をクリックしてファイルの作成を完了させます。

 

続いてFuse設定を行います。

1

上部のツールバーから、図の↑でしめした、雷っぽいアイコンの「Device programing」をクリックして、マイコンへの書き込み画面を表示させます。

2

まずは、左上の「Tool」のプルダウンメニューから「STK500 COM*(*にはCOM番号が入ります)を選びます。次に、「Device」のプルダウンメニューから使用するマイコン(今回は「ATmega328P」)を選択します。そして、その右側の「Apply」ボタンをクリックしてデバイスへの接続を開始します。(厳密には接続が開始されるのは、次のステップ)

3

左側のメニューから「Fuses」(図の←)をクリックしてFUSE設定を開きます。この時にエラーが出た場合は、マイコンが正しく接続できていないので、各種設定や回路の確認を行ってください。

36

FUSE設定を開くとこのような感じの画面になります。画像はArduino UNOFUSE設定になります。Arduinoとしてマイコンを使う場合は基本的にはこの設定にしてください。一応、各設定の紹介をしておきます。なお、各設定の「.」の前はFUSEバイトの名前を指しており、後は設定の名前です。

BODLEVEL:マイコンに印加される電圧が下がった時に、マイコンをリセットする設定です。ここで設定された電圧を下回ると、マイコンがリセットされます。設定電圧は”1.8V”,”2.7V”,”4.3V”電圧低下によるリセットなしです。Arduinoでは”2.7V”に設定されています。

RSTDISABLE:マイコンのリセットピン(atmega328Pの場合PC6)の無効化の設定です。チェックをオンにすると、リセットピンは通常のポートとして使用できます。この際にリセットを行うには、低電圧リセットか電源をONにし直す必要があります。書き込み時などに不都合が生じるので、基本的にチェックは入れないでください。

DWEN:デバッグ機能を有効化する設定です。デバッガーがないとデバッグができないので、当ブログでは使用しません。うっかりチェックを入れるとISP通信ができなり、通常の書き込み機では書き込みが不能になるので注意してください

SPIEN:直列プログラミング(ISPによる書き込み)を許可する設定です。無効にするとISPでの書き込みができなくなり、通常の書き込み機では書き込みができなくなるので注意してください。

WDTON:ウォッチドッグタイマを常時有効化する設定です。

EESAVE:チップの消去時のEEPROMの内容を保護する設定です。

BOOTSZ:ブートローダの容量の設定です。選択肢は“256word”,”521word”,”1024word”,”2048word”です。

BOOTRST:起動時にブートローダなどを使用するかどうかの設定です。Arduinoの場合はチェックを入れないと、書き込みなどができなくなります。

CKDIV8:システムクロックを水晶からのクロックの1/8にする機能です。

CKOUT:システムクロックを外部にピン(atmega328pの場合PB0)に取り出す機能です。

SUT_CKSEL:起動時間とクロックの種別を選択します。外部に接続する水晶の有無やクロック数、電源の起動時間などに合わせて設定を行います。Arduinoの場合はAtmel Studioの一番下に出てくる、”(外部)低電力クリスタル発振器の8~16MHz, 起動遅延時間が16k×CK リセットからの負荷遅延14×CK+65ms (外部クリスタル発振子、低速上昇電源)Atmel Studio上の表記では”Ext. Crystal Osc. 8.0- MHz;Start-up time PWMDWN/RESET:16K CK/14 CK + 65ms”に設定されています。Arduinoとして使用しない場合でも8MHz以上の水晶やセラロックを使用する場合はこの設定を使用すればよいでしょう。外部クロックを使用しない場合は、くれぐれも外部クロック関連の設定にしないように気を付けてください。外部に水晶を使用しないとマイコンが使えなくなります。詳しい設定は、ATmega328PデータシートP28~31を参照してください。

 

FUSE設定はこんな感じです、基本的に設定変更をするのは、”BOODLEBEL”,”CKDIV8”,”SUT_CKSEL”3つでArduinoとして使う場合など、必要がある場合は”BOOTSZ”,”BOOTRST”も変更すればよいでしょう。ここの設定は下手に触るとマイコンが使えなくなるので慎重に行ってください

Arduinoとして使わない場合で特に事情がない場合は、初期状態から”BODLEBEL”2.7V ”CKDIV8”のチェックを外す、”SUT_CKSEK”を一番下の"Ext Crystal 8MHz 65ms”にしておけばいいと思います。(下の画像参照)
38

ちなみに、マイコンの種類が変わると、FUSE設定が多少変わるので、ATmega328(とその系統)を使わない場合はマイコンのデータシートのヒューズビットの設定を確認して設定を行ってください。よくわからない設定の変更は慎重に!(よくわからない設定の変更は控えておくのが安全です)

最後に参考程度に、FUSE設定のデータシートの抜粋を置いておきます。既定の設定などはここを参考にしてください。

 

37

次回からは本格的に、マイコンのプログラムに入っていって、最終的に音楽などを演奏できるようにしていきます。

制御編 第5回 AVRマイコンの環境づくり2 AtmelStudioの日本語化とAtmel Studioの初期設定

前回にAtmel Studio のインストールを行いましたが、そのままの状態では英語で使い勝手がよくないです。そのため今回はAtmel Studioの日本語化とそのあとの初期設定のお話をします。

Atmel StudioVisual Studio shell (isolate)というMicrosoft visual Studioのエディター機能のみを取り出したソフトウェアをベースに動いています。そのため、visual Studio shellの日本語版をインストールすると日本語化が可能と言えるのですが、実はAtmel Stduio 7ではそれができません。なぜかというと、Atmel Studio 7Visual Studio 2015 shell をベースに作られているのですが、 Visual Studio 2015 shellの単体での配布がされていないからです。ですが日本語化する方法があります。それは、日本語版のVisual Studio をインストールするということです。インストールするVisual StudioAtmel Studioのベースとなっている同じバージョンの無料版である「Visual Studio Community 2015」です。(同じ無料版のVisual Studio Express 2015でもできるっぽいですが、わざわざExpressをインストールする必要もないと思います)これをインストールすることで、Atmel Studioが日本語で使用できるようになります。(Visual Studio Language Packをインストールしたら使えそうに見えますが、インストールの段階でVisual Studioが見つかりませんって言われて跳ねられます)

 

まずは、Visual Studio Community 2015をダウンロードします。

Google検索で「Visual Studio Community 2015」と検索してリンクを進みと、下のようなページが表示されます。

18-1

このページの「ダウンロード」ボタンを押すと次のようなページに飛ばされます。(執筆時点では)

19

Visual Studio 2015のダウンロードボタンを押したはずなのに、なんと2017のダウンロードページに飛ばされてしまいます。(執筆時では)ですが、このページの下の方に古いバージョンのダウンロードへのリンクがあります。

20

ページ下部の「older versions」をクリックして古いバージョンの一覧へと進みます。(執筆時の一覧画面のURL: https://www.visualstudio.com/vs/older-downloads/

21

そのなかから、「2015」の欄の右側の「Download」をクリックしてVisual Studio 2015のダウンロードページへと進みます。この時にマイクロソフトアカウントへのログインが求められるので、ログインをしておきます。

22

このような画面が表示されるので、この中から「Visual Studio Community 2015」を探します。(図の□囲み)

23

そして、左側のプルダウンメニュー(上の図で”x86”と表示されているところ)からOSのビット数(32ビット版OSならx86 64ビット版OSならx64)を選びます。次に、中央のプルダウンメニューから”Japanese”を選びます。最後に右側のプルダウンメニューから”EXE”を選びます。(画像は、32ビット版OSの場合の選択になっています。)すべて選べたら、右側の「Download」をクリックしてダウンロードを始めます。

 

ダウンロードしたインストーラーを実行して、インストールを開始します。

24

HDDSSDの容量がひっ迫しているとかがない限りは、「既定」が選択されたまま、下部の「インストール」をクリックします。

25
しばらく待つと、このようにインストール完了画面が出るので、「今すぐ再起動」をクリックして再起動を行います。

 

次は、Atmel Studioの初期設定です。

デスクトップの赤いアイコンから、「Atmel Studio 7」を起動させます。(この時点では日本語が表示されないですが正常です)

26

Tools」メニューの一番下「Options」をクリックして、設定画面を開きます。

27

右側の一覧から「International Settings」を選択し、「Language」から「日本語」を選び下部の「OK」をクリックします。その後、一旦Atmel Studioを閉じてから再起動をします。

再起動して日本語になっていれば、日本化は成功です。次はライターの設定を行います。

28

上部の「ツール」メニューの上から4番目の「Add target(図の黄色部)をクリックして、ライターの追加画面に入ります。

29

Select tool」のプルダウンメニューから「STK500」を選びます。

30

するとシリアルポートを選ぶメニューが出てきます。前回のライターの初期設定の際にメモした「Programing Port」のCOM番号を「Select Serial port」のプルダウンメニューから選びます。

31

先ほどの「Select Serial port」が画面のように「Polulu USB AVR Programer V2 Programing Port(COM*)」と表示されていることを確認して、下部の「Apply」をクリックして設定を確定させます。

以上で初期設定は完了です。

次回はファイルの作成方法とFuse設定などを紹介したいと思います。

制御編 第4回 AVRマイコンの環境づくり1 ライターのドライバとAtmel Studioのインストール

前回まではマイコンのプログラミングで使うビット演算のお話をしてきましたが、今回からはAVRマイコンのプログラミングを行う環境づくりのお話をしたいと思います。

まずはAVRマイコンの書き込みに用いるライター(書き込み機)を選びます。少し前なら純正のライターである「AVRmkⅡ」を選ぶのですが、現在は販売中止になっており入手が困難になっています。現在購入可能な純正品としては、デバッグ機能が付いた「Atmel Ice Basic」などがありますが1万円を超えてしまいます。互換品をAmazonとか日本橋などを見ているといろいろありますが、純正の開発環境である「Atmel Studio」からは書き込みができないなど不都合があるものが多いです。そこで、筆者が使っているのはスイッチサイエンスで売られている「Pololu USB AVR Programmer v2」です。このライターは他の安いライターと違ってAVRマイコンの統合開発環境である「Atmel Studio」でプログラミングから書き込みができ、非常に便利です。

1

販売ページ:https://www.switch-science.com/catalog/2662/

そして、この販売ページから製造元の「Pololu」のサイト(下図)(https://www.pololu.com/product/3170/resources )へのリンクもあり、そのサイトに詳しい使い方が書かれています。(英語ですが)
2

まずこのサイトからドライバー(図の下側の←)をダウンロードします。また、上の←のリンクより、使用方法が見れます。

ダウンロードしたドライバーのインストーラーを実行します。

3

ウィザードに従ってインストールを行います。まずは「Next」で進みます。

4

次にインストール先を聞かれます。変更の必要があれば適時変更、なければそのまま「Next」で進みます。


5

次もそのまま「Next」で進みます。

6

Install」をクリックしてインストールを始めます。途中でドライバのインストールの確認画面が出てくるので「インストール」をクリックして、すべてのドライバのインストールを行います。

7

この画面が出たら完了です。

続いて、スタートメニュから「Polulu」フォルダの「Pololu USB AVR Programer v2…」を開きライターの初期設定を行います。
8

9

デバイスの設定画面で、初めに←1で示した個所に記載されている、「Programing Port」のCOM番号をメモしておきます。
次にライターからの電源供給の設定をします。マイコンに書き込みをするときには、マイコンに電源が供給されている必要があります。その電源をライターから供給する場合は図の←2の「Vcc Output」をEnableに変更します。書き込み時に外部から電源が供給されている場合は「Vcc Output」をDisableにします。この設定を間違えると書き込みができないことやライターが破損する恐れがあるため書き込みを行う回路の仕様をきちんと確認したうえで間違いのないようにしてください。

 

続いてAtmel Studioのインストールへ進みます。

Google検索で「Atmel Studio 7」で検索をして、「Atmel Studio 7 | Microchip Technology Inc …」のリンクを開きます。(執筆時点でのURL: https://www.microchip.com/avr-support/atmel-studio-7 )

9-1

10

このような感じの画面が開くので下の方に進みダウンロードリンクへと進みます。

11

Windows(x86/x64)」の中からAtmel Studio7.0をダウンロードします。筆者は下の「Atmel Studio 7.0 (build 1645) offline installer」をダウンロードしましが「web installer」をダウンロードしても同じです。(インストールの時に大きなファイルをダウンロードするか、先にダウンロードするかの違いです。)(ビルド番号は時期によって変わるので、その時々にあわしたものをダウンロードしてください)

ダウンロードしたファイルを実行してインストーラーを起動させます。

12

最初に、ライセンス条項の確認が出てくるので確認をしたら、「I agree to the license terms and conditions(図の↓)をクリックして、同意状態にした後、下部の「Next」で次に進みます。

13

インストールする項目の選択ですが、すべてインストールして問題ないので、そのまま「Next」をクリックします。

14

サンプルなどのインストールを行うかどうかについて聞かれますが、インストールしておいて問題ないのでそのまま「Next」をクリックします。

17

最後にパソコンの環境チェックがされ問題がなければすべての項目に「✓」が付きます。すべてに「✓」がついていることを確認して「Next」をクリックするとインストールが始まります。AtmelStudioも途中でドライバのインストール確認画面が出るので、すべて「インストール」をクリックしてすべてのドライバをインストールします。

環境チェックで以下のように跳ねられた場合は、その項目を修正してからインストールを行ってください。
16
筆者の場合はwindows updateの「KB2999226」がインストールされていないというエラーが出ました。筆者の環境ではWindowsUpdateからインストールできなかったため、画面に出ているURLから更新を手動でダウンロードしてインストールを行うと、エラーがなくなりました。

18

最後に、このような画面がでたらインストールは完了です。(環境次第でかなり時間がかかります)

Close」を押してセットアップを完了させると、Atmel Studioが起動します。ですが、現時点では英語のメニューとなっています。日本語化することが可能なので次回日本語化の紹介をします。

制御編 第3回 ビットシフト

 前回はビット演算のお話をしましたが、今回はビット演算の一部ともいえるビットシフトのお話をします。ビットシフトというのはその名の通り、ビットの位置を移動させる機能です。この機能は主に、値を読み込んだ時に高いビットの値のみを使いたいときや、通信データの作成の時に使います。ですが、使う機会はそんなに多くないのでさらっと行きたいと思います。

ではビットシフトをすると、どのようになるのかをお見せしましょう

操作前の値      10101010

右に4bitシフト  00001010

1回目の例は右向きに4bitシフトさせた例です。このように右向きにシフトさせると高い位置のビットにあったデータを低いビットに移動させることができます。ここで気を付けないといけないのは、ビットシフトさせて消えるビットと新たに出てくるビットがあることです。この例の場合は操作前の右側(下位)4ビットはシフトさせると消えていることがわかると思います。逆にシフトさせたあとの左側(上位)4ビットが新たに出てきてすべて0が入っていることがわかります。つまり、ビットシフトをさせるとシフトさせた方向寄りのシフトさせた数のビットが消えるというわけです。

次に左向きにシフトする例です。

操作前の値     10101010

左に4bitシフト  10100000

左向きにシフトすると左側(上位)4ビットが消えていることがわかりますね。

ちなみに、左向きのシフトはシフトしたビット分2倍されている(例のように右に4ビットシフトする場合は値を16倍している)とも考えることもできます。このように考えた場合、範囲外に出て消えるビットは「値がオーバーフローした」と考えることができます。同様に右向きの場合はシフトしたビット分1/2倍されていると言えます。

C言語でビットシフトを行う場合はこのように書きます。

右に4ビットシフトさせる場合

B = A >> 4; //(Aは操作前の値 Bはビットシフトさせた後の値)

左に4ビットシフトさせる場合

B = A <<4; //(Aは操作前の値 Bはビットシフトさせた後の値)

C言語の表記は見た目のままなので簡単かなと思います。

なお、int型などで負の数を表したときはいろいろとややこしいことになるようですが、マイコン関連の処理で使うことはまずないと思うので特に詳しいことは書きません。

 

では実際にビットシフトを使う例を示してみましょう。

例えば、PD5からPD7にスイッチが接続されていて、3つのスイッチで値を設定していると考えましょう。今回はPD5PD6のスイッチがHIGHになっていると考えます。そして、最終的に値は下位3ビット(0からまで)で表したいとします。
1

Atmega328PのデータシートのP67を見ると、ポートDのピンの状態を読み込こむレジスタはPINDであることがわかります。

まずは上位3ビットのみを取り出します。

PIND     10101010 (Aとする)

取り出すビット11100000 (Bとする)

A & B   10100000 (Cとする)

続いてビットシフトを行って上位3ビットにいる値を下位3ビットに移動させます。

C              10100000

右に5bitシフト  00000101

こうすると上位3ビットにスイッチを接続して値を設定しても、下位3ビットの値として取り出すことができます。これをC言語で表すとこのように書けます。

uint8_t B = PIND & 0xE0;//0xE0 = 0x11100000 (上位3ビット取り出し)

B= B >> 5;//左に5ビットシフト

(uint8_tは符号なしの8ビットの整数型(Arudinoでいうbyte型)を示しています。)

C言語でもそのままに表せますね。ちなみに、先に行っているビットを取り出す作業は今回の場合は必要ありませんが、必要となる場合も多いので安全のために処理に含めています。(本当に必要になるのは中間のビットを取り出してシフトさせる場合などです)

 

次に通信データ作成の場合を考えてみましょう。

通信の場合できる限り送信のデータ数を少なくしたい場合が多いです。特に1バイトで完結させることができるとプログラムがとても楽に書くことができます。そこで、1バイト(8ビット)にビット数の少ない複数のデータを挿入する方法を紹介します。

ABはそれぞれ4ビットのみで表せる値として、送信データはABの両方を含めて1バイトにしたい場合を考えます。

最初に、ABから下位4ビットのみを取り出します。(もしも上位4ビットにゴミが混ざっていた場合送信データがおかしくなるため)

A          00001110

取り出すビット00001111 (Abとする)

A & Ab  00001110 (Aとする)

B          10001010

取り出すビット00001111 (Bbとする)

B & Bb  00001010 (Dlとする)

この例の場合Bの最上位ビットにゴミの値が入っていますが、下位4ビットのみを取り出すことでこのゴミの値を除去できます。(普通はゴミの値なんて入らないと思いますが…)続いて、Aを上位ビットとするためにAを4ビット左側にシフトします。

A            00001110

左に4itシフト   11100000 (Dhとする)

こうすることでDl(元のB)Dh(元のA)でビットの位置が被らないことになります。そのため、DhDlOR(+でもいい)することで1つのデータに入れれます。

Dl      11100000 (Aとする)

Dh        00001010 (Bとする)

Dh | Dl  11101010 DATA

こうすることでDATAの上位4ビットはゴミを取り除いたAのデータが入っており、下位4ビットにはごみを取り除いたBのデータが入っていることがわかりますね。こうすることで桁が少ない複数の値を1つの値に収めることができるというわけです。これをC言語で書くとこのようになります。

A &= 0x0F;//下位4ビット取り出し(上位4ビットにあるゴミを除去)

B &= 0x0F;

A = A << 4;

uint8_t DATA = A | B;//DATA = A+B;も可

 

次にこのデータをもとのA,Bに戻す方法を紹介します。

まずはAを取り出すために、データAがある上位4ビットのみを抽出します。

DATA        11101010

取り出すビット 11110000 (Abとする)

DATA & Ab     11100000 A

これで、上位4ビットを抽出できたのでこれを下位4ビットにビットシフトさせます。

A              11100000

右に4itシフト    00001110 A

こうすることで元のデータAが取り出すことができました。続いてデータBを取り出します。データBは下位4ビットにいるので下位4ビットのみを抽出します。

DATA       11101010

取り出すビット00001111 (Bbとする)

DATA & Bb   00001010 B

データBはビットシフトを行っていないので抽出した値が元のデータBとなります。これらもC言語で表すとこのようになります。

uint8_t A = DATA & 0xF0;//データ抽出

A = A >> 4;//右に4ビットシフト

uint8_t B = DATA & 0x0F;//データ抽出

 

前回と今回でマイコンのプログラムで重要なビットの処理のお話をしてきました。このビットの処理は慣れるまではちょっと大変ですが、慣れると簡単に扱えるようになると思います。次回はAVRマイコンのプログラミングを行う環境設定のお話をしたいと思います。

制御編 第2回 マイコンで使うビット演算

 前回はマイコンのハードウェアの設計のお話をしましたが、今回からはマイコンのプログラミングについて書いていきたいと思います。まずは、マイコンのレジスタを叩く際に必須と言えるビット演算のお話をしたいと思います。

 

 マイコンをはじめとするコンピュータの世界はデジタル、つまり01しかない世界です。マイコンも例外ではなく大量の01の組み合わせで動いています。コンピュータの世界では1つの01のデータを1ビット、これを8つ組み合わせたものを1バイトと呼びます。つまり1バイト=8ビットというわけです。一般的にはビットはコンピュータのビット数(パソコンだと32ビットだとか64ビットとか言いますね)やシリアル系の通信速度(wifiとかLANの通信速度の〇〇bpsといいますね)で使われて、バイトは容量系の単位(RAM16GBとかROM64GBとかいいますね)に使われることが多いです。

 前置きはこの程度にしておきます。マイコンには変数などで使われる通常のメモリのほかに、レジスタという特殊なメモリ領域があります。このレジスタを使ってマイコンに搭載された機能である入出力などを操作します。今回使用するマイコンは8ビットのAVRマイコンなのでレジスタは基本的に8ビットになっています。例えばポートの出力状態を設定するレジスタにおいても最大8つのポートごとにレジスタが割り当てられているのです。このうち1つのポートだけを操作したい場合などに必要な概念がビット演算というわけです。

ビット演算の基礎の基礎としてまずは論理演算を紹介します。

AND(論理積)

and
and

ANDは論理積ともいえ、日本語で言うと「AかつB」、論理式で表すと”AB” ”AB"などとなります。つまり、掛け算なので入力にどれか1つでも0があった場合は出力が0となります。例えば01ANDすると出力は011ANDすると出力は1となります。C言語のプログラムでは“&&”と表します。

 

OR(論理和)

OR
or

ANDは論理和ともいえ、日本語で言うと「AまたはB」、論理式で表すと”A+B” ”AB”などとなります。つまり、足し算なので入力にどれか1つでも1があった場合は出力が1となります。例えば01ORすると出力は100ORすると出力は0となります。C言語のプログラムでは“||”と表します。

 

NOT(否定)

 NOT
not

NOTは否定ともいえ、日本語で言うと「Aではない」、論理式で表すと”Ā”などと表します。0が入力された場合は1が出力され、10以外)が入力されると0が出力されます。入力に対して出力が反転されるので、論理回路では反転を意味する”inverter”とも言われます。C言語のプログラムではでは”!”と表します。

 

NAND(否定論理積)
NAND
nand

NANDANDの出力にNOTをかけたものです。日本語で言うと「(AかつB)ではない」、論理式で表すと1などとなります。つまり、掛け算の否定なので入力にどれか1つでも0があった場合は出力が1となります。例えば01NANDすると出力は111NANDすると出力は0となります。C言語ではANDしたあとにNOTをかけて「例えば:!(A&&B)」実行します。論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。(特定のビットを0にするために入力にNOTをかけてからANDすることは多いですが…)

 

NOR(否定論理和)
NOR
nor

NORORの出力にNOTをかけたものです。日本語で言うと「(AまたはB)ではない」、論理式で表すと2などとなります。つまり、足し算の否定なので入力にどれか1つでも1があった場合は出力が0となります。例えば01NORすると出力は000NORすると出力は1となります。C言語ではORしたあとにNOTをかけて「例えば:!(A||B)」実行します。NANDと同じく論理回路ではよく使われますが、マイコンのプログラムの場合は使う機会は少ないかもしれないです。

 

XOR(排他的論理和)
XOR
xor

XORは排他的論理和と言われる、少し変わった論理演算です。論理式で表すと3となります。入力の1の数が奇数の時に1を出力し、1の個数が偶数の時に0を出力します。こちらは論理回路では使う機会が比較的少ないですが、マイコンのプログラムではそこそこ使います。

 

以上の6つが論理演算ではよく使われてます。基本的には前半の3つであるANDORNOTですべての論理演算が可能です。また、NANDNOR2つでもすべての論理演算が可能です。

 

次に今回の本題であるビット演算のお話をしたいと思います。ビット演算では先ほどまで紹介した論理演算をビット単位で行います。ビット単位でのビット演算を考えるため、まずは演算を行う数値を2進数で表します。2進数表記した値を1桁ずつ論理演算するとビット演算になります。まずは、ANDORNOTXORのプログラミングにおける記号とビット演算するとどのようになるかを紹介します。

AND

C言語での記号は”&” です。論理演算の記号である”&&”と間違えないように注意してください

A 10101010

B 11110000

A & B 10100000

 

OR

C言語での記号は”|” です。論理演算の記号である”||”と間違えないように注意してください

A 10101010

B 11110000

A | B 11111010

 

NOT

C言語での記号は”~” です。

A 10101010

~A 01010101

 

XOR

C言語での記号は”^” です。

A 10101010

B 11110000

A ^ B 01011010

 

C言語ではこの4つのビット演算を使用することができます。これらを使ってレジスタの特定のビットのみの抽出などを行っていきます。

まずはレジスタの例として、atmega328PのポートBの状態(HIGHLOWか)を設定するレジスタを使ってみたいと思います。

Atmega328Pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf)のページ65の図の部分より、ポートBの出力状態を切り替えるレジスタは”PORTB”であることがわかります。
2

続いて下部のビットの一覧部を拡大します。
3

図のようにビット0PB0の状態 を制御、ビット1PB1の状態を制御…といったようになっており、各ビットに0を入れると対応するポートがLOW1を入れると対応するポートがHIGHになります。このように、1つのレジスタでPB0からPB7までの8つのピン(厳密にはPB6PC7はたいてい水晶を接続するので6ピンになることが多い)の状態を制御する仕様になっていることがわかると思います。そのため、1つのピンのみを制御しようとして、レジスタに直接値を入力するとPB0からPB7までのすべての状態が変わってしまい不都合が生じてしまいます。ここで必要なのがビット演算というわけです。特定のビットのみを操作したいときは、現在のレジスタの状態と操作するビットが立てられた(1にされた)値をビット演算で比較をします。現在のレジスタの状態はデータシートのビット一覧(上の図)のアクセス種別の表記より読み込みが可能であることがわかります。そのためこのような処理が可能というわけです。

特定のポート(ビット)のみを操作する方法を、例を使って紹介していきたいと思います。それぞれ操作する前の状態はわからない(テキトーな値)になっているとします。

1        PB4HIGHにしたいとき(ビット4のみを1にする)

現在の状態に操作するビットを立てた(1にした)値をORします。 

操作前のPORTB 10101010 (Aとする)

操作するビット  00010000 (Bとする)

A | B 10111010 PORTB

このようにすると元の状態が何であったとしても操作したいビットが確実に1に設定され、ほかのビットは何も影響を受けないことがわかると思います。これをC言語で省略せずに記述するとこのようになります。

PORTB = PORTB | 0b00010000;

ですが、操作するビットを2進数(プログラムでは”0b****”で示す)書いていては入力が大変で、読みにくいです。そのためこれを16進数(プログラムでは”0x**”で示す)に変換します。また、C言語での省略表記も合わせて使うとこのようになります。

PORTB |= 0x10;

先ほどの書き方に比べてとてもスマートになりますね。ですので、基本的にはこの書き方を使っていきたいと思います。

 

2        PB4のみをLOWにしたいとき(ビット4のみを0にする)

操作するビットを立てた(1にした)値にNOTをかけて反転させた値と現在の状態をANDします。

操作するビット 00010000 (Bとする)

~B 11101111 (操作するビットの反転)

操作前のPORTB    10111010 (Aとする)

操作するビットの反転  11101111 (~Bとする)

A & ~B   10101010 PORTB

こうすることで、操作したいビットが確実に0になり、ほかのビットは影響を受けません。C言語で書くと

PORTB = PORTB & (~0b00010000);

となり、省略系にして

PORTB &= ~0x10;

と表せます。

3        PB4のみ状態を入れ替える(ビット4が1だった場合0、0だった場合1にする)

現在の状態と操作するビットを立てた(1にした)値のXORをかけます。

操作前のPORTB 10101010 (Aとする)

操作するビット  00010000 (Bとする)

A ^ B 10111010 PORTB

元のビットの状態が逆のパターン

操作前のPORTB 10111010 (Aとする)

操作するビット  00010000 (Bとする)

A ^ B 10101010 PORTB

このようにすると操作したいビットの状態が入れ替わり、ほかのビットは影響を受けません。C言語で書くと

PORTB = PORTB ^ 0b00010000;

省略して

PORTB ^= 0x10;

と表せます。

レジスタの特定のビットのみを操作するときは基本的にはこの3つを使うことが多いと思います。ビット演算ではほかにも特定のビットのみを取り出したいときにANDを使うときもあります。方法としては元の値に取り出したいビットを立てた(1にした)値をANDします。

例えば、元の値から下4ビットのみを取り出す場合はこのようにします。

元の値    10101010 (Aとする)

取り出すビット00001111 (Bとする)

A & B   00001010

このようにすると上4ビットはすべて0で下4ビットは元の値がそのまま取り出せることがわかります。C言語で書くと以下のようになります。

C = A & 0b00001111; (元の値をA 下4ビットを取り出した値をCとしている)

省略して

C = A & 0x0F;

と表せます。(元の値がレジスタであったり、元の値を保持することが多いので、”A&=0x0F;”と書くことは少ないです。)

この方法はマイコンのレジスタから値を取り出す際や通信の際によく使う手法です。

ビット演算は以上として次回はビットシフトのお話をしたいと思います。

制御編 第1回  マイコンのハードウェア

前回まではハードウェアの設計のお話でしたが、今回からはVVVFや音楽を奏でるうえで必要なマイコンのお話をしたいと思います。

一言にマイコンと言っても実はいろいろな種類のマイコンがあります。一般的に知られているマイコン(ボード)といえばArduinoRaspberry Piなどがあります。両方ともデジタル入出力やシリアル通信などの低レベルなIO端子が搭載されていますが、この2つには大きな違いがあります。前者のArduinoはいわいる狭い意味でのマイコンで、後者はOSが入った小型のパソコンです。そのためそれぞれに得意不得意な処理があります。まずはその2つの系統の違いを紹介します。

 

Arduino系統

P_20171230_180217_vHDR_On
・基本的にOSを持たない。持っていたとしても非常に簡素なものである

・時間関係の処理の精度が比較的高い。

・コンパイルは外部で行ったうえで書きこむ。

・計算速度は比較的遅い。

 

Raspberry Pi 系統

P_20171226_135957_vHDR_Auto
・パソコンのように内部に高機能なOSを持つ。

・ほかの処理などにより時間関連の精度が低い。(OSによっては正確に処理できるものもある)

・本体でプログラムを書きコンパイルすることも可能。

・計算速度は比較的早い。

 

主な違いはこのようなところです。Arduinoの系統のマイコンは、モータ駆動回路など機械に近い部位に、Raspberry Pi 系統のマイコンは画像処理などの比較的重たい処理に向いているといえるでしょう。筆者はモータを演奏するのがメインであるためマイコンはArduinoの系統のものを使います。なのでここからのお話はArduino系統の狭い意味でのマイコンの方の話をしていきたいと思います。

 

狭い意味でのマイコンとしてArduino系統と書きましたが、実はこの中にもいろいろな種類のマイコンがあります。その中でもまずはマイコンボードとマイコンの区別をしたいと思います。

マイコン

P_20171230_173519_vHDR_On
AVRPICH8そしてARMなどマイコンのチップ単独のものである

実際に使用するには周辺回路を設計する必要があるほか、書き込み回路や開発環境などを別に用意しなければならない

またレジスタを叩く必要があるなどプログラムの難易度も比較的高い

石だけなので安いため大量生産する場合に向いている

 

マイコンボード

P_20171230_173316_vHDR_Auto
Arduinombedなどマイコンとその周辺回路が1枚の基板上に乗せられて販売されているのもの

書き込み回路が内蔵されていることが多くUSB接続などで直接書き込める。また開発環境もマイコンボードを作っているメーカーが用意してくれていることが多い

レジスタを叩かずに済む場合が多くプログラムの難易度も低いことが多い

初心者や試作に向いている

 

マイコンとマイコンボードの違いはこのような感じです。

マイコンボードで最も一般的に使われているのはArduinoで情報量やライブラリも充実していて非常に使いやすいマイコンボードと言えます。しかし、性能があまり高くないといった問題やPWM周波数が固定などモータ演奏に使うにはちょっと難があったりもします。

逆に近年はやり始めたmbedESP32などのARM系のCPUを搭載したマイコンは性能が高いという利点がありますが、情報量が少ないという問題があります。ちなみにmbedの場合はPWMの周波数を任意に変えれるようです。最近はArduinoでもARMCPUを搭載したものも出てきていますが、現状あまり普及してるとはいいがたいですね…

 

個人で基板を1枚のみ作って楽しむ場合はマイコンボードを使うと安価で楽ですが、自作の基板とのドッキングが難しくなるという問題もあります。そのため自作の基板に直接マイコンを乗せて周辺回路まで構成するということもよくありますAVRマイコンを使う場合はマイコン内部にArduinoのプログラム(ブートローダ)を入れると自作のArduinoとして使うこともできてしまいます。筆者のstepVVVFArduino Uno互換の設計をしています。

 ここまではマイコンの一般的なお話をしてきましたが、ここからは筆者がモータ演奏や初版のVVVFに使用しているAVRマイコンとその拡張である自作のArduinoのお話をしたいと思います。

まずはマイコンのハードウェアの設計のお話をしたいと思います。

今回は筆者が実際にstepVVVFに使用したatmega328Pを例にして話をしたいと思います。

まずはatmega328Pのデータシートを

https://avr.jp/user/DS/PDF/mega328P.pdf

そして、ハードウェア設計に必要なピン接続図はこちらです。

1
マイコンのハードウェア設計のうち基本回路についてはデータシートで決められたとおりに接続しなければなりません。最初にマイコンの端子とそれに対応する機能の紹介をしたいと思います。

まずは全体に共通する標準IOと外部割込み(PCINT)のお話から

各端子のピン番号のすぐ横にPB〇、PC〇、PD〇という番号があります。これがマイコンの基本的な入出力(HIGHLOWの入出力)である標準IOのポート番号と言われるものです。PBはマイコンのPORTBPCはマイコンのPORTCといったように内部的にいくつかの組に分けられており、プログラムではこのPORTごとに制御を行います。そのため、同時に操作する必要のある出力は同じポートにまとめておくとプログラムが書きやすくなります。

 

次に外部割込みPCINT)のお話です。Atmega328PではすべてのIOポートにPCINT〇〇という表記があります。これは外部割込みというピンの状態が変化したときに、動作を始めるマイコンの機能が使える端子を示しています。ただしPCINTは端子ごとに個別に割り込みを設定することができません。個別の割り込みはのちに紹介するINT〇を使わなければなりません。

 

続いてPWM出力のポートのお話です。マイコンにはPWMと呼ばれるONOFFを高速で繰り返して疑似的なアナログ信号を作り出すPWM出力と呼ばれる機能が搭載されています。この機能が搭載されているのはOCR〇□(〇には1~3の数字、四角にはAB 例:OCR0A)と書かかれている端子です。Atmega328Pの場合はピン番号が5,11,12,15,16,17の端子にこの機能が搭載されています。そしてOCR〇□のうち〇の部分に書かれた数字がタイマー番号を示していて、このタイマー番号ごとに周波数などを設定することができます。いろいろな都合上同じモータの正逆は同じ番号のポートからとると良いです。ちなみに、このONOFFを繰り返す速度を変えることで音楽を奏でることができるのです。

 

ここからは端子ごとの個別の機能を紹介していきます。

ピン番号1 この端子はマイコンのリセット機能をもつ端子です。通常の設定ではこの端子にLOWを入力するとマイコンがリセットされます。基本的に10kΩでプルアップしておきます。

ピン番号2,3 この端子はシリアル通信の機能を持っています。シリアル通信を使用するときは2番ピンが受信側、3番ピンが送信側になります。回路を設計するときにはRX,TX(受信,送信)の向きに注意してください。くれぐれもマイコンやシリアル変換アダプタのRX同士やTX同士を接続しないように…

ピン番号 4,5 この端子は個別の外部割込みの機能を持つ端子です。PCINTと違いピンごとに別々の割り込みとして処理できるほか、PCINTに比べて選べるモードが多かったりします。

ピン番号 9,10 この端子は外部クロックである水晶やセラロックを接続するポートです。マイコン内部にもクロック発生器は入ってますが遅いので、Arduionでは外部クロックとして16MHzの水晶を取り付けています。水晶を取り付ける場合は22pF程度のセラミックコンデンサも取り付けないと発振しないので気を付けなければなりません。

ピン番号 12,13 この端子はアナログ比較器機能を持っています。12,13番ピン入力電圧を比較して、条件が整った場合に割り込みが実行されます。

ピン番号 16,17,18,19 この端子はSPI通信の機能を持っています。SPI通信を使用するときはSS,MOSI,MISO,SCKの各端子に接続します。またAVRマイコンに書き込みを行うときもこのSPI端子を使用します。

ピン番号21 AREF この後に示すアナログ入力の基準となる電圧を設定するピンです。特に理由がない限りVCCに接続します。

ピン番号2328 アナログ入力 A/D変換機を通してアナログ電圧を識別できる端子です。プルグラムはAREF端子と同じ電圧が印可されたときに最大値(通常1023)、0Vが入力されたときに最小値(0)を読み取ります。

ピン番号 27,28 この端子はI2C通信機能を持っています。I2C通信を使用するときはSDA,SCL端子にそれぞれ接続します。ただしI2Cは規格上プルアップ抵抗が必須なので注意が必要です。

 

以上がマイコンの各端子の持っている機能の簡単な説明です。細かな説明はプログラムの時に紹介します。以上のことを考慮して回路の設計を行ってください。例として筆者の製作したステッピングモータやケースファンを演奏するstepVVVFの基板を紹介します。

2
この基板はタイマー02の端子にそれぞれモータを接続して、PB1,2PD7,8にデバッグ用のLED、そしてモータの出力停止をPC0~3,センサの入力をADC4,5に接続しています。また、この基板は数珠つなぎをするためシリアル通信はRXのみ接続して、TXはソフトウェアシリアルを使用するためにPD2にしています。

大体こんな感じに接続すれば使えます。

 

ハードウェア設計の最後にマイコンへの書き込み回路の紹介をします。

まずは通常のAVRマイコンの書き込み方法です。

通常AVRマイコンの書き込みにはSPI通信を使ったICSPと呼ばれる方法でマイコンに書き込みを行います。ピンヘッダーに以下のように接続を行うと書き込み回路の完成です。

3
次にArduinoとして書き込みを行うときの配線です。

4
基本的にはこのように配線を行います。注意しなければならないのはDTRピンが0.1uFのコンデンサを介してマイコンのResetピンに接続されていることです。

最後に通常のAVRArduinoの両方のモードの書き込みに対応した、書き込み専用基板の回路図を紹介します。

5
電源は書き込み用の変換基板から供給されるので省略しています。構造としてはマイコンが動作するために必要な電源端子への接続と、水晶を接続したうえで、マイコンから書き込みに必要な端子を引き出して使用しているだけの簡単な回路となっています。

製作日記2 ステッピングモータで音楽を鳴らしてみた3

前回までで子機側のプログラムが完成したので、次はマスター側のプログラムです。
1
2
マスター側のプログラムは基本的にはこれだけです。基板側のプログラムの逆の処理を行っているだけですね。また、あらかじめsetup関数内でシリアル通信の起動である「Serial2.begin(19200)」を実行しています。
使い方は、serialSent関数を第1引数に送り先のID、第2引数に周波数を入れて実行するだけです。また、音を止めるときは周波数に0を入れます。

これを音楽の分、ひたすら書くと音楽が完成ですが、書くのがあまりに大変なので、Midiファイルを読み込めるライブラリなどを使用すれば多少楽になると思います。

 

そして、そのあと格安で基板を製造できる業者を発見したので、チェナーダイオードとゲートドライバ電源の瞬停対策用のコンデンサを取り付けた基板を作り直しました。
3
4

そして届いた基板がこんなかんじ
P_20171207_185217_vHDR_Auto
安いのになかなかきれいにできました。

 

本当は実装したいのですが、部品が届かないのでケースファンを演奏してみることに

プログラムをこんな感じに書き換えて、1枚の基板で2つのケースファンを演奏できるようにします。

5

これが初期設定などです。ケースファンを演奏する場合は出力ピンのPWM機能を利用します。そしてその周波数を変更することで音楽にします。今回は8bitタイマーの位相基準PWMを使用しました。

6

これがPWMの周波数を設定する関数です。16bitタイマーに比べると出せる周波数の範囲が狭くなり、精度も悪化してしまいます。

7

これが、通信部分です。モータごとにIDを振っておき、IDの種類によって無視かどちらのモータのデータであるかの判別を行っています。

 

このプログラムでケースファンを演奏するとちゃんと演奏することはできました。ただ、まだ動画を撮れていないので動画は後日紹介します。

製作日記2 ステッピングモータで音楽を鳴らしてみた2

基板が完成したので、今回も最初は直流モータで実験。

プリンタ用のモータでは問題がなかったので、540モータでも実験を継続。しばらくは問題なく動いていました。ところが…調子にのって回していてうっかり出力をショートさせてしまい、動かなくなってしまったのです… 

その状態でしばらく通電しているとゲートドライバが異常発熱していることが判明。なのでとりあえず、ショートしたFETにつながる2つのゲートドライバを交換して、出力が出ていることを確認してから再度、モータを回します。

瞬間だけ動くような気がしたものの、動かない… もしかして、のこりの2つのゲトドラが悪さしている?とか考えて全部交換してもやっぱりだめ。ああやこうやしているうちにゲトドラの死骸が増えていきます…
P_20171103_165620_vHDR_Auto

しばらくして、ようやく原因っぽいものが判明。それは「モータからのサージ」なのです。実はこの時、電源の個数を減らすためにモータ駆動用とゲート駆動用の電源を一緒にしていたので、モータからのサージがゲートドライバに流れてしまうというものでした…

とりあえず、電源を分離して実験開始。あっさり問題なく動作しました。

 

ということで、今度はステッピングモータを回すプログラムを作成。

とりあえずは、通信なしてArduinoを使ってプログラミングをします。

1

汚いけど、一応ソースコードです。上の方で、モータの励磁ピンの配列を作成しておき、励磁のプログラムを書きやすくしています。そして、残りは音階の定義ですね。

2

続いて、初期設定と音階の設定のプログラムです。Arduinoじゃない何かが大量に混入しているとか気にしない… AVRのレジスタを叩けば軽量化した上に、処理が簡単なので…

3

次がステッピングを演奏するコアの部分です。周波数を入力すると、その周波数の音を奏でているのです。マイコンのタイマー割り込みの機能を使うことで、こんなにも簡単に書けます。ちなみに、このプログラムはレジスタを叩かなければ書けません!

 

そして、音楽を入れて演奏…


だいたい、音楽にはなっているものの、時々変な挙動をしています…

しばらくは、ステッピングモータが起動するのに若干脱調しているのだと思い込んでいました…(実は後から別の原因だと気が付きます…

 

続いて、和音を鳴らすことができるように、ID指令式のシリアル通信を実装。

最初はArduinoで書いていたのですが、ちょっとめんどくさくなったので、Arduinoのシステムを捨てて、Atmel Studioでプログラムを書くことに変更しました。

AVRのマイコンを触る時はデータシートがないとわけがわからなくなるとおもうので、こちらを参考に(https://avr.jp/user/DS/PDF/mega328P.pdf

いろいろとマイコンの内部的なお話がいろいろと書かれています。細かいところを読んでいると結構面白いですが、難しいし量が多すぎるので、必要なところだけを読んでいます。

 

とりあえず、このデーターシートを読みながらプログラムを作成

 4

最初は定義とか読み込みです。Arduinoと違っていくつかincludeしなければならないものがあります。<util/interrupt.h>は割り込みを使用するヘッダーファイル、<util/delay.h>delayを使うヘッダーファイルです。Delayを使うにはCPUのクロック数を与えないといけないので、ここで宣言をしています。(delay.hを読み込む前にF_CPUで定義)

5

ここでは、ピンの入出力の設定やタイマー割り込みの初期設定、シリアル通信の初期設定をしています。割り込みは種類がいくつかあるうちから、音楽を鳴らすのに最も適していそうな位相/周波数基準でOCR1ATOP値とした割り込みにしています。シリアル通信についてはArduinoと通信する関係で、通信速度以外この設定以外にはできません…

 
6

次は、入力された周波数から、その周波数分のパルスを生成する割り込みの設定を行う関数です。OCR1AでタイマーのTOP値を変更することで、割り込みの周波数を自由に変更できるという、マイコンの機能を使用しています。また、OCR1Bの割り込みを併用してduty比を落とせるようにしています。
実は先ほどのArduinoの時はタイマーのTOP値をICR1にしていたのですが、データシートを読んでいると、周波数変更をする場合はOCR1AをTOP値にするべき、と書かれていたのです…さっきの音がおかしくなっていた原因はこれだったというわけです。

7
そして、これがステッピングモータのパルスを生成するプログラムの実行部分です。割り込み処理を使うことで、ここまで簡単にパルス生成とduty比を下げるプログラムが書けてしまいます。

 
8

そして、これが今回のメインである通信の処理部分です。シリアル通信のデータを受信すると、この割り込み処理が開始され、最初に受信データを読み込みます。その後、データの最上位bitを解析し、最上位bit1であればID信号を意味するので、ID受信のモードに入ります。受信したIDが自分のIDと同じであれば、続行のデータを受信できるようにします。そして、受信データのバッファーのクリアを行います。(配列を最初に戻す)

自分のID宛ての情報だった場合で最上位bit0であった場合は、バッファーにデータを蓄えていき、既定のデータ数に達すると、バッファーのデータから周波数を抜き取ります。最終的に、パルス生成の割り込みの設定の関数へ周波数を引き渡すことで、モータを演奏します。

 

汚いソースコードですが、このような感じで複数のモータを1つのシリアルで管理できるようにやってみました。マイコンの機能を有効に使えば、案外簡単にかけてしまうのです。

 

続きは次回

製作日記2 ステッピングモータで音楽を鳴らしてみた1

 前回は高電圧でいろいろと問題を起こしてしまったので、今回は低圧で音を奏でることが可能なステッピングモータを演奏することにしました。前回のVVVFでモータにかける電圧を上げると音量が大きくなることが分かったので、今回は30Vまで印可できる仕様に、そして電流も過電流に耐えるように、駆動部はICを使わずにディスクリートの部品を使うことにしました。そして、シリアル通信を使って、和音の再生も可能にして、音楽をよりきれいに再生できるように考えてみました。

 

 まずはシステムの構成から

1
システムとしてはマスターのArduinoに音楽信号を保存するかPCから音楽のデータを受信し、その信号をマスターArduinoに接続されたstepVVVFID信号を合わせて送信します。自分と同じIDのデータを受信したstepVVVFは受信したデータから周波数を読み出し、その周波数で演奏を行います。IDを変えることで演奏先を変更できます。また、ゲート駆動用の電源は、駆動用の電源電圧が12V~14Vの時は接続を不要にしているため、12Vでステッピングモータを駆動させる時は配線が2本のみで済みとてもスッキリとしています。

 

まずは回路の設計を始めます。

前回はゲートドライバにIR2110を使いましたが、デッドタイム自動挿入機能がないという欠陥がありました。今回はRSで安くてかつ出力電流が大きめ、そしてデッドタイムの調整が可能という面白いゲートドライバ「L6384E」を使用することにしました。

ということで6384Eの英語のデータシートを端から端まで読んでみることに…

http://www.st.com/content/ccc/resource/technical/document/datasheet/group0/d3/35/0e/fc/db/e1/45/52/CD00169715/files/CD00169715.pdf/jcr:content/translations/en.CD00169715.pdf

2
内部構造はこんな感じと… どうやらブートストラップダイオードは内蔵されていると… そして入力はプルダウンでSDはプルアップっぽくなっていると

3
ピン配置はこんな感じで入力ロジックレベル的には、5Vあれば十分で、SD/DT端子に0.5V以下をかけると出力がシャットダウンされると。他は特に注意する点はなさそう

4
SD/DT端子に接続する抵抗器の大きさでデッドタイムが設定できる模様。今回は250ns200nsの中間をとって100kΩにすることにしました。

そして最初は気が付かなかった個所が、その下で、Vccth1,2です。上の方の定格のところに電源電圧が0.3~14.6Vって書いていたので、この範囲なら動作するんやなあーと思っていて、電源の電圧を9Vにしたら動作が止まって??ってなって調べてみると、電源電圧が一定を下回ると自動的に出力がダウンされる機能がついていたことが判明したのです… (あとから考えれば内部の半導体が、電圧が低いと動かないとかゲート電圧が落ちるとMOSFETの発熱が増えることへの安全対策かなあと…)

そして、アプリケーションノート(http://www.st.com/content/ccc/resource/technical/document/application_note/5c/00/05/fd/e5/65/46/97/CD00004008.pdf/files/CD00004008.pdf/jcr:content/translations/en.CD00004008.pdf)を読んでいると、18ページくらいに周波数が低い時で大容量のコンデンサをつける場合は外付けのダイオードを取り付けることを推奨するみたいなことが書かれていたので、一応、ブートストラップダイオードは取り付けることにしました。(100Hzでの駆動を想定して、ゆとりを持たせるとコンデンサが10uFになったので…)

ゲート抵抗とかその辺は適当に選びます。フォトカプラは前回と同様にTLP785を使用しましたが、スイッチング速度改善のために、プルダウン抵抗を680Ωに変更しました。(本当は高速なフォトカプラを使うべきなのですが…)

マイコンにはArduinoUNOにも用いられているAtmega328Pを使い、周辺回路もArduino準拠にして、プログラムをArduinoでも書けるようにしました。また、デバッグ用のLED4つ、電流センサ等に使えるアナログ入力を2つ搭載しました。今回は複数基板を数珠つなぎにするので、シリアル通信は、RXは通常通り配線しますが、TXは並列接続できないので、適当なピンでソフトウェアシリアルにすることに…

MOSFETは秋月で1つ50円で売られていたEKI04027を採用。耐電流は放熱板なしで計算して、約24Aでした。普通のICのモジュールと値段が大して変わらないのにこの耐電流はすごい… おかげで540モータも演奏できることに ポリスイッチは12A遮断を2つ並列で24A遮断にしました。

そして出来上がった回路図がこちら

main-1

続いて、プリント基板を設計

前回設計したstepVVVFは基板がスカスカであったのに、部品同士の干渉があるなどの不具合があったので今回は反省して部品同士が正しく取り付けられることを確認しながら設計することにしました。そして、前回に比べて大幅な密度アップをしました。

6

ついでにマイコンの書き込みボードも搭載しています。

 

Dビューがこちら

7
前回までの基板と比べると、大幅に高集積になってることがわかると思います。

 

このデータをElecrowに発注。

P_20171021_184418_vHDR_Auto
今回も黒色基板にしました。(左の基板は次の工作の分)

 

これを実装するとこんな感じ

P_20171102_184243_vHDR_Auto
ポリスイッチがしばらく届かなかったので、とりあえずはジャンパー線で代用しました。

実は今回はコスト削減のために部品を一部をebayで購入したので、届くのが遅かったのです…(実は当初はMOSFETebayで購入していたのですが、偽物が届いて急遽MOSFETを変更して、ポリスイッチも変わったという…)

続きは次回

製作日記 VVVFをつくってみた その2

前回からの続きです

 

とりあえずは直流モータ回してみよーってことで、直流モータを回してみる。

だが、ある程度の周期で回転が止まるという事故が発生…

ブートストラップコンデンサの容量が足りていなかった、という問題と、ブートストラップの使い方を間違えていたということが判明して、コンデンサを交換して対処。

P_20170913_185321_vHDR_On
 

問題がないことを確認できたので今度は誘導モータを用意

P_20170826_173903_vHDR_Auto


風切り音がすごいので音量に注意してください

とりあえずは、低圧で実験してみました。結果モータは回転したので、ちょっとずつ電圧を上げてみます。40Vぐらいまで実験して、問題がなさそうだったので、今度はDC280V(リップルがあるので厳密には平均DC260~270ぐらい)をかけてみることに。

「パチッ」という音とともにヒューズが飛んだ…

なんでだーと思ってもう一度低圧に戻してみると、どうやらどうやら瞬間的に過大電流が流れてる?なことが判明。実はプログラムでデッドタイムを入れていたはずが、ミスでうまく挿入されていないことが判明。ここでIR2110のゲトドラにデッドタイム自動挿入機能がないことも判明… 

とりあえずプログラム側で修正して、実験継続

 


モータからの異音に注意してください

今度は変な音がするなあと思いながらも、「回ったー」と思ってしばらく眺めていたら、またも「パチッ」と音がして停止…

あれれ…なんでだーと思ってヒューズを変えてもまた切れる… そして挙句の果てにはIGBTがお亡くなりに… 

いろいろと試しているうちに、どうやら非同期から同期に切り替わるタイミングかその逆でヒューズが切れていることが判明。プログラムを確認したら条件によって、デッドタイムが入らないことがわかって、修正

今度は問題なさそうだったので、今度はシリアル通信を追加 なんだがどうやら割り込みで失敗するのか、たまにモータから異音… 仕方がないのでシリアル通信は諦め…


P_20170909_133204_vHDR_Auto
とりあえずは京急もどきの音が流せたので、100円ショップでかった網の箱にVVVFのユニットを挿入して完全防止を図ることに

 


しばらく京急もどきの音を流して問題がないことを確認して、とりあえずは終了。(再現ではないので音はめちゃくちゃです…)

この後は本物を音を再現しようと思ってたのですが、シリアル通信だけで間に合わないくらいの処理速度ではちょっと無理があるなあということで、デッドタイム自動挿入のゲートユニットを設計することに、続きはかなり先に実施することに変更しました。

壊した部品はヒューズが10本くらい、そしてIGBT2つ… 自分の実力のなさが浮き彫りになった一作目の工作でした。

ギャラリー
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • HDDを演奏する楽器を作ってみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
  • 制作日記5 細かな基板を注文してみた
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: