L6470を使用した秋月のステッピングモータードライバをうごかすライブラリとプログラム,なおもともとあるやつをぱくった上で機能を追加している

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
ryuna
Date:
Tue Nov 11 09:11:47 2014 +0000
Commit message:
??????

Changed in this revision

L6470_lib/L6470.cpp Show annotated file Show diff for this revision Revisions of this file
L6470_lib/L6470.h Show annotated file Show diff for this revision Revisions of this file
beforeMain.txt Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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