Goertek_Mito_Lab / Mbed 2 deprecated ServoTensionerV3

Dependencies:   mbed

Committer:
tkry
Date:
Sun May 10 18:10:57 2020 +0000
Revision:
0:cd74549e4be2
Child:
1:b0b5e0e70af8
calibrate AnalogVal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tkry 0:cd74549e4be2 1 /*
tkry 0:cd74549e4be2 2 基板:4/3モデル,SB16とSB18はカット
tkry 0:cd74549e4be2 3
tkry 0:cd74549e4be2 4 参考文献
tkry 0:cd74549e4be2 5 HX711ロードセルのライブラリ,Read meにインポート方法記載あり
tkry 0:cd74549e4be2 6 https://github.com/atoy40/mbed-hx711
tkry 0:cd74549e4be2 7 7セグのアルゴリズム,正負などを変更
tkry 0:cd74549e4be2 8 https://forum.arduino.cc/index.php?topic=351609.0
tkry 0:cd74549e4be2 9 https://zhuanlan.zhihu.com/p/73846629
tkry 0:cd74549e4be2 10 EEPROMのプログラム
tkry 0:cd74549e4be2 11 https://os.mbed.com/users/bborredon/code/eeprom/docs/925096a4c7f0/classEEPROM.html
tkry 0:cd74549e4be2 12
tkry 0:cd74549e4be2 13 変更箇所
tkry 0:cd74549e4be2 14 ステップ増加とリニア増加の両方をサポート
tkry 0:cd74549e4be2 15 */
tkry 0:cd74549e4be2 16
tkry 0:cd74549e4be2 17 // ライブラリ
tkry 0:cd74549e4be2 18 #include "mbed.h"
tkry 0:cd74549e4be2 19 #include "HX711.h"
tkry 0:cd74549e4be2 20
tkry 0:cd74549e4be2 21 // EEPROMのアドレス定義
tkry 0:cd74549e4be2 22 #define min_address 0
tkry 0:cd74549e4be2 23 #define stp_address 20
tkry 0:cd74549e4be2 24 #define t1_address 40
tkry 0:cd74549e4be2 25 #define t2_address 60
tkry 0:cd74549e4be2 26 #define f1_address 80
tkry 0:cd74549e4be2 27 #define f2_address 100
tkry 0:cd74549e4be2 28
tkry 0:cd74549e4be2 29 // ピンの初期設定
tkry 0:cd74549e4be2 30 Serial pc(USBTX,USBRX); // シリアル通信
tkry 0:cd74549e4be2 31 HX711 loadcell(D7, D8, 128); // ロードセル(Data, Sck)
tkry 0:cd74549e4be2 32 I2C eeprom(D4, D5); // EEPROM(sda, scl)
tkry 0:cd74549e4be2 33 DigitalOut datapin(D2); // 7セグのDIO
tkry 0:cd74549e4be2 34 DigitalOut latchpin(D3); // 7セグのRCLK
tkry 0:cd74549e4be2 35 DigitalOut clockpin(D0); // 7セグのSCLK
tkry 0:cd74549e4be2 36 DigitalOut FET(D1); // モーター電源のFET駆動信号
tkry 0:cd74549e4be2 37 DigitalIn sw1(D9); // スイッチ入力1
tkry 0:cd74549e4be2 38 DigitalIn sw2(D10); // スイッチ入力2
tkry 0:cd74549e4be2 39 DigitalOut Rled(D11); // 赤LED
tkry 0:cd74549e4be2 40 DigitalOut Gled(D12); // 緑LED
tkry 0:cd74549e4be2 41 AnalogOut aout3(A3); // アナログ出力
tkry 0:cd74549e4be2 42 AnalogIn analog_value5(A5); // オペアンプ非反転入力(+)読み込み
tkry 0:cd74549e4be2 43 AnalogIn analog_value6(A6); // オペアンプ反転入力(-)読み込み
tkry 0:cd74549e4be2 44
tkry 0:cd74549e4be2 45 // タイマー割り込み
tkry 0:cd74549e4be2 46 Ticker LED_IRQ; // LEDの割り込み(1kHz)
tkry 0:cd74549e4be2 47 Ticker DAC_IRQ; // DACの割り込み(100Hz)
tkry 0:cd74549e4be2 48
tkry 0:cd74549e4be2 49 // グローバル変数
tkry 0:cd74549e4be2 50 unsigned int LedNum = 0; // LEDの桁の切り替え用変数
tkry 0:cd74549e4be2 51 int Data = 0; // LPF後のロードセルデータ
tkry 0:cd74549e4be2 52 bool ReadSign1 = 0; // 圧力計の代入完了サイン
tkry 0:cd74549e4be2 53 bool ReadSign2 = 0; // LEDディスプレイの出力完了サイン
tkry 0:cd74549e4be2 54 double Tcnt = 0; // DAC用の時間カウント変数
tkry 0:cd74549e4be2 55 double a = 0; // DAC用の傾き変数(1/Ts)
tkry 0:cd74549e4be2 56 double t = 0; // 処理用の立上り時間(Time_start)
tkry 0:cd74549e4be2 57 double t1; // sw1の立上り時間(Time_start)
tkry 0:cd74549e4be2 58 double t2; // sw2の立上り時間(Time_start)
tkry 0:cd74549e4be2 59 double f1; // 張力の減少量
tkry 0:cd74549e4be2 60 double f2; // 張力の減少量
tkry 0:cd74549e4be2 61 double stp; // ステップ分解数
tkry 0:cd74549e4be2 62 double gain = 0; // 張力の減少量を操作するゲイン
tkry 0:cd74549e4be2 63 double Voltage = 0; // DAC用の電圧[V]
tkry 0:cd74549e4be2 64 double ZeroVoltage = 0.0; // リセット後の初期位置の電圧
tkry 0:cd74549e4be2 65 double BiasVoltage = 0.25; // 線形範囲に収めるためのバイアス電圧
tkry 0:cd74549e4be2 66 double TargetVoltage = 0.0; // ポテンショメーター上の目標電圧値
tkry 0:cd74549e4be2 67 double CommandVoltage = 0.0; // 目標電圧を出力するためのA3の指令電圧
tkry 0:cd74549e4be2 68 bool Scnt = 0; // DAC用のスイッチカウント変数
tkry 0:cd74549e4be2 69 bool rewrite = 0; // EEPROMの上書きフラグ
tkry 0:cd74549e4be2 70 char data[100]; // コマンド入力のバッファ
tkry 0:cd74549e4be2 71
tkry 0:cd74549e4be2 72 // 関数のプロトタイプ宣言
tkry 0:cd74549e4be2 73 void seg(int num, int d); // 1桁の出力
tkry 0:cd74549e4be2 74 void LED4_Display(); // 4桁の出力
tkry 0:cd74549e4be2 75 void DAC_switch(); // DACの切り替え
tkry 0:cd74549e4be2 76 void DAC_linear(); // DACのリニア出力
tkry 0:cd74549e4be2 77 void DAC_step(); // DACのステップ出力
tkry 0:cd74549e4be2 78 void pc_rx(); // シリアルでのグローバル変数書き換え
tkry 0:cd74549e4be2 79 void eeprom_update(); // シリアル入力を判定し,EEPROMのメモリを書き換え
tkry 0:cd74549e4be2 80 char RomRead(int address); // EEPROMの単文字読み取り関数
tkry 0:cd74549e4be2 81 float RomRead_address(int address); // EEPROMのデータ読み取り関数
tkry 0:cd74549e4be2 82 void RomWrite(int address, char c); // EEPROMの単文字書き込み関数
tkry 0:cd74549e4be2 83 void RomWrite_address(int address, char c[]); // EEPROMのデータ読み込む関数
tkry 0:cd74549e4be2 84 float cmd2num(char c[]); // コマンドと数値の変換
tkry 0:cd74549e4be2 85
tkry 0:cd74549e4be2 86 // 7セグの対応表
tkry 0:cd74549e4be2 87 const int state[15][8]= {
tkry 0:cd74549e4be2 88 {1, 1, 0, 0, 0, 0, 0, 0}, // 0
tkry 0:cd74549e4be2 89 {1, 1, 1, 1, 1, 0, 0, 1}, // 1
tkry 0:cd74549e4be2 90 {1, 0, 1, 0, 0, 1, 0, 0}, // 2
tkry 0:cd74549e4be2 91 {1, 0, 1, 1, 0, 0, 0, 0}, // 3
tkry 0:cd74549e4be2 92 {1, 0, 0, 1, 1, 0, 0, 1}, // 4
tkry 0:cd74549e4be2 93 {1, 0, 0, 1, 0, 0, 1, 0}, // 5
tkry 0:cd74549e4be2 94 {1, 0, 0, 0, 0, 0, 1, 0}, // 6
tkry 0:cd74549e4be2 95 {1, 1, 1, 1, 1, 0, 0, 0}, // 7
tkry 0:cd74549e4be2 96 {1, 0, 0, 0, 0, 0, 0, 0}, // 8
tkry 0:cd74549e4be2 97 {1, 0, 0, 1, 0, 0, 0, 0}, // 9
tkry 0:cd74549e4be2 98 {1, 1, 1, 1, 1, 1, 1, 1}, // NA
tkry 0:cd74549e4be2 99 {0, 0, 0, 0, 0, 0, 0, 1}, // 1桁
tkry 0:cd74549e4be2 100 {0, 0, 0, 0, 0, 0, 1, 0}, // 2桁
tkry 0:cd74549e4be2 101 {0, 0, 0, 0, 0, 1, 0, 0}, // 3桁
tkry 0:cd74549e4be2 102 {0, 0, 0, 0, 1, 0, 0, 0}, // 4桁
tkry 0:cd74549e4be2 103 };
tkry 0:cd74549e4be2 104
tkry 0:cd74549e4be2 105 int main()
tkry 0:cd74549e4be2 106 {
tkry 0:cd74549e4be2 107 sw1.mode(PullUp); // スイッチのプルアップ
tkry 0:cd74549e4be2 108 sw2.mode(PullUp); // スイッチのプルアップ
tkry 0:cd74549e4be2 109
tkry 0:cd74549e4be2 110 // 起動後の処理
tkry 0:cd74549e4be2 111 Rled = 0; // 動作チェック用の赤LED点灯
tkry 0:cd74549e4be2 112 Gled = 1; // 動作チェック用の緑LED点灯,外部電源駆動の場合シリアル割り込み内のgetcで処理が止まる?
tkry 0:cd74549e4be2 113 wait(0.8); // モーター電源オンの待ち時間
tkry 0:cd74549e4be2 114 FET = 1; // モーター電源オン,EEPROM書き込み時はオフ
tkry 0:cd74549e4be2 115
tkry 0:cd74549e4be2 116 // 割り込みの定義
tkry 0:cd74549e4be2 117 pc.attach(pc_rx,Serial::RxIrq); // シリアルデータ受信時の割り込み
tkry 0:cd74549e4be2 118 LED_IRQ.attach(&LED4_Display, 1e-3); // 5msecごとに桁を更新
tkry 0:cd74549e4be2 119 DAC_IRQ.attach(&DAC_switch, 1e-2); // 10msecごとにDACを変動
tkry 0:cd74549e4be2 120
tkry 0:cd74549e4be2 121 // メイン処理内の変数
tkry 0:cd74549e4be2 122 float lpf = 0.8; // 値が大きいほどに平滑化
tkry 0:cd74549e4be2 123 double raw_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 124 double lpf_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 125 double pre_data = 0.0; // LPF用の一時変数
tkry 0:cd74549e4be2 126
tkry 0:cd74549e4be2 127 // EEPROMの読み込み
tkry 0:cd74549e4be2 128 ZeroVoltage = RomRead_address(min_address);
tkry 0:cd74549e4be2 129 stp = RomRead_address(stp_address); // stpの代入
tkry 0:cd74549e4be2 130 t1 = RomRead_address(t1_address); // t1の代入
tkry 0:cd74549e4be2 131 t2 = RomRead_address(t2_address); // t2の代入
tkry 0:cd74549e4be2 132 f1 = RomRead_address(f1_address); // f1の代入
tkry 0:cd74549e4be2 133 f2 = RomRead_address(f2_address); // f2の代入
tkry 0:cd74549e4be2 134
tkry 0:cd74549e4be2 135 int offset = loadcell.read(); // ロードセルの初期値取得
tkry 0:cd74549e4be2 136
tkry 0:cd74549e4be2 137 while (true) {
tkry 0:cd74549e4be2 138 Rled = 1; //動作チェック用の赤LED点灯
tkry 0:cd74549e4be2 139 Gled = 0; //動作チェック用の緑LED点灯
tkry 0:cd74549e4be2 140
tkry 0:cd74549e4be2 141 if(rewrite == 1) {
tkry 0:cd74549e4be2 142 eeprom_update();
tkry 0:cd74549e4be2 143 rewrite = 0;
tkry 0:cd74549e4be2 144 }
tkry 0:cd74549e4be2 145 else {
tkry 0:cd74549e4be2 146 if( ReadSign2 == 0 ) { // LEDの出力処理後に実行(LEDの出力処理中(データ送信中)に実行されない)
tkry 0:cd74549e4be2 147 raw_data = (float)(loadcell.read()-offset)*0.003525f; // 実測で調節した方が良さそう?(4.2987/16777216.0/128)/(0.001*8.9/2000.0)
tkry 0:cd74549e4be2 148 lpf_data = (1.0f - lpf)*raw_data + lpf*pre_data;
tkry 0:cd74549e4be2 149 pre_data = lpf_data;
tkry 0:cd74549e4be2 150 ReadSign1 = 1; // 読み込む直前で圧力計変数をtrue(読み込み前)にする(データ代入中の値を出力しない)
tkry 0:cd74549e4be2 151 Data = (int)lpf_data;
tkry 0:cd74549e4be2 152 }
tkry 0:cd74549e4be2 153 ReadSign1 = 0; // 読み込み完了で圧力計変数をfalse(読み込み後)にする
tkry 0:cd74549e4be2 154
tkry 0:cd74549e4be2 155 //Arduino Serial plotterでのLPFの比較用
tkry 0:cd74549e4be2 156 //pc.printf("%f", raw_data);
tkry 0:cd74549e4be2 157 //pc.printf(",");
tkry 0:cd74549e4be2 158 //pc.printf("%f\n", lpf_data);
tkry 0:cd74549e4be2 159 }
tkry 0:cd74549e4be2 160 }
tkry 0:cd74549e4be2 161 }
tkry 0:cd74549e4be2 162
tkry 0:cd74549e4be2 163 // 1桁出力関数
tkry 0:cd74549e4be2 164 void seg(int num, int d)
tkry 0:cd74549e4be2 165 {
tkry 0:cd74549e4be2 166 // 数値データの送信
tkry 0:cd74549e4be2 167 for(int i=0; i<=7; i++) {
tkry 0:cd74549e4be2 168 datapin=state[num][i];
tkry 0:cd74549e4be2 169 clockpin=1;
tkry 0:cd74549e4be2 170 clockpin=0;
tkry 0:cd74549e4be2 171 }
tkry 0:cd74549e4be2 172
tkry 0:cd74549e4be2 173 // 桁データの送信
tkry 0:cd74549e4be2 174 for(int i=0; i<=7; i++) {
tkry 0:cd74549e4be2 175 datapin=state[d+10][i];
tkry 0:cd74549e4be2 176 clockpin=1;
tkry 0:cd74549e4be2 177 clockpin=0;
tkry 0:cd74549e4be2 178 }
tkry 0:cd74549e4be2 179 latchpin=0;
tkry 0:cd74549e4be2 180 latchpin=1;
tkry 0:cd74549e4be2 181 }
tkry 0:cd74549e4be2 182
tkry 0:cd74549e4be2 183 // 4桁出力関数
tkry 0:cd74549e4be2 184 void LED4_Display()
tkry 0:cd74549e4be2 185 {
tkry 0:cd74549e4be2 186 if(ReadSign1 == 0) { // 圧力計の読み込み処理後に実行(圧力計の読み込み処理中に実行されない)
tkry 0:cd74549e4be2 187 ReadSign2 = 1; // 出力直前でLED計変数をtrue(読み込み前)にする
tkry 0:cd74549e4be2 188 if( Data < 0) { // 0以下の場合に値を0にする
tkry 0:cd74549e4be2 189 Data = 0;
tkry 0:cd74549e4be2 190 }
tkry 0:cd74549e4be2 191
tkry 0:cd74549e4be2 192 LedNum++; // 桁変え
tkry 0:cd74549e4be2 193 if(LedNum>4) {
tkry 0:cd74549e4be2 194 LedNum=1;
tkry 0:cd74549e4be2 195 }
tkry 0:cd74549e4be2 196 switch(LedNum) { // 桁ごとに出力
tkry 0:cd74549e4be2 197 case 1:
tkry 0:cd74549e4be2 198 seg((int)Data%10/1,1);
tkry 0:cd74549e4be2 199 break;
tkry 0:cd74549e4be2 200 case 2:
tkry 0:cd74549e4be2 201 if(Data < 10) {
tkry 0:cd74549e4be2 202 seg(10,2);
tkry 0:cd74549e4be2 203 } else {
tkry 0:cd74549e4be2 204 seg((int)Data%100/10,2);
tkry 0:cd74549e4be2 205 }
tkry 0:cd74549e4be2 206 break;
tkry 0:cd74549e4be2 207 case 3:
tkry 0:cd74549e4be2 208 if(Data < 100) {
tkry 0:cd74549e4be2 209 seg(10,3);
tkry 0:cd74549e4be2 210 } else {
tkry 0:cd74549e4be2 211 seg((int)Data%1000/100,3);
tkry 0:cd74549e4be2 212 }
tkry 0:cd74549e4be2 213 break;
tkry 0:cd74549e4be2 214 case 4:
tkry 0:cd74549e4be2 215 if(Data < 1000) {
tkry 0:cd74549e4be2 216 seg(10,4);
tkry 0:cd74549e4be2 217 } else {
tkry 0:cd74549e4be2 218 seg((int)Data%10000/1000,4);
tkry 0:cd74549e4be2 219 }
tkry 0:cd74549e4be2 220 break;
tkry 0:cd74549e4be2 221 }
tkry 0:cd74549e4be2 222
tkry 0:cd74549e4be2 223 // 出力完了でLED変数をfalse(読み込み後)にする
tkry 0:cd74549e4be2 224 ReadSign2 = 0;
tkry 0:cd74549e4be2 225 }
tkry 0:cd74549e4be2 226 }
tkry 0:cd74549e4be2 227
tkry 0:cd74549e4be2 228 // DACの切り替え
tkry 0:cd74549e4be2 229 void DAC_switch()
tkry 0:cd74549e4be2 230 {
tkry 0:cd74549e4be2 231 if(stp=='1') {
tkry 0:cd74549e4be2 232 DAC_linear();
tkry 0:cd74549e4be2 233 } else {
tkry 0:cd74549e4be2 234 DAC_step();
tkry 0:cd74549e4be2 235 }
tkry 0:cd74549e4be2 236 }
tkry 0:cd74549e4be2 237
tkry 0:cd74549e4be2 238 void DAC_linear()
tkry 0:cd74549e4be2 239 {
tkry 0:cd74549e4be2 240 if(sw1==false) {
tkry 0:cd74549e4be2 241 t = t1; // sw1の変動時間
tkry 0:cd74549e4be2 242 gain = f1; // sw1の変動割合
tkry 0:cd74549e4be2 243 }
tkry 0:cd74549e4be2 244 if(sw2==false) {
tkry 0:cd74549e4be2 245 t = t2; // sw2の変動時間
tkry 0:cd74549e4be2 246 gain = f2; // sw2の変動割合
tkry 0:cd74549e4be2 247 }
tkry 0:cd74549e4be2 248 // SWの動作
tkry 0:cd74549e4be2 249 if((sw1==false||sw2==false) && Tcnt<t*1e2 ) {
tkry 0:cd74549e4be2 250 // 立ち上がり状態,ボタンは押されている,他の状態でない
tkry 0:cd74549e4be2 251 Tcnt += 1;
tkry 0:cd74549e4be2 252 a = +1/t;
tkry 0:cd74549e4be2 253 } else if(sw1==false||sw2==false) {
tkry 0:cd74549e4be2 254 // 継続状態,ボタンは押されている
tkry 0:cd74549e4be2 255 Tcnt += 1;
tkry 0:cd74549e4be2 256 a = 0;
tkry 0:cd74549e4be2 257 } else {
tkry 0:cd74549e4be2 258 Voltage = 0;
tkry 0:cd74549e4be2 259 Tcnt = 0;
tkry 0:cd74549e4be2 260 a = 0;
tkry 0:cd74549e4be2 261 }
tkry 0:cd74549e4be2 262 // 電圧範囲の設定
tkry 0:cd74549e4be2 263 TargetVoltage = gain*(ZeroVoltage-1.692) + 1.692; // 50%の電圧
tkry 0:cd74549e4be2 264 CommandVoltage = 1.539*TargetVoltage - 2.360 - BiasVoltage;
tkry 0:cd74549e4be2 265 Voltage = Voltage + CommandVoltage*a*1e-2;
tkry 0:cd74549e4be2 266 aout3.write((Voltage+BiasVoltage)/3.3);
tkry 0:cd74549e4be2 267 }
tkry 0:cd74549e4be2 268
tkry 0:cd74549e4be2 269 void DAC_step()
tkry 0:cd74549e4be2 270 {
tkry 0:cd74549e4be2 271 // SWの動作
tkry 0:cd74549e4be2 272 if(sw2==false) {
tkry 0:cd74549e4be2 273 Voltage = 0;
tkry 0:cd74549e4be2 274 Tcnt = 0;
tkry 0:cd74549e4be2 275 a = 0;
tkry 0:cd74549e4be2 276 Scnt = false;
tkry 0:cd74549e4be2 277 } else if(Scnt == false && sw1==false && Tcnt<stp ) {
tkry 0:cd74549e4be2 278 // 立ち上がり状態,ボタンは押されている,他の状態でない
tkry 0:cd74549e4be2 279 Tcnt += 1;
tkry 0:cd74549e4be2 280 a = +1/stp;
tkry 0:cd74549e4be2 281 Scnt = true;
tkry 0:cd74549e4be2 282 } else {
tkry 0:cd74549e4be2 283 // 継続状態,ボタンは押されている
tkry 0:cd74549e4be2 284 a = 0;
tkry 0:cd74549e4be2 285 if(sw1==false) {
tkry 0:cd74549e4be2 286 Scnt = true;
tkry 0:cd74549e4be2 287 } else {
tkry 0:cd74549e4be2 288 Scnt = false;
tkry 0:cd74549e4be2 289 }
tkry 0:cd74549e4be2 290 }
tkry 0:cd74549e4be2 291 // 電圧範囲の設定(範囲はgain:1.0で調節可能)
tkry 0:cd74549e4be2 292 TargetVoltage = gain*(ZeroVoltage-1.692) + 1.692; // 全範囲の電圧
tkry 0:cd74549e4be2 293 CommandVoltage = (1.539*TargetVoltage - 2.360) - BiasVoltage; // 最大値の電圧
tkry 0:cd74549e4be2 294 Voltage = Voltage + CommandVoltage*a;
tkry 0:cd74549e4be2 295 aout3.write((Voltage+BiasVoltage)/3.3);
tkry 0:cd74549e4be2 296 }
tkry 0:cd74549e4be2 297
tkry 0:cd74549e4be2 298 // シリアルデータ受信時の処理,グローバル変数の書き換え
tkry 0:cd74549e4be2 299 void pc_rx ()
tkry 0:cd74549e4be2 300 {
tkry 0:cd74549e4be2 301 // 文字列受信用の配列
tkry 0:cd74549e4be2 302 int data_index = 0;
tkry 0:cd74549e4be2 303 // 配列に受信したASCIIを代入
tkry 0:cd74549e4be2 304 while(1) {
tkry 0:cd74549e4be2 305 if (!pc.readable()) continue;
tkry 0:cd74549e4be2 306 char c = pc.getc();
tkry 0:cd74549e4be2 307 data[data_index] = c;
tkry 0:cd74549e4be2 308 if (c == '\n') {
tkry 0:cd74549e4be2 309 data[data_index+1] = '\0';
tkry 0:cd74549e4be2 310 pc.printf(">");
tkry 0:cd74549e4be2 311 pc.puts(data); //エコーしないと割り込みが終了しない?
tkry 0:cd74549e4be2 312 break;
tkry 0:cd74549e4be2 313 }
tkry 0:cd74549e4be2 314 data_index++;
tkry 0:cd74549e4be2 315 }
tkry 0:cd74549e4be2 316 rewrite = 1;
tkry 0:cd74549e4be2 317 }
tkry 0:cd74549e4be2 318
tkry 0:cd74549e4be2 319 void eeprom_update()
tkry 0:cd74549e4be2 320 {
tkry 0:cd74549e4be2 321
tkry 0:cd74549e4be2 322 // minの変更
tkry 0:cd74549e4be2 323 if (data[0]=='z' && data[1]=='e' && data[2]=='r' && data[3]=='o') {
tkry 0:cd74549e4be2 324 pc.puts("Calibration done\n");
tkry 0:cd74549e4be2 325 int AnalogVal = 100*3.3*analog_value6.read();
tkry 0:cd74549e4be2 326 ZeroVoltage = AnalogVal/100.0;
tkry 0:cd74549e4be2 327 int Num1 = AnalogVal/100;
tkry 0:cd74549e4be2 328 int Num2 = (AnalogVal%100)/10;
tkry 0:cd74549e4be2 329 int Num3 = (AnalogVal%10)/1;
tkry 0:cd74549e4be2 330 // EEPROMへの書き込み
tkry 0:cd74549e4be2 331 RomWrite(min_address+0, 'z');
tkry 0:cd74549e4be2 332 RomWrite(min_address+1, 'e');
tkry 0:cd74549e4be2 333 RomWrite(min_address+2, 'r');
tkry 0:cd74549e4be2 334 RomWrite(min_address+3, 'o');
tkry 0:cd74549e4be2 335 RomWrite(min_address+4, '=');
tkry 0:cd74549e4be2 336 RomWrite(min_address+5, (char)Num1+'0');
tkry 0:cd74549e4be2 337 RomWrite(min_address+6, '.');
tkry 0:cd74549e4be2 338 RomWrite(min_address+7, (char)Num2+'0');
tkry 0:cd74549e4be2 339 RomWrite(min_address+8, (char)Num3+'0');
tkry 0:cd74549e4be2 340 RomWrite(min_address+9, '\n');
tkry 0:cd74549e4be2 341 RomWrite(min_address+10, '\0');
tkry 0:cd74549e4be2 342 }
tkry 0:cd74549e4be2 343
tkry 0:cd74549e4be2 344 // stpの変更
tkry 0:cd74549e4be2 345 if (data[0]=='s' && data[1]=='t' && data[2]=='p' && data[3]=='=') {
tkry 0:cd74549e4be2 346 float cmd = cmd2num(data);
tkry 0:cd74549e4be2 347 if(cmd<=0) {
tkry 0:cd74549e4be2 348 pc.puts("Error 0 < stp\n");
tkry 0:cd74549e4be2 349 } else {
tkry 0:cd74549e4be2 350 RomWrite_address(stp_address, data);
tkry 0:cd74549e4be2 351 pc.puts("change stp=");
tkry 0:cd74549e4be2 352 pc.printf("%f\n",RomRead_address(stp_address));
tkry 0:cd74549e4be2 353 }
tkry 0:cd74549e4be2 354 }
tkry 0:cd74549e4be2 355
tkry 0:cd74549e4be2 356 // t1の変更
tkry 0:cd74549e4be2 357 if (data[0]=='t' && data[1]=='1' && data[2]=='=') {
tkry 0:cd74549e4be2 358 float cmd = cmd2num(data);
tkry 0:cd74549e4be2 359 if(cmd<=0.01f) {
tkry 0:cd74549e4be2 360 pc.puts("Error 0.01 <= t1\n");
tkry 0:cd74549e4be2 361 } else {
tkry 0:cd74549e4be2 362 RomWrite_address(t1_address, data);
tkry 0:cd74549e4be2 363 pc.puts("change t1=");
tkry 0:cd74549e4be2 364 pc.printf("%f\n",RomRead_address(t1_address));
tkry 0:cd74549e4be2 365 }
tkry 0:cd74549e4be2 366 }
tkry 0:cd74549e4be2 367
tkry 0:cd74549e4be2 368 // t2の変更
tkry 0:cd74549e4be2 369 if (data[0]=='t' && data[1]=='2' && data[2]=='=') {
tkry 0:cd74549e4be2 370 float cmd = cmd2num(data);
tkry 0:cd74549e4be2 371 if(cmd<=0.01f) {
tkry 0:cd74549e4be2 372 pc.puts("Error 0.01 <= t2\n");
tkry 0:cd74549e4be2 373 } else {
tkry 0:cd74549e4be2 374 RomWrite_address(t2_address, data);
tkry 0:cd74549e4be2 375 pc.puts("change t2=");
tkry 0:cd74549e4be2 376 pc.printf("%f\n",RomRead_address(t2_address));
tkry 0:cd74549e4be2 377 }
tkry 0:cd74549e4be2 378 }
tkry 0:cd74549e4be2 379
tkry 0:cd74549e4be2 380 // f1の変更
tkry 0:cd74549e4be2 381 if (data[0]=='f' && data[1]=='1' && data[2]=='=') {
tkry 0:cd74549e4be2 382 float cmd = cmd2num(data);
tkry 0:cd74549e4be2 383 if(cmd<=0.01f || cmd>=0.99f) {
tkry 0:cd74549e4be2 384 pc.puts("Error 0.01 <= f1 <= 0.99\n");
tkry 0:cd74549e4be2 385 } else {
tkry 0:cd74549e4be2 386 RomWrite_address(f1_address, data);
tkry 0:cd74549e4be2 387 pc.puts("change f1=");
tkry 0:cd74549e4be2 388 pc.printf("%f\n",RomRead_address(f1_address));
tkry 0:cd74549e4be2 389 }
tkry 0:cd74549e4be2 390 }
tkry 0:cd74549e4be2 391
tkry 0:cd74549e4be2 392 // f2の変更
tkry 0:cd74549e4be2 393 if (data[0]=='f' && data[1]=='2' && data[2]=='=') {
tkry 0:cd74549e4be2 394 float cmd = cmd2num(data);
tkry 0:cd74549e4be2 395 if(cmd<=0.01f || cmd>=0.99f) {
tkry 0:cd74549e4be2 396 pc.puts("Error 0.01 <= f2 <= 0.99\n");
tkry 0:cd74549e4be2 397 } else {
tkry 0:cd74549e4be2 398 RomWrite_address(f2_address, data);
tkry 0:cd74549e4be2 399 pc.puts("change f2=");
tkry 0:cd74549e4be2 400 pc.printf("%f\n",RomRead_address(f2_address));
tkry 0:cd74549e4be2 401 }
tkry 0:cd74549e4be2 402 }
tkry 0:cd74549e4be2 403
tkry 0:cd74549e4be2 404 // 変数の確認
tkry 0:cd74549e4be2 405 if (data[0]=='p' && data[1]=='a' && data[2]=='r' && data[3]=='a' && data[4]=='m') {
tkry 0:cd74549e4be2 406 pc.puts("zero=");
tkry 0:cd74549e4be2 407 pc.printf("%.2lf \n",RomRead_address(min_address));
tkry 0:cd74549e4be2 408 pc.puts("stp=");
tkry 0:cd74549e4be2 409 pc.printf("%.2lf \n",RomRead_address(stp_address));
tkry 0:cd74549e4be2 410 pc.puts("t1=");
tkry 0:cd74549e4be2 411 pc.printf("%.2lf \n",RomRead_address(t1_address));
tkry 0:cd74549e4be2 412 pc.puts("t2=");
tkry 0:cd74549e4be2 413 pc.printf("%.2lf \n",RomRead_address(t2_address));
tkry 0:cd74549e4be2 414 pc.puts("f1=");
tkry 0:cd74549e4be2 415 pc.printf("%.2lf \n",RomRead_address(f1_address));
tkry 0:cd74549e4be2 416 pc.puts("f2=");
tkry 0:cd74549e4be2 417 pc.printf("%.2lf \n",RomRead_address(f2_address));
tkry 0:cd74549e4be2 418 }
tkry 0:cd74549e4be2 419 }
tkry 0:cd74549e4be2 420
tkry 0:cd74549e4be2 421 float cmd2num(char c[])
tkry 0:cd74549e4be2 422 {
tkry 0:cd74549e4be2 423 char t_data[16];
tkry 0:cd74549e4be2 424 int t_equal_index=0;
tkry 0:cd74549e4be2 425 int t_point_index=0;
tkry 0:cd74549e4be2 426 int t_end_index=0;
tkry 0:cd74549e4be2 427
tkry 0:cd74549e4be2 428 // データとインデックスの代入
tkry 0:cd74549e4be2 429 for(int i=0; i<16; i++) {
tkry 0:cd74549e4be2 430 t_data[i] = c[i];
tkry 0:cd74549e4be2 431 if(t_data[i]=='=') {
tkry 0:cd74549e4be2 432 t_equal_index=i;
tkry 0:cd74549e4be2 433 }
tkry 0:cd74549e4be2 434 if (t_data[i]=='.') {
tkry 0:cd74549e4be2 435 t_point_index = i;
tkry 0:cd74549e4be2 436 }
tkry 0:cd74549e4be2 437 if((t_data[i]=='\r')||(t_data[i]=='\n')) {
tkry 0:cd74549e4be2 438 t_end_index = i;
tkry 0:cd74549e4be2 439 break;
tkry 0:cd74549e4be2 440 }
tkry 0:cd74549e4be2 441 }
tkry 0:cd74549e4be2 442
tkry 0:cd74549e4be2 443 // Asciiと数値の変換
tkry 0:cd74549e4be2 444 double t_command_num = 0;
tkry 0:cd74549e4be2 445 if(t_equal_index!=0) {
tkry 0:cd74549e4be2 446 // 小数の有無で分岐
tkry 0:cd74549e4be2 447 if(t_point_index==0) {
tkry 0:cd74549e4be2 448 // 整数部の処理
tkry 0:cd74549e4be2 449 for(int i=t_equal_index+1; i<t_end_index; i++) {
tkry 0:cd74549e4be2 450 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_end_index-i-1);
tkry 0:cd74549e4be2 451 }
tkry 0:cd74549e4be2 452 } else {
tkry 0:cd74549e4be2 453 // 整数部の処理
tkry 0:cd74549e4be2 454 for(int i=t_equal_index+1; i<t_point_index; i++) {
tkry 0:cd74549e4be2 455 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i-1);
tkry 0:cd74549e4be2 456 }
tkry 0:cd74549e4be2 457 // 小数部の処理
tkry 0:cd74549e4be2 458 for(int i=t_point_index+1; i<t_end_index; i++) {
tkry 0:cd74549e4be2 459 t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i);
tkry 0:cd74549e4be2 460 }
tkry 0:cd74549e4be2 461 }
tkry 0:cd74549e4be2 462 }
tkry 0:cd74549e4be2 463 return t_command_num;
tkry 0:cd74549e4be2 464 }
tkry 0:cd74549e4be2 465
tkry 0:cd74549e4be2 466 // 指定のアドレスにデータを書き込む
tkry 0:cd74549e4be2 467 void RomWrite_address(int address, char c[])
tkry 0:cd74549e4be2 468 {
tkry 0:cd74549e4be2 469 for(int i=0; i<15; i++) {
tkry 0:cd74549e4be2 470 RomWrite(i+address,c[i]);
tkry 0:cd74549e4be2 471 }
tkry 0:cd74549e4be2 472 RomWrite(15+address,'\0');
tkry 0:cd74549e4be2 473 }
tkry 0:cd74549e4be2 474
tkry 0:cd74549e4be2 475 // 指定のアドレスからデータを読み込む
tkry 0:cd74549e4be2 476 float RomRead_address(int address)
tkry 0:cd74549e4be2 477 {
tkry 0:cd74549e4be2 478 char r_data[16];
tkry 0:cd74549e4be2 479 int r_equal_index=0;
tkry 0:cd74549e4be2 480 int r_point_index=0;
tkry 0:cd74549e4be2 481 int r_end_index=0;
tkry 0:cd74549e4be2 482
tkry 0:cd74549e4be2 483 // データとインデックスの代入
tkry 0:cd74549e4be2 484 for(int i=0; i<16; i++) {
tkry 0:cd74549e4be2 485 r_data[i] = RomRead(address+i);
tkry 0:cd74549e4be2 486 if(r_data[i]=='=') {
tkry 0:cd74549e4be2 487 r_equal_index=i;
tkry 0:cd74549e4be2 488 }
tkry 0:cd74549e4be2 489 if (r_data[i]=='.') {
tkry 0:cd74549e4be2 490 r_point_index = i;
tkry 0:cd74549e4be2 491 }
tkry 0:cd74549e4be2 492 if((r_data[i]=='\r')||(r_data[i]=='\n')) {
tkry 0:cd74549e4be2 493 r_end_index = i;
tkry 0:cd74549e4be2 494 break;
tkry 0:cd74549e4be2 495 }
tkry 0:cd74549e4be2 496 }
tkry 0:cd74549e4be2 497
tkry 0:cd74549e4be2 498 // Asciiと数値の変換
tkry 0:cd74549e4be2 499 double r_command_num = 0;
tkry 0:cd74549e4be2 500 if(r_equal_index!=0) {
tkry 0:cd74549e4be2 501 // 小数の有無で分岐
tkry 0:cd74549e4be2 502 if(r_point_index==0) {
tkry 0:cd74549e4be2 503 // 整数部の処理
tkry 0:cd74549e4be2 504 for(int i=r_equal_index+1; i<r_end_index; i++) {
tkry 0:cd74549e4be2 505 r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_end_index-i-1);
tkry 0:cd74549e4be2 506 }
tkry 0:cd74549e4be2 507 } else {
tkry 0:cd74549e4be2 508 // 整数部の処理
tkry 0:cd74549e4be2 509 for(int i=r_equal_index+1; i<r_point_index; i++) {
tkry 0:cd74549e4be2 510 r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_point_index-i-1);
tkry 0:cd74549e4be2 511 }
tkry 0:cd74549e4be2 512 // 小数部の処理
tkry 0:cd74549e4be2 513 for(int i=r_point_index+1; i<r_end_index; i++) {
tkry 0:cd74549e4be2 514 r_command_num += (r_data[i] - '0')*pow((float)10,(float)r_point_index-i);
tkry 0:cd74549e4be2 515 }
tkry 0:cd74549e4be2 516 }
tkry 0:cd74549e4be2 517 }
tkry 0:cd74549e4be2 518 return r_command_num;
tkry 0:cd74549e4be2 519 }
tkry 0:cd74549e4be2 520
tkry 0:cd74549e4be2 521 // 指定のアドレスからchar型で一文字を返す
tkry 0:cd74549e4be2 522 char RomRead(int address)
tkry 0:cd74549e4be2 523 {
tkry 0:cd74549e4be2 524 char data[3];
tkry 0:cd74549e4be2 525 data[0] = 0; // MSB address
tkry 0:cd74549e4be2 526 data[1] = address; // LSB address
tkry 0:cd74549e4be2 527 eeprom.write(0xA0, data, 2);
tkry 0:cd74549e4be2 528
tkry 0:cd74549e4be2 529 char response[1];
tkry 0:cd74549e4be2 530 eeprom.read(0xA0, response, 1);
tkry 0:cd74549e4be2 531 return response[0];
tkry 0:cd74549e4be2 532 }
tkry 0:cd74549e4be2 533
tkry 0:cd74549e4be2 534 // 指定のアドレスにint型で一文字書き込む
tkry 0:cd74549e4be2 535 void RomWrite(int address, char c)
tkry 0:cd74549e4be2 536 {
tkry 0:cd74549e4be2 537 char data[3];
tkry 0:cd74549e4be2 538 data[0] = 0; // MSB address
tkry 0:cd74549e4be2 539 data[1] = address; // LSB address
tkry 0:cd74549e4be2 540 data[2] = c; // data
tkry 0:cd74549e4be2 541 eeprom.write(0xA0, data, 3);
tkry 0:cd74549e4be2 542 while(eeprom.write(0xA0, NULL, 0)); // wait to complete
tkry 0:cd74549e4be2 543 }