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.
© Copyright 2024 Paperzz