Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@1:b0b5e0e70af8, 2020-05-10 (annotated)
- Committer:
- tkry
- Date:
- Sun May 10 19:51:15 2020 +0000
- Revision:
- 1:b0b5e0e70af8
- Parent:
- 0:cd74549e4be2
1st complete
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:b0b5e0e70af8 | 110 | // EEPROMの読み込み |
tkry | 1:b0b5e0e70af8 | 111 | ZeroVoltage = RomRead_address(min_address); |
tkry | 1:b0b5e0e70af8 | 112 | stp = RomRead_address(stp_address); // stpの代入 |
tkry | 1:b0b5e0e70af8 | 113 | t1 = RomRead_address(t1_address); // t1の代入 |
tkry | 1:b0b5e0e70af8 | 114 | t2 = RomRead_address(t2_address); // t2の代入 |
tkry | 1:b0b5e0e70af8 | 115 | f1 = RomRead_address(f1_address); // f1の代入 |
tkry | 1:b0b5e0e70af8 | 116 | f2 = RomRead_address(f2_address); // f2の代入 |
tkry | 1:b0b5e0e70af8 | 117 | |
tkry | 0:cd74549e4be2 | 118 | // 起動後の処理 |
tkry | 0:cd74549e4be2 | 119 | Rled = 0; // 動作チェック用の赤LED点灯 |
tkry | 0:cd74549e4be2 | 120 | Gled = 1; // 動作チェック用の緑LED点灯,外部電源駆動の場合シリアル割り込み内のgetcで処理が止まる? |
tkry | 0:cd74549e4be2 | 121 | wait(0.8); // モーター電源オンの待ち時間 |
tkry | 0:cd74549e4be2 | 122 | FET = 1; // モーター電源オン,EEPROM書き込み時はオフ |
tkry | 0:cd74549e4be2 | 123 | |
tkry | 0:cd74549e4be2 | 124 | // 割り込みの定義 |
tkry | 0:cd74549e4be2 | 125 | pc.attach(pc_rx,Serial::RxIrq); // シリアルデータ受信時の割り込み |
tkry | 0:cd74549e4be2 | 126 | LED_IRQ.attach(&LED4_Display, 1e-3); // 5msecごとに桁を更新 |
tkry | 0:cd74549e4be2 | 127 | DAC_IRQ.attach(&DAC_switch, 1e-2); // 10msecごとにDACを変動 |
tkry | 0:cd74549e4be2 | 128 | |
tkry | 0:cd74549e4be2 | 129 | // メイン処理内の変数 |
tkry | 0:cd74549e4be2 | 130 | float lpf = 0.8; // 値が大きいほどに平滑化 |
tkry | 0:cd74549e4be2 | 131 | double raw_data = 0.0; // LPF用の一時変数 |
tkry | 0:cd74549e4be2 | 132 | double lpf_data = 0.0; // LPF用の一時変数 |
tkry | 0:cd74549e4be2 | 133 | double pre_data = 0.0; // LPF用の一時変数 |
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 | 1:b0b5e0e70af8 | 144 | } else { |
tkry | 0:cd74549e4be2 | 145 | if( ReadSign2 == 0 ) { // LEDの出力処理後に実行(LEDの出力処理中(データ送信中)に実行されない) |
tkry | 0:cd74549e4be2 | 146 | raw_data = (float)(loadcell.read()-offset)*0.003525f; // 実測で調節した方が良さそう?(4.2987/16777216.0/128)/(0.001*8.9/2000.0) |
tkry | 0:cd74549e4be2 | 147 | lpf_data = (1.0f - lpf)*raw_data + lpf*pre_data; |
tkry | 0:cd74549e4be2 | 148 | pre_data = lpf_data; |
tkry | 0:cd74549e4be2 | 149 | ReadSign1 = 1; // 読み込む直前で圧力計変数をtrue(読み込み前)にする(データ代入中の値を出力しない) |
tkry | 0:cd74549e4be2 | 150 | Data = (int)lpf_data; |
tkry | 0:cd74549e4be2 | 151 | } |
tkry | 0:cd74549e4be2 | 152 | ReadSign1 = 0; // 読み込み完了で圧力計変数をfalse(読み込み後)にする |
tkry | 0:cd74549e4be2 | 153 | //Arduino Serial plotterでのLPFの比較用 |
tkry | 0:cd74549e4be2 | 154 | //pc.printf("%f", raw_data); |
tkry | 0:cd74549e4be2 | 155 | //pc.printf(","); |
tkry | 0:cd74549e4be2 | 156 | //pc.printf("%f\n", lpf_data); |
tkry | 0:cd74549e4be2 | 157 | } |
tkry | 0:cd74549e4be2 | 158 | } |
tkry | 0:cd74549e4be2 | 159 | } |
tkry | 0:cd74549e4be2 | 160 | |
tkry | 0:cd74549e4be2 | 161 | // 1桁出力関数 |
tkry | 0:cd74549e4be2 | 162 | void seg(int num, int d) |
tkry | 0:cd74549e4be2 | 163 | { |
tkry | 0:cd74549e4be2 | 164 | // 数値データの送信 |
tkry | 0:cd74549e4be2 | 165 | for(int i=0; i<=7; i++) { |
tkry | 0:cd74549e4be2 | 166 | datapin=state[num][i]; |
tkry | 0:cd74549e4be2 | 167 | clockpin=1; |
tkry | 0:cd74549e4be2 | 168 | clockpin=0; |
tkry | 0:cd74549e4be2 | 169 | } |
tkry | 0:cd74549e4be2 | 170 | |
tkry | 0:cd74549e4be2 | 171 | // 桁データの送信 |
tkry | 0:cd74549e4be2 | 172 | for(int i=0; i<=7; i++) { |
tkry | 0:cd74549e4be2 | 173 | datapin=state[d+10][i]; |
tkry | 0:cd74549e4be2 | 174 | clockpin=1; |
tkry | 0:cd74549e4be2 | 175 | clockpin=0; |
tkry | 0:cd74549e4be2 | 176 | } |
tkry | 0:cd74549e4be2 | 177 | latchpin=0; |
tkry | 0:cd74549e4be2 | 178 | latchpin=1; |
tkry | 0:cd74549e4be2 | 179 | } |
tkry | 0:cd74549e4be2 | 180 | |
tkry | 0:cd74549e4be2 | 181 | // 4桁出力関数 |
tkry | 0:cd74549e4be2 | 182 | void LED4_Display() |
tkry | 0:cd74549e4be2 | 183 | { |
tkry | 0:cd74549e4be2 | 184 | if(ReadSign1 == 0) { // 圧力計の読み込み処理後に実行(圧力計の読み込み処理中に実行されない) |
tkry | 0:cd74549e4be2 | 185 | ReadSign2 = 1; // 出力直前でLED計変数をtrue(読み込み前)にする |
tkry | 0:cd74549e4be2 | 186 | if( Data < 0) { // 0以下の場合に値を0にする |
tkry | 0:cd74549e4be2 | 187 | Data = 0; |
tkry | 0:cd74549e4be2 | 188 | } |
tkry | 0:cd74549e4be2 | 189 | |
tkry | 0:cd74549e4be2 | 190 | LedNum++; // 桁変え |
tkry | 0:cd74549e4be2 | 191 | if(LedNum>4) { |
tkry | 0:cd74549e4be2 | 192 | LedNum=1; |
tkry | 0:cd74549e4be2 | 193 | } |
tkry | 0:cd74549e4be2 | 194 | switch(LedNum) { // 桁ごとに出力 |
tkry | 0:cd74549e4be2 | 195 | case 1: |
tkry | 0:cd74549e4be2 | 196 | seg((int)Data%10/1,1); |
tkry | 0:cd74549e4be2 | 197 | break; |
tkry | 0:cd74549e4be2 | 198 | case 2: |
tkry | 0:cd74549e4be2 | 199 | if(Data < 10) { |
tkry | 0:cd74549e4be2 | 200 | seg(10,2); |
tkry | 0:cd74549e4be2 | 201 | } else { |
tkry | 0:cd74549e4be2 | 202 | seg((int)Data%100/10,2); |
tkry | 0:cd74549e4be2 | 203 | } |
tkry | 0:cd74549e4be2 | 204 | break; |
tkry | 0:cd74549e4be2 | 205 | case 3: |
tkry | 0:cd74549e4be2 | 206 | if(Data < 100) { |
tkry | 0:cd74549e4be2 | 207 | seg(10,3); |
tkry | 0:cd74549e4be2 | 208 | } else { |
tkry | 0:cd74549e4be2 | 209 | seg((int)Data%1000/100,3); |
tkry | 0:cd74549e4be2 | 210 | } |
tkry | 0:cd74549e4be2 | 211 | break; |
tkry | 0:cd74549e4be2 | 212 | case 4: |
tkry | 0:cd74549e4be2 | 213 | if(Data < 1000) { |
tkry | 0:cd74549e4be2 | 214 | seg(10,4); |
tkry | 0:cd74549e4be2 | 215 | } else { |
tkry | 0:cd74549e4be2 | 216 | seg((int)Data%10000/1000,4); |
tkry | 0:cd74549e4be2 | 217 | } |
tkry | 0:cd74549e4be2 | 218 | break; |
tkry | 0:cd74549e4be2 | 219 | } |
tkry | 0:cd74549e4be2 | 220 | // 出力完了でLED変数をfalse(読み込み後)にする |
tkry | 0:cd74549e4be2 | 221 | ReadSign2 = 0; |
tkry | 0:cd74549e4be2 | 222 | } |
tkry | 0:cd74549e4be2 | 223 | } |
tkry | 0:cd74549e4be2 | 224 | |
tkry | 0:cd74549e4be2 | 225 | // DACの切り替え |
tkry | 0:cd74549e4be2 | 226 | void DAC_switch() |
tkry | 0:cd74549e4be2 | 227 | { |
tkry | 1:b0b5e0e70af8 | 228 | if(stp==1) { |
tkry | 0:cd74549e4be2 | 229 | DAC_linear(); |
tkry | 0:cd74549e4be2 | 230 | } else { |
tkry | 0:cd74549e4be2 | 231 | DAC_step(); |
tkry | 0:cd74549e4be2 | 232 | } |
tkry | 0:cd74549e4be2 | 233 | } |
tkry | 0:cd74549e4be2 | 234 | |
tkry | 0:cd74549e4be2 | 235 | void DAC_linear() |
tkry | 0:cd74549e4be2 | 236 | { |
tkry | 0:cd74549e4be2 | 237 | if(sw1==false) { |
tkry | 0:cd74549e4be2 | 238 | t = t1; // sw1の変動時間 |
tkry | 0:cd74549e4be2 | 239 | gain = f1; // sw1の変動割合 |
tkry | 0:cd74549e4be2 | 240 | } |
tkry | 0:cd74549e4be2 | 241 | if(sw2==false) { |
tkry | 0:cd74549e4be2 | 242 | t = t2; // sw2の変動時間 |
tkry | 0:cd74549e4be2 | 243 | gain = f2; // sw2の変動割合 |
tkry | 0:cd74549e4be2 | 244 | } |
tkry | 0:cd74549e4be2 | 245 | // SWの動作 |
tkry | 0:cd74549e4be2 | 246 | if((sw1==false||sw2==false) && Tcnt<t*1e2 ) { |
tkry | 0:cd74549e4be2 | 247 | // 立ち上がり状態,ボタンは押されている,他の状態でない |
tkry | 0:cd74549e4be2 | 248 | Tcnt += 1; |
tkry | 0:cd74549e4be2 | 249 | a = +1/t; |
tkry | 0:cd74549e4be2 | 250 | } else if(sw1==false||sw2==false) { |
tkry | 0:cd74549e4be2 | 251 | // 継続状態,ボタンは押されている |
tkry | 0:cd74549e4be2 | 252 | Tcnt += 1; |
tkry | 0:cd74549e4be2 | 253 | a = 0; |
tkry | 0:cd74549e4be2 | 254 | } else { |
tkry | 0:cd74549e4be2 | 255 | Voltage = 0; |
tkry | 0:cd74549e4be2 | 256 | Tcnt = 0; |
tkry | 0:cd74549e4be2 | 257 | a = 0; |
tkry | 0:cd74549e4be2 | 258 | } |
tkry | 0:cd74549e4be2 | 259 | // 電圧範囲の設定 |
tkry | 0:cd74549e4be2 | 260 | TargetVoltage = gain*(ZeroVoltage-1.692) + 1.692; // 50%の電圧 |
tkry | 0:cd74549e4be2 | 261 | CommandVoltage = 1.539*TargetVoltage - 2.360 - BiasVoltage; |
tkry | 0:cd74549e4be2 | 262 | Voltage = Voltage + CommandVoltage*a*1e-2; |
tkry | 0:cd74549e4be2 | 263 | aout3.write((Voltage+BiasVoltage)/3.3); |
tkry | 0:cd74549e4be2 | 264 | } |
tkry | 0:cd74549e4be2 | 265 | |
tkry | 0:cd74549e4be2 | 266 | void DAC_step() |
tkry | 0:cd74549e4be2 | 267 | { |
tkry | 0:cd74549e4be2 | 268 | // SWの動作 |
tkry | 0:cd74549e4be2 | 269 | if(sw2==false) { |
tkry | 0:cd74549e4be2 | 270 | Voltage = 0; |
tkry | 0:cd74549e4be2 | 271 | Tcnt = 0; |
tkry | 0:cd74549e4be2 | 272 | a = 0; |
tkry | 0:cd74549e4be2 | 273 | Scnt = false; |
tkry | 0:cd74549e4be2 | 274 | } else if(Scnt == false && sw1==false && Tcnt<stp ) { |
tkry | 0:cd74549e4be2 | 275 | // 立ち上がり状態,ボタンは押されている,他の状態でない |
tkry | 0:cd74549e4be2 | 276 | Tcnt += 1; |
tkry | 0:cd74549e4be2 | 277 | a = +1/stp; |
tkry | 0:cd74549e4be2 | 278 | Scnt = true; |
tkry | 0:cd74549e4be2 | 279 | } else { |
tkry | 0:cd74549e4be2 | 280 | // 継続状態,ボタンは押されている |
tkry | 0:cd74549e4be2 | 281 | a = 0; |
tkry | 0:cd74549e4be2 | 282 | if(sw1==false) { |
tkry | 0:cd74549e4be2 | 283 | Scnt = true; |
tkry | 0:cd74549e4be2 | 284 | } else { |
tkry | 0:cd74549e4be2 | 285 | Scnt = false; |
tkry | 0:cd74549e4be2 | 286 | } |
tkry | 0:cd74549e4be2 | 287 | } |
tkry | 1:b0b5e0e70af8 | 288 | // 電圧範囲の設定(範囲1.0で設定) |
tkry | 1:b0b5e0e70af8 | 289 | TargetVoltage = 1.0*(ZeroVoltage-1.692) + 1.692; // 全範囲の電圧 |
tkry | 0:cd74549e4be2 | 290 | CommandVoltage = (1.539*TargetVoltage - 2.360) - BiasVoltage; // 最大値の電圧 |
tkry | 0:cd74549e4be2 | 291 | Voltage = Voltage + CommandVoltage*a; |
tkry | 0:cd74549e4be2 | 292 | aout3.write((Voltage+BiasVoltage)/3.3); |
tkry | 0:cd74549e4be2 | 293 | } |
tkry | 0:cd74549e4be2 | 294 | |
tkry | 0:cd74549e4be2 | 295 | // シリアルデータ受信時の処理,グローバル変数の書き換え |
tkry | 0:cd74549e4be2 | 296 | void pc_rx () |
tkry | 0:cd74549e4be2 | 297 | { |
tkry | 0:cd74549e4be2 | 298 | // 文字列受信用の配列 |
tkry | 0:cd74549e4be2 | 299 | int data_index = 0; |
tkry | 0:cd74549e4be2 | 300 | // 配列に受信したASCIIを代入 |
tkry | 0:cd74549e4be2 | 301 | while(1) { |
tkry | 0:cd74549e4be2 | 302 | if (!pc.readable()) continue; |
tkry | 0:cd74549e4be2 | 303 | char c = pc.getc(); |
tkry | 0:cd74549e4be2 | 304 | data[data_index] = c; |
tkry | 0:cd74549e4be2 | 305 | if (c == '\n') { |
tkry | 0:cd74549e4be2 | 306 | data[data_index+1] = '\0'; |
tkry | 0:cd74549e4be2 | 307 | pc.printf(">"); |
tkry | 0:cd74549e4be2 | 308 | pc.puts(data); //エコーしないと割り込みが終了しない? |
tkry | 0:cd74549e4be2 | 309 | break; |
tkry | 0:cd74549e4be2 | 310 | } |
tkry | 0:cd74549e4be2 | 311 | data_index++; |
tkry | 0:cd74549e4be2 | 312 | } |
tkry | 0:cd74549e4be2 | 313 | rewrite = 1; |
tkry | 0:cd74549e4be2 | 314 | } |
tkry | 0:cd74549e4be2 | 315 | |
tkry | 0:cd74549e4be2 | 316 | void eeprom_update() |
tkry | 0:cd74549e4be2 | 317 | { |
tkry | 0:cd74549e4be2 | 318 | // minの変更 |
tkry | 0:cd74549e4be2 | 319 | if (data[0]=='z' && data[1]=='e' && data[2]=='r' && data[3]=='o') { |
tkry | 0:cd74549e4be2 | 320 | pc.puts("Calibration done\n"); |
tkry | 0:cd74549e4be2 | 321 | int AnalogVal = 100*3.3*analog_value6.read(); |
tkry | 0:cd74549e4be2 | 322 | ZeroVoltage = AnalogVal/100.0; |
tkry | 0:cd74549e4be2 | 323 | int Num1 = AnalogVal/100; |
tkry | 0:cd74549e4be2 | 324 | int Num2 = (AnalogVal%100)/10; |
tkry | 0:cd74549e4be2 | 325 | int Num3 = (AnalogVal%10)/1; |
tkry | 0:cd74549e4be2 | 326 | // EEPROMへの書き込み |
tkry | 0:cd74549e4be2 | 327 | RomWrite(min_address+0, 'z'); |
tkry | 0:cd74549e4be2 | 328 | RomWrite(min_address+1, 'e'); |
tkry | 0:cd74549e4be2 | 329 | RomWrite(min_address+2, 'r'); |
tkry | 0:cd74549e4be2 | 330 | RomWrite(min_address+3, 'o'); |
tkry | 0:cd74549e4be2 | 331 | RomWrite(min_address+4, '='); |
tkry | 0:cd74549e4be2 | 332 | RomWrite(min_address+5, (char)Num1+'0'); |
tkry | 0:cd74549e4be2 | 333 | RomWrite(min_address+6, '.'); |
tkry | 0:cd74549e4be2 | 334 | RomWrite(min_address+7, (char)Num2+'0'); |
tkry | 0:cd74549e4be2 | 335 | RomWrite(min_address+8, (char)Num3+'0'); |
tkry | 0:cd74549e4be2 | 336 | RomWrite(min_address+9, '\n'); |
tkry | 0:cd74549e4be2 | 337 | RomWrite(min_address+10, '\0'); |
tkry | 0:cd74549e4be2 | 338 | } |
tkry | 0:cd74549e4be2 | 339 | |
tkry | 0:cd74549e4be2 | 340 | // stpの変更 |
tkry | 0:cd74549e4be2 | 341 | if (data[0]=='s' && data[1]=='t' && data[2]=='p' && data[3]=='=') { |
tkry | 0:cd74549e4be2 | 342 | float cmd = cmd2num(data); |
tkry | 1:b0b5e0e70af8 | 343 | stp=cmd; |
tkry | 0:cd74549e4be2 | 344 | if(cmd<=0) { |
tkry | 0:cd74549e4be2 | 345 | pc.puts("Error 0 < stp\n"); |
tkry | 0:cd74549e4be2 | 346 | } else { |
tkry | 0:cd74549e4be2 | 347 | RomWrite_address(stp_address, data); |
tkry | 0:cd74549e4be2 | 348 | pc.puts("change stp="); |
tkry | 0:cd74549e4be2 | 349 | pc.printf("%f\n",RomRead_address(stp_address)); |
tkry | 0:cd74549e4be2 | 350 | } |
tkry | 1:b0b5e0e70af8 | 351 | Voltage = 0; |
tkry | 1:b0b5e0e70af8 | 352 | Tcnt = 0; |
tkry | 1:b0b5e0e70af8 | 353 | a = 0; |
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 | 1:b0b5e0e70af8 | 359 | t1=cmd; |
tkry | 0:cd74549e4be2 | 360 | if(cmd<=0.01f) { |
tkry | 0:cd74549e4be2 | 361 | pc.puts("Error 0.01 <= t1\n"); |
tkry | 0:cd74549e4be2 | 362 | } else { |
tkry | 0:cd74549e4be2 | 363 | RomWrite_address(t1_address, data); |
tkry | 0:cd74549e4be2 | 364 | pc.puts("change t1="); |
tkry | 0:cd74549e4be2 | 365 | pc.printf("%f\n",RomRead_address(t1_address)); |
tkry | 0:cd74549e4be2 | 366 | } |
tkry | 0:cd74549e4be2 | 367 | } |
tkry | 0:cd74549e4be2 | 368 | |
tkry | 0:cd74549e4be2 | 369 | // t2の変更 |
tkry | 0:cd74549e4be2 | 370 | if (data[0]=='t' && data[1]=='2' && data[2]=='=') { |
tkry | 0:cd74549e4be2 | 371 | float cmd = cmd2num(data); |
tkry | 1:b0b5e0e70af8 | 372 | t2=cmd; |
tkry | 0:cd74549e4be2 | 373 | if(cmd<=0.01f) { |
tkry | 0:cd74549e4be2 | 374 | pc.puts("Error 0.01 <= t2\n"); |
tkry | 0:cd74549e4be2 | 375 | } else { |
tkry | 0:cd74549e4be2 | 376 | RomWrite_address(t2_address, data); |
tkry | 0:cd74549e4be2 | 377 | pc.puts("change t2="); |
tkry | 0:cd74549e4be2 | 378 | pc.printf("%f\n",RomRead_address(t2_address)); |
tkry | 0:cd74549e4be2 | 379 | } |
tkry | 0:cd74549e4be2 | 380 | } |
tkry | 0:cd74549e4be2 | 381 | |
tkry | 0:cd74549e4be2 | 382 | // f1の変更 |
tkry | 0:cd74549e4be2 | 383 | if (data[0]=='f' && data[1]=='1' && data[2]=='=') { |
tkry | 0:cd74549e4be2 | 384 | float cmd = cmd2num(data); |
tkry | 1:b0b5e0e70af8 | 385 | f1=cmd; |
tkry | 0:cd74549e4be2 | 386 | if(cmd<=0.01f || cmd>=0.99f) { |
tkry | 0:cd74549e4be2 | 387 | pc.puts("Error 0.01 <= f1 <= 0.99\n"); |
tkry | 0:cd74549e4be2 | 388 | } else { |
tkry | 0:cd74549e4be2 | 389 | RomWrite_address(f1_address, data); |
tkry | 0:cd74549e4be2 | 390 | pc.puts("change f1="); |
tkry | 0:cd74549e4be2 | 391 | pc.printf("%f\n",RomRead_address(f1_address)); |
tkry | 0:cd74549e4be2 | 392 | } |
tkry | 0:cd74549e4be2 | 393 | } |
tkry | 0:cd74549e4be2 | 394 | |
tkry | 0:cd74549e4be2 | 395 | // f2の変更 |
tkry | 0:cd74549e4be2 | 396 | if (data[0]=='f' && data[1]=='2' && data[2]=='=') { |
tkry | 0:cd74549e4be2 | 397 | float cmd = cmd2num(data); |
tkry | 1:b0b5e0e70af8 | 398 | f2=cmd; |
tkry | 0:cd74549e4be2 | 399 | if(cmd<=0.01f || cmd>=0.99f) { |
tkry | 0:cd74549e4be2 | 400 | pc.puts("Error 0.01 <= f2 <= 0.99\n"); |
tkry | 0:cd74549e4be2 | 401 | } else { |
tkry | 0:cd74549e4be2 | 402 | RomWrite_address(f2_address, data); |
tkry | 0:cd74549e4be2 | 403 | pc.puts("change f2="); |
tkry | 0:cd74549e4be2 | 404 | pc.printf("%f\n",RomRead_address(f2_address)); |
tkry | 0:cd74549e4be2 | 405 | } |
tkry | 0:cd74549e4be2 | 406 | } |
tkry | 0:cd74549e4be2 | 407 | |
tkry | 0:cd74549e4be2 | 408 | // 変数の確認 |
tkry | 0:cd74549e4be2 | 409 | if (data[0]=='p' && data[1]=='a' && data[2]=='r' && data[3]=='a' && data[4]=='m') { |
tkry | 0:cd74549e4be2 | 410 | pc.puts("zero="); |
tkry | 0:cd74549e4be2 | 411 | pc.printf("%.2lf \n",RomRead_address(min_address)); |
tkry | 0:cd74549e4be2 | 412 | pc.puts("stp="); |
tkry | 0:cd74549e4be2 | 413 | pc.printf("%.2lf \n",RomRead_address(stp_address)); |
tkry | 0:cd74549e4be2 | 414 | pc.puts("t1="); |
tkry | 0:cd74549e4be2 | 415 | pc.printf("%.2lf \n",RomRead_address(t1_address)); |
tkry | 0:cd74549e4be2 | 416 | pc.puts("t2="); |
tkry | 0:cd74549e4be2 | 417 | pc.printf("%.2lf \n",RomRead_address(t2_address)); |
tkry | 0:cd74549e4be2 | 418 | pc.puts("f1="); |
tkry | 0:cd74549e4be2 | 419 | pc.printf("%.2lf \n",RomRead_address(f1_address)); |
tkry | 0:cd74549e4be2 | 420 | pc.puts("f2="); |
tkry | 0:cd74549e4be2 | 421 | pc.printf("%.2lf \n",RomRead_address(f2_address)); |
tkry | 0:cd74549e4be2 | 422 | } |
tkry | 0:cd74549e4be2 | 423 | } |
tkry | 0:cd74549e4be2 | 424 | |
tkry | 0:cd74549e4be2 | 425 | float cmd2num(char c[]) |
tkry | 0:cd74549e4be2 | 426 | { |
tkry | 0:cd74549e4be2 | 427 | char t_data[16]; |
tkry | 0:cd74549e4be2 | 428 | int t_equal_index=0; |
tkry | 0:cd74549e4be2 | 429 | int t_point_index=0; |
tkry | 0:cd74549e4be2 | 430 | int t_end_index=0; |
tkry | 0:cd74549e4be2 | 431 | |
tkry | 0:cd74549e4be2 | 432 | // データとインデックスの代入 |
tkry | 0:cd74549e4be2 | 433 | for(int i=0; i<16; i++) { |
tkry | 0:cd74549e4be2 | 434 | t_data[i] = c[i]; |
tkry | 0:cd74549e4be2 | 435 | if(t_data[i]=='=') { |
tkry | 0:cd74549e4be2 | 436 | t_equal_index=i; |
tkry | 0:cd74549e4be2 | 437 | } |
tkry | 0:cd74549e4be2 | 438 | if (t_data[i]=='.') { |
tkry | 0:cd74549e4be2 | 439 | t_point_index = i; |
tkry | 0:cd74549e4be2 | 440 | } |
tkry | 0:cd74549e4be2 | 441 | if((t_data[i]=='\r')||(t_data[i]=='\n')) { |
tkry | 0:cd74549e4be2 | 442 | t_end_index = i; |
tkry | 0:cd74549e4be2 | 443 | break; |
tkry | 0:cd74549e4be2 | 444 | } |
tkry | 0:cd74549e4be2 | 445 | } |
tkry | 0:cd74549e4be2 | 446 | |
tkry | 0:cd74549e4be2 | 447 | // Asciiと数値の変換 |
tkry | 0:cd74549e4be2 | 448 | double t_command_num = 0; |
tkry | 0:cd74549e4be2 | 449 | if(t_equal_index!=0) { |
tkry | 0:cd74549e4be2 | 450 | // 小数の有無で分岐 |
tkry | 0:cd74549e4be2 | 451 | if(t_point_index==0) { |
tkry | 0:cd74549e4be2 | 452 | // 整数部の処理 |
tkry | 0:cd74549e4be2 | 453 | for(int i=t_equal_index+1; i<t_end_index; i++) { |
tkry | 0:cd74549e4be2 | 454 | t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_end_index-i-1); |
tkry | 0:cd74549e4be2 | 455 | } |
tkry | 0:cd74549e4be2 | 456 | } else { |
tkry | 0:cd74549e4be2 | 457 | // 整数部の処理 |
tkry | 0:cd74549e4be2 | 458 | for(int i=t_equal_index+1; i<t_point_index; i++) { |
tkry | 0:cd74549e4be2 | 459 | t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i-1); |
tkry | 0:cd74549e4be2 | 460 | } |
tkry | 0:cd74549e4be2 | 461 | // 小数部の処理 |
tkry | 0:cd74549e4be2 | 462 | for(int i=t_point_index+1; i<t_end_index; i++) { |
tkry | 0:cd74549e4be2 | 463 | t_command_num += (t_data[i] - '0')*pow((double)10,(double)t_point_index-i); |
tkry | 0:cd74549e4be2 | 464 | } |
tkry | 0:cd74549e4be2 | 465 | } |
tkry | 0:cd74549e4be2 | 466 | } |
tkry | 0:cd74549e4be2 | 467 | return t_command_num; |
tkry | 0:cd74549e4be2 | 468 | } |
tkry | 0:cd74549e4be2 | 469 | |
tkry | 0:cd74549e4be2 | 470 | // 指定のアドレスにデータを書き込む |
tkry | 0:cd74549e4be2 | 471 | void RomWrite_address(int address, char c[]) |
tkry | 0:cd74549e4be2 | 472 | { |
tkry | 0:cd74549e4be2 | 473 | for(int i=0; i<15; i++) { |
tkry | 0:cd74549e4be2 | 474 | RomWrite(i+address,c[i]); |
tkry | 0:cd74549e4be2 | 475 | } |
tkry | 0:cd74549e4be2 | 476 | RomWrite(15+address,'\0'); |
tkry | 0:cd74549e4be2 | 477 | } |
tkry | 0:cd74549e4be2 | 478 | |
tkry | 0:cd74549e4be2 | 479 | // 指定のアドレスからデータを読み込む |
tkry | 0:cd74549e4be2 | 480 | float RomRead_address(int address) |
tkry | 0:cd74549e4be2 | 481 | { |
tkry | 0:cd74549e4be2 | 482 | char r_data[16]; |
tkry | 0:cd74549e4be2 | 483 | int r_equal_index=0; |
tkry | 0:cd74549e4be2 | 484 | int r_point_index=0; |
tkry | 0:cd74549e4be2 | 485 | int r_end_index=0; |
tkry | 0:cd74549e4be2 | 486 | |
tkry | 0:cd74549e4be2 | 487 | // データとインデックスの代入 |
tkry | 0:cd74549e4be2 | 488 | for(int i=0; i<16; i++) { |
tkry | 0:cd74549e4be2 | 489 | r_data[i] = RomRead(address+i); |
tkry | 0:cd74549e4be2 | 490 | if(r_data[i]=='=') { |
tkry | 0:cd74549e4be2 | 491 | r_equal_index=i; |
tkry | 0:cd74549e4be2 | 492 | } |
tkry | 0:cd74549e4be2 | 493 | if (r_data[i]=='.') { |
tkry | 0:cd74549e4be2 | 494 | r_point_index = i; |
tkry | 0:cd74549e4be2 | 495 | } |
tkry | 0:cd74549e4be2 | 496 | if((r_data[i]=='\r')||(r_data[i]=='\n')) { |
tkry | 0:cd74549e4be2 | 497 | r_end_index = i; |
tkry | 0:cd74549e4be2 | 498 | break; |
tkry | 0:cd74549e4be2 | 499 | } |
tkry | 0:cd74549e4be2 | 500 | } |
tkry | 0:cd74549e4be2 | 501 | |
tkry | 0:cd74549e4be2 | 502 | // Asciiと数値の変換 |
tkry | 0:cd74549e4be2 | 503 | double r_command_num = 0; |
tkry | 0:cd74549e4be2 | 504 | if(r_equal_index!=0) { |
tkry | 0:cd74549e4be2 | 505 | // 小数の有無で分岐 |
tkry | 0:cd74549e4be2 | 506 | if(r_point_index==0) { |
tkry | 0:cd74549e4be2 | 507 | // 整数部の処理 |
tkry | 0:cd74549e4be2 | 508 | for(int i=r_equal_index+1; i<r_end_index; i++) { |
tkry | 0:cd74549e4be2 | 509 | r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_end_index-i-1); |
tkry | 0:cd74549e4be2 | 510 | } |
tkry | 0:cd74549e4be2 | 511 | } else { |
tkry | 0:cd74549e4be2 | 512 | // 整数部の処理 |
tkry | 0:cd74549e4be2 | 513 | for(int i=r_equal_index+1; i<r_point_index; i++) { |
tkry | 0:cd74549e4be2 | 514 | r_command_num += (r_data[i] - '0')*pow((double)10,(double)r_point_index-i-1); |
tkry | 0:cd74549e4be2 | 515 | } |
tkry | 0:cd74549e4be2 | 516 | // 小数部の処理 |
tkry | 0:cd74549e4be2 | 517 | for(int i=r_point_index+1; i<r_end_index; i++) { |
tkry | 0:cd74549e4be2 | 518 | r_command_num += (r_data[i] - '0')*pow((float)10,(float)r_point_index-i); |
tkry | 0:cd74549e4be2 | 519 | } |
tkry | 0:cd74549e4be2 | 520 | } |
tkry | 0:cd74549e4be2 | 521 | } |
tkry | 0:cd74549e4be2 | 522 | return r_command_num; |
tkry | 0:cd74549e4be2 | 523 | } |
tkry | 0:cd74549e4be2 | 524 | |
tkry | 0:cd74549e4be2 | 525 | // 指定のアドレスからchar型で一文字を返す |
tkry | 0:cd74549e4be2 | 526 | char RomRead(int address) |
tkry | 0:cd74549e4be2 | 527 | { |
tkry | 0:cd74549e4be2 | 528 | char data[3]; |
tkry | 1:b0b5e0e70af8 | 529 | data[0] = 0; // MSB address |
tkry | 1:b0b5e0e70af8 | 530 | data[1] = address; // LSB address |
tkry | 0:cd74549e4be2 | 531 | eeprom.write(0xA0, data, 2); |
tkry | 0:cd74549e4be2 | 532 | char response[1]; |
tkry | 0:cd74549e4be2 | 533 | eeprom.read(0xA0, response, 1); |
tkry | 0:cd74549e4be2 | 534 | return response[0]; |
tkry | 0:cd74549e4be2 | 535 | } |
tkry | 0:cd74549e4be2 | 536 | |
tkry | 0:cd74549e4be2 | 537 | // 指定のアドレスにint型で一文字書き込む |
tkry | 0:cd74549e4be2 | 538 | void RomWrite(int address, char c) |
tkry | 0:cd74549e4be2 | 539 | { |
tkry | 0:cd74549e4be2 | 540 | char data[3]; |
tkry | 0:cd74549e4be2 | 541 | data[0] = 0; // MSB address |
tkry | 0:cd74549e4be2 | 542 | data[1] = address; // LSB address |
tkry | 0:cd74549e4be2 | 543 | data[2] = c; // data |
tkry | 0:cd74549e4be2 | 544 | eeprom.write(0xA0, data, 3); |
tkry | 0:cd74549e4be2 | 545 | while(eeprom.write(0xA0, NULL, 0)); // wait to complete |
tkry | 0:cd74549e4be2 | 546 | } |