dsPIC30F2010 を使用するセンサBLDC モータ制御

AN957
dsPIC30F2010 を使用するセンサ BLDC モータ制御
著者 :
Stan D’Souza
Microchip Technology
はじめに
dsPIC30F2010は組込み式モータ制御アプリケーション
用に特別に設計された 28 ピン、16 ビットの MCU です。
dsPIC30F2010が特別に設計される代表的なモータのタ
イプとしては、AC 誘導モータ(ACIM)、ブラシレス DC
(BLDC)、DC などがあります。dsPIC30F2010 の主要な特
徴を以下紹介します。
・ 個別な 6 個の、または相補型 3 ペアの専用モータ
制御 PWM 出力
・ 最大 4 の同時サンプリング性能を有する 6 入力、
500Ksps ADC
・ 複数シリアル通信:UART、I2C および SPI
・ 小型パッケージ:組込み式制御アプリケーション
用 6 × 6 mm QFN
・ 制御ループでの高速応答 DSP エンジン
本 ア プ リ ケ ー シ ョ ン ノ ー ト で は、ど の よ う に
dsPIC30F2010 を用いてセンサ BLDC モータを制御する
かを説明します。BLDC モータの動作に関する詳細と、
BLDCモータの操作と制御に必要な一般情報については
AN901 をご参照ください。本アプリケーションノート
では、dsPIC30F2010 を用いた具体的な実装を説明しま
す。BLDC モータの詳細に関してごく簡単に触れます。
BLDC モータ
BLCD モータは、基本的には内外構造が逆になっている
DC モータです。DC モータでは、固定子は永久磁石で
す。回転子は、電流が流れる巻線で巻かれています。
回転子内の電流は反転されて、スプリット整流子とブ
ラシにより回転または移動する電界を生み出します。
一方 BLDC モータでは、巻線が固定子上に巻かれ、回転
子は永久磁石です。したがって、内外構造が逆になっ
ている DC モータと呼ばれます。
図 1:
BLDC 整流図
60o
ホール R
ホール Y
ホール B
通電 Q3,Q5Q1,Q5Q1,Q6Q2,Q6Q2,Q4Q3,Q4Q3,Q5Q1,Q5Q1,Q6
ホール状態
RYB
5
4
6
2
3
1
5
4
6
ホールセンサを読み取ると、1 ~ 6 の値を表す 3 ビッ
トコードが得られます。各コード値は、回転子が現在
位置するセクターを表しています。よって、コード値
からは、通電する必要のある巻線についての情報が与
えられます。したがって、プログラムは簡単な参照用
テーブルを用いて、回転子を回転させるためにどの二
つの巻線を通電するかを決定できます。
なお、状態「0」と「7」は、ホールセンサにとっては
無効な状態です。ソフトウェアはこれらの状態を検知
し、PWM を無効にしなければいけません。
状態変化通知入力
活用方法として、ホールセンサを dsPIC30F2010 の入力
ピン(状態変化通知(CN)入力)に接続することがで
きます。これらのピンの入力変化があると、割込みが
発生します。CN 割込みサービスルーチン(ISR)では、
ユーザアプリケーションプログラムがホールセンサの
値を読み取り、その値を用いて BLDC モータの巻線を駆
動するためのオフセットを生成するため参照用テーブ
ルを参照します。
回転子を回転させるには、回転電界が必要です。通常、
3 相 BLDC モータは 3 つの固定子の位相を備え、1 度に
二つを通電させ回転電界を生じます。この方法は容易
に実行できますが、永久磁石回転子が固定子によって
ロックされないようにするには、回転子磁石の正確な
位置を把握しつつ、特定の方式で順次固定子を通電し
なければいけません。位置情報はシャフトエンコーダ、
通常は回転子磁石の位置を検知するホールセンサによ
り取得できます。一般的な 3 相センサ BLDC モータの場
合、六つの異なる動作区間があり、それぞれ二つ特定
の固定子が通電されます。これを図 1 に示します。
©2006 Microchip Technology Inc.
DS00957A_JP page 1
AN957
モータ制御パルス幅変調(MCPWM)
上記方法を用いると、BLDC モータの最高速回転を得る
ことができます。ただし、様々な BLCD モータの速度を
得るには、巻線の端子に可変電圧を印加しなければな
りません。このことをデジタル用語で説明すると、可
変電圧は、BLDC モータの巻線に印加する PWM 信号の
デューティサイクルを変化させることで得られます。
dsPIC30F2010 は、PWM 信号で駆動可能な PWM 出力を 6
個備えています。図 2 に示されるように、3 つの巻線
は 6 個のスイッチ、IGBT または MOSFET を用いて High
に駆動される、Low に駆動される、あるいは全く駆動
されないの 3 種類が可能です。巻線の一部がたとえば
高圧側に接続されると、可変デューティサイクル信号
PWMを低圧側ドライバーに印加することができます。こ
れは、高圧側を PWM 信号で制御し、低圧側を VSS また
は GND に接続することと同じ結果になります。PWM 信
号で駆動する場合、低圧側ドライバーの方が高圧側ド
ライバーよりも推奨されます。
図 2:
BEMF 検知ハードウェア例
z
=
Q1
Q3
B
R
VDC
z
PWM は、dsPIC30F2010 の専用モータ制御(MC)PWM に
より提供されます。MCPWM モジュールは、モータ制御
アプリケーション用に特別に設計されています(この
MCPWM モジュールの説明をご覧になるとき、図 3 をご
参照ください)。
MCPWM は、専用 16 ビット PTMR 時間基準レジスタを備
えています。このタイマは、最小 Tcy まで設定可能な
ユーザの定義する時間刻みでインクリメントされま
す。また、ユーザは値を選択し PTPER レジスタにロー
ドすることにより、PWM に必要な周期も決定します。
PTMR は TCY 毎に PTPER 値と比較されて、一致すれば、
新たな周期が開始されます。
デューティサイクルも同様に、3 つのデューティサイ
クルレジスタに値をロードすることで制御されます。
周期の比較とは異なり、デューティサイクルレジスタ
は、TCY/2 毎に(つまり、周期比較の 2 倍の早さ)で
比較されます。PTMR と PDCx が一致すれば、対応する
デューティサイクル出力が、選択された PWM モードで
決められた Low または High に駆動されます。デュー
ティサイクル比較からの 3 つの出力は、一方が High で
他方が Low(またはその逆)の対となる相補型出力ピ
ンにそれぞれ出力されます。2 つの出力は独立した出
力として構成可能です。相補型出力として駆動される
場合、High から Low、または Low から High へ移行する
間にデッドタイムを挿入できます。このデッドタイム
はハードウェアで実現し、最小 Tcy までの時間を設定
できます。デッドタイムの挿入によって、駆動回路に
おける偶発的なショートスルーが回避されます。
z
Q4
z
Q6
Y
DS00957A_JP page 2
©2006 Microchip Technology Inc.
AN957
図 3:
PWM ブロック図
PWMCON1
PWM 選択及びモード SFR
PWMCON2
DTCON1
デットタイム制御 SFR
FLTACON
FLTA ピン制御 SFR
OVDCON
PWM 手動制御 SFR
PWM ジェネレータ #3
16 ビットデータバス
PDC3 バッファ
PDC3
コンパレータ
PWM ジェネレータ
#2
PTMR
PWM3H
チャネル 3 デットタイム
ジェネレータ
オーバーライドロジック
チャネル 2 デットタイム
ジェネレータ
オーバーライドロジック
PWM3L
出力
ドライバー
ブロック
PWM2H
PWM2L
コンパレータ
PWM ジェネレータ
#1
チャネル 1 デットタイム
ジェネレータ
オーバーライドロジック
PTPER
PWM1H
PWM1L
FLTA
PTPER バッファ
PTCON
コンパレータ
SEVTDIR
SEVTCMP
スペシャルイベント
ポストスケーラ
スペシャルイベント・トリガ
PTDIR
PWM 時間基準
注:明瞭化のため、PWM ジェネレータ #1 および #2 の詳細は省略されています。
© 2006 Microchip Technology Inc.
DS00957A_JP page 3
AN957
MCPWMモジュールを構成できるモードは複数あります。
エッジ揃え出力がおそらく最も一般的なモードです。
図 4 にエッジ揃え PWM の動作を示します。周期の開始
時、出力はすべて High に駆動されます。PTMR がイン
クリメントして、デューティサイクルレジスタと一致
すれば、対応するデューティサイクル出力は Low とな
り、デューティサイクルの終了を意味します。PTMR と
PTPER レジスタとが一致すると、新たな周期が開始さ
れ、すべての出力が High となって全く新たな周期がス
タートします。
図 4:
エッジ揃え PWM
OVDCON レジスタ内の値に応じて、ユーザはどのピンが
PWM 信号を取得し、どのピンが有効または無効に駆動
されるのかを選択できます。BLDC センサモータを制御
する際には、回転子の位置とホールセンサの値に応じ
て、2 つの巻線ペアを駆動する必要があります。CN 割
込みサービスルーチンでは、ホールセンサを読み取っ
てから、センサの値を、OVDCON レジスタにロードされ
る値に対応する参照用テーブル内のオフセットとして
使用します。表 1 と図 5 に、回転子がどのセクターに
配置され、それによりどの巻線が駆動されるべきかに
応じて、様々な値を OVDCON レジスタにロードする方法
を示します。
表 1:
PDCx からロードされる新デューティサイクル
PTPER
PDC1
PDC2
PWM 出力オーバーライド例
状態
OVDCON<15:8>
OVDCON<7:0>
1
2
3
4
00000011b
00110000b
00111100b
00001111b
00000000b
00000000b
00000000b
00000000b
PTMR 値
0
PWM1H
図 5:
PWM 出力オーバーライド例
デューティサイクル
状態
PWM2H
1
2
3
4
周期
PWM3H
PWM3L
MCPWM が設定可能なその他のモードに、中央揃え PWM
とシングルショット PWM とがあります。これらのモー
ドは BLDC モータの制御には使用されないので、ここで
は説明しません。詳細に関しては、dsPIC30F ファミ
リーリファレンスマニュアル(DS70046)をご参照くだ
さい。
本アプリケーションで使用される MCPWM の重要な特徴
は、オーバーライド制御です。オーバーライド制御は
MCPWM の最終段です。ユーザは OVDCON レジスタに直接
書き込み、出力ピンを制御することができます。OVDCON
レジスタは 2 つの 6 ビットフィールドで構成されてい
ます。OVDCON レジスタの上位バイト部分は、該当出力
ピンが PWM 信号により駆動される(1 に設定される)
か、あるいは OVDCON レジスタの下位バイト部分の該当
ビットにより有効 / 無効に駆動される(0 に設定され
る)かを決定します。この特徴によって、ユーザーは
PWM 信号を使用しながら、全ての出力ピンを駆動しな
いことが可能になります。BLDC モータの場合、同じ値
が全 PDCx レジスタに書き込まれます。
DS00957A_JP page 4
PWM2H
PWM2L
PWM1H
PWM1L
注:
状態 1 ~ 4 間の切換時間はユーザソフトウェアにより制
御される。状態の切換は OVDCON に新たな値を書き込む
ことで制御される。PWM 出力はこの例では独立モードで
動作する。
©2006 Microchip Technology Inc.
AN957
ハードウェアの説明
ファームウェアの説明
図 6 のブロック図に、dsPIC30F2010 を用いて BLDC を
駆動する方法を示します。詳細図に関しては付録 C を
ご参照下さい。
2 つのファームウェアプログラムが付録 A 及び B に添
付され、アプリケーションノートに記載の方法を説明
しています。ひとつのプログラムは、開ループ速度制
御を使用します。もうひとつのプログラムは、閉ルー
プ速度制御に比例積分フィードバックを使用していま
す。
図 6:
ハードウェアブロック図
dsPIC30F2010
BLDC
PWM3H
PWM3L
PWM2H
PWM2L
PWM1H
PWM1L
MOSFET ド
ライバー
開ループ制御
AN2
指示
CN5
CN6
CN7
開ループ方法は通常、実際のアプリケーションでは非
現実的です。ここで紹介するのは、BLDC モータの制御
方法を示すためです。
ホールセンサフィードバック
6 個の MCPWM 出力が 3 つの MOSFET ドライバーペア
(IR2101S)に接続され、最終的に 6 個の MOSFET に接続
されます(IRFR2407)。これらの MOSFET は 3 相ブリッ
ジ方式で、BLDC モータ巻線に接続されます。現行の実
装では、最高 MOSFET 電圧が 70 ボルト、最高 MOSFET 電
流は 18 アンペアです。
最大定格で使用される場合、適切な放熱を提供しなけ
ればならないことを指摘しておくべきです。また、
MOSFET ドライバーは動作するのに比較的高い電圧
(15V)が要求されるため、この電圧レベルを提供する
必要があります。モータは 24V の BLDC モータなので、
DC+ ~ DC- バス電圧は 24V です。5V レギュレータが
dsPIC30F2010 に電源供給します。3 つのホールセンサ
入力は、状態変化通知機能付き入力ピンに接続されま
す。これらの入力は,割込みとともに動作するよう設
定されますので、これらの 3 個のピンのいずれかで更
新が生じると、割込みが生成されます。速度の指示を
出すため、ポテンショメータが ADC 入力に接続されま
す(RB2)。
モータの起動および停止用に、プッシュボタンスイッ
チ R14 が使用されます。帰還電流を提供するため、微
小抵抗(25 ミリオーム)が DC- バス電圧と接地または
VSS 間に接続されます。この微小抵抗上で生成される
電圧は、演算増幅器により増幅されて(MCP6002)、ADC
に入力されます(RB1)。
開ループ制御では、MCPWM はスピードポットからの電
圧入力に基づきモータ速度を直接制御します。MCPWM、
ADC、ポートおよび状態変化通知入力の初期化後、プロ
グラムは開始を示す起動信号(たとえば、キーが押さ
れる)を待ちます(図 7 を参照)。キーが押されると、
ホールセンサが読み取られます。その値に基づき、該
当値がテーブルから検索され、OVDCON に書き込まれま
す。この時点で、モータは回転し始めます。
図 7:
開ループフロー
開始
MCPWM、ADC およびポートを初期
化する
No
キーが押されたか?
Yes
ホールセンサを読み取る:
OVDCON に参照用テーブルの状態
をロードする
指示ポテンショメータ
が読み取られたか?
No
Yes
PDCx に指示値をロードする
No
キーが押されたか?
Yes
OVDCON を用いて MCPWM を停止す
る
© 2006 Microchip Technology Inc.
DS00957A_JP page 5
AN957
最初に、デューティサイクル値はデフォルト 50%に保
持されます。次からのメインプログラムループでは、
ポテンショメータが読み取られ、その値(つまり、正
確な指示値)がデューティサイクルとして挿入されま
す。これでモータ速度が決定されます。デューティサ
イクル値が高いほど、モータは速く回転します。速度
は図 8 に示されるように、電圧制御ポットにより制御
されます。
図 8:
開ループ電圧制御モード
BLDC モータ
指示
dsPIC®
MCPWM
閉ループ制御
閉ループ制御ファームウェアでは、主な違いは、ポテ
ンショメータがモーター回転速度を設定するのに使用
されることです。制御ループは速度の比例・積分(PI)
制御を行ないます。実際速度を測定するには、TMR3 を
使用してひとつ完全な電気サイクルを計測します。こ
こは 10 極モータを使用しているため、5 電気サイクル
は結果的に 1 機械サイクルとなります。T 秒が 1 電気
サイクルの時間とすれば、速度 S=60/(P2*T) rpm とな
ります(ただし、P はモータの極の数とする)。その制
御を図 10 に示します。図 11 は閉ループ制御のフロー
チャートです。
図 10:
閉ループ電圧制御モード
モータ
指示
ホールセンサは状態変化通知ピンに接続されます。CN
割込みが許可されています。回転子が回転するにつれ、
回転磁石の位置が変更し、回転子は別のセクターに入
ります。新たな位置はそれぞれ CN 割込みによって知ら
されます。図 9 に示される CN 割込みルーチンでは、
ホールセンサが読み取られ、その値に基づき、参照用
テーブルの値が取得されOVDCONレジスタに書き込まれ
ます。この動作により、確実に正しい巻線が適切なセ
クターで駆動されて、モータが回転し続けます。
図 9:
CN 割込みフロー
+
Σ
dsPIC®
MCPWM
速度 PI
コントローラ
算出されるモータ速度
図 11:
閉ループ制御フロー
開始
MCPWM、ADC およびポートを
初期化する
開始
No
ホールセンサを読み取る
キーが押されたか?
Yes
参照用テーブルの状態の値を取得
ホールセンサを読み取る:
参照用テーブルの状態を OVDCON
にロードする
OVDCON にロードする
終了
実際の速度が読み取ら
れたか?
No
Yes
比例・積分速度エラー*を算出
する
位相進み
位相進みとその実行方法の詳細に関しては、AN901 を
ご参照ください。
No
キーが押されたか?
Yes
OVDCON を用いて MCPWM を停止す
る
* PDCx = Kp(比例速度エラー)+ Kl(積分速度エラー)
DS00957A_JP page 6
©2006 Microchip Technology Inc.
AN957
結論
参考文献
dsPIC30F2010 は、センサ BLDC モータの閉ループ制御
に適しています。周辺機能や DSP エンジンはセンサ
BLDCアプリケーションに優れたバンド幅を提供すると
ともに、ユーザーに十分なアプリケーションプログラ
ム空間を提供できます。
・ AN885 - Brushless
Fundamentals
・ AN901 - Using the
BLDC Control
・ AN857 - Brushless
・ AN889 - Brushless
PIC18FXX31 MCUs
© 2006 Microchip Technology Inc.
DC (BLDC) Motor
dsPIC30F for Sensorless
DC Motor Control Made Easy
DC Motor Control Using
DS00957A_JP page 7
AN957
付録 A:
付属書類
開ループ制御のソースコードリスト
本付録は、開ループ制御のソースコードリストを含みます。
Software License Agreement
The software supplied herewith by Microchip Technology Incorporated (the “Company”) is intended and supplied to you, the
Company’s customer, for use solely and exclusively with products manufactured by the Company.
The software is owned by the Company and/or its supplier, and is protected under applicable copyright laws. All rights are reserved.
Any use in violation of the foregoing restrictions may subject the user to criminal sanctions under applicable laws, as well as to civil
iability for the breach of the terms and conditions of this license.
THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR
STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE
FOR SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//--------------------------------------------------------------------------------//
Software License Agreement
//
// The software supplied herewith by Microchip Technology Incorporated
// (the “Company”) is intended and supplied to you, the Company’s customer,
// for use solely and exclusively with products manufacture by the Company.
// The software is owned by the Company and/or its supplier, and is protected under
// applicable copyright laws. All rights are reserved. Any use in violation of the
// foregoing restrictions may subject the user to criminal sanctions under applicable
// laws, as well as to civil liability for the breach of the terms and conditions of
// this license.
//
// THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, WHETHER EXPRESS,
// IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//--------------------------------------------------------------------------------// ファイル:ClosedLoopSenBLDC.c
//
// 作成者:Stan D'Souza, Microchip Technoloy
//
// 下記ファイルを MPLAB プロジェクトに含むものとします。
//
//
ClosedLoopSenBLDC.c -メインソースコードファイル
//
p30f2010.gld -リンカスクリプトファイル
//--------------------------------------------------------------------// 改訂履歴
//
//10/01/04 -第 1 版
//---------------------------------------------------------------------/*************************************************************
低圧側ドライバーテーブルは以下のとおりです。この StateLoTable では、低圧側ドライバーは PWM で、高圧側ドラ
イバーはオンまたはオフです。このプログラムは本テーブルを使用します。
*************************************************************/
unsigned int StateLoTable[] = {0x0000, 0x0210, 0x2004, 0x0204,
0x0801, 0x0810, 0x2001, 0x0000};
/****************************************************************
以下は状態変化通知 CN5、CN6、CN7 の割り込みベクターです。ホールセンサの状態が変わった時、割り込みが発生し
以下のルーチンが実行されます。ユーザは PORTB を読み取り、ビット 3、4 および 5 をマスクし、1、2….6 として読
み取るようにその値をシフトし調節する必要があります。次に、この値は OVDCON レジスタにロードされる値を決定
するため、参照用テーブル StateLoTable 内のオフセットとして使用されます。
*****************************************************************/
DS00957A_JP page 8
©2006 Microchip Technology Inc.
AN957
void _ISR _CNInterrupt(void)
{
IFS0bits.CNIF = 0;
// clear flag
HallValue = PORTB & 0x0038;
// mask RB3,4 & 5
HallValue = HallValue >> 3;
// shift right 3 times
OVDCON = StateLoTable[HallValue];
}
/*********************************************************************
ADC 割込みは指示ポット値を PDCx レジスタにロードします。これは、モータが動作中の場合のみ実行されます。
*********************************************************************/
void _ISR _ADCInterrupt(void)
{
IFS0bits.ADIF = 0;
if (Flags.RunMotor)
{
PDC1 = ADCBUF0;
PDC2 = PDC1;
PDC3 = PDC1;
}
}
// get value ...
// and load all three PWMs ...
// duty cycles
int main(void)
{
LATE = 0x0000;
TRISE = 0xFFC0;
// PWMs are outputs
CNEN1 = 0x00E0;
// CN5,6 and 7 enabled
CNPU1 = 0x00E0;
// enable internal pullups
IFS0bits.CNIF = 0;
// clear CNIF
IEC0bits.CNIE = 1;
// enable CN interrupt
InitMCPWM();
InitADC10();
while(1)
{
while (!S2);
// wait for start key hit
while (S2)
// wait till key is released
DelayNmSec(10);
// read hall position sensors on PORTB
HallValue = PORTB & 0x0038;
// mask RB3,4 & 5
HallValue = HallValue >> 3;
// shift right to get value 1, 2 ... 6
OVDCON = StateLoTable[HallValue]; // Load the overide control register
PWMCON1 = 0x0777;
// enable PWM outputs
Flags.RunMotor = 1;
// set flag
while (Flags.RunMotor)
// while motor is running
if (S2)
// if S2 is pressed
{
PWMCON1 = 0x0700;
// disable PWM outputs
OVDCON = 0x0000;
// overide PWM low.
Flags.RunMotor = 0;
// reset run flag
while (S2)
// wait for key release
DelayNmSec(10);
}
} // end of while (1)
}
© 2006 Microchip Technology Inc.
DS00957A_JP page 9
AN957
/*******************************************************************
以下のコードは、
1.1 チャネル変換(この場合、RB2/AN2)
2.PWM トリガーによる変換開始
3.ポットの CH0 および RB2 への接続
4.サンプリングの手動停止と変換開始
5.変換完了の手動チェック
のために ADC レジスタを設定するのに必要です。
*********************************************************************/
void InitADC10(void)
{
ADPCFG = 0xFFF8;
ADCON1 = 0x0064;
ADCON2 = 0x0200;
ADCHS = 0x0002;
ADCON3 = 0x0080;
IFS0bits.ADIF = 0;
IEC0bits.ADIE = 1;
ADCON1bits.ADON = 1;
//
//
//
//
//
//
all PORTB = Digital;RB0 to RB2 = analog
PWM starts conversion
simulataneous sample 4 channels
Connect RB2/AN2 as CH0 = pot ..
ch1 = Vbus, Ch2 = Motor, Ch3 = pot
Tad = internal RC (4uS)
// turn ADC ON
}
/********************************************************************
InitMCPWM は以下のように PWM を初期化します。
1.FPWM=16000hz
2.独立 PWM
3.OVDCON を用いる制御出力
4.ポテンショメータから読み出した ADC 値でデューティサイクルを設定
5.PWM スペシャルトリガによる ADC 変換開始を設定
*********************************************************************/
void InitMCPWM(void)
{
PTPER = FCY/FPWM - 1;
PWMCON1 = 0x0700;
OVDCON = 0x0000;
PDC1 = 100;
PDC2 = 100;
PDC3 = 100;
SEVTCMP = PTPER;
PWMCON2 = 0x0F00;
PTCON = 0x8000;
// disable PWMs
// allow control using OVD
// init PWM 1, 2 and 3 to 100
// 16 postscale values
// start PWM
}
//--------------------------------------------------------------------// これは、1 ミリ秒~ 65.5 秒の遅延を実現する一般的な 1ms 遅延ルーチンです。N=1 の場合、遅延は 1ms で、
// N=65535 の場合、遅延は 65,535ms です。なお、FCY が計算に使用されます。上記定義文の場合のように、正確
// な FCY を算出するため必要な変更(PLLx4 または PLLx8 など)を行なってください。
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
for(j=0;j < MILLISEC;j++);
}
DS00957A_JP page 10
©2006 Microchip Technology Inc.
AN957
付録 B:
付属書類
閉ループ制御のソースコードリスト
本付録は、閉ループ制御のソースコードリストを含みます。
//--------------------------------------------------------------------------------//
Software License Agreement
//
// The software supplied herewith by Microchip Technology Incorporated
// (the “Company”) is intended and supplied to you, the Company’s customer,
// for use solely and exclusively with products manufacture by the Company.
// The software is owned by the Company and/or its supplier, and is protected under
// applicable copyright laws. All rights are reserved. Any use in violation of the
// foregoing restrictions may subject the user to criminal sanctions under applicable
// laws, as well as to civil liability for the breach of the terms and conditions of
// this license.
//
// THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, WHETHER EXPRESS,
// IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//--------------------------------------------------------------------------------// ファイル:ClosedLoopSenBLDC.c
//
// 作成者:Stan D'Souza, Microchip Technoloy
//
// 下記ファイルを MPLAB プロジェクトに含むものとします。
//
//
ClosedLoopSenBLDC.c -メインソースコードファイル
//
p30f2010.gld -リンカスクリプトファイル
//
//--------------------------------------------------------------------// 改訂履歴
//
// 10/01/04 -第 1 版
//--------------------------------------------------------------------//***************************************************************************
ClosedLoopSenBLDC.c は BLDC モータのセンサ閉ループ制御です。タスクは以下から構成されます。
CN5、6 および 7(ポート B)に接続されるホールセンサの状態変化を検知します。
CN 割込みの間、ポート B を読み取ることにより入力されたセンサ値を読み取ります。
位置 1、2、….6 の状態をマスクし決定します。
提供される StateLoTable 参照用テーブルを使用して、OVDCON レジスタ値を決定します。
この値を OVDCON に設定します。
PWM が、独立連続 PWM を生成するように初期化されます。
ポット REF の値が、指示モータ速度を決定するのに使用されます。次に指示速度と実際速度を用いて比例速度誤差と
積分速度誤差を決定します。これらの 2 つの値により、新たなデューティサイクルが次の計算式で算出されます。
NewDutyCycle=Kp*(比例速度誤差)+Ki*(積分速度誤差 ) そして 10 ビットの NewDutyCycle 値が三つの PWM デュー
ティサイクルにロードされます。
FPWM は 16000hz です。
ADC は PWM トリガーによる変換開始に設定されます。
********************************************************************************/
© 2006 Microchip Technology Inc.
DS00957A_JP page 11
AN957
#define __dsPIC30F2010__
#include "c:\pic30_tools\support\h\p30F2010.h"
#define
#define
#define
#define
#define
#define
FCY 10000000// xtal = 5.0Mhz; PLLx8
MILLISEC FCY/10000// 1 mSec delay constant
FPWM 16000
Ksp1200
Ksi10
RPMConstant60*(FCY/256)
#define S2!PORTCbits.RC14
void
void
void
void
void
void
void
InitTMR3(void);
InitADC10(void);
AverageADC(void);
DelayNmSec(unsigned int N);
InitMCPWM(void);
CalculateDC(void);
GetSpeed(void);
struct {
}
unsigned RunMotor : 1;
unsigned Minus : 1;
unsigned unused : 14;
Flags;
unsigned int HallValue;
int Speed;
unsigned int Timer3;
unsigned char Count;
unsigned char SpeedCount;
int DesiredSpeed;
int ActualSpeed;
int SpeedError;
int DutyCycle;
int SpeedIntegral;
//*************************************************************
低圧側ドライバーテーブルは以下のとおりです。この StateLoTable では、低圧側ドライバーは PWM で、高圧側ドラ
イバーはオンまたはオフです。このプログラムは本テーブルを使用します。
*************************************************************/
unsigned int StateLoTable[] = {0x0000, 0x1002, 0x0420, 0x0402,
0x0108, 0x1008, 0x0120, 0x0000};
/****************************************************************
以下は状態変化通知 CN5、CN6、CN7 の割り込みベクターです。ホールセンサの状態が変わった時、割り込みが発生し
以下のルーチンが実行されます。ユーザは PORTB を読み取り、ビット 3、4 および 5 をマスクし、1、2….6 として読
み取るようにその値をシフトし調節する必要があります。次に、この値は OVDCON レジスタにロードされる値を決定
するため、参照用テーブル StateLoTable 内のオフセットとして使用されます。
*****************************************************************/
DS00957A_JP page 12
©2006 Microchip Technology Inc.
AN957
void _ISR _CNInterrupt(void)
{
IFS0bits.CNIF = 0;
//
HallValue = PORTB & 0x0038;
//
HallValue = HallValue >> 3;
//
OVDCON = StateLoTable[HallValue];//
}
clear flag
mask RB3,4 & 5
shift right 3 times
Load the overide control register
/*********************************************************************
ADC 割込みは、指示ポット値を DesiredSpeed 変数にロードします。これは、速度エラーを決定するのに使用されま
す。モータが動作していないとき、PDC 値は直接ポットからの入力値を使用します。
*********************************************************************/
void _ISR _ADCInterrupt(void)
{
IFS0bits.ADIF = 0;
DesiredSpeed = ADCBUF0;
if (!Flags.RunMotor)
{
PDC1 = ADCBUF0;
// get value ...
PDC2 = PDC1;
// and load all three PWMs ...
PDC3 = PDC1;
// duty cycles
}
}
/************************************************************************
メインルーチンは初期化と、モータの始動と停止を行うボタン入力を制御します。
************************************************************************/
int main(void)
{
LATE = 0x0000;
TRISE = 0xFFC0;
// PWMs are outputs
CNEN1 = 0x00E0;
// CN5,6 and 7 enabled
CNPU1 = 0x00E0;
// enable internal pullups
IFS0bits.CNIF = 0;
// clear CNIF
IEC0bits.CNIE = 1;
// enable CN interrupt
SpeedError = 0;
SpeedIntegral = 0;
InitTMR3();
InitMCPWM();
InitADC10();
while(1)
{
while (!S2);
// wait for start key hit
while (S2)
// wait till key is released
DelayNmSec(10);
// read hall position sensors on PORTB
HallValue = PORTB & 0x0038;
// mask RB3,4 & 5
HallValue = HallValue >> 3;
// shift right to get value 1, 2 ... 6
OVDCON = StateLoTable[HallValue];// Load the overide control register
PWMCON1 = 0x0777;
// enable PWM outputs
Flags.RunMotor = 1;
// set flag
T3CON = 0x8030;
// start TMR3
while (Flags.RunMotor)
// while motor is running
if (!S2)
// if S2 is not pressed
© 2006 Microchip Technology Inc.
DS00957A_JP page 13
AN957
{
if (HallValue == 1)
{
HallValue = 0xFF;
if (++Count == 5)
//IF in sector 1
// force a new value as a sector
// do this for 5 electrical revolutions or 1
// mechanical revolution for a 10 pole motor
{
Timer3 = TMR3;// read latest tmr3 value
TMR3 = 0;
Count = 0;
GetSpeed();// determine spped
}
}
}
}
else
// else S2 is pressed to stop motor
{
PWMCON1 = 0x0700;// disable PWM outputs
OVDCON = 0x0000; // overide PWM low.
Flags.RunMotor = 0;// reset run flag
while (S2)// wait for key release
DelayNmSec(10);
}
// end of while (1)
}
/*******************************************************************
以下のコードは、
1.1 チャネル変換(この場合、RB2/AN2)
2.PWM トリガーによる変換開始
3.ポットの CH0 および RB2 への接続
4.サンプリングの手動停止と変換開始
5.変換完了の手動チェック
のために ADC レジスタを設定するのに必要です。
*********************************************************************/
void InitADC10(void)
{
ADPCFG = 0xFFF8;
ADCON1 = 0x0064;
ADCON2 = 0x0000;
ADCHS = 0x0002;
ADCON3 = 0x0080;
IFS0bits.ADIF = 0;
IEC0bits.ADIE = 1;
//
//
//
//
//
//
//
all PORTB = Digital;RB0 to RB2 = analog
PWM starts conversion
sample CH0 channel
Connect RB2/AN2 as CH0 = pot.
Tad = internal RC (4uS)
clear flag
enable interrupt
ADCON1bits.ADON = 1;
// turn ADC ON
}
DS00957A_JP page 14
©2006 Microchip Technology Inc.
AN957
/********************************************************************
InitMCPWM は以下のように PWM を初期化します。
1.FPWM=16000hz
2.独立 PWM
3.OVDCON を用いる制御出力
4.PI アルゴリズムと速度エラーでデューティサイクルを設定
5.PWM スペシャルトリガによる ADC 変換開始を設定
*********************************************************************/
void InitMCPWM(void)
{
PTPER = FCY/FPWM - 1;
PWMCON1 = 0x0700;
OVDCON = 0x0000;
PDC1 = 100;
PDC2 = 100;
PDC3 = 100;
SEVTCMP = PTPER;
PWMCON2 = 0x0F00;
PTCON = 0x8000;
// disable PWMs
// allow control using OVD
// init PWM 1, 2 and 3 to 100
// special trigger is 16 period values
// 16 postscale values
// start PWM
}
/************************************************************************
Tmr3 は速度を計測するのに使用されるため、Tcy/256 を用いてカウントするように設定されます。
*************************************************************************/
void InitTMR3(void)
{
T3CON = 0x0030;
TMR3 = 0;
PR3 = 0x8000;
}
// internal Tcy/256 clock
/************************************************************************
GetSpeed は、1 機械サイクルごとに TMR3 内の値を用いてモータの正確な速度を決定する。
*************************************************************************/
void GetSpeed(void)
{
if (Timer3 > 23000)
// if TMR3 is large ignore reading
return;
if (Timer3 > 0)
Speed = RPMConstant/(long)Timer3;// get speed in RPM
ActualSpeed += Speed;
ActualSpeed = ActualSpeed >> 1;
if (++SpeedCount == 1)
{SpeedCount = 0;CalculateDC();}
}
© 2006 Microchip Technology Inc.
DS00957A_JP page 15
AN957
/*****************************************************************************
CalculateDC は PI アルゴリズムを用いて、PDCx レジスタにロードされる新 DutyCycle 値を算出します。
****************************************************************************/
void CalculateDC(void)
{
DesiredSpeed = DesiredSpeed*3;
Flags.Minus = 0;
if (ActualSpeed > DesiredSpeed)
SpeedError = ActualSpeed - DesiredSpeed;
else
{
SpeedError = DesiredSpeed - ActualSpeed;
Flags.Minus = 1;
}
SpeedIntegral += SpeedError;
if (SpeedIntegral > 9000)
SpeedIntegral = 0;
DutyCycle = (((long)Ksp*(long)SpeedError + (long)Ksi*(long)SpeedIntegral) >> 12);
DesiredSpeed = DesiredSpeed/3;
if (Flags.Minus)
DutyCycle = DesiredSpeed + DutyCycle;
else DutyCycle = DesiredSpeed - DutyCycle;
if (DutyCycle < 100)
DutyCycle = 100;
if (DutyCycle > 1250)
{DutyCycle = 1250;SpeedIntegral = 0;}
PDC1 = DutyCycle;
PDC2 = PDC1;
PDC3 = PDC1;
}
//--------------------------------------------------------------------// これは、1 ミリ秒~ 65.5 秒の遅延を実現する一般的な 1ms 遅延ルーチンです。N=1 の場合、遅延は 1ms で、
//N=65535 の場合、遅延は 65,535ms です。なお、FCY が計算に使用されます。上記定義文の場合のように、正確
// な FCY を算出するため必要な変更(PLLx4 または PLLx8 など)を行なってください。
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
for(j=0;j < MILLISEC;j++);
}
DS00957A_JP page 16
©2006 Microchip Technology Inc.
© 2006 Microchip Technology Inc.
付属書類
付録 C:
概略図
本付録は、dsPIC30F2010 を使用したセンサ BLDC モータの制御概略図を含めます。
図 C-1:
モータ制御概略図 1
AN957
DS00957A_JP page 17
モータ制御概略図 2
VB 8
HO 7
VS 6
2 HIN
3 LIN
VCC 1
LO 5
COM 4
VB 8
HO 7
VS 6
2 HIN
3 LIN
VCC 1
LO 5
COM 4
2 HIN
3 LIN
VB 8
HO 7
VS 6
VCC 1
LO 5
COM 4
AN957
DS00957A_JP page 18
図 C-2:
© 2006 Microchip Technology Inc.
マイクロチップデバイスのコード保護機能に関する以下の点に留意ください。
・
マイクロチップの製品は各製品独自のマイクロチップデーターシートにある仕様を満たしています。
・
各製品ファミリーは、通常の状態で所定の方法で利用いただければ市場にある類似製品の中で最も安全なファミリーの一つと
マイクロチップは信じております。
・
不正かつ非合法な方法を使ったコード保護機能の侵害があります。弊社の理解ではこうした手法は、マイクロチップデーター
シートにある動作仕様書以外の方法でマイクロチップ製品を使用することになります。こうした手法を使用した人は、ほとん
どの場合、知的財産権の侵害となります。
・
マイクロチップはコードの統合性に関心をお持ちの顧客とは協働させていただきます。
・
マイクロチップまたは他のセミコンダクターメーカーがコードの安全性を保証したものではありません。コード保護は製品保
護が「破られない」ということを保証するものではありません。
コード保護は常に進化します。マイクロチップは、当社製品のコード保護機能を継続的に改善することをお約束いたします。マクロ
チップのコード保護機能を破ることは、デジタル・ミレニアム著作権法に違反します。こうした行為によるソフトウェアーや著作権
に関わる作品への不正アクセスがあった場合、同法に基づき賠償請求する権利があります。
本書の日本語版はユーザーの使用のために提供されます。
Microchip Technology Inc. とその子会社、関連会社、すべ
ての取締役、役員、職員、代理人は翻訳の間違いにより起こ
るいかなる責も負わないものとします。間違いが疑われる個
所については、Microchip Technology Inc. 発行のオリジナ
ル文書を参照いただくようお奨めします。
商標
本書に書かれているデバイスアプリケーション等に関する内
容は、参考情報に過ぎません。ご利用のアプリケーションが
仕様を満たしているかどうかについては、お客様の責任にお
いて確認をお願いします。これらの情報の正確さ、またはこ
れの情報の使用に関し、マイクロチップテクノロジーインク
はいかなる表明と保証を行うものではなく、また、一切の責
任を負うものではありません。マイクロチップの明示的な書
面による承認なしに、生命維持装置あるいは生命安全用途に
マイクロチップのデバイスを使用することはすべて購入者の
リスクとし、また購入者はこれによって起きたあらゆる損害、
クレーム、訴訟、費用に関して、マイクロチップは擁護され、
免責され、損害をうけないことに同意するものとします。知
的財産権に基づくライセンスを暗示的に与えたものではあり
ません。
AmpLab、FilterLab、Migratable Memory、MXDEV、MXLAB、
SEEVAL、SmartSensor、The Embedded Control Solutions
Company は、米国においてマイクロチップテクノロジーインク
の登録商標です。
マイクロチップの名称とロゴ、マイクロチップのロゴ、
Accuron、dsPIC、KEELOQ、microID、MPLAB、PIC、PICmicro、
PICSTART、PRO MATE、PowerSmart、rfPIC、SmartShunt は米国及
び他の国々において、マイクロチップテクノロジーインクの登
録商標です。
Analog-for-the-Digital Age、Application Maestro、dsPICDEM、
dsPICDEM.net、dsPICworks、ECAN、ECONOMONITOR、FanSense、
FlexROM、fuzzyLAB、In-Circuit Serial Programming、ICSP、
ICEPIC、Linear Active Thermistor、Mindi、Miwi、MPASM、
MPLIB、MPLINK、MPSIM、PICkit、PICDEM、PICDEM.net、PICLAB、
PICtail、PowerCal、Powerlnfo、PowerMate、PowerTool、REAL
ICE、rfLAB、rfPICDEM、Select Mode、Smart Serial、SmartTel、
Total Endurance、UNI/O、WiperLock、及び ZENA は、米国及び
他の国々において、マイクロチップテクノロジーインクの登録
商標です。
SQTP は米国においてマイクロチップテクノロジーインクのサー
ビスマークです。
本書に記載された上記以外の商標は、それぞれの会社の財産で
す。
著作権。©2006、マイクロチップテクノロジーインク、米国で印
刷。無断複写・転載を禁じます。
再生紙を使用
マイクロチップは、1OS/TS-16949 を受けました。本社、アリゾナ州チャ
ンドラーとテンペ、オレゴン州グレシャムとカリフォルニア州マウンテン
ビューにあるデザイン及びウエハー施設に対する品質システム認証です。
弊社の品質システムプロセスと手続きは、PICmicro® 8-bitMCUs 、
KEELOQ® コードホッピングデバイス、シリアル EEPROMs 、マイクロペリ
フェラル、非揮発性メモリーとアナログ製品を対象としています。更に、
開発システムの設計及び製造に関するマイクロチップの品質システムは、
2000 年に ISO9001 の認証を受けています。
© 2006 Microchip Technology Inc.
DS00957A_JP page 19
全世界の販売及びサービス拠点
AMERICAS
ASIA/PACIFIC
ASIA/PACIFIC
EUROPE
Corporate Office
2355 West Chandler Blvd.
Chandler, AZ 85224-6199
Tel: 480-792-7200
Fax: 480-792-7277
Technical Support:
http://support.microchip.com
Web Address:
www.microchip.com
Australia - Sydney
Tel: 61-2-9868-6733
Fax: 61-2-9868-6755
India - Bangalore
Tel: 91-80-4182-8400
Fax: 91-80-4182-8422
China - Beijing
Tel: 86-10-8528-2100
Fax: 86-10-8528-2104
India - New Delhi
Tel: 91-11-5160-8631
Fax: 91-11-5160-8632
Austria - Wels
Tel: 43-7242-2244-399
Fax: 43-7242-2244-393
Denmark - Copenhagen
Tel: 45-4450-2828
Fax: 45-4485-2829
China - Chengdu
Tel: 86-28-8676-6200
Fax: 86-28-8676-6599
India - Pune
Tel: 91-20-2566-1512
Fax: 91-20-2566-1513
France - Paris
Tel: 33-1-69-53-63-20
Fax: 33-1-69-30-90-79
China - Fuzhou
Tel: 86-591-8750-3506
Fax: 86-591-8750-3521
Japan - Yokohama
Tel: 81-45-471- 6166
Fax: 81-45-471-6122
Germany - Munich
Tel: 49-89-627-144-0
Fax: 49-89-627-144-44
China - Hong Kong SAR
Tel: 852-2401-1200
Fax: 852-2401-3431
Korea - Gumi
Tel: 82-54-473-4301
Fax: 82-54-473-4302
China - Qingdao
Tel: 86-532-8502-7355
Fax: 86-532-8502-7205
Korea - Seoul
Tel: 82-2-554-7200
Fax: 82-2-558-5932 or
82-2-558-5934
Atlanta
Alpharetta, GA
Tel: 770-640-0034
Fax: 770-640-0307
Boston
Westborough, MA
Tel: 774-760-0087
Fax: 774-760-0088
Chicago
Itasca, IL
Tel: 630-285-0071
Fax: 630-285-0075
Dallas
Addison, TX
Tel: 972-818-7423
Fax: 972-818-2924
Detroit
Farmington Hills, MI
Tel: 248-538-2250
Fax: 248-538-2260
Kokomo
Kokomo, IN
Tel: 765-864-8360
Fax: 765-864-8387
Los Angeles
Mission Viejo, CA
Tel: 949-462-9523
Fax: 949-462-9608
San Jose
Mountain View, CA
Tel: 650-215-1444
Fax: 650-961-0286
Toronto
Mississauga, Ontario,
Canada
Tel: 905-673-0699
Fax: 905-673-6509
China - Shanghai
Tel: 86-21-5407-5533
Fax: 86-21-5407-5066
China - Shenyang
Tel: 86-24-2334-2829
Fax: 86-24-2334-2393
China - Shenzhen
Tel: 86-755-8203-2660
Fax: 86-755-8203-1760
China - Shunde
Tel: 86-757-2839-5507
Fax: 86-757-2839-5571
China - Wuhan
Tel: 86-27-5980-5300
Fax: 86-27-5980-5118
China - Xian
Tel: 86-29-8833-7250
Fax: 86-29-8833-7256
Malaysia - Penang
Tel: 60-4-646-8870
Fax: 60-4-646-5086
Philippines - Manila
Tel: 63-2-634-9065
Fax: 63-2-634-9069
Italy - Milan
Tel: 39-0331-742611
Fax: 39-0331-466781
Netherlands - Drunen
Tel: 31-416-690399
Fax: 31-416-690340
Spain - Madrid
Tel: 34-91-708-08-90
Fax: 34-91-708-08-91
UK - Wokingham
Tel: 44-118-921-5869
Fax: 44-118-921-5820
Singapore
Tel: 65-6334-8870
Fax: 65-6334-8850
Taiwan - Hsin Chu
Tel: 886-3-572-9526
Fax: 886-3-572-6459
Taiwan - Kaohsiung
Tel: 886-7-536-4818
Fax: 886-7-536-4803
Taiwan - Taipei
Tel: 886-2-2500-6610
Fax: 886-2-2508-0102
Thailand - Bangkok
Tel: 66-2-694-1351
Fax: 66-2-694-1350
02/16/06
DS00957A_JP page 20
©2006 Microchip Technology Inc.