航空研究会 / L6470_2021_1
Committer:
kannokoki
Date:
Sat Dec 25 12:35:05 2021 +0000
Revision:
0:cdf64907686d
L6470

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kannokoki 0:cdf64907686d 1 #ifndef _L6470_H_
kannokoki 0:cdf64907686d 2 #define _L6470_H_
kannokoki 0:cdf64907686d 3
kannokoki 0:cdf64907686d 4 #include"mbed.h"
kannokoki 0:cdf64907686d 5
kannokoki 0:cdf64907686d 6 //L6470 Registers
kannokoki 0:cdf64907686d 7 #define ABS_POS 0x01 // Current position
kannokoki 0:cdf64907686d 8 #define EL_POS 0x02 // Electrical position
kannokoki 0:cdf64907686d 9 #define MARK 0x03
kannokoki 0:cdf64907686d 10 #define SPEED 0x04
kannokoki 0:cdf64907686d 11 #define ACC 0x05
kannokoki 0:cdf64907686d 12 #define DEC 0x06
kannokoki 0:cdf64907686d 13 #define MAX_SPEED 0x07
kannokoki 0:cdf64907686d 14 #define MIN_SPEED 0x08
kannokoki 0:cdf64907686d 15 #define FS_SPD 0x15
kannokoki 0:cdf64907686d 16 #define KVAL_HOLD 0x09
kannokoki 0:cdf64907686d 17 #define KVAL_RUN 0x0A
kannokoki 0:cdf64907686d 18 #define KVAL_ACC 0x0B
kannokoki 0:cdf64907686d 19 #define KVAL_DEC 0x0C
kannokoki 0:cdf64907686d 20 #define INT_SPEED 0x0D
kannokoki 0:cdf64907686d 21 #define ST_SLP 0x0E
kannokoki 0:cdf64907686d 22 #define FN_SLP_ACC 0x0F
kannokoki 0:cdf64907686d 23 #define FN_SLP_DEC 0x10
kannokoki 0:cdf64907686d 24 #define K_THERM 0x11
kannokoki 0:cdf64907686d 25 #define ADC_OUT 0x12
kannokoki 0:cdf64907686d 26 #define OCD_TH 0x13
kannokoki 0:cdf64907686d 27 #define STALL_TH 0x14
kannokoki 0:cdf64907686d 28 #define STEP_MODE 0x16
kannokoki 0:cdf64907686d 29 #define ALARM_EN 0x17
kannokoki 0:cdf64907686d 30 #define CONFIG 0x18
kannokoki 0:cdf64907686d 31 #define STATUS 0x19
kannokoki 0:cdf64907686d 32
kannokoki 0:cdf64907686d 33 //L6470 Commands
kannokoki 0:cdf64907686d 34 #define NOP 0x000
kannokoki 0:cdf64907686d 35 #define SetParam 0x0<<5 // ( | PARAM )
kannokoki 0:cdf64907686d 36 #define GetParam 0x01<<5 // ( | PARAM )
kannokoki 0:cdf64907686d 37 #define Run_Forward 0x50
kannokoki 0:cdf64907686d 38 #define Run_Back 0x51
kannokoki 0:cdf64907686d 39 #define Step_Clock_Forward 0x58
kannokoki 0:cdf64907686d 40 #define Step_Clock_Back 0x59
kannokoki 0:cdf64907686d 41 #define Move_Forward 0x40
kannokoki 0:cdf64907686d 42 #define Move_Back 0x41
kannokoki 0:cdf64907686d 43 #define GoTo 0x60
kannokoki 0:cdf64907686d 44 #define GoTo_DIR_Forward 0x68
kannokoki 0:cdf64907686d 45 #define GoTo_DIR_Back 0x69
kannokoki 0:cdf64907686d 46 //#define GoUntill
kannokoki 0:cdf64907686d 47 //#define ReleseSW
kannokoki 0:cdf64907686d 48 #define GoHome 0x70
kannokoki 0:cdf64907686d 49 #define GoMark 0x78
kannokoki 0:cdf64907686d 50 #define ResetPos 0xD8
kannokoki 0:cdf64907686d 51 #define ResetDevice 0xC0
kannokoki 0:cdf64907686d 52 #define SoftStop 0xB0
kannokoki 0:cdf64907686d 53 #define HardStop 0xB8
kannokoki 0:cdf64907686d 54 #define SoftHiZ 0xA0
kannokoki 0:cdf64907686d 55 #define HardHiz 0xA8
kannokoki 0:cdf64907686d 56 #define GetStatus 0xD8
kannokoki 0:cdf64907686d 57
kannokoki 0:cdf64907686d 58
kannokoki 0:cdf64907686d 59
kannokoki 0:cdf64907686d 60
kannokoki 0:cdf64907686d 61 class L6470
kannokoki 0:cdf64907686d 62 {
kannokoki 0:cdf64907686d 63 SPI spi;
kannokoki 0:cdf64907686d 64 DigitalOut cs;
kannokoki 0:cdf64907686d 65
kannokoki 0:cdf64907686d 66 public:
kannokoki 0:cdf64907686d 67 L6470(PinName mosi, PinName miso, PinName sclk, PinName cs):spi(mosi, miso, sclk),cs(cs)
kannokoki 0:cdf64907686d 68 {
kannokoki 0:cdf64907686d 69 spi.format(8,2);
kannokoki 0:cdf64907686d 70 spi.frequency(4960000);
kannokoki 0:cdf64907686d 71 }
kannokoki 0:cdf64907686d 72
kannokoki 0:cdf64907686d 73 //~L6470();
kannokoki 0:cdf64907686d 74
kannokoki 0:cdf64907686d 75
kannokoki 0:cdf64907686d 76 //L6470(PinName mosi, PinName miso, PinName sclk, PinName ssel);
kannokoki 0:cdf64907686d 77
kannokoki 0:cdf64907686d 78 void init()
kannokoki 0:cdf64907686d 79 {
kannokoki 0:cdf64907686d 80 // L6470のspi通信の有効化
kannokoki 0:cdf64907686d 81 //_spi.format(8,2);
kannokoki 0:cdf64907686d 82 //_spi.frequency(4960000);
kannokoki 0:cdf64907686d 83
kannokoki 0:cdf64907686d 84 // nopを送ることで残留している命令を排除
kannokoki 0:cdf64907686d 85 cs = 1;
kannokoki 0:cdf64907686d 86 spi.write(0x00);
kannokoki 0:cdf64907686d 87 spi.write(0x00);
kannokoki 0:cdf64907686d 88 spi.write(0x00);
kannokoki 0:cdf64907686d 89 spi.write(0x00);
kannokoki 0:cdf64907686d 90 cs = 0;
kannokoki 0:cdf64907686d 91
kannokoki 0:cdf64907686d 92 //リセット
kannokoki 0:cdf64907686d 93 cs = 1;
kannokoki 0:cdf64907686d 94 spi.write(0xC0);
kannokoki 0:cdf64907686d 95 cs = 0;
kannokoki 0:cdf64907686d 96
kannokoki 0:cdf64907686d 97 // MAX_SPEED設定。
kannokoki 0:cdf64907686d 98 cs = 1;
kannokoki 0:cdf64907686d 99 spi.write(0x07);
kannokoki 0:cdf64907686d 100 // 最大回転スピード値(10bit) 初期値は 0x41
kannokoki 0:cdf64907686d 101 spi.write(0x00);
kannokoki 0:cdf64907686d 102 spi.write(0x23);
kannokoki 0:cdf64907686d 103 cs = 0;
kannokoki 0:cdf64907686d 104
kannokoki 0:cdf64907686d 105 // KVAL_HOLD設定。
kannokoki 0:cdf64907686d 106 /// レジスタアドレス。
kannokoki 0:cdf64907686d 107 cs = 1;
kannokoki 0:cdf64907686d 108 spi.write(0x09);
kannokoki 0:cdf64907686d 109 spi.write(0xFF);
kannokoki 0:cdf64907686d 110 cs = 0;
kannokoki 0:cdf64907686d 111
kannokoki 0:cdf64907686d 112 // KVAL_spiUN設定。
kannokoki 0:cdf64907686d 113 /// レジスタアドレス。
kannokoki 0:cdf64907686d 114 cs = 1;
kannokoki 0:cdf64907686d 115 spi.write(0x0A);
kannokoki 0:cdf64907686d 116 spi.write(0xFF);
kannokoki 0:cdf64907686d 117 cs = 0;
kannokoki 0:cdf64907686d 118
kannokoki 0:cdf64907686d 119 // KVAL_ACC設定。
kannokoki 0:cdf64907686d 120 cs = 1;
kannokoki 0:cdf64907686d 121 spi.write(0x0B);
kannokoki 0:cdf64907686d 122 spi.write(0xFF);
kannokoki 0:cdf64907686d 123 cs = 0;
kannokoki 0:cdf64907686d 124
kannokoki 0:cdf64907686d 125 // KVAL_DEC設定。
kannokoki 0:cdf64907686d 126 /// レジスタアドレス。
kannokoki 0:cdf64907686d 127 cs= 1;
kannokoki 0:cdf64907686d 128 spi.write(0x0C);
kannokoki 0:cdf64907686d 129 spi.write(0x40);
kannokoki 0:cdf64907686d 130 cs = 0;
kannokoki 0:cdf64907686d 131
kannokoki 0:cdf64907686d 132 // OCD_TH設定。
kannokoki 0:cdf64907686d 133 /// レジスタアドレス。
kannokoki 0:cdf64907686d 134 cs = 1;
kannokoki 0:cdf64907686d 135 spi.write(0x13);
kannokoki 0:cdf64907686d 136 spi.write(0x0F);
kannokoki 0:cdf64907686d 137 cs = 0;
kannokoki 0:cdf64907686d 138
kannokoki 0:cdf64907686d 139 // STALL_TH設定。
kannokoki 0:cdf64907686d 140 /// レジスタアドレス。
kannokoki 0:cdf64907686d 141 cs = 1;
kannokoki 0:cdf64907686d 142 spi.write(0x14);
kannokoki 0:cdf64907686d 143 spi.write(0x7F);
kannokoki 0:cdf64907686d 144 cs = 0;
kannokoki 0:cdf64907686d 145 };
kannokoki 0:cdf64907686d 146 //void writeByte(uint8_t);
kannokoki 0:cdf64907686d 147 void writeByte(uint8_t data)
kannokoki 0:cdf64907686d 148 {
kannokoki 0:cdf64907686d 149 cs = 1;
kannokoki 0:cdf64907686d 150 spi.write(data);
kannokoki 0:cdf64907686d 151 cs = 0;
kannokoki 0:cdf64907686d 152 }
kannokoki 0:cdf64907686d 153
kannokoki 0:cdf64907686d 154 void writeBytes(uint8_t add, int bytes, uint32_t value)
kannokoki 0:cdf64907686d 155 {
kannokoki 0:cdf64907686d 156 uint32_t data[3];
kannokoki 0:cdf64907686d 157 for (int i = 0; i < bytes; i++){
kannokoki 0:cdf64907686d 158 data[i] = value & 0xff;
kannokoki 0:cdf64907686d 159 value = value >> 8;
kannokoki 0:cdf64907686d 160 }
kannokoki 0:cdf64907686d 161 if(bytes == 3){
kannokoki 0:cdf64907686d 162 cs = 1;
kannokoki 0:cdf64907686d 163 spi.write(add);
kannokoki 0:cdf64907686d 164 spi.write(data[2]);
kannokoki 0:cdf64907686d 165 spi.write(data[1]);
kannokoki 0:cdf64907686d 166 spi.write(data[0]);
kannokoki 0:cdf64907686d 167 cs = 0;
kannokoki 0:cdf64907686d 168 }
kannokoki 0:cdf64907686d 169 else if ( bytes == 2 ) {
kannokoki 0:cdf64907686d 170 cs = 1;
kannokoki 0:cdf64907686d 171 spi.write( add );
kannokoki 0:cdf64907686d 172 spi.write( data[1] ) ;
kannokoki 0:cdf64907686d 173 spi.write( data[0] ) ;
kannokoki 0:cdf64907686d 174 cs = 0;
kannokoki 0:cdf64907686d 175 }
kannokoki 0:cdf64907686d 176 else if ( bytes == 1 ) {
kannokoki 0:cdf64907686d 177 cs = 1;
kannokoki 0:cdf64907686d 178 spi.write( add );
kannokoki 0:cdf64907686d 179 spi.write( data[0] ) ;
kannokoki 0:cdf64907686d 180 cs = 0;
kannokoki 0:cdf64907686d 181 }
kannokoki 0:cdf64907686d 182 }
kannokoki 0:cdf64907686d 183
kannokoki 0:cdf64907686d 184 //void writeBytes(uint8_t, int, uint32_t);
kannokoki 0:cdf64907686d 185 void L6470_run(long speed)
kannokoki 0:cdf64907686d 186 {
kannokoki 0:cdf64907686d 187 uint8_t dir;
kannokoki 0:cdf64907686d 188 long spd;
kannokoki 0:cdf64907686d 189 uint8_t spd_h;
kannokoki 0:cdf64907686d 190 uint8_t spd_m;
kannokoki 0:cdf64907686d 191 uint8_t spd_l;
kannokoki 0:cdf64907686d 192
kannokoki 0:cdf64907686d 193 // 方向検出。
kannokoki 0:cdf64907686d 194 if (speed < 0)
kannokoki 0:cdf64907686d 195 {
kannokoki 0:cdf64907686d 196 dir = 0x50;
kannokoki 0:cdf64907686d 197 spd = -1 * speed;
kannokoki 0:cdf64907686d 198 }
kannokoki 0:cdf64907686d 199 else
kannokoki 0:cdf64907686d 200 {
kannokoki 0:cdf64907686d 201 dir = 0x51;
kannokoki 0:cdf64907686d 202 spd = speed;
kannokoki 0:cdf64907686d 203 }
kannokoki 0:cdf64907686d 204
kannokoki 0:cdf64907686d 205 // 送信バイトデータ生成。
kannokoki 0:cdf64907686d 206 spd_h = (uint8_t)((0x000F0000 & (uint32_t)spd) >> 16);
kannokoki 0:cdf64907686d 207 spd_m = (uint8_t)((0x0000FF00 & (uint32_t)spd) >> 8);
kannokoki 0:cdf64907686d 208 spd_l = (uint8_t)(0x000000FF & (uint32_t)spd);
kannokoki 0:cdf64907686d 209 // コマンド(レジスタアドレス)送信。
kannokoki 0:cdf64907686d 210 cs = 1;
kannokoki 0:cdf64907686d 211 spi.write(dir);
kannokoki 0:cdf64907686d 212 spi.write(spd_h);
kannokoki 0:cdf64907686d 213 spi.write(spd_m);
kannokoki 0:cdf64907686d 214 spi.write(spd_l);
kannokoki 0:cdf64907686d 215 cs = 0;
kannokoki 0:cdf64907686d 216 }
kannokoki 0:cdf64907686d 217
kannokoki 0:cdf64907686d 218 //void L6470_run(uint32_t);
kannokoki 0:cdf64907686d 219
kannokoki 0:cdf64907686d 220 int getstatus(uint8_t data)
kannokoki 0:cdf64907686d 221 {
kannokoki 0:cdf64907686d 222 cs = 1;
kannokoki 0:cdf64907686d 223 int s = spi.write(data);
kannokoki 0:cdf64907686d 224 cs = 0;
kannokoki 0:cdf64907686d 225 return s;
kannokoki 0:cdf64907686d 226 }
kannokoki 0:cdf64907686d 227 };
kannokoki 0:cdf64907686d 228
kannokoki 0:cdf64907686d 229
kannokoki 0:cdf64907686d 230 #endif