航空研究会 / 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 /*#include"mbed.h"
kannokoki 0:cdf64907686d 2 #include"L6470.h"
kannokoki 0:cdf64907686d 3
kannokoki 0:cdf64907686d 4 SPI spi(PinName mosi, PinName miso, PinName ssel);
kannokoki 0:cdf64907686d 5 DigitalOut cs(PinName);
kannokoki 0:cdf64907686d 6
kannokoki 0:cdf64907686d 7 L6470::L6470(const spi_pinmap_t &static_pinmap, PinName ssel)
kannokoki 0:cdf64907686d 8 :
kannokoki 0:cdf64907686d 9 static_pinmap(new SPI(mosi,miso,sclk)),
kannokoki 0:cdf64907686d 10 spi(*static_pinmap),
kannokoki 0:cdf64907686d 11 ssel = DigitalOut(PinName)
kannokoki 0:cdf64907686d 12 {
kannokoki 0:cdf64907686d 13 init();
kannokoki 0:cdf64907686d 14 }
kannokoki 0:cdf64907686d 15
kannokoki 0:cdf64907686d 16 L6470::~L6470(){}
kannokoki 0:cdf64907686d 17
kannokoki 0:cdf64907686d 18
kannokoki 0:cdf64907686d 19 /*L6470::L6470(PinName mosi, PinName miso, PinName sclk, PinName ssel)
kannokoki 0:cdf64907686d 20 :
kannokoki 0:cdf64907686d 21 spi_p(new SPI(mosi, miso, sclk)),
kannokoki 0:cdf64907686d 22 spi(*spi_p),
kannokoki 0:cdf64907686d 23 cs_p(new DigitalOut(ssel)),
kannokoki 0:cdf64907686d 24 cs(*cs_p)
kannokoki 0:cdf64907686d 25
kannokoki 0:cdf64907686d 26
kannokoki 0:cdf64907686d 27
kannokoki 0:cdf64907686d 28 void L6470::init(){
kannokoki 0:cdf64907686d 29
kannokoki 0:cdf64907686d 30 // L6470のspi通信の有効化
kannokoki 0:cdf64907686d 31 //spi.format(8,2);
kannokoki 0:cdf64907686d 32 //spi.frequency(4960000);
kannokoki 0:cdf64907686d 33
kannokoki 0:cdf64907686d 34 // nopを送ることで残留している命令を排除
kannokoki 0:cdf64907686d 35 cs = 1;
kannokoki 0:cdf64907686d 36 spi.write(0x00);
kannokoki 0:cdf64907686d 37 spi.write(0x00);
kannokoki 0:cdf64907686d 38 spi.write(0x00);
kannokoki 0:cdf64907686d 39 spi.write(0x00);
kannokoki 0:cdf64907686d 40 cs = 0;
kannokoki 0:cdf64907686d 41
kannokoki 0:cdf64907686d 42 //リセット
kannokoki 0:cdf64907686d 43 cs = 1;
kannokoki 0:cdf64907686d 44 spi.write(0xC0);
kannokoki 0:cdf64907686d 45 cs = 0;
kannokoki 0:cdf64907686d 46
kannokoki 0:cdf64907686d 47 // MAX_SPEED設定。
kannokoki 0:cdf64907686d 48 cs = 1;
kannokoki 0:cdf64907686d 49 spi.write(0x07);
kannokoki 0:cdf64907686d 50 // 最大回転スピード値(10bit) 初期値は 0x41
kannokoki 0:cdf64907686d 51 spi.write(0x00);
kannokoki 0:cdf64907686d 52 spi.write(0x23);
kannokoki 0:cdf64907686d 53 cs = 0;
kannokoki 0:cdf64907686d 54
kannokoki 0:cdf64907686d 55 // KVAL_HOLD設定。
kannokoki 0:cdf64907686d 56 /// レジスタアドレス。
kannokoki 0:cdf64907686d 57 cs = 1;
kannokoki 0:cdf64907686d 58 spi.write(0x09);
kannokoki 0:cdf64907686d 59 spi.write(0xFF);
kannokoki 0:cdf64907686d 60 cs = 0;
kannokoki 0:cdf64907686d 61
kannokoki 0:cdf64907686d 62 // KVAL_spiUN設定。
kannokoki 0:cdf64907686d 63 /// レジスタアドレス。
kannokoki 0:cdf64907686d 64 cs = 1;
kannokoki 0:cdf64907686d 65 spi.write(0x0A);
kannokoki 0:cdf64907686d 66 spi.write(0xFF);
kannokoki 0:cdf64907686d 67 cs = 0;
kannokoki 0:cdf64907686d 68
kannokoki 0:cdf64907686d 69 // KVAL_ACC設定。
kannokoki 0:cdf64907686d 70 cs = 1;
kannokoki 0:cdf64907686d 71 spi.write(0x0B);
kannokoki 0:cdf64907686d 72 spi.write(0xFF);
kannokoki 0:cdf64907686d 73 cs = 0;
kannokoki 0:cdf64907686d 74
kannokoki 0:cdf64907686d 75 // KVAL_DEC設定。
kannokoki 0:cdf64907686d 76 /// レジスタアドレス。
kannokoki 0:cdf64907686d 77 cs= 1;
kannokoki 0:cdf64907686d 78 spi.write(0x0C);
kannokoki 0:cdf64907686d 79 spi.write(0x40);
kannokoki 0:cdf64907686d 80 cs = 0;
kannokoki 0:cdf64907686d 81
kannokoki 0:cdf64907686d 82 // OCD_TH設定。
kannokoki 0:cdf64907686d 83 /// レジスタアドレス。
kannokoki 0:cdf64907686d 84 cs = 1;
kannokoki 0:cdf64907686d 85 spi.write(0x13);
kannokoki 0:cdf64907686d 86 spi.write(0x0F);
kannokoki 0:cdf64907686d 87 cs = 0;
kannokoki 0:cdf64907686d 88
kannokoki 0:cdf64907686d 89 // STALL_TH設定。
kannokoki 0:cdf64907686d 90 /// レジスタアドレス。
kannokoki 0:cdf64907686d 91 cs = 1;
kannokoki 0:cdf64907686d 92 spi.write(0x14);
kannokoki 0:cdf64907686d 93 spi.write(0x7F);
kannokoki 0:cdf64907686d 94 cs = 0;
kannokoki 0:cdf64907686d 95 }
kannokoki 0:cdf64907686d 96
kannokoki 0:cdf64907686d 97 void L6470::writeByte(uint8_t data)
kannokoki 0:cdf64907686d 98 {
kannokoki 0:cdf64907686d 99 cs = 1;
kannokoki 0:cdf64907686d 100 spi.write(data);
kannokoki 0:cdf64907686d 101 cs = 0;
kannokoki 0:cdf64907686d 102 }
kannokoki 0:cdf64907686d 103
kannokoki 0:cdf64907686d 104
kannokoki 0:cdf64907686d 105 void L6470::writeBytes(uint8_t add, int bytes, uint32_t value)
kannokoki 0:cdf64907686d 106 {
kannokoki 0:cdf64907686d 107 uint32_t data[3];
kannokoki 0:cdf64907686d 108 for (int i = 0; i < bytes; i++){
kannokoki 0:cdf64907686d 109 data[i] = value & 0xff;
kannokoki 0:cdf64907686d 110 value = value >> 8;
kannokoki 0:cdf64907686d 111 }
kannokoki 0:cdf64907686d 112 if(bytes == 3){
kannokoki 0:cdf64907686d 113 cs = 1;
kannokoki 0:cdf64907686d 114 spi.write(add)
kannokoki 0:cdf64907686d 115 spi.write(data[2]);
kannokoki 0:cdf64907686d 116 spi.write(data[1]);
kannokoki 0:cdf64907686d 117 spi.write(data[0]);
kannokoki 0:cdf64907686d 118 cs_R = 0;
kannokoki 0:cdf64907686d 119 }
kannokoki 0:cdf64907686d 120 else if ( bytes == 2 ) {
kannokoki 0:cdf64907686d 121 cs = 1;
kannokoki 0:cdf64907686d 122 spi.write( add );
kannokoki 0:cdf64907686d 123 spi.write( data[1] ) ;
kannokoki 0:cdf64907686d 124 spi.write( data[0] ) ;
kannokoki 0:cdf64907686d 125 cs = 0;
kannokoki 0:cdf64907686d 126 }
kannokoki 0:cdf64907686d 127 else if ( bytes == 1 ) {
kannokoki 0:cdf64907686d 128 cs = 1;
kannokoki 0:cdf64907686d 129 spi.write( add );
kannokoki 0:cdf64907686d 130 spi.write( data[0] ) ;
kannokoki 0:cdf64907686d 131 cs = 0;
kannokoki 0:cdf64907686d 132 }
kannokoki 0:cdf64907686d 133 }
kannokoki 0:cdf64907686d 134
kannokoki 0:cdf64907686d 135
kannokoki 0:cdf64907686d 136 void L6470::L6470_run(uint32_t speed)
kannokoki 0:cdf64907686d 137 {
kannokoki 0:cdf64907686d 138 uint8_t dir;
kannokoki 0:cdf64907686d 139 uint32_t spd;
kannokoki 0:cdf64907686d 140 uint8_t spd_h;
kannokoki 0:cdf64907686d 141 uint8_t spd_m;
kannokoki 0:cdf64907686d 142 uint8_t spd_l;
kannokoki 0:cdf64907686d 143
kannokoki 0:cdf64907686d 144 // 方向検出。
kannokoki 0:cdf64907686d 145 if (speed < 0)
kannokoki 0:cdf64907686d 146 {
kannokoki 0:cdf64907686d 147 dir = 0x50;
kannokoki 0:cdf64907686d 148 spd = -1 * speed;
kannokoki 0:cdf64907686d 149 }
kannokoki 0:cdf64907686d 150 else
kannokoki 0:cdf64907686d 151 {
kannokoki 0:cdf64907686d 152 dir = 0x51;
kannokoki 0:cdf64907686d 153 spd = speed;
kannokoki 0:cdf64907686d 154 }
kannokoki 0:cdf64907686d 155
kannokoki 0:cdf64907686d 156 // 送信バイトデータ生成。
kannokoki 0:cdf64907686d 157 spd_h = (uint8_t)((0x000F0000 & spd) >> 16);
kannokoki 0:cdf64907686d 158 spd_m = (uint8_t)((0x0000FF00 & spd) >> 8);
kannokoki 0:cdf64907686d 159 spd_l = (uint8_t)(0x000000FF & spd);
kannokoki 0:cdf64907686d 160 // コマンド(レジスタアドレス)送信。
kannokoki 0:cdf64907686d 161 cs = 1;
kannokoki 0:cdf64907686d 162 spi.write(dir);
kannokoki 0:cdf64907686d 163 spi.write(spd_h);
kannokoki 0:cdf64907686d 164 spi.write(spd_m);
kannokoki 0:cdf64907686d 165 spi.write(spd_l);
kannokoki 0:cdf64907686d 166 cs = 0;
kannokoki 0:cdf64907686d 167 }
kannokoki 0:cdf64907686d 168
kannokoki 0:cdf64907686d 169 */