放熱の基本設計(ヒートシンクのサイズの求め方)

参考

放熱器・ヒートシンク 水谷電機工業(株)- ヒートシンクに関する基礎情報

放熱の基本設計法

http://www.njr.co.jp/products/semicon/PDF/package/aj02220.pdf

熱抵抗R

  • 温度の伝えにくさを示す値

  • 単位は \rm [{}^{\circ}C/W]

    • ある物体に1ワットの熱を加えたとき,温度が何度上昇するかを示す値

      • 半導体パッケージにおける熱抵抗は、デバイスが1[W]の電力を消費した時に生じる素子とパッケ-ジ 表面や周囲雰囲気との温度差である
  • この熱抵抗を利用して,ヒートシンクを用いた放熱をモデル化する

熱伝導のモデル化

  • 熱の発生源(ここでは半導体)を出発点に,ケース,熱伝導体,ヒートシンク,空気中と熱が伝導していく.

  • それぞれの物体が熱の伝わりやすさ(=熱抵抗)を持っており,空気中までの熱の伝わりやすさは熱抵抗の直列つなぎによって表現することができる.

  • この図より,以下の値が分かれば必要なヒートシンクの熱抵抗の必要最大値 \rm R_{fa}を求めることができる.

    • 半導体の発熱量 \rm Q[W]

    • ケースまでの熱抵抗 \rm R_{jc}[{}^{\circ}C]

    • (接触熱抵抗を含めた絶縁シートの熱抵抗 \rm R_{cf}[{}^{\circ}C/W])

  • \rm Q\times(Rjc+Rcf+Rfa)=Tj-Ta

  • 必要最大値よりも熱抵抗が小さいヒートシンクを使えば,十分な放熱ができる

基本的な3端子レギュレータ電源の設計

  • レギュレータ部の発熱量:\rm 4[W]

  • ケースまでの熱抵抗 \rm R_{jc}\rm 4[{}^{\circ}C/W]

  • 絶縁シート部分の熱抵抗 \rm R_{cf}\rm 3[{}^{\circ}C/W]

  • ヒートシンクの熱抵抗 \rm R_{fa}

  • 半導体接合部の温度(熱源):許容最大値 \rm 150[{}^{\circ}C]

    • (この上限より10-20%の余裕を見て設計する)

\rm Q\times(Rjc+Rcf+Rfa)=Tj-Ta

\rm\displaystyle Rjc+Rcf+Rfa=\frac{Tj\times0.9-Ta}{Q}

\rm\displaystyle 4+3+Rfa=\frac{150\times0.9-50}{4}

\rm\displaystyle Rfa=21.25-4-3=14.25

となる.

接触熱抵抗

固体どうしの接触面が完全に密着しないことにより生じる熱抵抗。滑らかな固体面でも凸凹な構造があるために接触面積の割合は現実として100%にならず,空気など熱伝導率の小さい流体が面の間隙に存在すると大きな熱抵抗が生じる。単位は℃/W。

倒立振子ロボットを作る

参考資料

倒立振子の作り方

モータドライバの使い方

ジャイロセンサの使い方(ドリフトの補正)

- ジャイロセンサ その2 – メモたんく

L6470でステッピングモータを動かす

随時更新中(2017.07.30 )

使ったもの

バイポーラ ステッピングモーター ST-42BYH1004

f:id:tyokota_0529:20170616191039p:plain:w300

バイポーラ ステッピングモーター ST−42BYH1004: パーツ一般 秋月電子通商 電子部品 ネット通販

主な仕様

項目 詳細
ステータ バイポーラタイプ
相数
基本ステップ角 0.9度±5%
1回転ステップ数 400
絶縁抵抗 100MΩ(500VDC
コイル抵抗 5.0±10%Ω/相
入力定格電圧 5V
定格電流 1.0A/相
静止トルク 4.4kgf・cm
重量 0.34kg
注意 軸を回さない。感電する

配線

配線
A(A相) Black
C(_A相) Green
B(B相) Red
D(_B相) Blue

L6470使用 ステッピングモータードライブキット

秋月電子で購入

f:id:tyokota_0529:20170620034854p:plain:w300

L6470使用 ステッピングモータードライブキット: 組立キット 秋月電子通商 電子部品 ネット通販

参考資料

SPI通信

L6470

(L6480の動かし方 [メモ][開発] ステッピングモータードライバL6470とL6480 ヤメ記者SEの徒然なるままに…/ウェブリブログ)

L6470でステッピングモータを動かす

ピンの役割

  • 制御はSPI通信によってマイコンから行われる

    • Master: Arduin UNO R3

    • Slave: L6470 Driver

Adruino側

SPI通信のためのピン

ピン番号 名称 役割
D11 MOSI
(Master Out Slave In)
マスタからスレーブへデータを送るライン
D12 MISO
(Master In Slave Out)
スレーブからマスタへデータを送るライン
D13 SCK
(Serial Clock, Output)
データ転送を同期させるためマスタより生成されるクロック信号
D10 SS
(Slave Serect pin, Output)
デジタル信号を渡すことでスレーブを選択する.
LOWが渡されたスレーブはマスタとの通信をおこなう.
HIGHが渡されたときマスタからのデータを無視する.

L6470側

SPI通信のためのピン

ピン番号 名称 分類
5 SDO (SPI Data Out) Logic output
6 CK (SPI Clock) Logic input
7 SDI (SPI Data In) Logic input
8 #CS (SPI Chip Serect, = Slave Srect) Logic input, 負論理

Arduinoとの接続

  • D11 (MOSI) <-> 7 (SDI)
  • D12 (MISO) <-> 5 (SDO)
  • D13 (SCK) <-> 6 (CK)
  • D10 (SS) <-> 8 (#CS)

その他のピン

  • 必要に応じて機能を足したいときに利用するものが多い
ピン番号 名称 分類 役割
1 #BUSY/SYNC Open Drain Output Busy Frag Mode(SYNC_EN bitがLOW(0)のとき, default)
・デフォルトの状態では,コマンド実行中はLOWになる.
・一定速度コマンド,絶対位置指定コマンド,移動コマンドが実行中の時、ピン出力がLOW
・コマンドが実行されたとき(目標速度、目標座標に到達),このBUSYピンは解放される

Synchronization Signal Mode(SYNC_EN bitがHIGH(1)のとき)
・このモードでのステップクロック信号は、SYNC_SELとSTEP_SELパラメータの組み合わせに応じて出力される
2 FRAG
(Status Frag)
Open Drain Output アラーム発生時にFRAGピンをGNDに接続する
(内部のオープンドレイントランジスタによる)
3 GND (Ground)
4 EXT-VDD
(External-VDD)
Power ロジック出力ピンの電圧範囲を設定.
VDDpinは内部でVregまたは3.3V電源に接続されていない
9 STCK
(Step-clock Input)
Logic Input Step-clock mode時に入力された信号によって
モータの動きが定義される
10 #STBY/#RST
(Stepby and Reset)
Logic Input LOW logic levelでlogicをリセット,デバイスをスタンバイモードに.使わない場合はVDDにつなげておく

ロジック電源の設定

  • L6470はモータを動かす電源の他に,MCUを動かすロジック電源が必要である

  • ジャンパピンの挿入によって,MCU(Micro Control Unit)の電源電圧の供給方法を設定する

    • MCU3.3~5Vの間で動作する
  • この電圧は,L6470から出力され,マイコンへ入力されるデジタル信号の信号電圧にもなる

  • L6470は内部のレギュレータによって,モータ電源から3Vの電圧をMCUに回すこともできる

    • しかし,Arduino5V駆動であるため,3Vで駆動させることは好ましくない

    • Arduinoの5VピンからEXT-VDDピンに電圧を供給してMCUを駆動させる


f:id:tyokota_0529:20170620112724p:plain:w500

SPIの設定

  • L6470を使う際には,初めにコマンドを送るためのSPI通信の設定を行う

    • SPI.begin()

    • SPI.setBitOrder( MSBFIRST )

    • SPI.setDataMode( SPI_MODE3 )

  • それに加え,L6470ではシフトするコマンドを8ビットごとに区切る必要がある

Bit Order

  • SPI.transfer()で送信する1バイト分の情報を,左端(最上位)と右端(最下位)のどちらから送信するかを決める

MSB (Most Significant Bit)とLSB (Most Significant Bit)

  • 2進数で表された情報において,

    • MSB: Most Significant Bit First = 最上位ビット

    • LSB: Least Significant Bit First = 最下位ビット

  • を指す(ここでは8bit=1byte)

7 6 5 4 3 2 1 0
MSB LSB

SPI.setBitOrder()の命令

  • SPI.setBitOrder( MSBFIRST )

    • 最上位ビット(MSB)から順にデータを送信する

    • 7→6→5→4→3→2→1→0

  • SPI.setBitOrder( LSBFIRST )

    • 最下位ビット(LSB)から順にデータを送信する

    • 0→1→2→3→4→5→6→7

Data Mode

  • クロック位相(clock phase)とクロック極性(clock polarity)という2つの要素を決定

    • クロック位相:シフトされたデータを読み取るタイミング

      • クロック信号の 立ち下がりエッジ or 立ち上がりエッジ
    • クロック極性:アイドリング(待機)状態を示すクロック信号の状態

      • HIGH状態 or LOW状態

SPI.setDataMode()の命令

  • SPI.getDataMode( SPI_MODE3 )

    • クロック信号の立ち上がりで送信(シフト)されたデータの読み取りを行う

    • また,クロック信号がHIGHの間をアイドリング状態とする

その他のSPI_MODE
立ち下がりエッジで読み取り 立ち上がりエッジで読み取り
LOW状態でアイドリング SPI_MODE0 SPI_MODE1
HIGH状態でアイドリング SPI_MODE2 SPI_MODE3

SPIの設定まとめ

f:id:tyokota_0529:20170622050557p:plain:w900

内部レジスタ

  • L6470には,モータの制御に関するパラメータが設定できる内部レジスタ(記憶回路)が多く存在する

    • レジスタは可変長,22ビットや4ビット等がある.各レジスタの内部アドレスは0x01~0x19まで

    • レジスタのパラメータには初期設定(デフォルト値)が決まっており,電源投入直後にはデフォルト値が設定される

    • 大体はデフォルトの値で動作する.変更が必要な場合もあり

  • レジスタの値を設定した後に,コマンド(回転・ストップ等)を送ってモータを制御する


f:id:tyokota_0529:20170623040712p:plain

コマンドの送り方

  • MSBファーストで8ビットずつ

  • 8ビットごとに,CSのHIGH->LOWを行う必要がある

SPI.begin()
SPI.setBitOrder( MSBFIRST )
SPI.setDataMode( SPI_MODE3 )

void L6470_send( unsigned char add_or_val ){
        while( !digitalRead(PIN_BUSY) ){ // BUSY(LOW状態)が解除されるまで待機する
        }
        digitalWrite( PIN_SPI_SS, LOW);
        SPI.transfer( add_or_val ); //1バイト(8ビット)のデータを送信
        digitalWrite( PIN_SPI_SS, HIGH);
}

SetParam()によるレジスタの値の設定

Run()による定速回転

コマンド:Run( DIR, Spd )

  • 回転方向DIR(Direction)と,目標速度Spd(Speed)を指定してステッピングモータを定速回転させる

  • 32ビットの情報を4回に分けて送信する

f:id:tyokota_0529:20170630200712p:plain

初めの8ビット

  • 定速回転のコマンド+回転方向の指定

Command binary code

7 6 5 4 3 2 1 0
0 1 0 1 0 0 0 DIR
16進数
定速正回転の場合(DIR = 1) 定速負回転の場合(DIR = 0)
2進数 01010001 01010000
16進数 0x51 0x50

残りの24ビット

  • 回転速度の指定

    • Speedレジスタ(現在のモータ速度を格納しているレジスタ)内のデータと同じ表現形式

    • 実際にはMAX_SPEEDレジスタの値より小さく,MIN_SPEEDレジスタより大きい値である必要がある

      • これが満たされない場合,MAX(MIN)_SPEEDの値で実行される
    • 目標速度に達するまでBUSY状態

モータ速度の表現

  • Speed,MAX_SPEED,MIN_SPEEDレジスタでほぼ同じ表現が用いられる

  • レジスタにはステップ/動作クロックで表された値が格納されている

  • 1秒あたりのステップ数(ステップ/秒)には,それぞれ以下の式で変換される

Speedレジスタ(20ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-28}}{動作クロック}

  • 初期値は0(0ステップ/動作クロック,0ステップ/秒)

  • 動作クロックは250ns

MAX_SPEEDレジスタ(10ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-18}}{動作クロック}

  • 初期値は041

  • 動作クロックは250ns

ステップ/動作クロックからステップ/秒への変換

\rm\displaystyle 041 → 65(step/tick)

  • \rm\displaystyle Max_{init} [ step/s ] = \frac{ 65 \times 2^{-18}}{250 \times 10^{-9}}

  • \rm\displaystyle Max_{init} = 991.82 [ step/s ]

MAX_SPEEDレジスタの最大値

  • 初期値041は7ビット

  • 10ビットの最大値1111111111は0x3FF, 1023

  • \rm\displaystyle Max_{max} [ step/s ] = \frac{ 1023 \times 2^{-18}}{250 \times 10^{-9}}

  • \rm\displaystyle Max_{max} = 155609.74 [ step/s ]

MIN_SPEEDレジスタ(13ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-24}}{動作クロック}

  • 初期値は000(0ステップ/動作クロック,0ステップ/秒)

  • 動作クロックは250ns

バイスの初期化

  • Arduinoのvoid setup()内で,モータ駆動する前に以下の内容を実行する.
void L6470_resetDevice(){
   // nop命令
   L6470_send(0x00);
   L6470_send(0x00);        
   L6470_send(0x00);        
   L6470_send(0x00);
  // ResetDevice
   L6470_send(0xc0);
}
  • nop命令を4回(4byte分)送った後に,デバイスをリセットする(ResetDeviceコマンドを送る).

    • これは,L6470に一度に送る情報が最大で4byteであるため
  • nop命令を4回送ることで,前のコマンドを確実に終了させてからデバイスをリセットする

ResetDevice (Application commands)

  • L6470デバイスを電源投入後の状態にリセットする

    • パラメータの初期化等

Command binary code

7 6 5 4 3 2 1 0
1 1 0 0 0 0 0 0
16進数
  • 0xc0

    • SPI.transfer(0xc0)で初期化

NOP (Application commands)

  • Nothing is performed

    • 何もしない

Command binary code

7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
16進数
  • 0x00

    • SPI.transfer(0x00)で何もしない命令

シェーダ言語メモ

シェーダとは

  • GPU上での描画処理を細かく設定する

    • グラフィックス・パイプライン上の処理をプログラム言語で制御できる

OpenGL用の GLSL (OpenGL Shading Language)
DirectX用の HLSL (High Level Shading Language)

GPU (Graphics Processing Unit)

  • PCの画像処理を担当する部品の1つ

参考

  • CPUはCentral Processing Unitという

www.gizmodo.jp

グラフィックス・パイプライン

  • GPUで行われる三次元グラフィックスの描画処理の流れ

  • プログラマブルシェーダの導入により,パイプライン上の(レンダリング時における)頂点単位の処理や画素単位の処理がユーザに解放された

    • 頂点シェーダ(Vertex Shader)とフラグメントシェーダ(Fragment Shader, Pixel Shader)

f:id:tyokota_0529:20170610162430p:plain

コンピュータグラフィックス[改訂新版] (コンピュータグラフィックス編集委員会著) P. 57より

GLSL (OpenGL Shading Language)

シェーダープログラムの利用手順

記述 内容
glCreateShader() バーテックスシェーダとフラグメントシェーダのシェーダオブジェクトを作成
glShaderSource() 作成したそれぞれのシェーダオブジェクトに対してソースプログラムを読み込む
glCompileShader() 読み込んだソースプログラムをコンパイルします
glCreateProgram() プログラムオブジェクトを作成
glAttachShader() プログラムオブジェクトに対してシェーダオブジェクトを登録
glLinkProgram() シェーダプログラムをリンク
glUseProgram() シェーダプログラムを適用

シェーダの種類

頂点シェーダ(Vertex Shader)

  • 各頂点が持つ情報を制御するシェーダ

  • 頂点位置や頂点の色などを制御可能

  • ラスタライザにより情報が線形補間される

フラグメントシェーダ(Fragment Shader, Pixel Shader)

  • 各画素ごとに情報を制御するシェーダ

  • ラスタライザから受け取った情報を基に描画色を計算する

f:id:tyokota_0529:20170610213829p:plain