2相ステッピングモーターをL6470ドライバーとarduinoで動かしています。
arduinoは初めてで、いろんなところから拾って書いてみました。
動きとしては、電源ON→ステッピングモーターが正転→リミットスイッチに当たる(switch ON)→モーターが550秒100のスピードで逆転→トルク保持のまま100ミリ秒休憩→モーターが550秒100のスピードで正転→トルク保持のまま100ミリ秒休憩→の繰り返し
スイッチONからモーター正転逆転はできたのですが、「トルク保持のまま休憩」ができません。
delayを使うとスイッチの反応を邪魔してしまうので、このような書き方をしました。
どうかお助けください。。。
/*********************** 回転 ************************/ #include <Arduino.h> #include <SPI.h> /************* 設定の部 */ long max_speed = 7000;// 70000 固定 long int dd = 200;// 微増・微減の量 400 int dt = 10; // 微増・微減にかける時間 ミリ秒 int t_interval = 10;// (休止する時間 みり秒) int t_hold = 170; // 最高速を維持する時間 ミリ秒) int steps; /* 設定 終わり ************** ****/ // ピン定義。 #define PIN_SPI_MOSI 11 #define PIN_SPI_MISO 12 #define PIN_SPI_SCK 13 #define PIN_SPI_SS 10 #define PIN_L6470_SS PIN_SPI_SS // 関数プロトタイプ void L6470_write(unsigned char data); void L6470_init(void); void L6470_run(long speed); /*********************** 動作に関わる変数。 ************************/ long speed = 1000; // スピード初期値 long int n_dir = 0 ;// カウントアップ 奇数で正回転 偶数で逆回転 long offTime; int c_step = max_speed / dd; const int limit_sw = 7; bool switchState = false; int counter = 0; int milsec = 0; bool speedSwitch = false; void setup() { // ピン設定。 pinMode(PIN_SPI_MOSI, OUTPUT); pinMode(PIN_SPI_MISO, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_L6470_SS, OUTPUT); // りみとすいっち pinMode(limit_sw, INPUT_PULLUP ); digitalWrite(PIN_L6470_SS, HIGH); // SPI開始。 SPI.begin(); // シリアル通信。 Serial.begin(9600); // L6470の初期化。 L6470_init(); Serial.println("Start..."); } void loop() { int value = digitalRead(limit_sw); if(value == 0){ counter ++; if(counter > 50){ switchState = true; counter = 50; } } if (switchState == true){ milsec++; Serial.println(milsec); if(milsec > 550){ speedSwitch = !speedSwitch; milsec = 0; } int speed; if(speedSwitch == true){ speed = 100; } else{ speed = -100; } L6470_run( speed ); } else{ L6470_run( 400 );//速度 } } void L6470_write(unsigned char data) { // ~SSイネーブル。 digitalWrite(PIN_L6470_SS, LOW); // SPI転送。 SPI.transfer(data); // ~SSディスエーブル。 digitalWrite(PIN_L6470_SS, HIGH); } void L6470_init() { // MAX_SPEED設定。 /// レジスタアドレス。 L6470_write(0x07); // 最大回転スピード値(10bit) 0020 L6470_write(0x00); L6470_write(0x90); // KVAL_HOLD設定。 /// レジスタアドレス。 L6470_write(0x09); // モータ停止中の電圧設定(8bit) L6470_write(0xFF); // KVAL_RUN設定。 /// レジスタアドレス。 L6470_write(0x0A); // モータ定速回転中の電圧設定(8bit) //L6470_write(0xFF); L6470_write(0x64); // KVAL_ACC設定。 /// レジスタアドレス。 L6470_write(0x0B); // モータ加速中の電圧設定(8bit) L6470_write(0xFF); // KVAL_DEC設定。 /// レジスタアドレス。 L6470_write(0x0C); // モータ減速中の電圧設定(8bit) L6470_write(0xFF); // OCD_TH設定。 /// レジスタアドレス。 L6470_write(0x13); // オーバーカレントスレッショルド設定(4bit) L6470_write(0x0F); // STALL_TH設定。 /// レジスタアドレス。 L6470_write(0x14); // ストール電流スレッショルド設定(4bit) L6470_write(0x7F); } void L6470_run(long speed) { unsigned short dir; unsigned long spd; unsigned char spd_h; unsigned char spd_m; unsigned char spd_l; //spd = speed; // 方向検出。 if (speed < 0) { dir = 0x50; spd = -1 * speed; } else { dir = 0x51; spd = speed; } // 送信バイトデータ生成。 spd_h = (unsigned char)((0x0F0000 & spd) >> 16); spd_m = (unsigned char)((0x00FF00 & spd) >> 8); spd_l = (unsigned char)(0x00FF & spd); // コマンド(レジスタアドレス)送信。 L6470_write(dir); // データ送信。 L6470_write(spd_h); L6470_write(spd_m); L6470_write(spd_l); Serial.print( " current spd = "); Serial.println( spd ); }