TI社のBLDCモータードライバDRV8301を コントロールするためのユーティリティのようなクラスです。 できるだけユーザーにわかりやすく レジスタの設定・読み取りなどを行います。 尚、データシートは必須の模様。
Dependents: BLDC1Axis_DRV8301CTRL
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 }
Generated on Mon Jul 18 2022 11:39:46 by 1.7.2