
L6470を使用した秋月のステッピングモータードライバをうごかすライブラリとプログラム,なおもともとあるやつをぱくった上で機能を追加している
Dependencies: mbed
Revision 0:298e718ad4cb, committed 2014-11-11
- Comitter:
- ryuna
- Date:
- Tue Nov 11 09:11:47 2014 +0000
- Commit message:
- ??????
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/L6470_lib/L6470.cpp Tue Nov 11 09:11:47 2014 +0000 @@ -0,0 +1,296 @@ +/* + *mbed L6470 SPI Library + */ + +#include "mbed.h" +#include "L6470.h" + + + L6470::L6470(PinName mosi, PinName miso, PinName sclk, PinName cs,PinName busy) + : m_spi(mosi, miso, sclk), m_cs(cs),m_busy(busy,PullUp) + { + //定義時に行う + m_cs = 1; + m_spi.format(8,3); + m_spi.frequency(1000000); + + /*///前回の送りデータを流す + send(0x00); + send(0x00); + send(0x00); + send(0x00); + /**/ + + } + void L6470::send(uint8_t temp) + { + //while(!m_busy){ + //} + m_cs = 0;//#cs = 1; + temp = m_spi.write((uint8_t)temp); + m_cs = 1;//#cs = 0; + + wait_us(0.5); + + } + + + uint8_t L6470::send_r(uint8_t temp) + { + //while(!m_busy){ + //} + m_cs = 0;//#cs = 1; + temp = m_spi.write((uint8_t)temp); + m_cs = 1;//#cs = 0; + + wait_us(1); + return temp; + } + + void L6470::send_bytes(uint8_t temp[], int i) + { + while(0< i--) + { + send(temp[i]); + } + } + + void L6470::send_bytes_r(uint8_t temp[], int i) + { + while(0< i--) + { + temp[i] = send_r(temp[i]); + } + } + + + + + void L6470::NOP() + { + send(0x00); + + } + + void L6470::SetParam(int param, int value) + { + int n = (param>>8)/8;//配列の数 + int m = (param>>8)%8;//nは割り算だからあまりの分の値が取れないためこちらをif文に活用 + if(!m){ + uint8_t temp[n+1]; + temp[n] = 0x00 | (uint8_t)(param & 0xFF); + while(0 < n--){//比較後マイナス + temp[n] = (uint8_t)(value >> 8*n )&0xFF; + } + send_bytes(temp,sizeof temp/sizeof temp[0]); + + }else{//余りが出た場合. 例 22とか7 + uint8_t temp[n+2]; + temp[n+1] = 0x00 | (uint8_t)(param & 0xFF); + temp[n] = (uint8_t)(value >> 8*n)&~(0xFF<<m);//FFをずらしたあとで1の補数変換で反転. + while(0 < n--){ + temp[n]= (uint8_t)(value >> 8*n)&0xFF; + } + send_bytes(temp,sizeof temp/sizeof temp[0]); + } + + } + int L6470::GetParam(int param) + { + int value = 0; + int n = (param>>8)/8;//配列の数 + int m = (param>>8)%8;//nは割り算だからあまりの分の値が取れないためこちらをif文に活用 + + if(!m){ + uint8_t temp[n+1]; + for(int i = 0; i < n+1; i++){ + temp[i] = 0; + } + temp[n] = 0x20|(uint8_t)(param&0xFF); + send_bytes_r(temp,sizeof temp/sizeof temp[0]); + while(0 < n--){ + value |= (int)temp[n] << 8*n; + } + + }else{ + n++; + uint8_t temp[n+1]; + for(int i = 0; i < n+2; i++){ + temp[i] = 0; + } + temp[n] = 0x20|(uint8_t)(param&0xFF); + send_bytes_r(temp,sizeof temp/sizeof temp[0]); + while(0 < n--){ + value |= (int)temp[n]<< 8*n; + } + + } + + return value; + } + + + + void L6470::Run(bool dir, int speed) + { + uint8_t temp[4]; + temp[3] = 0x50|dir; + temp[2] = (uint8_t)(speed >> 16)&0x0F; + temp[1] = (uint8_t)(speed >> 8)&0xFF; + temp[0] = (uint8_t)(speed >> 0)&0xFF; + send_bytes(temp,sizeof temp/sizeof temp[0]); + + } + + void L6470::StepClock(bool dir) + { + send(0x58|dir); + } + + void L6470::Move(bool dir,int n_step ) + { + uint8_t temp[4]; + temp[3] = 0x40|dir; + temp[2] = (uint8_t)(n_step >> 16)&0x3F; + temp[1] = (uint8_t)(n_step >> 8)&0xFF; + temp[0] = (uint8_t)(n_step >> 0)&0xFF; + send_bytes(temp,sizeof temp/sizeof temp[0]); + + } + void L6470::GoTo(int abs_pos) + { + uint8_t temp[4]; + temp[3] = 0x60; + temp[2] = (uint8_t)(abs_pos >> 16)&0x3F; + temp[1] = (uint8_t)(abs_pos >> 8)&0xFF; + temp[0] = (uint8_t)(abs_pos >> 0)&0xFF; + send_bytes(temp,sizeof temp/sizeof temp[0]); + + } + + void L6470::GoTo_dir(bool dir, int abs_pos) + { + uint8_t temp[4]; + temp[3] = 0x68|dir; + temp[2] = (uint8_t)(abs_pos >> 16)&0x3F; + temp[1] = (uint8_t)(abs_pos >> 8)&0xFF; + temp[0] = (uint8_t)(abs_pos >> 0)&0xFF; + send_bytes(temp,sizeof temp/sizeof temp[0]); + + } + + void L6470::GoUntill(bool act, bool dir, int speed) + { + uint8_t temp[4]; + temp[3] = 0x82|(act<<8)|dir; + temp[2] = (uint8_t)(speed >> 16)&0x3F; + temp[1] = (uint8_t)(speed >> 8)&0xFF; + temp[0] = (uint8_t)(speed >> 0)&0xFF; + send_bytes(temp,sizeof temp/sizeof temp[0]); + } + + void L6470::ReleseSW(bool act,bool dir) + { + send(0x92|(act <<3)|dir); + } + void L6470::GoHome() + { + send(0x70); + } + + void L6470::GoMark() + { + send(0x78); + } + + void L6470::ResetPos() + { + send(0xD8); + } + + void L6470::ResetDevice() + { + send(0xC0); + } + + void L6470::SoftStop() + { + send(0xB0); + } + + void L6470::HardStop() + { + send(0xB8); + } + + void L6470::SoftHiz() + { + send(0xA0); + } + + void L6470::HardHiz() + { + send(0xA8); + } + + void L6470::Resets() + { + SoftStop(); + wait(0.5); + ResetDevice(); + SetParam(ABS_POS,INI_ABS_POS); + SetParam(EL_POS,INI_EL_POS); + SetParam(MARK,INI_MARK); + SetParam(SPEED,INI_SPEED); + SetParam(ACC,INI_ACC); + SetParam(DEC,INI_DEC); + SetParam(MAX_SPEED,INI_MAX_SPEED); + SetParam(MIN_SPEED,INI_MIN_SPEED); + SetParam(KVAL_HOLD,INI_KVAL_HOLD); + SetParam(KVAL_RUN,INI_KVAL_RUN); + SetParam(KVAL_ACC,INI_KVAL_ACC); + SetParam(KVAL_DEC,INI_KVAL_DEC); + SetParam(INT_SPD,INI_INT_SPD); + SetParam(ST_SLP,INI_ST_SLP); + SetParam(FN_SLP_ACC,INI_FN_SLP_ACC); + SetParam(FN_SLP_DEC,INI_FN_SLP_DEC); + SetParam(K_THERM,INI_K_THERM); + SetParam(OCD_TH,INI_OCD_TH); + SetParam(STALL_TH,INI_STALL_TH); + SetParam(FS_SPD,INI_FS_SPD); + SetParam(STEP_MODE,INI_STEP_MODE); + SetParam(ALARM_EN,INI_ALARM_EN); + SetParam(CONFIG,INI_CONFIG); + + } + + void L6470::BusyWait(unsigned int time) + {//BESYが解除されるまで待機 + while(!m_busy){ + } + + wait_ms(time); + } + + void L6470::Step(int dosu) + { + //初期値180度とする + int temp; + + temp = dosu*200/360; + + GoTo(temp); + + + + } + + + + + + + + + + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/L6470_lib/L6470.h Tue Nov 11 09:11:47 2014 +0000 @@ -0,0 +1,134 @@ + +#ifndef L6470_STEP_H +#define L6470_STEP_H + +//Brid. respected +#include "mbed.h" + +//config name.reset data; +//first init config data. +#define INI_ABS_POS 0 +#define INI_EL_POS 0 +#define INI_MARK 180 +#define INI_SPEED 0 +#define INI_ACC 0x8A//8A//0010 +#define INI_DEC 0x8A +#define INI_MAX_SPEED 0x20 +#define INI_MIN_SPEED 0 +#define INI_FS_SPD 0x27 +#define INI_KVAL_HOLD 0x3F +#define INI_KVAL_RUN 0xFF +#define INI_KVAL_ACC 0x70 +#define INI_KVAL_DEC 0x70 +#define INI_INT_SPD 0x408 +#define INI_ST_SLP 0x19 +#define INI_FN_SLP_ACC 0x29 +#define INI_FN_SLP_DEC 0x29 +#define INI_K_THERM 0 +// INI_ADC_OUT read only desu. +#define INI_OCD_TH 0xF0 +#define INI_STALL_TH 0x7F +#define INI_STEP_MODE 0x70 +#define INI_ALARM_EN 0xFF +#define INI_CONFIG 0x2E88 +// INI_STATUS read only desu. + + + + +//レジスタのアドレス +// name length<<8 + address +#define ABS_POS ((22<<8)+0x01) +#define EL_POS ((9<<8)+0x02) +#define MARK ((22<<8)+0x03) +#define SPEED ((20<<8)+0x04) +#define ACC ((12<<8)+0x05) +#define DEC ((12<<8)+0x06) +#define MAX_SPEED ((10<<8)+0x07) +#define MIN_SPEED ((13<<8)+0x08) +#define FS_SPD ((10<<8)+0x15) +#define KVAL_HOLD ((8<<8)+0x09) +#define KVAL_RUN ((8<<8)+0x0A) +#define KVAL_ACC ((8<<8)+0x0B) +#define KVAL_DEC ((8<<8)+0x0C) +#define INT_SPD ((14<<8)+0x0D) +#define ST_SLP ((8<<8)+0x0E) +#define FN_SLP_ACC ((8<<8)+0x0F) +#define FN_SLP_DEC ((8<<8)+0x10) +#define K_THERM ((4<<8)+0x11) +#define ADC_OUT ((5<<8)+0x12) +#define OCD_TH ((4<<8)+0x13) +#define STALL_TH ((7<<8)+0x14) +#define STEP_MODE ((8<<8)+0x16) +#define ALARM_EN ((8<<8)+0x17) +#define CONFIG ((16<<8)+0x18) +#define STATUS ((16<<8)+0x19) + +class L6470{ + + public: + + /** + * + * @param mosi SPI mosi pin + * @param miso SPI miso pin + * @param sck SPI sck pin + * @param _cs #cs pin + * + */ + + L6470(PinName mosi, PinName miso, PinName sck, PinName cs, PinName busy); + + void send(uint8_t temp); + uint8_t send_r(uint8_t temp); + void send_bytes(uint8_t temp[], int i); + void send_bytes_r(uint8_t temp[], int i); + void NOP(); + void SetParam(int param, int value); + int GetParam(int param); + void Run(bool dir, int speed); + void StepClock(bool dir); + void Move(bool dir,int n_step );//n_step--22bit + void GoTo(int abs_pos); + void GoTo_dir(bool dir, int abs_pos); + void GoUntill(bool act, bool dir, int speed); + void ReleseSW(bool act,bool dir); + void GoHome(); + void GoMark(); + void ResetPos(); + void ResetDevice(); + void SoftStop(); + void HardStop(); + void SoftHiz(); + void HardHiz(); + void Resets(); + void BusyWait(unsigned int time); + void Step(int dosu); + + + + protected: + + SPI m_spi; + DigitalOut m_cs; + DigitalIn m_busy; + + + +}; +#endif + + + + + + + + + + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/beforeMain.txt Tue Nov 11 09:11:47 2014 +0000 @@ -0,0 +1,93 @@ +#include "mbed.h" +DigitalOut myled0(LED1); +DigitalOut myled1(LED2); +DigitalOut myled2(LED3); + +SPI Step(p11,p12,p13);//msoi,miso,sclk +DigitalOut css(p14); + + +void L6470_send(uint8_t data){ + + css = 0; + Step.write(data); + css = 1; +} + +void L6470_setup(){ + + //最大回転スピード + L6470_send(0x07); + L6470_send(0x08); + L6470_send(0x17); + + //モーター停止中電圧 + L6470_send(0x09); + L6470_send(0x50); + //モーター定速回転時 + L6470_send(0x0a); + L6470_send(0xb0); + //加速中電圧 + L6470_send(0x0b); + L6470_send(0x70); + //減速中電圧 + L6470_send(0x0c); + L6470_send(0x70); + + //フルハーフ + L6470_send(0x16); + L6470_send(0x02); +} + +void setup(){ + // + L6470_send(0x00); + L6470_send(0x00); + L6470_send(0x00); + L6470_send(0x00); + + // + L6470_send(0xc0); + + L6470_setup(); + + wait_ms(1000); + +} + + +int main() { + + myled0 = 0; + myled1 = 0; + css = 1; + Step.format(8, 3); + //Step.frequency(500000);//1MHz + + setup(); + + + + L6470_send(128+64+16);//homeset + + wait(1); + L6470_send(64+16+1);//run + L6470_send(0x00); + L6470_send(0xa0); + L6470_send(0x00); + + wait(5); + L6470_send(128+32+16+8); + wait(0.1); + + + + while(1) { + + + + + + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Nov 11 09:11:47 2014 +0000 @@ -0,0 +1,62 @@ +#include "mbed.h" +#include <L6470.h> +DigitalOut myled(LED1); + + +L6470 Step(p11,p12,p13,p14,p15);//msoi,miso,sclk,_cs + + + +int main() { + + int i = 0; + Step.Resets(); + Step.GoMark(); + + Step.BusyWait(0); + + Step.GoHome(); + + Step.BusyWait(0); + //Step.ResetPos(); + wait(0.5); + + + Step.Step(-90); + + Step.BusyWait(0); + + Step.Step(720); + + Step.BusyWait(0); + Step.GoHome(); + + while(1) { + /* + Step.Spin360(i); + Step.BusyWait(0); + if(i >360) { + i = 0; + Step.GoHome(); + } + i++; + */ + + + + + + + + + + + + + + + + + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Nov 11 09:11:47 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/031413cf7a89 \ No newline at end of file