モータの鳴らし方byHanDen

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

制御編 第11回 マイコンのタイマー割り込み その2

文字数の関係の記事を2つに分けています。今回は前回の続きです。

サンプルプログラム

 今回のサンプルプログラムは、「frequency」変数に入力した周波数(パルス)数でステッピングモータを回転させるプログラムです。回転数に応じてduty比を変化させており、2相励磁となっています。

 

#include <avr/io.h>

#include <avr/interrupt.h>//割り込みのライブラリ

 

void setSquareWave(int freq); //矩形波の周波数設定

 

volatile uint8_t vect = 0;//角度

volatile uint8_t duty_h = 0;//duty125以上

volatile int frequency = 500;

 

volatile double duty = 0;

uint8_t PD[5] = {0x08, 0x20, 0x00, 0x40, 0x08};//ステッピングモータ励磁状態の配列

uint8_t PB[5] = {0x00, 0x00, 0x08, 0x00, 0x00};//この値をPORTに入れる

 

int main(void)

{

         DDRD = 0x68;//PWMピンを出力設定

         DDRB = 0x0F;

               

         //矩形波生成タイマー設定

         TCCR1A = 0x03; //PWM出力なし位相/周波数基準 OCR1A max

         TCCR1B = 0x1B; // 64分周

         TIMSK1 = 0x00; //割り込み停止

         setSquareWave(frequency);//周波数セット

         sei();//割り込み開始

       

    while (1)

    {

    }

}

 

void setSquareWave(int freq) {

  if (freq < 500) duty = 80; //duty比設定//90

  else if (freq < 1000) duty = 120;//120

  else if (freq < 1500) duty = 190;//150

  else duty = 230;//200

 

  if (freq != 0) { //動作

    TIMSK1 = 0x00;  //割り込み禁止

    //TCCR1B = 0x1B;//64分周 /2 250,000回カウント

    OCR1A = (unsigned int)(250000 / freq) ; //割り込み周波数

        if(duty <= 125){ //duty比が低い時(実質1相励磁)

                OCR1B = OCR1A * (duty / 125.0);

                duty_h = 0;//duty

        }else {//duty比が高い時(2相励磁)

                OCR1B = OCR1A * ((duty -125.0) / 125.0);

                duty_h = 1;//duty

        }

   

    TIMSK1 = 0x05;//OVFと比較Bの割り込み許可

   

    DDRC = 0x00;//出力オフ(Hi-Z)

 

  } else  { //停止

    TIMSK1 = 0x00;  //割り込みなし

    PORTD &= ~0x68;

    PORTB &= ~0x08;//出力L

    DDRC = 0x0F;//出力ダウン

  }

}

 

ISR(TIMER1_OVF_vect) { //オーバーフロー割り込み

        vect++; //進める

        if (vect > 4) vect = 1; //OVF

        PORTD |= PD[vect];

        PORTB |= PB[vect]; //出力

 

}

 

ISR(TIMER1_COMPB_vect) { //矩形波割り込み

        if(duty_h){

                PORTD &= ~PD[vect - 1];//1つ前の出力OFF

                PORTB &= ~PB[vect - 1];//1相励磁

        }else{

                PORTD &= ~PD[vect];//出力OFF

                PORTB &= ~PB[vect];//1相励磁

        }

       

}

 基本的なレジスタ設定はPWM出力に準じています。また、ステッピングモータのduty比の設定は溢れ割り込みと比較一致割り込みを組み合わせることで実現しています。ステッピングモータの励磁状態は配列に入れた値を使うことで処理の簡略化を実現しています。

そして、割り込みを使用するにあたって注意しなければならないのが、割り込み用のライブラリである<avr/interrupt.h>を読み込まなければならないことと、割り込み処理はISR(*****)」の関数を使う必要があるということです。また、ISR関数の引数(*****)(マクロともいう)は割り込みの種類ごとに異なるので注意しなければなりません。Atmega328Pにおけるタイマー割り込みの場合はISR関数の引数は以下の表のようになります。

8

割り込み処理の内容はISR関数に上の表の引数を入れること(サンプルプログラム参照)で実行ができます。ここで引数を間違うと割り込み処理ができないので注意が必要です。(コンパイルが通る場合もあるので注意)

以上でタイマー割り込みの設定は終わりです。次回は割り込み処理の引数(マクロ名)の探し方を紹介したいと思います。

制御編 第10回 マイコンのタイマー割り込み その1

前回はマイコンからPWMを出力するお話をしましたが、今回はタイマー割り込みのお話です。前回のPWMはマイコンのタイマー機能を利用していましたが、今回のタイマー割り込みもタイマーを使っています。とはいえ「割り込みってなんやねん」って思う方もいると思うので最初に軽く割り込みについて紹介します。

 

割り込みとは

 割り込みは、設定したトリガが発生した時に強制的に特定の処理をさせることを意味しています。トリガが発生した時にたとえ他の処理を行っていたとしても、割り込みに指定された処理を強制的に実行するため、トリガ発生時に確実な処理が可能になるというわけです。これを図示すると下の図のようになります。
1

 図からも、通常の処理を行っているときにトリガが入ると強制的に割り込み処理を開始し、割り込み処理が終了するまでは他の処理が中断されることがわかりますね。(Atmega328Pなどの1スレッドのマイコンの場合)

 

タイマー割り込みとは

タイマー割り込みでは、このトリガが「タイマー」によって発生します。つまり、一定の時間ごとに割り込み処理を行えるということです。ステッピングモータを回すパルスを発生させるときなど正確な時間間隔で似た処理を行いたいときなどに非常に使い勝手の良い処理と言えますね。それでは、続いてAtmega328Pにおけるタイマー割り込みの原理を紹介していきます。

タイマー割り込みは前回紹介したPWMと同様にマイコンのタイマー機能を使っており、マイコンのタイマーのカウンタがある状態になった時に、トリガを発生させるという仕組みです。ここでの、ある状態とは、タイマーがカウントの数がオーバーフロー(溢れ)した時比較値PWM生成の時の閾値 OCR0Bなど)と一致した時などを指します。つまり、タイマーのカウントが特定の値に達した時に、割り込み処理が実行されるというわけです。このタイミングを図示してみます。
2

 上の図がタイマーのカウンタがオーバーフローしたときの割り込み(マイコンではこれを溢れ割り込みと言います)を示しており、タイマーのカウンタがオーバーフローする↓で示したタイミングで割り込み処理が行われます。ただし、この溢れ割り込みのタイミングはタイマーの動作種別によりタイミングが変わります。(詳細は次の節)また、同様に下の図はタイマーのカウンタが比較Aに達した時の割り込み(比較A割り込み)を示しており、↓で示したタイミングで割り込み処理が実行されます。

 

タイマー割り込みの注意点

 先ほどの節でタイマー割り込みの原理を紹介しましたが実際にタイマー割り込みを使用するにあたって注意しなければならない点が複数あります。1つ目は溢れ割り込みのタイミングで2つ目は比較・捕獲割り込みのタイミング、3つ目はTOP値と比較・捕獲値の関係です。

溢れ割り込みのタイミング

 溢れ割り込みは定義上はカウンタの値がオーバーフローした時の割り込みです。しかし、溢れ割り込みでオーバーフローした時に割り込みが入るのはデータシート上「標準動作」と「比較一致タイマ/カウンタ解除(CTC)動作」のみであるということに注意しなければなりません。すなわちよく使われる、「高速PWM動作」「位相基準PWM動作」、「位相/周波数基準PWM動作」においてはタイマーのカウンタがオーバーフローした時に割り込みが実行されないというわけです。Atmega328pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )P.99(タイマー1)を確認すると、このことの記載がされており、タイマーの動作種別によりタイミングが異なると書かれています。そのタイミングはタイマー動作種別の表(以下に引用)に書かれています。
3
4

上が8ビットタイマーで下が16ビットタイマーの場合です。それぞれの表の右端の赤で囲んだ「TOV1設定時」の項目に溢れ割り込みが入るタイミングが書かれています。これより「高速PWM動作」ではタイマーのカウンタが「TOP値」に達した時、「位相基準PWM動作」「位相/周波数基準PWM動作」ではタイマーのカウンタが「BOTTOM(0)に達した時に割り込みが動作することがわかります。これを図示してみます。
4-1
 図を見れば「高速PWM動作」はTOP値で割り込みが入っていますが、TOP値は同時にBOTTOM値でもあるのでどちらかというと溢れ割り込みは、タイマーのカウンタが0になったタイミングで入ると考えても問題はないでしょう。以上が溢れ割り込みの動作のタイミングの注意点です。

 

比較・捕獲割り込みのタイミング

 比較A,B割り込みや捕獲割り込みはタイマーのカウンタの値が比較A,B(OCR*A,B)や捕獲値(ICR1)と一致した時をトリガとして割り込みが入ります。原理上はこれだけなのですが、タイマーの動作種別により割り込みが入るタイミングや回数が変わることに注意しなければなりません。割り込みが入るタイミングを図示してみます。
4-2
 この図を見れば、高速PWM動作ではカウンタ1周期の間に割り込みが1回で等間隔に割り込みが入るのに対して、位相(/周波数)基準PWM動作ではカウンタ1周期の間に2回割り込みが入り割り込みが入るタイミングが等間隔でないことがわかります。割り込み動作の時はカウンタが上昇時と下降時の区別がされずに単に値が一致した時がトリガとなるためこのような動作となります。

 

TOP値と比較値との関係

 この関係はタイマーのカウンタのTOP値と比較値が一定の関係にならないと割り込みが入らないことを示しています。割り込みが正しく入る条件はこのような関係です。

比較値≦TOP

この関係も原理から考えると非常にやさしいものですが2つの値の関係よってどのようになるかを図示してみます。
5

比較値とTOP値の関係を「比較値>TOP値」「比較値=TOP値」「比較値<TOP値」の3つの場合を図示してみました。この図を見れば、「比較値>TOP値」の時に割り込みが一切入らなくなることは明らかですね。また、「比較値=TOP値」はカウンタがTOP値に達した時に割り込みが入るため、カウンタ1周期につき1しか割り込みが入らないこともわかると思います。

 

以上の3つが割り込みを使うときの大きな注意点となります。続いて、各種レジスタの設定方法ですが、波の形と最大高さ関連の設定は前回のPWMの記事http://vvvf.blog.jp/archives/7662206.html)を参考に行ってください。ここではタイマー割り込みにおいてPWM出力時と異なるレジスタ設定の項目を紹介します。

 

割り込みのレジスタ設定

 6

初めに、各出力ポートの設定です。今回はPWM出力を利用しないので、すべて「標準ポート動作」(COM*x: 0 0)を選択します。TCCR0A,BTCCR1A,BTCCR2A,Bのその他の設定はPWMの時と同じようにしてください。

続いて、割り込み動作の許可の設定です。
7

この割り込み許可レジスタで、各種割り込みを許可する設定を行っています。利用する割り込みのビットを立てることで、割り込みが使用できるようになります。なお、捕獲割り込みは「ICR1」と一致時、比較一致割り込みは「OCR*A」「OCR*B」と一致した時に割り込みが入ります。

以上でレジスタの設定は終了ですが、割り込みを使用するにはプログラムですこし変わった書き方が必要となります。各レジスタの実際の設定値と合わせて、次のサンプルプログラムのところで紹介します。

 

文字数の関係でサンプルプログラムはその2に続きます

制御編 第9回 マイコンのPWM出力 その2

前回は任意の周波数のPWMを生成するためのパラメータを決定しました。今回はその決定したパラメータを実際にプログラムに落とし込む方法を紹介します。

レジスタの設定

いままでの計算で目的の周波数のPWMを出力する設定は見つかりました。今度は実際にその設定をレジスタに入力していきます。設定情報は毎度のごとくAtmega328Pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )から探します。タイマー0のレジスタ設定はP76~78、タイマー1のレジスタ設定はP94~96、タイマー2のレジスタ設定はP112~114に書かれています。なお、8ビットタイマーの「タイマー0,1」と16ビットタイマーの「タイマー1」は分けて紹介したいと思います。

 

8ビットタイマー

8ビットタイマーは「タイマー0」と「タイマー2」に搭載されていますがほぼ設定内容は同一なので「タイマー0」を基準に紹介していきます。(分周のところだけ違うのでそこだけ別途説明します)タイマー0における、PWM出力の設定レジスタは「TCCR0A」と「TCCR0Bです。また、可変周波数PWMを行う場合の波の高さは「OCR0Aレジスタに、duty比を設定する閾値は「OCR0Bレジスタに入力します。それでは、各レジスタの中身を見ていきましょう。

1
2
3
4

PWMを生成するのに使用するレジスタはこの4つですが、下の2つのレジスタは数値を入力するだけなので、詳細な説明は省略します。上の2つのレジスタは各ビットの状態を使ってさまざまな、設定を行っています。それぞれの設定項目別に紹介をしていきます。

OC0Aの端子の出力設定(比較A出力選択)TCCR0Aの第6,7ビット」
5

この項目で確認する必要があるのは、図の赤で囲んだところです。PWMの動作種別(波の形)によって「高速PWM比較A出力選択」か「位相基準PWM動作比較A出力選択」を確認して下さい。波の高さを可変する可変周波数PWMを出力する場合は、ここで出力設定をするOC0A」端子に対応する、比較レジスタ(PWM生成の閾値)が波の高さを設定するレジスタそのものであるため、この端子からPWMを出力することはできません。そのため、可変周波数PWMを使用する場合は図の赤で示した「標準ポート動作(OC0A切断)」を選択します。つまり、COM0A1,COM0A0ともに0となります。

可変周波数PWMを使わず、限られた周波数のPWMのみを出力する場合は「OC0A端子もPWM出力が可能となり、その場合は図の青←で示した「比較一致でLow…」「上昇計数時の比較一致でLow…」の設定を選択します。

 

OC0Bの端子の出力設定(比較B出力選択) TCCR0Aの第4,5ビット」

 6

この項目の中身自体は先ほどの設定と大差なく、確認する箇所も同じですが、可変周波数PWMを使用する場合は設定する内容が違うことに注意が必要です。ここで設定を行う「OC0B」端子は、可変周波数PWMを行う場合ではPWMが出力される端子です。そのため、図の赤←で示した「比較一致でLow…」「上昇計数時の比較一致でLow…」、つまり「COM0B1:1, COM0B2:0」を選択しなければなりません(データシートのレジスタの項目名は間違いです)この設定をしないとPWMが正しく出力されないので注意が必要です。(なお、COM0A1,2:11を選ぶと出力波形が反転します)

 

タイマー波形選択TCCR0Aの第0,1ビット、TCCR0Bの第4ビット」
7

ここの項目ではタイマーで生成される波形の種類を選択します。可変周波数のPWMを生成する場合は波の高さを変更できるようにする必要があるため、TOP値をレジスタで設定できる項目を選ばなければなりません。そのため、図の赤の←で示したTOP値が「OCR0A」で定義できる設定を選択します。波形が三角波の「位相基準PWM動作」を選択する場合赤←1で示した「TOP:OCR0Aの位相基準PWM動作」(WGM02:1 WGM01:0 WGM00:1)を選択します。また、波形がのこぎり波の「高速PWM動作」を選択する場合赤←2で示した「TOP:OCR0Aの高速PWM動作」(WGM02:1 WGM01:1 WGM00:1)を選択します。

可変周波数のPWMを使用しない場合は図の青←で示したTOP値が「$FF(255)」の項目を選択します。

 また、この設定項目を保存するレジスタはWGM01WGM00が「TCCR0A」、WGM02が「TCCR0B」と2つに分かれていることに注意しなければなりません。

 

分周選択
8

この項目では、タイマーに使う分周の値を選択します。必要な分周に応じた項目を選択してください。ただし、この項目は同じ8ビットタイマーでも「タイマー0」と「タイマー2」で選択肢が異なるので注意してください。上の画像は「タイマー0」の設定です。「タイマー2」の場合は以下のような選択肢に変わります。
9

このように、同じ分周数でもレジスタに設定する値が変わってくるので注意が必要です。

 

レジスタの設定例

これまでに説明した、手順で実際に任意の周波数のPWMを出力する設定を紹介します。

今回はシステムクロック16Mhzで出力PWM1kHzとし、タイマーの波形は位相基準PWMとした場合です。また、duty比は0.5としておきます。

初めに、分周値とTOP値を選定します。(分周は64として代入)
式

計算結果より、TOP値は125となり使用可能範囲であるため、設定パラメータは分周64TOP125とします。

各レジスタに設定した値を入力していくと以下のようなパラメータとなります。なお、赤字は関係ないor設定できない項目なので0にしています。
10
11
TOP値を定義する「OCR0A」とduty比を設定する閾値を定義する「OCR0B」には以下のように値をそのまま入力させます。

OCR0A=125

OCR0B=OCR0A*0.5=62

このように設定することで任意の周波数のPWMを生成することができます。

 

16ビットタイマー

 16ビットタイマー(タイマー1)の場合も8ビットタイマーと同様に設定を行っていきます。データシートのP94~96より、PWMの設定レジスタは「TCCR1A」と「TCCR0B」となっています。そして、可変周波数PWMを使う場合の波の最大値は「OCR1AorICR1」、PWM生成の閾値は「OCR1B」となっています。後者の3つのレジスタは値を設定するレジスタです。16ビットタイマーなので設定できる値は16ビットとなりますが、あくまでAtmega328P8ビットマイコンなので8ビットのレジスタを2つ使う形となっています。

 8ビットタイマーとシステムが近いので違いがある点を絞って紹介をしていきたいと思います。まずは、設定レジスタである「TCCR1A」と「TCCR1B」の中身を見てみます。

 12
13

設定レジスタの中身はこのようになっており、タイマーの波形選択である「WGMn」以外の設定は8ビットタイマーと同じ設定です。今回は8ビットタイマーと設定が異なる波形の形の設定を見てみましょう。

タイマー波形の選択TCCR1Aの第0,1ビット TCCR1Bの第3,4ビット」
14

8ビットタイマーに比べて設定項目が非常に多くなっています。8ビットタイマーとの違いは主にTOP値の選択項目が多くなっているということで、0x00FF」「0x01FF」「0x3FF」「OCR1A」「ICR1」と5種類のなかから選ぶことが可能になります。可変周波数PWMを使う場合は赤色の←示した「TOPOCR1Aの位相/周波数基準PWM動作」(WGM1: 1 0 0 1)TOPOCR1Aの高速PWM動作」(WGM0: 1 1 1 1)を選択すると良いでしょう。また、可変周波数PWMを使わない場合でほかの8ビットタイマーと同様に使いたい場合は青←で示した「TOP0x00FF8ビット位相基準PWM動作」(WGM1: 0 0 0 1)や「TOP0x00FF8ビット高速PWM動作」(WGM1: 0 1 0 1)を選択すると良いでしょう。

16ビットタイマーでもほかの設定は8ビットタイマーと同じなので省略します。次に波の高さ(TOP値)やPWMを生成する閾値を設定するレジスタを見てみます。
15

Atmega328Pはあくまで8ビットマイコンなので16ビットの値を1つのレジスタとして扱うことができません。そのため、内部的には下位バイトと上位バイトの2つのレジスタに分けられていますが、Atmel Studioではこれら2つをまとめて「OCR1A」として扱うことが可能になっています。そのため、ほかの8ビットタイマーなどと同様の感覚で使うことが可能です。(この書き方ができない環境の場合はビット演算とビットシフトを使って、それぞれのレジスタに書き込みをする必要があります)

 

レジスタの設定は、8ビットタイマーの時と同様に行います。

 

サンプルプログラム

今回は、ある変数に入力された周波数のPWMを生成するプログラムをサンプルとして紹介したいと思います。今回はタイマー0を使用しDuty比は31%に固定としています。

#include <avr/io.h>

 

volatile int freq = 1000; //出力周波数

volatile double duty = 80; // 80/2550.31331%

 

int main(void)

{

         DDRD = 0x68;//PWMピンを出力設定

         DDRB = 0x08;

         //矩形波生成タイマー設定

         TCCR0A = 0x01; //PWM出力停止 位相基準 OCR0A max

         TCCR0B = 0x0C; // 256分周

 

TCCR0A &= ~0x20;//PWM停止

if((freq > 125) && (freq < 2000)){

                TCCR0B = 0x0C;//256分周

                OCR0A = (unsigned int)(31250 / freq) ; //割り込み周波数

                OCR0B = OCR0A * (duty / 250.0);

                TCCR0A |= 0x20;//PWM起動 OCR0Bのみ

}else if((freq > 50) && (freq < 125)){

                TCCR0B = 0x0D;//1024分周

                OCR0A = (unsigned int)(7812 / freq) ; //割り込み周波数

                OCR0B = OCR0A * (duty / 250.0);

                TCCR0A |= 0x20;//PWM起動 OCR0Bのみ

}else if((freq > 2000) && (freq < 7000)){

                TCCR0B = 0x0B;//64分周

                OCR0A = (unsigned int)(125000 / freq) ; //割り込み周波数

                OCR0B = OCR0A * (duty / 250.0);

                TCCR0A |= 0x20;//PWM起動 OCR0Bのみ

}

 

    while (1)

    {

}

 

プログラムとしては、TOP値が8ビットに収まる範囲で場合分けをして分周を区切っています。また、プログラム実行中の周波数を変更も視野に入れたため、念のためPWM周波数を変更する処理を行うときはPWM出力を一旦停止させています。TOP値の計算は前回紹介したものをあらかじめ計算可能な場所のみ計算したものを使用しています。

 

以上で任意の周波数のPWMを出力する方法の紹介は終わりです。次はタイマー割り込みのお話を予定しています。


制御編 第8回 マイコンのPWM出力 その1 可変周波数PWMの理論とパラメータ決定

前回はデジタル入出力のお話をしましたが、今回は疑似アナログ出力ともいわれるPWMの出力を紹介します。PWMと言ってもなにかわからないかもしれないので、まずは、PWMがどんなものであるかをお見せしましょう。
1
この図の波形は電圧の波形を示しています。PWMというのはこのようにONOFFを高速で繰り返して、疑似的にアナログ出力を行おうとするものです。出力電圧は以下の式で表せます。

Vin:入力電圧[V]

Vout:出力電圧[V]

T:PWM周期[s]

t:ON時間[s]

Vout=Vin×(t/T)

つまり、ONの時間とOFFの時間の割合を調整して、0Vから入力電圧の範囲でいろいろな電圧を作り出せるというわけです。そして、PWM周期とON時間の比をデューティー比と言います。

そして、モータを演奏するうえでは非常に有用なのがPWM周期です。PWM周期が短くなると高い音周波数が高い音)が出て、PWM周期が短くなると低い音周波数が低い音)なります。ちなみに、周期から周波数は以下の式で変換できます。

f:PWM周波数[Hz]

f = 1/T

この式より、PWM周期が大きいとPWM周波数が低くなり低い音が、PWM周期が小さいとPWM周波数が高くなり高い音が出ることがよくわかると思います。つまり、モータ演奏はこのPWM周波数を調整して音色を演奏するというわけです。この章では、PWMの出力方法はもちろん、PWMの周波数の変更方法も紹介していきます。

 

マイコンのタイマーの動作

マイコンのPWM出力はArudinoでいうdelay()のようなものを使って、手動でONOFFを繰り返して出力するものではありません。マイコンのPWMはマイコン内部に搭載されているタイマーと呼ばれる機能を使って、波形を生成しています。

今回使用している「atmega328P」の場合はタイマーが3つ搭載されており、内部の最大カウントが8ビット(255)の8ビットタイマーが2つ、最大カウントが16ビット(65535)16ビットタイマーが1つ搭載されています。それぞれのタイマーで出せる周波数やデューティー比の精度が大幅に変わってきます。(もちろん16ビットタイマーの方が精度を出しやすい)

話ばかりでは、分からないと思うので、実際にマイコンのタイマーがどのようなものであるかをデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )から見てみましょう。データシートの89ページからタイマーについて書かれているページがあります。

はじめにタイマー全体の概要を紹介するために例として、高速PWM動作を使ってみます。
2

マイコンのタイマーは、内部的に図の→で示したようなのこぎり波を描くカウンタがあります。時間(CPUのクロック数)に応じてこのカウンタの値が変化し、こののこぎり波と閾値を比較してPWMの波形を生成しています。CPUのクロック数に応じてPWMの波形を生成しているため、一定で正確なPWM周波数とデューティー比を出力できるというわけです。PWMは図で示したように、のこぎり波の値が閾値より小さい時ON状態になっていて、閾値より大きい時にOFF状態となってことがわかります。

マイコンでは、この上下する波形の形や、最大高さ傾き変更することができます。これらの変化させることで、生成するPWMの周波数を変更することができます。ここからは、波形の形、最大高さ、傾きによりPWM周波数が変えれることを紹介していきます。

 

波形の形

波形の形は2種類あり、先ほど示したようなカウンタが最大値となると0に戻るのこぎり波を描くタイプと、カウンタが最大値になると値が降下し始める三角波を描くタイプの2種類があります。この2種類の波形は動作種別により設定ができます。前者のタイプの波形は「高速PWM動作」を選んだ場合に生成され、後者のタイプの波形は「位相基準PWM動作」または「位相/周波数基準PWM」を選んだ場合に生成されます。

傾きと最大高さが同じ場合に、PWMの出力波形がどのようになるかを図示してみます。
3

この波形の図からもわかるように、のこぎり波を生成する「高速PWM動作」で生成されるPWM周波数は、三角波を生成する「位相基準動作」「位相/周波数基準動作」(位相/周波数基準動作はタイマー1のみ)で生成されるPWM周波数の約2倍の周波数になっていることがわかります。(約とつけたのは、完全な2倍ではないため)これによって、PWM周波数を2倍に変化させることはできますが、これだけでは音色を奏でることはできません。 そのため、ほかのテクニックを組み合わせる必要があります。

また、データシートの「位相基準動作」のページを確認すると、「位相/周波数基準動作」が使えるタイマー1の場合はTOP(波の最大高さ)を変更する場合は、「位相/周波数基準動作の使用を推奨する」と書かれています。そのため、今回使用する動作種別は「高速PWM動作」と、「位相/周波数基準動作」(タイマー1)or「位相基準動作」(タイマー0,1)をタイマーに応じて使い分け、各波形ごとに1種類の種別を使うことにします。

 

波の最大高さ

先ほどは、波の形を変えて周波数を変化させようとしましたが、今度は波の最大値(高さ)を変化させてPWM周波数を変化させる方法を紹介します。

傾きが同じ場合に最大値を変化させると生成される周波数が変化するというわけですが、言葉ではわかりにくいと思うので、どのようになるのかを図示してみます。
3

この図から、傾きが同じでも波の高さを高くすればPWM周波数は低くなり、高さを低くすればPWM周波数が高くなることがわかります。これより、PWMの周波数は波の高さに反比例することがわかると思います。

 波の最大高さの設定は、PWMの出力の設定によって可否が変わります。周波数を可変するPWMを生成する場合は、最大値が固定ではなくレジスタで設定できるものを選びます。(可変しない場合はTOP値0xFF(255)のものを選ぶ)8ビットタイマーである「タイマー0」と「タイマー2」の場合は波の最大高さはOCR0A」、「OCR2A」のレジスタで設定できます。また、16ビットタイマーである「タイマー1」の場合は波の最大高さを「ICR1」かOCR1Aで設定できますが、PWM周波数を頻繁に変える場合「ICR1」を使うと正しく動作しません。(データシートによると「ICR1」を変更する際に2重緩衝がされないため、条件によって正しく動作なると書かれており、波の高さを変更する場合は「OCR1A」の利用を推奨すると書かれています。筆者の環境で「ICR1」で周波数可変を試しましたが、正しく音が出ないときが発生しました。)そのため、波の高さを変える(周波数を変える)場合に使える波の最大値(TOP値)の設定レジスタは「OCR*Aとなります。

 次に、各タイマーで使える波の高さの最大値について紹介します。設定できる波の高さの最大値は8ビットタイマー(タイマー0,2)と16ビットタイマー(タイマー1)で大きく違うことに注意しなければなりません。 

8ビットタイマーはその名の通り、内部処理を8ビットで行っています。そのため、設定できる波の高さの最大値も8ビットで表せる数に限られます。つまり、最大値は255(2^8-1)というわけです。また、PWMを生成するにあたって波の高さが最低2は必要(最大高さ1以下だと、閾値との比較ができずPWMとして成立しない)です。そのため、原理上設定できる波の高さは2255というわけです。しかし、波の高さが低いとduty比の変更が困難になってくるので、実質的に使用できる波の高さの最低値は20~30程度として、実使用においての波の高さの範囲は30255となります。

16ビットタイマーの場合は内部処理が16ビットで行われているので波の最大高さは65,535となり、実質的に波の高さとして設定できるのは20~65,535となります。そのため、周波数の設定の自由度は圧倒的に16ビットタイマーの方が高いというわけです。

 

波の傾き

 波の形や高さを変えて周波数を変化させる方法以外にも波の傾きを変更して周波数を変更する方法を紹介しましたが、次は波の傾きを変えて周波数を変更する方法を紹介します。先ほどまでの方法に比べると直感的にもわかりやすいとは思いますが、今回も図示してみます。5

 この図から、傾きを小さくするとPWM周波数が低くなり、傾きを大きくするとPWM周波数が高くなることがわかります。これより、PWMの周波数は波の傾きからも変更できることが明らかですね。

 AVRマイコンではタイマーの波の傾きは、マイコンに接続されている水晶発振子の周波数をもとに決められています。ですが、プログラム上からは水晶発振子の周波数を変更することは基本的にできません。そのため、タイマーには分周器という水晶が一定の回数発振したら、カウントを1つ進めるという機能が搭載されています。この分周器の設定を変更することによりタイマーのカウンタの傾きを変更できるというわけです。それでは分周器を使った場合のタイマーの波形のイメージを実際に図示してみましょう。
7

分周のイメージとしては、このような感じのイメージになっています。(実際の動作とはちょっと違うかもしれないけど)つまり、分周をした分だけ傾きが小さくなります。図で示した8分周の場合は傾きが1/8になり、結果として出力される周波数も1/8となります。

分周器で設定できる分周はタイマーごとに決められており、Atmega328Pの場合設定できる分周は以下の通りです。
8

このようにいくつかの決められた分周の中から選択をすることで大まかな、周波数を決めることができます。また、外部からクロックを与えることでPWMを生成することも可能です。(ここでは紹介しません)

 

出力周波数の設計

先ほどまでは、PWMの理論と周波数を変える理論の紹介を行いましたが、次は実際に周波数を変えるためのパラメータの決定を行っていきたいと思います。設計の手順としては

波の形→波の傾き→波の高さ

で設計を行います。

初めに、波の形を決めます。のこぎり波の高速PWM動作三角波の位相基準動作(タイマー0,2)位相/周波数基準操作(タイマー1)のどちらかから選びます。特に理由がなければ三角波を選んでおけばよいでしょう。なお、ここで選ぶ波形によって使用する数式が変わるので注意が必要です。波の形を決めたら、周波数とパラメータの関係の数式からパラメータ選定を行います。データシートから出力周波数は以下の式で表せることがわかります。

9
初めに、この式に変形して以下のようにします。

10
そして、この式に、出力したいPWM周波数とシステムクロック(水晶の周波数)、そして適当な分周の値(8ビットタイマーで可聴周波数の場合は64分周程度を推奨)を代入して、TOP値を計算します。TOP値の計算結果が255(8ビットタイマーであるタイマー0,2),65535(16ビットタイマーであるタイマー1)を超えた場合分周の値を大きくします。逆にTOP値の計算結果が30を下回った場合分周の値を小さくします。分周の値を決めて、この式で計算したTOP値を波の高さとして設定すれば、出力したい周波数のPWMを出力することができます。

PS. 16ビットタイマーの場合でもTOP値が大きくなると扱いにくい場合は、必要に応じて分周の値を大きくしてください。

 

以上で任意の周波数のPWMを生成するための設定のパラメータは求まりました。次回は実際にプログラムに入力する方法を紹介します。

制御編 第7回 AVRマイコンのデジタル入出力

今回からは、実際にマイコンを使って特定の動作を行うプログラミングのお話を行っていきたいと思います。ここでは、レジスタの設定情報はもちろん、サンプルのプログラムも合わせて紹介していきたいと思います。

 

今回はマイコンの基本中の基本であるデジタル入出力のお話を行いたいと思います。

 

入出力設定

マイコンを使うときには初めにマイコンにピンを入力として使うか、出力として使うかを設定しなければなりません。

ピンを入力モードとして設定すると、インピーダンスは高くなります。逆に出力モードとして設定を行うと、ピンのインピーダンスは低くなります。そのため、回路上入力になる端子を出力設定すると、場合によっては過電流が流れマイコンが破損する場合があります。逆に回路上出力の個所を入力設定にすると出力先をドライブできなくなりますが、マイコンが破損する心配はほぼありません。(出力の条件次第(出力先の入力部をプルダウンやプルアップしていないなど)で出力先の回路が壊れる危険性はありますが…)この理由からAVRマイコンでは初期設定では、ピンは入力モードになっています。

レジスタ設定

入出力の設定を行うレジスタはAtmega328のデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )65ページから67ページにかけて書かれています。これより、PORTB,C,Dそれぞれの入出力を設定するレジスタはDDRB,C,Dであることがわかります。

例としてPORTBの入出力の設定レジスタであるDDRBのリストを引用します。
no title

DDRB」レジスタの0ビット目から7ビット目までそれぞれPB0~PB7までの入出力の設定を行うレジスタビットになっています。それぞれのピンに対応するビットを0にすると入力、1にすると出力になります。初期設定は上の図の「リセット値」になるのですべて0、つまりすべて入力モードになっています。

また、PORTBの場合以下のようにPB6,7(下図赤□)が水晶端子と重なっていることがわかります。1

このように特定の機能を持ったピンがある場合は、そのピンの持つ機能に合わせて入出力を設定します。今回のPB6,7は水晶入力なので、入力の設定にしておきます。(ピンの特殊機能を使う場合は基本的にここでの入出力設定は無視されて、正しい設定になるはずですが、一応保険のためにこのように設定しておきます。)

また、青で囲った部分は通常のピンとして利用できるピンです。このピンの中から使用するピンの入出力の設定を行います。(この中にはSPI通信の機能を持ったピンもあるので必要に応じて使い分けてください)

 

例として、PB1,3を出力、PB0,2,4,5を入力とする場合のレジスタ設定を紹介します。

2

上位の2ビットは使用不可なので0(入力)とし、ほかは出力ピンを1入力ピンを0としてビットを並べて2進数としたものを、16進数に変換を行い桁数の削減を行います。

 

デジタル出力(出力状態設定)/内部プルアップ設定

入出力の設定が終われば次は、マイコンのデジタル出力の設定を行います。これは、マイコンのピンからHレベルの信号を出力するかLレベルの信号を出力するかの設定です。また、ピンを入力モードとしたときに、ピンをマイコン内部でプルアップするかしないかの設定も同じレジスタで行います。

レジスタ設定

ピンの出力状態の設定を行うレジスタはデータシートの6567ページより、PORTB,C,Dそれぞれ、PORTB,C,Dであることがわかります。また、データシートの55ページの以下の情報から、プルアップが可能なことがわかります。
3

図の青で囲った、「PUD(MCUR4bit)(プルアップ禁止)レジスタは初期設定で0、つまりプルアップ許可(禁止でない)となっています。そのため、入力状態(DDRB,C,Dの対応ビットが0)である時に、PORTB,C,Dの対応ビットを1にすると、そのピンがプルアップされた入力になるというわけです。

 

次に例としてPORTBを紹介します。今回もリストを引用します。
4

入出力の設定と同じく、「PORTB」レジスタの0ビット目から7ビット目までそれぞれ、PB0からPB7までのピンの出力状態の設定を行うレジスタとなっております。それぞれのピンに対応するビットを0にするとLが出力され、1にするとHが出力されるようになっています。また、初期時(リセット時)はすべてLが出力されます。

 

例として、PB2,3H出力、PB4,5L出力、PB1をプルアップ入力、PB0をハイインピーダンス入力とした場合のレジスタ設定を紹介します。

まずは入出力の設定

DDRB 0b00111100

DDRB = 0x3C

次に出力状態設定
5

入出力設定は、上位2ビットが使用不可、下位2ビットが入力で、ほかは出力なので、その通りにビットを並べ、入出力の設定を行います。そして、出力状態の設定はPB2,3H出力、つまり2,3ビットが1、またPB1がプルアップなので1ビットが1になり、ほかはLまたはHZ(ハイインピーダンス)なので0となります。こちらも、最終的には桁数削減のために16進数表記にしています。

 

デジタル入力(ピン状態読み込み)

先ほどの設定でピンの出力状態の設定はできました。ですが、出力のレジスタでは入力モードの時にピンの状態を読み込むことができません。そのため、入力状態を取得するときには「入力レジスタ」と言われる別のレジスタを使用します。

レジスタ設定

ピンの入力状態を読み込むレジスタは、先ほどと同じくデータシートの65~67ページより、PORTB,C,Dのそれぞれに対して、PINB,C,Dであることがわかります。例として、PORTBの入力レジスタである、PINBについて紹介します。
6

このレジスタも、0ビット目から7ビット目までそれぞれPB0~PB7に対応しており、1を読み込んだ時はピンの状態がHレベル、0を読み込んだ時はピンの状態がLレベルとなっております。

また、このレジスタは種別としては読み書きの両対応のレジスタになっていますが、基本的には読み込みとして使用します。(PINBに書き込みを行うと、対応するPORTBの状態がトグルしますが、使うことはないと思います)

例として、PB3の状態を読み込む方法を紹介します。
7

特定のピンのみの状態を読み込む場合はAND演算を使って、読み込みたいビットのみを取り出します。(ほかのピンの状態は無視する必要があるため)また、必要に応じてビットシフトを行って、ビットをずらします。

 

以上で今回の(デジタル)入出力のお話は終了です。

 

サンプルプログラム

今回紹介したデジタル入出力を使った、サンプルプログラムの紹介を行いたいと思います。今回は、PD7にアクティブLOWのスイッチを接続し、内部プルアップを設定します。また、PB5端子にアクティブHIGHのLEDを接続し、スイッチが押されている間点灯するプログラムとします。

 

List1 DigitalInOut

#include <avr/io.h>

int main(void)

{

  DDRB = 0x20;//PBを出力

  DDRD = 0x00;//PD7は入力

  PORTD = 0x80;//PD7をプルアップ

  

    /* Replace with your application code */

    while (1)

    {

    if(PIND & 0x80){//H状態=ボタンが押されていないとき

      PORTB &= ~0x20;//PB5L出力

    }else{//L状態=ボタンが押されているとき

      PORTB |= 0x20;  //PB5H出力

    }

  }

}

 

プログラムの構成としては、初めに初期設定として、入出力の設定とプルアップの設定を行います。その後の無限ループ内で、PD7の状態を読み込み、Hの場合はPB5L状態、Lの場合はPB5H状態にしています。また、if文は0か非0かの判定であるので、状態判別時のビットシフトは省略できます。

また、今回の条件の場合は別の書き方として、while(1)の中を下のようにもすることができます。

while (1)

{

  PORTB = ~((PIND & 0x80) >> 2);

}


こちらの書き方の考え方は、入力信号をANDとビットシフト、反転を行い、if文などを使わずに、そのまま出力しています。

この2つの書き方は場合により使い分ければよいと思いますが、後者は比較的使う場面は少ないと思います。(マイコン的な考え方ではありますが…)まあ、考え方として知っておけば損はしないと思います。

 

今回はマイコンの入出力の方法を紹介しました。次回はマイコンで音楽を奏でるミソであるPWMの出力のお話をしていきたいと思います。

回路編第13回 ゲート抵抗の選び方

前回まではゲートドライバICの使い方の紹介をしてきましたが、今回はMOSFETのゲート部に取り付けるゲート抵抗の大きさの選び方のお話をしたいと思います。

 

 一般的にはMOSFETのゲート抵抗は数Ωから数百Ω程度と割と広い範囲で言われています。もちろん、この範囲の広さには理由があって、回路の用途や仕様などで取り付けるゲート抵抗が大きく変わるからです。

 通常ゲート抵抗が大きくなると、半導体のスイッチング速度が遅くなり、ゲート抵抗を小さくするとスイッチング速度は速くなります。このスイッチング速度がゲート抵抗を決める大きなカギとなります。まずは、スイッチング速度が速い場合と遅い場合のメリットデメリットを紹介しましょう。

スイッチング速度が速い場合

メリット

スイッチング損失が小さくなる

スイッチング周波数を高くできる

デッドタイムの設定時間を短くできる

 

デメリット

VOUT端子のアンダーシュートが大きくなる恐れがある

主回路に発生するサージ電圧が大きくなる(主にモータなどインダクタ成分のある負荷の場合)

出力にリンギングが発生しやすくなる

 

スイッチング速度が遅い場合

メリット

VOUT端子へのアンダーシュートが小さくなる

主回路に発生するサージ電圧が小さくなる

 

デメリット

デッドタイムの設定時間を長くする必要がある

スイッチング損失が大きくなる

スイッチング周波数を上げにくくなる

 

軽くまとめるとこのようなメリットとデメリットがあります。簡潔に言うと、極端にスイッチング速度が速くても遅くてもだめというわけです。この中でも特に注意しなければならないのが、デッドタイムの時間とスイッチング時間の関係です。デッドタイムの時間に対してスイッチング時間が遅い場合、ハイサイドとローサイドのMOSFETが同時にONになるタイミングができて、過大な電流が流れる恐れがあります。言葉だけではわかりにくいと思うので、実際にダメなパターンのゲート電圧波形を見てみましょう。
1

画像の黄色線がローサイド側のMOSFETのゲート電圧、水色線がハイサイド側のゲート電圧で縦の白線の内側がデッドタイムとなっております。

デットタイムは1usを入れていますが、デッドタイムの終わり(右側の白線)の時点ではローサイド側のゲート電圧が8Vぐらい残っていることがわかります。今回使用しているMOSFETのスレッショルド電圧は2V程度なので、デッドタイム終了時点でもローサイド側MOSFETONになっていることは明らかです。逆にハイサイド側のMOSFETONにし始めた(デッドタイム終了時)ほぼ同時にスレッショルド電圧を超えています。これによって、図のオレンジで示した時間はハイサイド側とローサイド側の両方のMOSFETが同時にONになっているというわけです。

このようにハイサイド側とローサイド側のMOSFETが同時にONになってしまうと、その間は過大な電流(貫通電流)MOSFETに流れることとなり、大きな損失が発生するほか、最悪MOSFETが故障します。そのため、ハイサイドとローサイドの両方が同時にONになることは防ぐようにゲート抵抗を決めなければなりません。(少なくともパワー回路では)

 

今回はケースファンやステッピングを演奏する低圧のMOSFETを使用した場合で「ある程度のゆとりをもって貫通電流が流れない程度」のスイッチング時間とした場合のゲート抵抗の選定をしたいと思います。

 今回はゲート抵抗を110Ω、47Ω、10Ωの場合のゲート電圧の波形とVOUT端子の波形を見て、そこからゲート抵抗の選定を行いたいと思います。

まずは、ゲート抵抗110Ωの場合から

ローサイドの立ち下り、ハイサイド立ち上がり時のゲート電圧
2

※オシロのオフセットの設定ミス?で基準電位がちょっとずれているので、Vminが負電圧になっています。

 

ローサイド立ち上がり、ハイサイド立ち下り時のゲート電圧
3


VOUT端子の立ち下り時(ローサイドがONになるとき)
4

VOUT端子の立ち上がり時(ハイサイドがONになる時)
5

波形からみて明らかにハイサイドと両サイドが同時にONになっていることが明らかですね。つまり、デッドタイム1μsに対してスイッチング速度が遅すぎるということです。結果、貫通電流が流れることにより大きな損失が発生し、MOFETの破損につながります。つまり、大きな問題があるというわけです。また、貫通電流の影響か何かで、MOSFETハイサイドの立ち上がり時のVOUT端子とゲート電圧にオーバーシュートが発生しています。

 

次にゲート抵抗が47Ωの場合です。

ローサイドの立ち下り、ハイサイド立ち上がり時のゲート電圧
6

ローサイド立ち上がり、ハイサイド立ち下り時のゲート電圧
7

VOUT端子の立ち下り時(ローサイドがONになるとき)
8

VOUT端子の立ち上がり時(ハイサイドがONになる時)
9

先ほどの110Ωの場合に比べると、ゲート電圧の立下り立ち上がりは速くなりました。ですが、この状態でもまだ、ハイサイドとローサイドが同時にONになって貫通電流が流れてしまう瞬間があります。貫通電流が流れる時間はかなり短くなったので、損失もそこまで大きくないとは言えますが、完璧とは言えないでしょう。

また、VOUT端子のハイサイド立ち上がり時のオーバーシュートも大幅に減少しています。

 

最後にゲート抵抗が10Ωの場合です。

ローサイドの立ち下り、ハイサイド立ち上がり時のゲート電圧
10

ローサイド立ち上がり、ハイサイド立ち下り時のゲート電圧
11

VOUT端子の立ち下り時(ローサイドがONになるとき)
12

VOUT端子の立ち上がり時(ハイサイドがONになる時)13

先ほどの47Ωの場合に比べてゲート電圧の立下り立ち上がりはさらに速くなりました。今回の場合は、デッドタイムが終了する立下りの初めから1μs立った時点で、ゲート電圧は1V程度まで降下しており、ハイサイドとローサイドのMOSFETが同時にONになることはなくなりました。また、VOUT端子の波形を見ても特に、アンダーシュートは見られず、オーバーシュートはわずかにあるものの、大きさ的にも問題がないレベルと見れます。

 

110Ω、47Ω、10Ωの3種類の波形から、今回の条件であるMOSFETを「EKI04027」ゲートドライバを「L6384E」を用いたときのゲート抵抗の最適値を求めます。
貫通電流対策とVOUT端子のアンダーシュートの観点から、ゲート抵抗は3つのなかでは10Ωが最も良いと見れます。ゲート電圧の波形からゲート抵抗の最適な範囲としては10Ωから20Ω程度だと言えるでしょう。

 

ゲート抵抗の値は、使用するMOSFETのゲート容量やスレッショルド電圧、ゲート駆動電源の電圧によって変動します。実際にゲート抵抗を選定する際にはこのことを考慮したうえで設計しなければなりません。MOSFETのゲート部はコンデンサの特性を持っていることから、MOSFETのゲート電圧の立下り波形は以下の式で近似できます。
14

この式である程度の近似はできますが、MOSFETのゲート部の内部抵抗やゲートドライバの最大電流などにより、ゲート電圧の計算値は低めに出てしまいます。(今回の条件ではオシロの波形に比べて、計算値は1~2V程度高めに出ています)MOSFETのゲート部の内部抵抗に関しては、上の式のゲート抵抗に足し合わせることで計算が可能ですが、ゲートドライバの最大電流の考慮はできません。(数式はあるかもしれないけど…)

また、ゲート容量については、ゲート電荷量とゲート電圧から計算を行い算出した方が、正しい値と考えられるため、ゲート電荷量から計算をしています。(MOSFETのデータシートのゲート容量はゲート電圧0V時の容量が書かれているため)

また、ゲート駆動電圧が今回とほぼ同じ場合は、ゲート抵抗はゲート容量に逆数倍にすればそこそこ良い値となるでしょう。

 

今回は、不明瞭な点が多いゲート抵抗の値の選定方法を紹介しました。ゲート抵抗はスイッチング速度の要求する条件によって大きく変わりますが、趣味でモータドライバ回路などを設計する場合は今回の条件(貫通電流が流れない程度のスイッチング速度)に近い場合も多いと思うので、ある程度の参考にはなったと思います。(小電力である信号用とかの場合は話が変わってくるとは思いますが…)
今回でゲート駆動関連のお話はいったん終了とし、次からはしばらくマイコン系のお話をしたいと思います。


回路編第12回 ゲートドライバICの使い方ver2 その2

2018/09/28追記
本ページで紹介しているゲートドライバL6384E(DIP版)はどうやらディスコンになった模様です。SOP版については現状取り扱い終了の表示は出ていないので本記事を利用する場合はSOP版を使うまたは、一部仕様の変化を対処したうえでIR2302などほかのゲートドライバICの利用になると思います。

前回は、ゲートドライバICの全般的なお話をしてきましたが、今回は、実際にゲートドライバICを使った回路の設計のお話をしていきたいと思います。

まずは、今回使用するL6384E関連の資料を並べます。(STマイクロの資料はすべて英語です)

データシート:

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

アプリケーションガイド:

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

技術資料(ヒントとコツ)

http://www.st.com/content/ccc/resource/technical/document/application_note/cd/92/16/b2/e7/fc/4d/97/CD00004191.pdf/files/CD00004191.pdf/jcr:content/translations/en.CD00004191.pdf

ブートストラップ回路の設計資料:

http://www.st.com/content/ccc/resource/technical/document/application_note/fa/ed/25/78/92/26/4c/44/CD00004158.pdf/files/CD00004158.pdf/jcr:content/translations/en.CD00004158.pdf

以上がSTマイクロの公式の資料です。

これに加えて、参考用にIR社のアプリケーションシートも紹介しておきます。

https://www.infineon.com/dgdl/AN-978.pdf?fileId=5546d46256fb43b301574c6029a97c36

こちらは日本語なので読みやすいかなと思います。

 

アプリケーションには設計に必要な情報がいろいろと書かれていますが、内容自体はとても難しいです。筆者も比較的重要だと思われる個所を主に読んで設計を行っています。(製品にするなら細かなところも必要だと思いますが、趣味レベルなら細かなところは無視してもいいかなと思っています。)筆者が重要だと考えている点は、ブートストラップ周りの部品選定と耐圧設計です。

 

まずは、ブートストラップ周りの部品を選びます

初めはブートストラップコンデンサの選定です。
前回紹介した数式にて計算を行います。(STの技術資料(ヒントとコツ)にもリーク電流などを考慮した数式がありますが、今回はIRの数式を使うこととします。)使用するゲートドライバは前述のとおりL6384EMOSFETは秋月で50円で売られている「EKI04027」を使います。また周波数はステッピングの最低パルス数を秒間100回として100[Hz]にします。(Qgは実使用が13Vでデータシートが10Vで大きな差がないので10Vで近似計算(あとで安全率を高めに見積もって打消))

式1
また、Vcc13.5V ダイオードの順方向電圧降下を0.6Vとして計算をします。ローサイドのMOSFETの順方向電圧降下はわずかなので0として計算します。

式2
これに安全率15をかけます。

式3
計算結果としては3.3uF4.7uF程度で十分ですが、積セラの容量低下と余裕を考慮して今回は10uFの積層セラミックコンデンサを使用することとしました。

次にダイオードの選定です。

電流値は以下の式で計算します。周波数は想定最大周波数の2kHzを入れました。

式4
また、耐圧をリカバリ時間は前回の通り以下の式で表せます。

式5
これより、安価なファストリカバリダイオードである「UF4007」を選定しました。

 

次に耐圧と動作電圧関係のお話です。

まずは耐圧の確認を行います。L6384Eのデータシートの4ページに書かれている最大絶対定格を見ます。

1
この表からVccの動作は範囲は-0.3~14.6Vであることがわかります。ゲートドライバに14.6Vを超える電圧を印可すると壊れてしまう恐れがあるので注意をしてください。この表記からゲートドライバの電源は14.6V以下なら何でもいいと思ってしまいます。しかし、実際には次の項目に注意しなければなりません。

2
3
データシートの7~8ページにまたがって書かれてる、DC operationの表に注目します。この表の上から2行目と3行目の「VCCth1:Vcc UV turn-on threshold」と「VCCth2: Vcc UV turn-off threshold」です。ゲートドライバICVccに印加される電圧が下がった時には、回路保護のため出力を停止する機能が搭載されています。この2つの項目は電圧が下がった時に出力を停止させる電圧(Vccth1)と電圧が回復した時に出力を復帰させる電圧(Vccth2)を示しています。そのため、ゲートドライバIC電源電圧は「Vccth1:出力復帰電圧」以上「Vcc(max):最大定格電圧」以下である必要があるというわけです。これを守らないとゲートドライバが動かないあるいは、破損するといった事故が発生する恐れがあります。

 

話を絶対最大定格の表に戻します。最大絶対定格の表の一番上のVOUT端子の電圧特性を確認します。ここには-3~VBOOT-18 と書かれています。なぜ、これを注意しなければならないかというと、ローサイド側のMOSFETONにした瞬間にアンダーシュートとしてVOUT端子に瞬間的に負の電圧が印可される場合があるからです。技術資料(ヒントとコツ)の12ページやIRのアプリケーションシートの8ページにこのことの記載があります。VOUT端子に-3Vを下回る負の電圧がかかるとコンデンサが過充電となり、ハイサイドドライバの耐圧である18Vを超え、結果的にゲートドライバICが破損する恐れがあるというわけです。

アンダーシュートにより発生する電圧は技術資料(ヒントとコツ)に計算方法が書かれていますが、配線のインダクタンスが正しく計算するのが難しいので、オシロスコープなどを使って実測するのが正確だと思います。この計測結果は次回の記事で紹介したいと思います。

アンダーシュートを減らすためにはスイッチング速度を遅くすること、そして配線のインダクタンスを減らす方法の2通りがあります。

前者のスイッチング速度はMOSFETのゲート抵抗により決まります。ゲート抵抗を大きくするとスイッチング速度が遅くなりアンダーシュートが減らせますが、ほかにも不都合が生じる恐れがあるため注意が必要です。ゲート抵抗の選定については次回の記事で紹介したいと思います。

配線のインダクタンスを減らす方法はIRのアプリケーションシートの8ページから9ページにかけて記載があるので確認をしてください。ここに書かれている内容をまとめると以下のようになります。

・配線はできるだけ短くする

・ゲートドライバICMOSFETはできるだけ近づける

・ブートストラップコンデンサの容量は0.47uF以上にする

・ゲートドライバの電源(Vcc)GNDの間にブートストラップコンデンサの10倍以上の容量のコンデンサを入れる

これくらいのことをすればアンダーシュートは減らせるというわけです。特に最後のVccGND間のコンデンサはゲートドライバ電源の瞬間的な電圧降下対策にもなるので入れることをお勧めします。

 

最大定格に関する項目で注意しなければならないのは以上だと思います。あえて言うと、

VBOOT端子の耐圧(主回路の耐圧)がありますが、ここの耐圧は600V程度あるので基本的に、問題になることはないと思います。

 

次に入力端子周りの設計を行います。

入力端子はINDT/SD端子の2つがありそれぞれの入力は以下のように設計します。

IN端子

ハイサイド側のMOSFETONにするか、ローサイド側のMOSFETONにするかの切り替えを行う端子です。この端子にHが入力されるとハイサイド、Lが入力されるとローサイドがONになります。

内部的にプルダウン抵抗が搭載されており、外付けでプルダウン抵抗を取り付けなくても動作させることが可能です。ただし、抵抗値が非常に高いので状況に応じて外付けでプルアップ抵抗やプルダウン抵抗を取り付ける必要があります。(入力にフォトトランジスタ出力のフォトカプラを取り付けた場合は、外付けでプルダウン抵抗を取り付けないと立下り動作が遅くなりすぎて使いもになりません)また、入力がシュミットトリガになっているので入力状態の安定性が高くなります。

 

DT/SD端子

出力のシャットダウンとデットタイムの設定端子です。

出力をシャットダウン(ハイサイドもローサイドもOFF)したいときは、この端子に閾値を下回る電圧を入力します。データシートのDC operation の表の一番下に書かれているVdtShutdown threshold)を確認すると0.5Vと書かれています。つまり、この端子に0.5V以下を入力すれば出力がシャットダウンされるというわけです。なお、出力をシャットダウンすると、モータは開放状態となります。

デッドタイムの設定は、この端子をGND間に接続する抵抗値の大きさによって決まります。抵抗値の大きさとデッドタイムとの関係のグラフはデータシートの11ページの「Figure.7 Deadtime vs. resistance」に書かれています。

6
   
また、DC operations の下から2つ目のdt(Deadtime seting range)にも主要な抵抗値とデッドタイムの対応が書かれています。今回はデッドタイムを1[us]にするのでRdt100[kΩ]を選定しました。

なお、この端子はデッドタイムの設定とシャットダウンを兼ねているので、両方の機能を使うためにはちょっと注意が必要です。シャットダウンを使用するためにトーテムポール出力になっているものを使用すると、デッドタイムの設定ができなくなります。そのため、オープンコレクタ出力のもの(フォトトランジスタ出力のフォトカプラなど)を接続する必要があります。

 

次に出力端子系の設計を行います。

VBOOT端子

 ハイサイドドライバの電源端子です。この端子にはブートストラップコンデンサの+側を接続します。また、条件によりブートストラップダイオードを取り付けます。

内蔵のブートストラップダイオードの情報が、アプリケーションガイドの17ページに書かれています。内蔵のブートストラップダイオード(厳密にはDMOSを含むらしい)は外付けダイオードに比べてリーク電流が小さいという特徴がありますが、周波数が高くなると電圧降下が高くと記載があります。高周波の場合はアプリケーションシートの17ページ下部の数式で計算が必要な模様です。また、ブートストラップコンデンサの容量が大きい場合(1~2uF以上)も外付けのダイオードの使用が必要ととらえられる記載があります。そのため、今回は外付けでブートストラップダイオードを取り付けます。

 

HVG端子

 ハイサイドドライバの出力端子です。ゲート抵抗を介してハイサイド側MOSFETのゲートに接続します。

VOUT端子

 ハイサイドドライバの基準電位となる端子です。ブートストラップダイオードの-側を接続するほか、ハイサイド側MOSFETのソース端子も接続します。ハーフブリッジやフルブリッジの場合は自動的にローサイド側のドレイン端子とも接続することになります。

LVG端子

 ローサイドドライバの出力端子で、ゲート抵抗を介してローサイド側MOSFETのゲートに接続します。

 

端子周りの設計はこのように行えばできるでしょう。では実際に設計した回路を紹介します。

7

今回筆者が設計したstepVVVFはコストカットのため入力のフォトカプラをトランジスタ出力のものを使っています。本当はもっと高速で動作する信号用のフォトカプラあるいはトーテムポール出力のフォトカプラを使用するべきですが、音楽を鳴らす周波数レベルでは問題がないためこのような構成にしました。接続は先ほどまでに紹介したとおりに接続を行っています。なお、MOSFET手前のRp1,2MOSFETのプルダウン抵抗でドライバICの不具合などでゲートがハイインピーダンスとなった時に、確実にゲートの電位をソースレベルに落とすためのものです。

 

以上で、ゲートドライバICを使った回路の設計は終わりです。次回はMOSFETのゲート抵抗をオシロスコープの波形を見ながら選んでみたいと思います。

回路編第11回 ゲートドライバIC(L6384E)の使い方ver2 その1

2018/09/28追記
本ページで紹介しているゲートドライバL6384E(DIP版)はどうやらディスコンになった模様です。SOP版については現状取り扱い終了の表示は出ていないので本記事を利用する場合はSOP版を使うまたは、一部仕様の変化を対処したうえでIR2302などほかのゲートドライバICの利用になると思います。

回路編を書くのはずいぶんと久しぶりですね。今回は、ゲートドライバICの使い方のお話をしたいと思います。ゲートドライバのお話はずいぶん前の記事でも紹介していましたが、わかりにくかったということで書き直しをしたいと思います。

 

今回使用するゲートドライバはSTマイクロ製の「L6384E」というゲートドライバです。このゲートドライバはRSコンポーネンツで20個以上買うと1つあたり約80円とDIPのゲートドライバの中では非常に安いのが特徴です。他にもデッドタイムの長さを調整する機能やブートストラップダイオードが内蔵されているなどいろいろと面白い使い方ができます。

 

まずはL6384Eのデータシートをご覧ください。(英語ですが…)

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

 

とはいえ、今回はゲートドライバICの全般的な抽象的なお話をしたいと思います。

最初にゲートドライバの構造のお話をします。

データシートの3ページ目に内部の構造の簡易的な図があります。
1

内部の構造はざっと3つに分けられます。画像の青で囲んだロジック部、赤で囲んだハイサイドドライバ、黄色で囲んでローサイドドライバです。それぞれの部分別に機能の紹介をしたいと思います。

ロジック部 

入力信号をMOSFETを動作させる信号に変換を行う回路です。MOSFETON/OFFの遅れによる回路の一時的なショートを防ぐためのデッドタイムの挿入や入力ミスによるハイサイド側とローサイド側が同時にONにならないような処理も行っています。これらの機能によりパワー回路を安全に動作させることが可能になります。(例外でこれらのこれらの機能が搭載されないゲートドライバもあり、前回紹介したIR2110は例外に含まれます) 

入力端子は出力側であるハイサイドドライバやローサイドドライバとは絶縁されており、入力端子に5V程度を入力すればH状態として認識されるので、直接マイコンの端子に接続することも可能です。ですがGNDが共通であるほか、フォトカプラのような完全な絶縁とは言えないので、気になる場合はフォトカプラなどを使ってマイコン側と絶縁を行ってください。

また、入力端子は内部的にプルアップやプルダウンがされているものが多いので、必ずデータシートを確認してから回路設計をしなければなりません。

 

ハイサイドドライバ

ハイサイド側のMOSFETを駆動するための回路です。内部には下図のようなトーテムポール回路が組み込まれており、MOSFETを高速にON/OFFすることが可能になっています。
2

ロジック部からはレベル変換器を通して接続されているので負荷にかかる電圧(GNDとハイサイドドライバの基準電位との間の電位差)はかなりの電圧(600Vぐらいまでのが多い)に耐えるものが多くなっています。

ハイサイドドライバの電源は、ブートストラップにより供給されています。詳細は後で紹介します。

ローサイドドライバ

ローサイド側のMOSFETを駆動するための回路です。ハイサイドドライバと同じくトーテムポール回路が組まれており高速にMOSFETを駆動させることができます。ハイサイド側とは異なりローサイドドライバの基準電位はGNDなのでレベルシフタは内蔵されていません。また、電源もゲートドライバICの電源をそのまま使っています。

 

ブートストラップの仕組み

 ブートストラップはコンデンサとダイオードを使ってハイサイドのゲート駆動電源を容易に作る方法です。ローサイド側を含めた全体の構造は下図のようになっています。
3

ゲート抵抗とかの周辺部品は見やすさを上げるために省略しています。

回路図よりローサイド側は特に何もありませんが、ハイサイド側にはダイオードとコンデンサが搭載されていることがわかると思います。これがブートストラップのミソと言える部品となります。

通常モータを駆動するときはPWMと呼ばれる疑似アナログ出力を使用します。PWMは高速でON/OFFを繰り返す信号です。ゲートドライバの入力にHigh(ON)を入力するとハイサイド側がONLow(OFF)を入力するとローサイド側がONになるので、ゲートドライバにPWMを入力するとハイサイドとローサイドが高速で切り替わることになります。

まずはローサイド側がONの時を考えます。
4

ローサイド側がONの時は図のようにOUTPUT端子の電位は0V(GNDと同電位)になります。すると、ブートストラップダイオードとブートストラップコンデンサを介してVccGNDを結ぶ回路が構成されます。充電されていない状態では、コンデンサにかかる電圧は0Vなので、ダイオードには順方向にVccの電圧がかかります。すると、ダイオードはONとなり電流が流れ、コンデンサに充電されるというわけです。この時の回路をもっと簡単に書くと下のようになりますね。
5

次にハイサイド側がONの状態を考えます。
6

ハイサイド側がONの時は図のようにOUTPUT端子はVDDとほぼ同電位になります。つまり、ハイサイド側の回路の基準電位がGNDレベルからVDDのレベルに引きあがられるということです。コンデンサが充電されていたとすると、ダイオードのカソード側の電圧は大体VDD+Vccとなるので、ダイオードはOFFになり、コンデンサの電荷はハイサイドドライバの電源となります。(ハイサイドドライバに電池のようなものがつながっていると考えたらわかりやすいかもしれません)この時の回路を簡単に書くと次のようになりますね。
7


最後にハイサイドもローサイドもOFFになっている状態を考えます。
8

両方の端子がOFFになっている場合はOUTPUT端子は分圧によって電位はおよそVDD/2になります。コンデンサが充電されていた場合は、ダイオードのカソード端子の電圧はVDD/2 + Vccとなるため、ダイオードはOFFとなります。そのためコンデンサはこれ以上充電されません。 コンデンサが空の場合も電流の流れる先がないため基本的に充電されません。

この状態はハイサイド側の基準電位がGNDレベルになっていないので、基本的にはハイサイド側がONの時の準備状態と考えればよいでしょう。

 

ブートストラップの原理はこのような感じになっています。簡潔にまとめると、ローサイドがONの状態の時にコンデンサを充電し、ローサイドがOFFになるとコンデンサが独立し、ハイサイドドライバの電源になるというわけです。

この原理からもお分かりだと思いますが、ブートストラップを使用するには、ハイサイドドライバの電源であるコンデンサを充電する時間を設ける必要があります。つまり、ずっとONにしておくことはできず、PWMを使って一定時間ローサイドがONになるようにしなければならないというわけです。

PS. MOSFETは絶縁ゲートなので一度ONにしたら、理論上は電流を流さなくてもずっとONになると言えますが、実際にはハイサイドドライバなどに電流が流れるため、ONにしている間は、わずかながらにもずっと電流が流れ続けます。なので充電されるまでコンデンサの電荷は減り続けるというわけです。

 

続いてブートストラップに使用する部品の選定方法を紹介したいと思います。

ブートストラップコンデンサの容量選定

L6384Eのデータシートにも容量計算の数式が書かれていますが、ハイサイドドライバの消費電流などが考慮されていない数式なので、今回もIRのアプリケーションシートに従った計算を行います。(アプリケーションシート:https://www.infineon.com/dgdl/Infineon-dt98-2j.pdf-AN-v01_00-JA.pdf?fileId=5546d46256fb43b3015756f4cf4643fb)

 2ページの式1からブートストラップコンデンサの最低の電荷の容量が求まります。
9
式1

Icbsはケミコンなどで発生するが、通常データシートに書かれていないので、計算できません。そのため、Icbs=0で計算を行い、最後の安全率の倍率を少し高めると良いと思います。
18/01/24追記 QgはVgsの電圧によって変化します。データシートのQg欄の条件を確認して、条件に書かれているVgsと実際に使用するVgsが離れている場合は、データシートのVgsとQgの関係グラフなどから適時補完をして下さい。(グラフがなければVgs2倍→Qg2倍で近似すればよいと思います。)

 

次にブートストラップコンデンサの容量に変換します。ページ3の式2を先ほど計算した値を使って表すと次のようになります。
式2

これによって、必要最低限のブートストラップコンデンサの容量が求まりました。しかし、この容量ではコンデンサの電圧変動が激しくなります。また、積層セラミックコンデンサの特性上、電圧が高くなると容量が減るといった問題もあります。容量が足りないとゲートを正しく駆動できずゲートドライバICにダメージを与える場合があるので、ブートストラップコンデンサの容量を選定するときは、安全率として上の式で計算した値の15倍程度をかけた容量のコンデンサを取りつけます。容量が多少大きくても不都合が生じないので、15倍して算出した容量のコンデンサがない場合は、容量が大きい側で近い値のコンデンサを選定してください。

 PS. IGBTなどゲート電荷量[C]がデータシートに書かれていない場合は、ゲート容量[F]×ゲートソース間電圧[V]=ゲート電荷量[C]でゲート電荷量の概算を算出してください。しかし、この式で計算をした値よりもゲート電荷量が大きい場合がある(両方書かれているデータシートより)ので、安全率として2程度をかけた値を使用すると良いと思います。

 

ブートストラップダイオードの選定

 ブートストラップダイオードの選定で特に考慮しなければならないので、ダイオードの耐圧と逆回復時間です。

 ダイオードの耐圧は主回路に印加される電圧以上でなければなりません。その理由は、ハイサイド側がONになった時には、下図のようにダイオードに主回路の電圧がそのまま印加されるためです。
10

次にダイオードの逆回復時間ですが、IRの資料によると逆回復時間は100[ns]以下である必要があるそうです。つまり、普通のダイオードではなくファストリカバリダイオードが必要というわけです。その理由を説明したいと思います。

回路がローサイド側からハイサイド側に切り替わる時は下図のように一気に電圧の向きが変わります。
11

このように電流の向きが変わる時には、瞬間的に逆方向に電流が流れてしまいます。この流れる時間が逆回復時間と呼ばれるものです。逆方向に電流が流れるときは、ダイオードで大きな抵抗が発生し、熱となります。逆回復時間が長いと、この発熱量が大きくなり場合によってはダイオードが破損する可能性があるというわけです。

この2つのほかにも耐電流の計算も必要です。先ほどの2つとまとめて以下に示します。
式3

ゲートドライバICのブートストラップに用いる回路部品の選定は以上のようなやり方で行えます。ゲートドライバの周辺回路の設計では、MOSFETのゲート抵抗の選定も非常に重要ですがこれは、次々回の記事でオシロスコープで測定した波形とともに検証していきます。次回は実際にL6384Eを例にゲートドライバICを使った回路の設計をしていきたいと思います。

制御編 第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設定などを紹介したいと思います。

ギャラリー
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
  • KiCad5の使い方 4章 シンボルエディターの使い方
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: