TI社のBLDCモータードライバDRV8301を コントロールするためのユーティリティのようなクラスです。 できるだけユーザーにわかりやすく レジスタの設定・読み取りなどを行います。 尚、データシートは必須の模様。

Dependents:   BLDC1Axis_DRV8301CTRL

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DRV8301CTRL.cpp Source File

DRV8301CTRL.cpp

00001 #include "DRV8301CTRL.h"
00002 
00003 //ショートカット
00004 #define DRV8301_CS_ACTIVE cs->write(0)
00005 #define DRV8301_CS_INACTIVE cs->write(1)
00006 #define DRV8301_GATE_ACTIVE gate->write(1)
00007 #define DRV8301_GATE_INACTIVE gate->write(0)
00008 
00009 //コンストラクタ(オーバーロード +3) =================================
00010 /*
00011  * シリアルとSPIのアドレス、CSとEN_GATEのピンネームを指定してインスタンスを生成
00012  */
00013 drv8301ctrl::drv8301ctrl(Serial *serial, SPI *spi, PinName csel, PinName en_gate){
00014     pc = serial;
00015     si = spi;
00016     cs = new DigitalOut(csel);
00017     gate = new DigitalOut(en_gate);
00018     hasSerial = !(pc == NULL);
00019 }
00020 
00021 //コンストラクタ(オーバーロード +3) =================================
00022 /*
00023  * シリアルとSPIのアドレス、CSとEN_GATEのアドレスを指定してインスタンスを生成
00024  */
00025 drv8301ctrl::drv8301ctrl(Serial *serial, SPI *spi, DigitalOut *csel, DigitalOut *en_gate){
00026     pc = serial;
00027     si = spi;
00028     cs = csel;
00029     gate = en_gate;
00030     hasSerial = !(pc == NULL);
00031 }
00032 
00033 //コンストラクタ(オーバーロード +3) =================================
00034 /*
00035  * SPIのアドレス、CSとEN_GATEのピンネームを指定してインスタンスを生成
00036  * この場合、デバッグ(シリアルでのSPI通信内容の出力)は使用できない
00037  */
00038 drv8301ctrl::drv8301ctrl(SPI *spi, PinName csel, PinName en_gate){
00039     si = spi;
00040     cs = new DigitalOut(csel);
00041     gate = new DigitalOut(en_gate);
00042     hasSerial = false;
00043 }
00044 
00045 //コンストラクタ(オーバーロード +3) =================================
00046 /*
00047  * SPIのアドレス、CSとEN_GATEのアドレスを指定してインスタンスを生成
00048  * この場合、デバッグ(シリアルでのSPI通信内容の出力)は使用できない
00049  */
00050 drv8301ctrl::drv8301ctrl(SPI *spi, DigitalOut *csel, DigitalOut *en_gate){
00051     si = spi;
00052     cs = csel;
00053     gate = en_gate;
00054     hasSerial = false;
00055 }
00056 
00057 //デストラクタ  =================================================
00058 drv8301ctrl::~drv8301ctrl(){
00059     delete pc;
00060     delete si;
00061     delete cs;
00062     delete gate;
00063 }
00064 
00065 //private:SPIコマンド送信  ======================================
00066 /*
00067  * SPIコマンドを送信し、DRV8301からの返答を受け取って返す
00068  * DRV8301は16bitの命令を送信した際、次回送信時に前回の返答を返す
00069  * つまり1回目でコマンドを送信し、2回目の空送信で返答を得る
00070  *
00071  * 引数debugを有効にした場合、SPIでのやりとりの内容をシリアルに出力する
00072  * 引数debugはデフォルトでtrue
00073  */
00074 int drv8301ctrl::spi_cmd(int val, bool debug){
00075     DRV8301_CS_ACTIVE;
00076     wait_us(1);
00077 
00078     //送信
00079     si->write(val);
00080 
00081     wait_us(1);
00082     DRV8301_CS_INACTIVE;
00083 
00084     wait_us(1);
00085 
00086     DRV8301_CS_ACTIVE;
00087 
00088     //返答
00089     int ret = si->write(0x0000);
00090 
00091     if(debug && hasSerial){
00092         pc->printf("CS ACTIVE\r\n\tSPI SEND >>>> values = 0x%08x\r\n\tRECEIVE  <<<< return = 0x%08x\r\nCS INACTIVE\r\n", val, ret);
00093     }
00094 
00095     wait_us(1);
00096     DRV8301_CS_INACTIVE;
00097     wait_us(1);
00098 
00099     return ret;
00100 }
00101 
00102 //private:SPI関連の初期化とか  ====================================
00103 /*
00104  * SPIインターフェースの初期化およびDRV8301への初期化コマンドの送信
00105  *
00106  * 引数reset_ifaceをfalseにすることでSPIインタフェースの初期化をスキップ
00107  * すでに外部でSPIインターフェースを使用している等の場合はfalseを指定
00108  * 引数reset_ifaceはデフォルトでtrue
00109  *
00110  */
00111 void drv8301ctrl::init(bool reset_iface){
00112     //SPI初期化
00113     if(reset_iface){
00114         si->frequency(DRV8301CTRL_FREQ);
00115         si->format(16, 1);
00116     }
00117 
00118     //EN_GATEの状態をリセット
00119     gateReset();
00120 
00121     //CS状態をセット
00122     DRV8301_CS_INACTIVE;
00123 
00124     //現在のレジスタ内容を出力
00125     if(hasSerial){
00126         pc->printf(
00127             "1\tSTATUS 1   NOW : 0x%08x, STATUS 2   NOW : 0x%08x\r\n",
00128             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS1, false) & 0x07FF),
00129             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS2, false) & 0x07FF)
00130         );
00131         pc->printf(
00132             "1\tREGISTER 1 NOW : 0x%08x, REGISTER 2 NOW : 0x%08x\r\n",
00133             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1, false) & 0x07FF),
00134             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2, false) & 0x07FF)
00135         );
00136     }
00137 
00138     //初期設定
00139     /*
00140      * コントロールレジスタは、自分で格納用の値を作って列挙体の値を論理和でくっつけた後
00141      * updateWriteValueやwriteCtrl(引数あり)で値を直接更新する方法と、
00142      * クラスのメンバ変数が所持している値をメソッドで更新してから
00143      * writeCtrl1(引数なし)で更新する方法などがある。
00144      * 基本的にはクラスメソッドで値を更新して、writeCtrlを引数なしで呼ぶことが妥当。
00145      *
00146      * 下記の方法は前者。
00147      */
00148     unsigned short settingVal1 =
00149         GATE_CURRENT_PEAKCURRENT_1_7A |
00150         GATE_RESET_NORMAL |
00151         PWM_MODE_PWMLINES_3 |
00152         OCP_MODE_CURRENTLIMIT |
00153         OC_ADJ_SET_ADJUST_0_358
00154     ;
00155 
00156     //上記をメソッド更新版で書いた場合
00157     //setGATE_CURRENT(1.7f);
00158     //setGATE_RESET(true);
00159     //setPWM_MODE(false);
00160     //setOCP_MODE(0x00);
00161     //setOC_ADJ(0.358f);
00162 
00163     //初期設定内容を書き込む
00164     //メソッド更新のみで値を書き換えた場合は引数は不要
00165     //writeCtrl1(); //メソッドで更新した場合 コントロールレジスタ1
00166     //writeCtrl2(); //メソッドで更新した場合 コントロールレジスタ2
00167     writeCtrl1(settingVal1); //コントロールレジスタ1
00168 
00169     //現在のレジスタ内容を出力
00170     if(hasSerial){
00171         pc->printf(
00172             "2\tSTATUS 1   NOW : 0x%08x, STATUS 2   NOW : 0x%08x\r\n",
00173             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS1, false) & 0x07FF),
00174             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS2, false) & 0x07FF)
00175         );
00176         pc->printf(
00177             "2\tREGISTER 1 NOW : 0x%08x, REGISTER 2 NOW : 0x%08x\r\n",
00178             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1, false) & 0x07FF),
00179             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2, false) & 0x07FF)
00180         );
00181     }
00182 
00183     unsigned short settingVal2 =
00184         OCTW_MODE_REPORT_OT_OC_BOTH |
00185         SHUNTGAIN_GAIN_40V_PER_V |
00186         DC_CAL_CH1_ENABLE |
00187         DC_CAL_CH2_ENABLE |
00188         OC_TOFF_CYCLE_BY_CYCLE
00189     ;
00190 
00191     //上記をメソッド更新版で書いた場合
00192     //setOCTW_MODE(0x00);
00193     //setGAIN(2);
00194     //setDC_CAL_CH1_Enabled(true);
00195     //setDC_CAL_CH2_Enabled(true);
00196     //setOC_TOFF_CycleByCycle(true);
00197 
00198     //初期設定内容を書き込む
00199     //メソッド更新のみで値を書き換えた場合は引数は不要
00200     //writeCtrl1(); //メソッドで更新した場合 コントロールレジスタ1
00201     //writeCtrl2(); //メソッドで更新した場合 コントロールレジスタ2
00202     writeCtrl2(settingVal2); //コントロールレジスタ1
00203 
00204     //デバイスIDを取得
00205     devID = readDEVICE_ID();
00206 
00207     //シリアル出力
00208     if(hasSerial){
00209         pc->printf("INITIALIZE BEGIN\r\n\tSPI Freq = %d[Hz], SPI Mode = 16, 1\r\n", (int)DRV8301CTRL_FREQ);
00210         pc->printf("\tDEVICE ID = [%d]\r\n", (int)devID);
00211     }
00212 
00213     //現在のレジスタ内容を出力
00214     if(hasSerial){
00215         pc->printf(
00216             "3\tSTATUS 1   NOW : 0x%08x, STATUS 2   NOW : 0x%08x\r\n",
00217             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS1, false) & 0x07FF),
00218             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS2, false) & 0x07FF)
00219         );
00220         pc->printf(
00221             "3\tREGISTER 1 NOW : 0x%08x, REGISTER 2 NOW : 0x%08x\r\n",
00222             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1, false) & 0x07FF),
00223             (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2, false) & 0x07FF)
00224         );
00225         pc->printf("\tINITIAL CTRL1 REG = 0x%08x\r\n\tINITIAL CTRL2 REG = 0x%08x\r\n", settingVal1, settingVal2);
00226     }
00227 
00228     //シリアル出力
00229     if(hasSerial){
00230         pc->printf("INITIALIZE END\r\n   ---===---===---   \r\n");
00231     }
00232 
00233     //待ち時間
00234     wait_ms(5);
00235 }
00236 
00237 //ステータスレジスタ1の読み取り  ========================================
00238 /*
00239  * DRV8301の現在の状態を読み取り、返す(ステータスレジスタ1)
00240  *
00241  * この情報で読み取れるものは、
00242  * FAULT(何らかの異常), GVDD_UV(GVDD電圧下降), PVDD_UV(PVDD電圧下降),
00243  * OTSD(温度上昇シャットダウン), OTW(温度上昇警告),
00244  * FETHA_OC(A相FETハイサイド過電流), FETLA_OC(A相FETローサイド過電流),
00245  * FETHB_OC(B相FETハイサイド過電流), FETLB_OC(B相FETローサイド過電流),
00246  * FETHC_OC(B相FETハイサイド過電流), FETLC_OC(B相FETローサイド過電流)
00247  *
00248  * 異常がなければ0, 異常があれば1が設定される
00249  */
00250 unsigned short drv8301ctrl::readStatus1(){
00251     //SPIで値を読み取り、返す
00252     return (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS1) & 0x07FF);
00253 }
00254 
00255 //ステータスレジスタ2の読み取り  ========================================
00256 /*
00257  * DRV8301の現在の状態を読み取り、返す(ステータスレジスタ2)
00258  *
00259  * この情報で読み取れるものは、
00260  * GVDD_OV(GVDD過電圧)、DEVICE_ID(デバイスID)
00261  *
00262  * GVDD_OVは異常がなければ0, 異常があれば1が設定される
00263  * デバイスIDは4bitの値で、通常は1(0x0001)を返す
00264  */
00265 unsigned short drv8301ctrl::readStatus2(){
00266     //SPIで値を読み取り、返す
00267     return (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_STATUS2) & 0x07FF);
00268 }
00269 
00270 //ステータスレジスタ:FAULTの読み取り  ===================================
00271 /*
00272  * ステータスレジスタからFAULTの状態だけを切り取って返す
00273  * 戻り値がtrueであればFAULT(何らかの異常)が発生している
00274  */
00275 bool drv8301ctrl::readFault(){
00276     return (((readStatus1() >> 10) & 0x0001) == 1);
00277 }
00278 
00279 //ステータスレジスタ:GVDD_UVの読み取り  =================================
00280 /*
00281  * ステータスレジスタからGVDD_UVの状態だけを切り取って返す
00282  * 戻り値がtrueであればGVDD_UV(GVDDの電圧下降)が発生している
00283  */
00284 bool drv8301ctrl::readGVDD_UV(){
00285     return (((readStatus1() >> 9) & 0x0001) == 1);
00286 }
00287 
00288 //ステータスレジスタ:PVDD_UVの読み取り  =================================
00289 /*
00290  * ステータスレジスタからPVDD_UVの状態だけを切り取って返す
00291  * 戻り値がtrueであればPVDD_UV(PVDDの電圧下降)が発生している
00292  */
00293 bool drv8301ctrl::readPVDD_UV(){
00294     return (((readStatus1() >> 8) & 0x0001) == 1);
00295 }
00296 
00297 //ステータスレジスタ:OTSDの読み取り  ====================================
00298 /*
00299  * ステータスレジスタからOTSDの状態だけを切り取って返す
00300  * 戻り値がtrueであればOTSD(温度上昇によるシャットダウン)が発生している
00301  *
00302  * 温度上昇によるシャットダウンは摂氏150度で設定される
00303  */
00304 bool drv8301ctrl::readOTSD(){
00305     return (((readStatus1() >> 7) & 0x0001) == 1);
00306 }
00307 
00308 //ステータスレジスタ:OTWの読み取り  =====================================
00309 /*
00310  * ステータスレジスタからOTWの状態だけを切り取って返す
00311  * 戻り値がtrueであればOTW(温度上昇による警告)が発生している
00312  *
00313  * 温度上昇による警告は摂氏130度で設定される
00314  * この警告は摂氏115度になるまで発生し続ける
00315  */
00316 bool drv8301ctrl::readOTW(){
00317     return (((readStatus1() >> 6) & 0x0001) == 1);
00318 }
00319 
00320 //ステータスレジスタ:FETHA_OCの読み取り  ================================
00321 /*
00322  * ステータスレジスタからFETHA_OCの状態だけを切り取って返す
00323  * 戻り値がtrueであればFETHA_OC(A相FETハイサイド過電流)が発生している
00324  */
00325 bool drv8301ctrl::readFETHA_OC(){
00326     return (((readStatus1() >> 5) & 0x0001) == 1);
00327 }
00328 
00329 //ステータスレジスタ:FETLA_OCの読み取り  ================================
00330 /*
00331  * ステータスレジスタからFETLA_OCの状態だけを切り取って返す
00332  * 戻り値がtrueであればFETLA_OC(A相FETローサイド過電流)が発生している
00333  */
00334 bool drv8301ctrl::readFETLA_OC(){
00335     return (((readStatus1() >> 4) & 0x0001) == 1);
00336 }
00337 
00338 //ステータスレジスタ:FETHB_OCの読み取り  ================================
00339 /*
00340  * ステータスレジスタからFETHB_OCの状態だけを切り取って返す
00341  * 戻り値がtrueであればFETHB_OC(B相FETハイサイド過電流)が発生している
00342  */
00343 bool drv8301ctrl::readFETHB_OC(){
00344     return (((readStatus1() >> 3) & 0x0001) == 1);
00345 }
00346 
00347 //ステータスレジスタ:FETLB_OCの読み取り  ================================
00348 /*
00349  * ステータスレジスタからFETLB_OCの状態だけを切り取って返す
00350  * 戻り値がtrueであればFETLB_OC(B相FETローサイド過電流)が発生している
00351  */
00352 bool drv8301ctrl::readFETLB_OC(){
00353     return (((readStatus1() >> 2) & 0x0001) == 1);
00354 }
00355 
00356 //ステータスレジスタ:FETHC_OCの読み取り  ================================
00357 /*
00358  * ステータスレジスタからFETHC_OCの状態だけを切り取って返す
00359  * 戻り値がtrueであればFETHC_OC(C相FETハイサイド過電流)が発生している
00360  */
00361 bool drv8301ctrl::readFETHC_OC(){
00362     return (((readStatus1() >> 1) & 0x0001) == 1);
00363 }
00364 
00365 //ステータスレジスタ:FETLC_OCの読み取り  ================================
00366 /*
00367  * ステータスレジスタからFETLC_OCの状態だけを切り取って返す
00368  * 戻り値がtrueであればFETLC_OC(C相FETローサイド過電流)が発生している
00369  */
00370 bool drv8301ctrl::readFETLC_OC(){
00371     return ((readStatus1() & 0x0001) == 1);
00372 }
00373 
00374 //ステータスレジスタ:GVDD_OVの読み取り  =================================
00375 /*
00376  * ステータスレジスタからGVDD_OVの状態だけを切り取って返す
00377  * 戻り値がtrueであればGVDD_OV(GVDD過電圧)が発生している
00378  */
00379 bool drv8301ctrl::readGVDD_OV(){
00380     return (((readStatus2() >> 7) & 0x0001) == 1);
00381 }
00382 
00383 //ステータスレジスタ:Device IDの読み取り  ===============================
00384 /*
00385  * ステータスレジスタからDevideIDの状態だけを切り取って返す
00386  * 戻り値は4bitの値、0 - 15の中のいずれか
00387  */
00388 unsigned char drv8301ctrl::readDEVICE_ID(){
00389     return (unsigned char)(readStatus2() & 0x0F);
00390 }
00391 
00392 //コントロールレジスタ1の読み取り  =======================================
00393 /*
00394  * DRV8301の現在の状態を読み取り、返す(コントロールレジスタ1)
00395  * 読み取った情報は、内部の保存用変数に格納する
00396  *
00397  * この情報で読み取れるものは、
00398  * GATE_CURRENT(FETゲートカレント設定), GATE_RESET(ゲートリセット監視),
00399  * PWM_MODE(PWM信号送出方法), OCP_MODE(過電流監視モード),
00400  * OC_ADJ_SET(過電流調整値)
00401  *
00402  * 設定値はデフォルトであればOC_ADJ_SET以外は0を返す
00403  */
00404 unsigned short drv8301ctrl::readCtrl1(){
00405     //取得した値を次回書き込み用変数に格納
00406     writeValue1 = (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1) & 0x07FF);
00407     return writeValue1;
00408 }
00409 
00410 //コントロールレジスタ2の読み取り  =======================================
00411 /*
00412  * DRV8301の現在の状態を読み取り、返す(コントロールレジスタ2)
00413  * 読み取った情報は、内部の保存用変数に格納する
00414  *
00415  * この情報で読み取れるものは、
00416  * OCTW_MODE(過電流、温度上昇監視方法), GAIN(電流読み取り値増幅),
00417  * DC_CAL_CH1(電流読み取り値オフセットch1),
00418  * DC_CAL_CH2(電流読み取り値オフセットch2),
00419  * OC_TOFF(過電流発生時オフタイム設定)
00420  *
00421  * 設定値はデフォルトであれば0を返す
00422  */
00423 unsigned short drv8301ctrl::readCtrl2(){
00424     //取得した値を次回書き込み用変数に格納
00425     writeValue2 = (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2) & 0x07FF);
00426     return writeValue2;
00427 }
00428 
00429 //コントロールレジスタ:GATE_CURRENTの読み取り  ===========================
00430 /*
00431  * コントロールレジスタからGATE_CURRENTの状態だけを切り取って返す
00432  *
00433  * 戻り値の値は0 - 3の4種類
00434  * Gate drive peak current 1.7 A = 0
00435  * Gate drive peak current 0.7 A = 1
00436  * Gate drive peak current 0.25 A = 2
00437  * Reserved = 3
00438  */
00439 unsigned char drv8301ctrl::readGATE_CURRENT(){
00440     return (unsigned char)(readCtrl1() & 0x03);
00441 }
00442 
00443 //コントロールレジスタ:GATE_CURRENTの読み取り:実際の値で返す  ===================
00444 /*
00445  * コントロールレジスタからGATE_CURRENTの状態だけを切り取って返す
00446  *
00447  * 戻り値の値は4種類
00448  * Gate drive peak current 1.7 A = 1.7f
00449  * Gate drive peak current 0.7 A = 0.7f
00450  * Gate drive peak current 0.25 A = 0.25f
00451  * Reserved = -1.0f
00452  */
00453 float drv8301ctrl::readValGATE_CURRENT(){
00454     float ret = 0.0f;
00455     switch(readCtrl1() & 0x03){
00456         case 0:
00457             //1.7A
00458             ret = 1.7f;
00459             break;
00460         case 1:
00461             //0.7A
00462             ret = 0.7f;
00463             break;
00464         case 2:
00465             //0.25A
00466             ret = 0.25f;
00467             break;
00468         default:
00469             //reserved
00470             ret = -1.0f;
00471     }
00472     return ret;
00473 }
00474 
00475 //コントロールレジスタ:GATE_RESETの読み取り  =============================
00476 /*
00477  * コントロールレジスタからGATE_RESETの状態だけを切り取って返す
00478  *
00479  * 戻り値がtrueならNormal mode
00480  * falseならReset gate driver latched faults (reverts to 0)
00481  */
00482 bool drv8301ctrl::readGATE_RESETisNormal(){
00483     //設定がNormalならtrue、そうでないならfalseを返す
00484     return (((readCtrl1() >> 2) & 0x01) == 0);
00485 }
00486 
00487 //コントロールレジスタ:PWM_MODEの読み取り  ===============================
00488 /*
00489  * コントロールレジスタからPWM_MODEの状態だけを切り取って返す
00490  *
00491  * 戻り値がtrueなら6線式PWMモード
00492  * falseなら3線式PWMモード
00493  */
00494 bool drv8301ctrl::readPWM_MODEis6PWM(){
00495     //設定が6-PWM Modeならtrue、3-PWM Modeならfalseを返す
00496     return (((readCtrl1() >> 3) & 0x01) == 0);
00497 }
00498 
00499 //コントロールレジスタ:OCP_MODEの読み取り  ===============================
00500 /*
00501  * コントロールレジスタからOCP_MODEの状態だけを切り取って返す
00502  *
00503  * 戻り値の値は0 - 3の4種類
00504  * Current limit = 0
00505  * OC latch shut down = 1
00506  * Report only = 2
00507  * OC disabled = 3
00508  */
00509 unsigned char drv8301ctrl::readOCP_MODE(){
00510     return (unsigned char)((readCtrl1() >> 4) & 0x03);
00511 }
00512 
00513 //コントロールレジスタ:OC_ADJ_SETの読み取り  =============================
00514 /*
00515  * コントロールレジスタからOC_ADJ_SETの状態だけを切り取って返す
00516  *
00517  * 戻り値の値は設定値の5bit(0 - 32)
00518  */
00519 unsigned char drv8301ctrl::readOC_ADJ_SET(){
00520     return (unsigned char)((readCtrl1() >> 6) & 0x1F);
00521 }
00522 
00523 //コントロールレジスタ:OC_ADJ_SETの読み取り:実際の値で返す  =====================
00524 /*
00525  * コントロールレジスタからOC_ADJ_SETの状態だけを切り取って返す
00526  *
00527  * 戻り値の値は設定値の実際の値
00528  */
00529 float drv8301ctrl::readValOC_ADJ_SET(){
00530     float ret = 0.0f;
00531     switch(readCtrl1() & 0x07C0){
00532         case 0x0000: ret = 0.060; break;
00533         case 0x0040: ret = 0.068; break;
00534         case 0x0080: ret = 0.076; break;
00535         case 0x00C0: ret = 0.086; break;
00536         case 0x0100: ret = 0.097; break;
00537         case 0x0140: ret = 0.109; break;
00538         case 0x0180: ret = 0.123; break;
00539         case 0x01C0: ret = 0.138; break;
00540         case 0x0200: ret = 0.155; break;
00541         case 0x0240: ret = 0.175; break;
00542         case 0x0280: ret = 0.197; break;
00543         case 0x02C0: ret = 0.222; break;
00544         case 0x0300: ret = 0.250; break;
00545         case 0x0340: ret = 0.282; break;
00546         case 0x0380: ret = 0.317; break;
00547         case 0x03C0: ret = 0.358; break;
00548         case 0x0400: ret = 0.403; break;
00549         case 0x0440: ret = 0.454; break;
00550         case 0x0480: ret = 0.511; break;
00551         case 0x04C0: ret = 0.576; break;
00552         case 0x0500: ret = 0.648; break;
00553         case 0x0540: ret = 0.730; break;
00554         case 0x0580: ret = 0.822; break;
00555         case 0x05C0: ret = 0.926; break;
00556         case 0x0600: ret = 1.043; break;
00557         case 0x0640: ret = 1.175; break;
00558         case 0x0680: ret = 1.324; break;
00559         case 0x06C0: ret = 1.491; break;
00560         case 0x0700: ret = 1.679; break;
00561         case 0x0740: ret = 1.892; break;
00562         case 0x0780: ret = 2.131; break;
00563         case 0x07C0: ret = 2.400; break;
00564     }
00565     return ret;
00566 }
00567 
00568 //コントロールレジスタ:OCTW_MODEの読み取り  ==============================
00569 /*
00570  * コントロールレジスタからOCTW_MODEの状態だけを切り取って返す
00571  *
00572  * 戻り値の値は0 - 3の4種類
00573  * Report both OT and OC at nOCTW pin = 0
00574  * Report OT only = 1
00575  * Report OC only = 2
00576  * Report OC only (reserved) = 3
00577  */
00578 unsigned char drv8301ctrl::readOCTW_MODE(){
00579     return (unsigned char)(readCtrl2() & 0x03);
00580 }
00581 
00582 //コントロールレジスタ:GAINの読み取り  ===================================
00583 /*
00584  * コントロールレジスタからGAINの状態だけを切り取って返す
00585  *
00586  * 戻り値の値は0 - 3の4種類
00587  * Gain of shunt amplifier: 10 V/V = 0
00588  * Gain of shunt amplifier: 20 V/V = 1
00589  * Gain of shunt amplifier: 40 V/V = 2
00590  * Gain of shunt amplifier: 80 V/V = 3
00591  */
00592 unsigned char drv8301ctrl::readGAIN(){
00593     return (unsigned char)((readCtrl2() >> 2) & 0x03);
00594 }
00595 
00596 //コントロールレジスタ:DC_CAL_CH1の読み取り  =============================
00597 /*
00598  * コントロールレジスタからDC_CAL_CH1の状態だけを切り取って返す
00599  *
00600  * 戻り値がtrueならオフセット有効
00601  * falseならオフセット無効
00602  */
00603 bool drv8301ctrl::readDC_CAL_CH1isEnabled(){
00604     //設定が有効(Enabled)ならtrue、そうでないならfalseを返す
00605     return (((readCtrl2() >> 4) & 0x01) == 0);
00606 }
00607 
00608 //コントロールレジスタ:DC_CAL_CH2の読み取り  =============================
00609 /*
00610  * コントロールレジスタからDC_CAL_CH2の状態だけを切り取って返す
00611  *
00612  * 戻り値がtrueならオフセット有効
00613  * falseならオフセット無効
00614  */
00615 bool drv8301ctrl::readDC_CAL_CH2isEnabled(){
00616     //設定が有効(Enabled)ならtrue、そうでないならfalseを返す
00617     return (((readCtrl2() >> 5) & 0x01) == 0);
00618 }
00619 
00620 //コントロールレジスタ:OC_TOFFの読み取り  ================================
00621 /*
00622  * コントロールレジスタからOC_TOFFの状態だけを切り取って返す
00623  *
00624  * 戻り値がtrueならCycle by cycle
00625  * falseならOff-time control
00626  */
00627 bool drv8301ctrl::readOC_TOFFisCycleByCycle(){
00628     //設定がCycle by Cycleならtrue、そうでないならfalseを返す
00629     return (((readCtrl2() >> 6) & 0x01) == 0);
00630 }
00631 
00632 //コントロールレジスタ1への書き込み:valが0xffffならwriteValue1を使用する  =========
00633 /*
00634  *  コントロールレジスタ1へ値を書き込む
00635  *  引数valが指定されていれば、引数の中の値を書き込み
00636  *  引数valが指定されていないか、もしくは引数valが0xffffであれば
00637  *  内部に保存しているwriteValue1の中の値を書き込む
00638  *
00639  *  戻り値がtrueであれば書き込み成功
00640  */
00641 bool drv8301ctrl::writeCtrl1(unsigned short val){
00642     //シリアル出力
00643     if(hasSerial){
00644         pc->printf("CURRENT SETTING = 0x%08x\r\n", (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1, false) & 0x07FF));
00645         pc->printf(">>>>WRITE CTRL1 REGISTER\r\n\tval         = 0x%08x\r\n\twriteValue1 = 0x%08x\r\n", val, writeValue1);
00646     }
00647 
00648     //値の書き込み(先頭(MSB)に1がついていたら書き込み失敗)
00649     unsigned short ret = spi_cmd(DRV8301REG_WRITEMODE | DRV8301REG_CTRL1 | ((val == 0xffff)? writeValue1 : val));
00650 
00651     //値の書き込みが終わったら現在の値を取得して値をリセットする
00652     resetWriteValue1();
00653 
00654     //先頭ビットに1がついていなければ(32768未満であれば)書き込み成功(trueを返す)
00655     return (ret < 32768);
00656 }
00657 
00658 //コントロールレジスタ2への書き込み:valが0xffffならwriteValue2を使用する  =========
00659 /*
00660  *  コントロールレジスタ2へ値を書き込む
00661  *  引数valが指定されていれば、引数の中の値を書き込み
00662  *  引数valが指定されていないか、もしくは引数valが0xffffであれば
00663  *  内部に保存しているwriteValue2の中の値を書き込む
00664  *
00665  *  戻り値がtrueであれば書き込み成功
00666  */
00667 bool drv8301ctrl::writeCtrl2(unsigned short val){
00668     //シリアル出力
00669     if(hasSerial){
00670         pc->printf("CURRENT SETTING = 0x%08x\r\n", (spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2, false) & 0x07FF));
00671         pc->printf(">>>>WRITE CTRL2 REGISTER\r\n\tval         = 0x%08x\r\n\twriteValue2 = 0x%08x\r\n", val, writeValue2);
00672     }
00673 
00674     //値の書き込み(先頭(MSB)に1がついていたら書き込み失敗)
00675     unsigned short ret = spi_cmd(DRV8301REG_WRITEMODE | DRV8301REG_CTRL2 | ((val == 0xffff)? writeValue2 : val));
00676 
00677     //値の書き込みが終わったら現在の値を取得して値をリセットする
00678     resetWriteValue2();
00679 
00680     //先頭ビットに1がついていなければ(32768未満であれば)書き込み成功(trueを返す)
00681     return (ret < 32768);
00682 }
00683 
00684 //コントロールレジスタ1に設定する内容を格納した変数をリセット  =========================
00685 void drv8301ctrl::resetWriteValue1(){
00686     writeValue1 = (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL1) & 0x07FF);
00687 }
00688 
00689 //コントロールレジスタ2に設定する内容を格納した変数をリセット  =========================
00690 void drv8301ctrl::resetWriteValue2(){
00691     writeValue2 = (unsigned short)(spi_cmd(DRV8301REG_READMODE | DRV8301REG_CTRL2) & 0x07FF);
00692 }
00693 
00694 //コントロールレジスタ1に設定する内容を格納した変数を直接アップデート  =====================
00695 void drv8301ctrl::updateWriteValue1(unsigned short val){
00696     writeValue1 = val;
00697 }
00698 
00699 //コントロールレジスタ2に設定する内容を格納した変数を直接アップデート  =====================
00700 void drv8301ctrl::updateWriteValue2(unsigned short val){
00701     writeValue2 = val;
00702 }
00703 
00704 //コントロールレジスタ:GATE_CURRENTの書き込み  ===========================
00705 void drv8301ctrl::setGATE_CURRENT(unsigned char val){
00706     //値は0x00,0x01,0x10,0x11の4種類。値が3(0x11)以上のものは0x00として扱う
00707     if(val > 3) val = 0;
00708 
00709     //writeValueの対象部分をゼロにして、論理和をとる
00710     writeValue1 &= 0xFFFC;
00711     writeValue1 |= val;
00712 
00713     //シリアル出力
00714     if(hasSerial){
00715         pc->printf("Register1 temporary value changed, [GATE_CURRENT]\r\n\tval = 0x%08x, writeValue1 = 0x%08x\r\n", val, writeValue1);
00716     }
00717 }
00718 
00719 //コントロールレジスタ:GATE_CURRENTの書き込み:実際の値に近いものを書き込む  ============
00720 void drv8301ctrl::setGATE_CURRENT(float realVal){
00721     //値は0.0(reserved),0.25,0.7,1.7の4種類。値が1.7以上は1.7として扱う
00722     realVal = (realVal < 0.0f) ? 0.0f : (realVal > 1.7f) ? 1.7f : realVal;
00723 
00724     //writeValueの対象部分をゼロにする
00725     writeValue1 &= 0xFFFC;
00726 
00727     if(realVal < 0.25f){
00728         writeValue1 |= GATE_CURRENT_PEAKCURRENT_RESERVED; //reserved
00729     }else if(realVal < 0.7f){
00730         writeValue1 |= GATE_CURRENT_PEAKCURRENT_0_25A; //0.25A
00731     }else if(realVal < 1.7f){
00732         writeValue1 |= GATE_CURRENT_PEAKCURRENT_0_7A; //0.7A
00733     }else{
00734         writeValue1 |= GATE_CURRENT_PEAKCURRENT_1_7A; //1.7A
00735     }
00736 
00737     //シリアル出力
00738     if(hasSerial){
00739         pc->printf("Register1 temporary value changed, [GATE_CURRENT]\r\n\tval = %01.2f, writeValue1 = 0x%08x\r\n", realVal, writeValue1);
00740     }
00741 }
00742 
00743 //コントロールレジスタ:GATE_RESETの書き込み  =============================
00744 void drv8301ctrl::setGATE_RESET(bool isNormal){
00745     //writeValueの対象部分をゼロにする
00746     writeValue1 &= 0xFFFB;
00747 
00748     writeValue1 |= isNormal ? GATE_RESET_NORMAL : GATE_RESET_RESETGATE_LATCHED_FAULT;
00749 
00750     //シリアル出力
00751     if(hasSerial){
00752         pc->printf(
00753             "Register1 temporary value changed, [GATE_RESET]\r\n\tisNormal = %s, writeValue1 = 0x%08x\r\n",
00754             (isNormal ? "true" : "false"),
00755             writeValue1
00756         );
00757     }
00758 }
00759 
00760 //コントロールレジスタ:PWM_MODEの書き込み  ===============================
00761 void drv8301ctrl::setPWM_MODE(bool is6PWM){
00762     //writeValueの対象部分をゼロにする
00763     writeValue1 &= 0xFFF7;
00764 
00765     writeValue1 |= is6PWM ? PWM_MODE_PWMLINES_6 : PWM_MODE_PWMLINES_3;
00766 
00767     //シリアル出力
00768     if(hasSerial){
00769         pc->printf(
00770             "Register1 temporary value changed, [PWM_MODE]\r\n\tis6PWM = %s, writeValue1 = 0x%08x\r\n",
00771             (is6PWM ? "true" : "false"),
00772             writeValue1
00773         );
00774     }
00775 }
00776 
00777 //コントロールレジスタ:OCP_MODEの書き込み  ===============================
00778 void drv8301ctrl::setOCP_MODE(unsigned char val){
00779     //値は0x00,0x01,0x10,0x11の4種類。値が3(0x11)以上のものは0x00として扱う
00780     if(val > 3) val = 0;
00781 
00782     //writeValueの対象部分をゼロにする
00783     writeValue1 &= 0xFFCF;
00784 
00785     switch(val){
00786         case 0: writeValue1 |= OCP_MODE_CURRENTLIMIT; break;
00787         case 1: writeValue1 |= OCP_MODE_OC_LATCH_SHUTDOWN; break;
00788         case 2: writeValue1 |= OCP_MODE_REPORTONLY; break;
00789         case 3: writeValue1 |= OCP_MODE_OC_DISABLE; break;
00790     }
00791 
00792     //シリアル出力
00793     if(hasSerial){
00794         pc->printf("Register1 temporary value changed, [GATE_CURRENT]\r\n\tval = 0x%08x, writeValue1 = 0x%08x\r\n", val, writeValue1);
00795     }
00796 }
00797 
00798 //コントロールレジスタ:OC_ADJ_SETの書き込み  =============================
00799 void drv8301ctrl::setOC_ADJ(unsigned char val){
00800     //値は0(0x00)から31(0x1f)まで。31以上は0として扱う
00801     if(val > 31) val = 0;
00802 
00803     //writeValueの対象部分をゼロにする
00804     writeValue1 &= 0xF83F;
00805 
00806     switch(val){
00807         case 0: writeValue1 |= OC_ADJ_SET_ADJUST_0_060; break;
00808         case 1: writeValue1 |= OC_ADJ_SET_ADJUST_0_068; break;
00809         case 2: writeValue1 |= OC_ADJ_SET_ADJUST_0_076; break;
00810         case 3: writeValue1 |= OC_ADJ_SET_ADJUST_0_086; break;
00811         case 4: writeValue1 |= OC_ADJ_SET_ADJUST_0_097; break;
00812         case 5: writeValue1 |= OC_ADJ_SET_ADJUST_0_109; break;
00813         case 6: writeValue1 |= OC_ADJ_SET_ADJUST_0_123; break;
00814         case 7: writeValue1 |= OC_ADJ_SET_ADJUST_0_138; break;
00815         case 8: writeValue1 |= OC_ADJ_SET_ADJUST_0_155; break;
00816         case 9: writeValue1 |= OC_ADJ_SET_ADJUST_0_175; break;
00817         case 10: writeValue1 |= OC_ADJ_SET_ADJUST_0_197; break;
00818         case 11: writeValue1 |= OC_ADJ_SET_ADJUST_0_222; break;
00819         case 12: writeValue1 |= OC_ADJ_SET_ADJUST_0_250; break;
00820         case 13: writeValue1 |= OC_ADJ_SET_ADJUST_0_282; break;
00821         case 14: writeValue1 |= OC_ADJ_SET_ADJUST_0_317; break;
00822         case 15: writeValue1 |= OC_ADJ_SET_ADJUST_0_358; break;
00823         case 16: writeValue1 |= OC_ADJ_SET_ADJUST_0_403; break;
00824         case 17: writeValue1 |= OC_ADJ_SET_ADJUST_0_454; break;
00825         case 18: writeValue1 |= OC_ADJ_SET_ADJUST_0_511; break;
00826         case 19: writeValue1 |= OC_ADJ_SET_ADJUST_0_576; break;
00827         case 20: writeValue1 |= OC_ADJ_SET_ADJUST_0_648; break;
00828         case 21: writeValue1 |= OC_ADJ_SET_ADJUST_0_730; break;
00829         case 22: writeValue1 |= OC_ADJ_SET_ADJUST_0_822; break;
00830         case 23: writeValue1 |= OC_ADJ_SET_ADJUST_0_926; break;
00831         case 24: writeValue1 |= OC_ADJ_SET_ADJUST_1_043; break;
00832         case 25: writeValue1 |= OC_ADJ_SET_ADJUST_1_175; break;
00833         case 26: writeValue1 |= OC_ADJ_SET_ADJUST_1_324; break;
00834         case 27: writeValue1 |= OC_ADJ_SET_ADJUST_1_491; break;
00835         case 28: writeValue1 |= OC_ADJ_SET_ADJUST_1_679; break;
00836         case 29: writeValue1 |= OC_ADJ_SET_ADJUST_1_892; break;
00837         case 30: writeValue1 |= OC_ADJ_SET_ADJUST_2_131; break;
00838         case 31: writeValue1 |= OC_ADJ_SET_ADJUST_2_400; break;
00839     }
00840 
00841     //シリアル出力
00842     if(hasSerial){
00843         pc->printf("Register1 temporary value changed, [OC_ADJ_SET]\r\n\tval = 0x%08x, writeValue1 = 0x%08x\r\n", val, writeValue1);
00844     }
00845 }
00846 
00847 //コントロールレジスタ:OC_ADJ_SETの書き込み:実際の値に近いものを書き込む  ==============
00848 void drv8301ctrl::setOC_ADJ(float realVal){
00849     //値は0.06から2.4まで。それ以上は0.06として扱う
00850     realVal = (realVal < 0.06f) ? 0.06f : (realVal > 2.4f) ? 2.4f : realVal;
00851 
00852     //writeValueの対象部分をゼロにする
00853     writeValue1 &= 0xF83F;
00854 
00855     //ifで振り分けていく・・・しかないのか・・・?
00856     if(realVal < 0.068f) writeValue1 |= OC_ADJ_SET_ADJUST_0_060;
00857     else if(realVal < 0.076f) writeValue1 |= OC_ADJ_SET_ADJUST_0_068;
00858     else if(realVal < 0.086f) writeValue1 |= OC_ADJ_SET_ADJUST_0_076;
00859     else if(realVal < 0.097f) writeValue1 |= OC_ADJ_SET_ADJUST_0_086;
00860     else if(realVal < 0.109f) writeValue1 |= OC_ADJ_SET_ADJUST_0_097;
00861     else if(realVal < 0.123f) writeValue1 |= OC_ADJ_SET_ADJUST_0_109;
00862     else if(realVal < 0.138f) writeValue1 |= OC_ADJ_SET_ADJUST_0_123;
00863     else if(realVal < 0.155f) writeValue1 |= OC_ADJ_SET_ADJUST_0_138;
00864     else if(realVal < 0.175f) writeValue1 |= OC_ADJ_SET_ADJUST_0_155;
00865     else if(realVal < 0.197f) writeValue1 |= OC_ADJ_SET_ADJUST_0_175;
00866     else if(realVal < 0.222f) writeValue1 |= OC_ADJ_SET_ADJUST_0_197;
00867     else if(realVal < 0.250f) writeValue1 |= OC_ADJ_SET_ADJUST_0_222;
00868     else if(realVal < 0.282f) writeValue1 |= OC_ADJ_SET_ADJUST_0_250;
00869     else if(realVal < 0.317f) writeValue1 |= OC_ADJ_SET_ADJUST_0_282;
00870     else if(realVal < 0.358f) writeValue1 |= OC_ADJ_SET_ADJUST_0_317;
00871     else if(realVal < 0.403f) writeValue1 |= OC_ADJ_SET_ADJUST_0_358;
00872     else if(realVal < 0.454f) writeValue1 |= OC_ADJ_SET_ADJUST_0_403;
00873     else if(realVal < 0.511f) writeValue1 |= OC_ADJ_SET_ADJUST_0_454;
00874     else if(realVal < 0.576f) writeValue1 |= OC_ADJ_SET_ADJUST_0_511;
00875     else if(realVal < 0.648f) writeValue1 |= OC_ADJ_SET_ADJUST_0_576;
00876     else if(realVal < 0.730f) writeValue1 |= OC_ADJ_SET_ADJUST_0_648;
00877     else if(realVal < 0.822f) writeValue1 |= OC_ADJ_SET_ADJUST_0_730;
00878     else if(realVal < 0.926f) writeValue1 |= OC_ADJ_SET_ADJUST_0_822;
00879     else if(realVal < 1.043f) writeValue1 |= OC_ADJ_SET_ADJUST_0_926;
00880     else if(realVal < 1.175f) writeValue1 |= OC_ADJ_SET_ADJUST_1_043;
00881     else if(realVal < 1.324f) writeValue1 |= OC_ADJ_SET_ADJUST_1_175;
00882     else if(realVal < 1.491f) writeValue1 |= OC_ADJ_SET_ADJUST_1_324;
00883     else if(realVal < 1.679f) writeValue1 |= OC_ADJ_SET_ADJUST_1_491;
00884     else if(realVal < 1.892f) writeValue1 |= OC_ADJ_SET_ADJUST_1_679;
00885     else if(realVal < 2.131f) writeValue1 |= OC_ADJ_SET_ADJUST_1_892;
00886     else if(realVal < 2.400f) writeValue1 |= OC_ADJ_SET_ADJUST_2_131;
00887     else writeValue1 |= OC_ADJ_SET_ADJUST_2_400;
00888 
00889     //シリアル出力
00890     if(hasSerial){
00891         pc->printf("Register1 temporary value changed, [OC_ADJ_SET]\r\n\tval = %2.3f, writeValue1 = 0x%08x\r\n", realVal, writeValue1);
00892     }
00893 }
00894 
00895 //コントロールレジスタ:OCTW_MODEの書き込み  ==============================
00896 void drv8301ctrl::setOCTW_MODE(unsigned char val){
00897     //値は0x00,0x01,0x10,0x11の4種類。値が3(0x11)以上のものは0x00として扱う
00898     if(val > 3) val = 0;
00899 
00900     //writeValueの対象部分をゼロにする
00901     writeValue2 &= 0xFFFC;
00902 
00903     switch(val){
00904         case 0: writeValue2 |= OCTW_MODE_REPORT_OT_OC_BOTH; break;
00905         case 1: writeValue2 |= OCTW_MODE_REPORT_OVERTEMP_ONLY; break;
00906         case 2: writeValue2 |= OCTW_MODE_REPORT_OVERCURRENT_ONLY; break;
00907         case 3: writeValue2 |= OCTW_MODE_REPORT_RESERVED; break;
00908     }
00909 
00910     //シリアル出力
00911     if(hasSerial){
00912         pc->printf("Register2 temporary value changed, [OCTW_MODE]\r\n\tval = 0x%08x, writeValue1 = 0x%08x\r\n", val, writeValue2);
00913     }
00914 }
00915 
00916 //コントロールレジスタ:GAINの書き込み  ===================================
00917 void drv8301ctrl::setGAIN(unsigned char val){
00918     //値は0x00,0x01,0x10,0x11の4種類。値が3(0x11)以上のものは0x00として扱う
00919     if(val > 3) val = 0;
00920 
00921     //writeValueの対象部分をゼロにする
00922     writeValue2 &= 0xFFF3;
00923 
00924     switch(val){
00925         case 0: writeValue2 |= SHUNTGAIN_GAIN_10V_PER_V; break;
00926         case 1: writeValue2 |= SHUNTGAIN_GAIN_20V_PER_V; break;
00927         case 2: writeValue2 |= SHUNTGAIN_GAIN_40V_PER_V; break;
00928         case 3: writeValue2 |= SHUNTGAIN_GAIN_80V_PER_V; break;
00929     }
00930 
00931     //シリアル出力
00932     if(hasSerial){
00933         pc->printf("Register2 temporary value changed, [GAIN]\r\n\tval = 0x%08x, writeValue1 = 0x%08x\r\n", val, writeValue2);
00934     }
00935 }
00936 
00937 //コントロールレジスタ:DC_CAL_CH1の書き込み  =============================
00938 void drv8301ctrl::setDC_CAL_CH1_Enabled(bool enable){
00939     //writeValueの対象部分をゼロにする
00940     writeValue2 &= 0xFFEF;
00941 
00942     //引数がtrueならDC_CALを有効にする
00943     writeValue2 |= enable ? DC_CAL_CH1_ENABLE : DC_CAL_CH1_DISABLE;
00944 
00945     //シリアル出力
00946     if(hasSerial){
00947         pc->printf(
00948             "Register2 temporary value changed, [DC_CAL_CH1]\r\n\tval = %s, writeValue1 = 0x%08x\r\n",
00949             enable ? "true" : "false",
00950             writeValue2
00951         );
00952     }
00953 }
00954 
00955 //コントロールレジスタ:DC_CAL_CH2の書き込み  =============================
00956 void drv8301ctrl::setDC_CAL_CH2_Enabled(bool enable){
00957     //writeValueの対象部分をゼロにする
00958     writeValue2 &= 0xFFDF;
00959 
00960     //引数がtrueならDC_CALを有効にする
00961     writeValue2 |= enable ? DC_CAL_CH1_ENABLE : DC_CAL_CH1_DISABLE;
00962 
00963     //シリアル出力
00964     if(hasSerial){
00965         pc->printf(
00966             "Register2 temporary value changed, [DC_CAL_CH2]\r\n\tval = %s, writeValue1 = 0x%08x\r\n",
00967             enable ? "true" : "false",
00968             writeValue2
00969         );
00970     }
00971 }
00972 
00973 //コントロールレジスタ:OC_TOFFの書き込み  ================================
00974 void drv8301ctrl::setOC_TOFF_CycleByCycle(bool enable){
00975     //writeValueの対象部分をゼロにする
00976     writeValue2 &= 0xFFBF;
00977 
00978     //引数がtrueならOC_TOFFをCycleByCycleにする
00979     writeValue2 |= enable ? OC_TOFF_CYCLE_BY_CYCLE : OC_TOFF_OFF_TIME_CONTROL;
00980 
00981     //シリアル出力
00982     if(hasSerial){
00983         pc->printf(
00984             "Register2 temporary value changed, [OC_TOFF]\r\n\tval = %s, writeValue1 = 0x%08x\r\n",
00985             enable ? "true" : "false",
00986             writeValue2
00987         );
00988     }
00989 }
00990 
00991 //EN_GATEを有効にする
00992 void drv8301ctrl::gateEnable(){
00993     DRV8301_GATE_ACTIVE;
00994     wait_us(20);
00995 }
00996 
00997 //EN_GATEを無効にする
00998 void drv8301ctrl::gateDisable(){
00999     DRV8301_GATE_INACTIVE;
01000     wait_us(20);
01001 }
01002 
01003 //状態をリセットする(ON-OFF-ON)
01004 void drv8301ctrl::gateReset(){
01005     DRV8301_GATE_ACTIVE;
01006     wait_us(15);
01007     DRV8301_GATE_INACTIVE;
01008     wait_us(15);
01009     DRV8301_GATE_ACTIVE;
01010     wait_us(15);
01011 }