20200823_Motacon2020_ver5_kikkawa

Dependencies:   mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200821_motacon_ver4

Committer:
MPPT51
Date:
Mon Aug 03 03:20:27 2020 +0000
Revision:
0:3e0c71851fee
Child:
1:47c28ece54ea
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 0:3e0c71851fee 1 /*
MPPT51 0:3e0c71851fee 2 Motacon 20200803 ver.2
MPPT51 0:3e0c71851fee 3 ver.1: ブラシレスモータ(BLDC), USBメモリ書き込み, LM61(インバータ温度測定), INA226(インバータ電流電圧測定), CAN
MPPT51 0:3e0c71851fee 4 ver.2 まともなプログラムになるように努力中
MPPT51 0:3e0c71851fee 5 */
MPPT51 0:3e0c71851fee 6 #include "mbed.h"
MPPT51 0:3e0c71851fee 7 #include "MSCFileSystem.h" //USBメモリ操作のため
MPPT51 0:3e0c71851fee 8 #include "INA226.hpp" //INA226操作のため
MPPT51 0:3e0c71851fee 9 #include "RateLimiter.h" //モータ加減速調整のため
MPPT51 0:3e0c71851fee 10 #include "BLDCmotorDriver.h"//BLDC操作のため
MPPT51 0:3e0c71851fee 11
MPPT51 0:3e0c71851fee 12 /*定数の設定*/
MPPT51 0:3e0c71851fee 13 #define Vin1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 14 #define Cin1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 15 #define Vout1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 16 #define Cout1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 17 #define temp1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 18 #define temp2_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 19
MPPT51 0:3e0c71851fee 20 /*基本の設定*/
MPPT51 0:3e0c71851fee 21 Serial pc(USBTX, USBRX);
MPPT51 0:3e0c71851fee 22 DigitalOut myled(LED1); //
MPPT51 0:3e0c71851fee 23 DigitalOut led2(LED2); //
MPPT51 0:3e0c71851fee 24 DigitalOut led3(LED3); //
MPPT51 0:3e0c71851fee 25 bool flagPrintf = 0; //main関数でのprintf処理のためのフラグ
MPPT51 0:3e0c71851fee 26 Ticker ticker1; //割り込み設定用
MPPT51 0:3e0c71851fee 27
MPPT51 0:3e0c71851fee 28 /*BLDC設定*/
MPPT51 0:3e0c71851fee 29 Timer timer; //回転数計算用タイマ設定
MPPT51 0:3e0c71851fee 30 BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p14, p17, p18, LED1);
MPPT51 0:3e0c71851fee 31 AnalogIn Pot(p20);
MPPT51 0:3e0c71851fee 32 InterruptIn HS_p16(p16);
MPPT51 0:3e0c71851fee 33 InterruptIn DIRECTION_SW(p8);
MPPT51 0:3e0c71851fee 34 void initBLDC(); //BLDCの初期設定を行う関数
MPPT51 0:3e0c71851fee 35 float rpm = 0, speed = 0;
MPPT51 0:3e0c71851fee 36 double dc = 0.0;
MPPT51 0:3e0c71851fee 37 bool direction = 0;//方向を決める
MPPT51 0:3e0c71851fee 38 int begin, end; //
MPPT51 0:3e0c71851fee 39 int HS_timer = 0; //速度検出のために使う変数
MPPT51 0:3e0c71851fee 40 int HS_timer1 = 0; //速度検出のために使う変数
MPPT51 0:3e0c71851fee 41 int reset_cnt = 0; //Timerをリセットするために使うカウンタ
MPPT51 0:3e0c71851fee 42
MPPT51 0:3e0c71851fee 43 /*CANの設定*/
MPPT51 0:3e0c71851fee 44 CAN canSlave(p30, p29); //CANのピン設定
MPPT51 0:3e0c71851fee 45 void initCAN(); //CANの初期設定を行う関数
MPPT51 0:3e0c71851fee 46 int forSend = 0; //データ送信時に一時的に使用する変数
MPPT51 0:3e0c71851fee 47 bool CANsendOK = 0; //CAN受信完了時,セットする(mainでのprintfのため)
MPPT51 0:3e0c71851fee 48 CANMessage msgSlave; //CAN送信用
MPPT51 0:3e0c71851fee 49 unsigned int canSlaveID = 0x10; //canSlaveの初期IDを0x10に設定 (モタコン:0x10, )
MPPT51 0:3e0c71851fee 50 void Handler_canSlaveSend();
MPPT51 0:3e0c71851fee 51
MPPT51 0:3e0c71851fee 52 /*INA226設定*/ //GNDGND(G-G):0x80, Vs+Vs+(1-1):0x8A, SDASDA(D-D):0x94, SCLSCL(C-C):0x9E, GNDVs+(G-1):0x82
MPPT51 0:3e0c71851fee 53 I2C i2c(p28,p27);
MPPT51 0:3e0c71851fee 54 INA226 VCmonitor1(i2c,0x9E); //GNDGND(G-G)に設定したINA226がVCmonitor1(1台目)
MPPT51 0:3e0c71851fee 55 INA226 VCmonitor2(i2c,0x94); //Vs+Vs+(1-1)に設定したINA226がVCmonitor2(2台目)
MPPT51 0:3e0c71851fee 56 void initINA226(); //INA226の初期設定を行う関数
MPPT51 0:3e0c71851fee 57 unsigned short val;
MPPT51 0:3e0c71851fee 58 double V,C,Vin1,Cin1,Vout1,Cout1;
MPPT51 0:3e0c71851fee 59 int count = 1; //INA226動作確認用カウンタ
MPPT51 0:3e0c71851fee 60 float data_Vin1[Vin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 61 float data_Cin1[Cin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 62 float data_Vout1[Vout1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 63 float data_Cout1[Cout1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 64 void get_VCin1(void);
MPPT51 0:3e0c71851fee 65 void get_VCout1(void);
MPPT51 0:3e0c71851fee 66
MPPT51 0:3e0c71851fee 67 /*温度測定(LM61)設定*/
MPPT51 0:3e0c71851fee 68 AnalogIn LM61(p15); ////set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:3e0c71851fee 69 float temp1 = 0.0, temp2 = 0.0;
MPPT51 0:3e0c71851fee 70 void get_temp(void); //温度取得する関数
MPPT51 0:3e0c71851fee 71 float data_temp1[temp1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 72 float data_temp2[temp2_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 73
MPPT51 0:3e0c71851fee 74 /*ADCのピン設定*/ //also setting unused analog input pins to digital outputs reduces A/D noise a bit //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
MPPT51 0:3e0c71851fee 75 DigitalOut P19(p19);
MPPT51 0:3e0c71851fee 76
MPPT51 0:3e0c71851fee 77 /*USBメモリの設定*/
MPPT51 0:3e0c71851fee 78 MSCFileSystem msc("usb"); // Mount flash drive under the name "msc"
MPPT51 0:3e0c71851fee 79 void write_toMSC(void); //MSC=USBメモリ
MPPT51 0:3e0c71851fee 80 FILE *fp; //ファイルの設定
MPPT51 0:3e0c71851fee 81
MPPT51 0:3e0c71851fee 82 //Timer timer; //処理時間測定用タイマ デバッグに使用する
MPPT51 0:3e0c71851fee 83 int n = 0; //移動平均算出に使うカウンタ
MPPT51 0:3e0c71851fee 84
MPPT51 0:3e0c71851fee 85 /*時間割り込み関数*/
MPPT51 0:3e0c71851fee 86 void handler_0t2s(){ //0.2秒毎の割り込み
MPPT51 0:3e0c71851fee 87 if( direction == 0 ){ //正回転
MPPT51 0:3e0c71851fee 88 dc = Pot.read();
MPPT51 0:3e0c71851fee 89 }
MPPT51 0:3e0c71851fee 90 if( direction == 1 ){ //逆回転
MPPT51 0:3e0c71851fee 91 dc = -1 * Pot.read();
MPPT51 0:3e0c71851fee 92 }
MPPT51 0:3e0c71851fee 93 reset_cnt++;
MPPT51 0:3e0c71851fee 94 if( reset_cnt >= 6000 ){
MPPT51 0:3e0c71851fee 95 timer.reset();
MPPT51 0:3e0c71851fee 96 reset_cnt = 0;
MPPT51 0:3e0c71851fee 97 }
MPPT51 0:3e0c71851fee 98 //flagPrintf = 1;
MPPT51 0:3e0c71851fee 99 }
MPPT51 0:3e0c71851fee 100 /*ホールセンサの立ち上がりから立ち上がりまでの時間計測する関数*/
MPPT51 0:3e0c71851fee 101 void handler_HS(){
MPPT51 0:3e0c71851fee 102 if( HS_timer == 0 ){
MPPT51 0:3e0c71851fee 103 begin = timer.read_us();
MPPT51 0:3e0c71851fee 104 HS_timer1 = 0;
MPPT51 0:3e0c71851fee 105 }
MPPT51 0:3e0c71851fee 106 if( HS_timer == 1 ){
MPPT51 0:3e0c71851fee 107 end = timer.read_us();
MPPT51 0:3e0c71851fee 108 HS_timer1 = 1;
MPPT51 0:3e0c71851fee 109 }
MPPT51 0:3e0c71851fee 110 if( HS_timer1 == 0 ){
MPPT51 0:3e0c71851fee 111 HS_timer = 1;
MPPT51 0:3e0c71851fee 112 }
MPPT51 0:3e0c71851fee 113 if( HS_timer1 == 1 ){
MPPT51 0:3e0c71851fee 114 HS_timer = 0;
MPPT51 0:3e0c71851fee 115 rpm = 3750 / (abs(end - begin) * 0.001);
MPPT51 0:3e0c71851fee 116 speed = rpm * 0.10518;
MPPT51 0:3e0c71851fee 117 }
MPPT51 0:3e0c71851fee 118 }
MPPT51 0:3e0c71851fee 119 /*Directionスイッチの割り込み 進行方向切り替え*/
MPPT51 0:3e0c71851fee 120 void handler_directionSW(){
MPPT51 0:3e0c71851fee 121 if( dc <= 0 ){
MPPT51 0:3e0c71851fee 122 direction = !direction;
MPPT51 0:3e0c71851fee 123 }
MPPT51 0:3e0c71851fee 124 }
MPPT51 0:3e0c71851fee 125 /*CANでデータを送信する関数*/
MPPT51 0:3e0c71851fee 126 void Handler_canSlaveSend() {
MPPT51 0:3e0c71851fee 127 forSend = (int)(V/100);
MPPT51 0:3e0c71851fee 128 msgSlave.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
MPPT51 0:3e0c71851fee 129 msgSlave.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 130
MPPT51 0:3e0c71851fee 131 forSend = (int)(C/10); //mAで取得した値を10で割り、char2分割で送り切れるようにする。(例: 測定電流が199.99Aのとき,C=199900.00となるため,forSend=19990となり,199と90で分割することで送信できる)
MPPT51 0:3e0c71851fee 132 msgSlave.data[2] = forSend / 100; //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
MPPT51 0:3e0c71851fee 133 msgSlave.data[3] = forSend % 100; //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 134
MPPT51 0:3e0c71851fee 135 forSend = (int)(speed*10); //speed * 10 = 856.5だが,intにするため,856が代入される
MPPT51 0:3e0c71851fee 136 msgSlave.data[4] = forSend / 100; //forSend / 100 = 8あまり56 となり,8がデータ格納される
MPPT51 0:3e0c71851fee 137 msgSlave.data[5] = forSend % 100; //forSend % 100 = 8あまり56 となり,56がデータ格納される
MPPT51 0:3e0c71851fee 138
MPPT51 0:3e0c71851fee 139 forSend = (int)(dc*100); //dc * 100 = 95
MPPT51 0:3e0c71851fee 140 msgSlave.data[6] = forSend; //charの最大値である255以下になるため,そのままデータ格納される
MPPT51 0:3e0c71851fee 141
MPPT51 0:3e0c71851fee 142 if(canSlave.write(msgSlave)){ //格納したデータを送信する
MPPT51 0:3e0c71851fee 143 CANsendOK = 1;
MPPT51 0:3e0c71851fee 144 }
MPPT51 0:3e0c71851fee 145 }
MPPT51 0:3e0c71851fee 146 /*CAN通信相手から送信要求がきたとき実行される*/
MPPT51 0:3e0c71851fee 147 void Handler_canSlaveRecieve(){ //CANの通信相手から,送信要求がきたときに実行される関数
MPPT51 0:3e0c71851fee 148 if( canSlave.read( msgSlave ) ){ //msgに送られたデータが入る
MPPT51 0:3e0c71851fee 149 led2 = !led2;
MPPT51 0:3e0c71851fee 150 if( msgSlave.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する
MPPT51 0:3e0c71851fee 151 Handler_canSlaveSend(); //送信処理をする関数に飛ぶ
MPPT51 0:3e0c71851fee 152 }
MPPT51 0:3e0c71851fee 153 }
MPPT51 0:3e0c71851fee 154 }
MPPT51 0:3e0c71851fee 155 /*電圧と電流測定する関数*/
MPPT51 0:3e0c71851fee 156 void get_VCin1(){
MPPT51 0:3e0c71851fee 157 if((VCmonitor1.getVoltage(&V) == 0) && (VCmonitor1.getCurrent(&C) == 0)){ //1台目INA226の電圧電流測定
MPPT51 0:3e0c71851fee 158 Vin1 -= data_Vin1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 159 Cin1 -= data_Cin1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 160 data_Vin1[n] = V/Vin1_LENGTH; //移動平均処理
MPPT51 0:3e0c71851fee 161 data_Cin1[n] = C/Cin1_LENGTH; //移動平均処理
MPPT51 0:3e0c71851fee 162 Vin1 += data_Vin1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 163 Cin1 += data_Cin1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 164 pc.printf("\n%d, Vin1: %f, Cin1: %f\n",count,Vin1,Cin1);
MPPT51 0:3e0c71851fee 165 }
MPPT51 0:3e0c71851fee 166 }
MPPT51 0:3e0c71851fee 167 /*温度測定する関数*/
MPPT51 0:3e0c71851fee 168 void get_temp(){
MPPT51 0:3e0c71851fee 169 temp1 -= data_temp1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 170 data_temp1[n] = ( ((LM61*3.3)-0.600)*100.0 ) / temp1_LENGTH; //移動平均処理
MPPT51 0:3e0c71851fee 171 temp1 += data_temp1[n]; //移動平均処理
MPPT51 0:3e0c71851fee 172 pc.printf("temp1:%5.2F C temp2:%5.2F C \n\r", temp1, temp2);
MPPT51 0:3e0c71851fee 173 }
MPPT51 0:3e0c71851fee 174 void write_toMSC(){
MPPT51 0:3e0c71851fee 175 if ( (fp= fopen( "/usb/MPPT.csv", "a")) == NULL ){ //ファイルを開く, aは上書きの命令(ファイルが存在しなければ新規作成する)
MPPT51 0:3e0c71851fee 176 pc.printf("USB error\r\n");
MPPT51 0:3e0c71851fee 177 exit(1);
MPPT51 0:3e0c71851fee 178 }
MPPT51 0:3e0c71851fee 179 pc.printf("USB file write!\r\n");
MPPT51 0:3e0c71851fee 180 //timer.start(); //書き込み時間測定開始
MPPT51 0:3e0c71851fee 181 fprintf(fp,"%f,%f,%f,%f,%f,%f\n", Vin1, Cin1, Vout1, Vout1, temp1, temp2); //ファイル書き込み
MPPT51 0:3e0c71851fee 182 //timer.stop(); //書き込み時間測定終了
MPPT51 0:3e0c71851fee 183 fclose(fp); //ファイルを閉じる
MPPT51 0:3e0c71851fee 184 //pc.printf("write time :%f\n\n\n",timer.read());
MPPT51 0:3e0c71851fee 185 }
MPPT51 0:3e0c71851fee 186
MPPT51 0:3e0c71851fee 187 /*INA226の初期設定*/
MPPT51 0:3e0c71851fee 188 void initINA226(){
MPPT51 0:3e0c71851fee 189 // 1台目の設定
MPPT51 0:3e0c71851fee 190 if ( !VCmonitor1.isExist() ){
MPPT51 0:3e0c71851fee 191 pc.printf("VCmonitor1 INA226 Not Found.\n");
MPPT51 0:3e0c71851fee 192 }
MPPT51 0:3e0c71851fee 193 val = 0;
MPPT51 0:3e0c71851fee 194 if ( VCmonitor1.rawRead(0x00,&val) != 0){
MPPT51 0:3e0c71851fee 195 pc.printf("VCmonitor1 INA226 Read Error\n");
MPPT51 0:3e0c71851fee 196 }
MPPT51 0:3e0c71851fee 197 pc.printf("VCmonitor1 Reg 0x00 : 0x%04x\r\n",val);
MPPT51 0:3e0c71851fee 198 VCmonitor1.setCurrentCalibration();
MPPT51 0:3e0c71851fee 199 }
MPPT51 0:3e0c71851fee 200 /*CANの初期設定*/
MPPT51 0:3e0c71851fee 201 void initCAN(){
MPPT51 0:3e0c71851fee 202 canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq); //CAN受信割り込みの設定
MPPT51 0:3e0c71851fee 203 msgSlave.id = canSlaveID; //CAN送信側(slave)のIDを決定
MPPT51 0:3e0c71851fee 204 msgSlave.len = 7; //CAN送信側で送るデータのバイト数
MPPT51 0:3e0c71851fee 205 }
MPPT51 0:3e0c71851fee 206 void initBLDC(){
MPPT51 0:3e0c71851fee 207 timer.start(); //回転数計算用タイマスタート
MPPT51 0:3e0c71851fee 208 DIRECTION_SW.mode(PullUp); //directionスイッチのモード設定
MPPT51 0:3e0c71851fee 209 DIRECTION_SW.fall(&handler_directionSW); //directionスイッチの立ち上がり割り込み設定
MPPT51 0:3e0c71851fee 210 DIRECTION_SW.rise(&handler_directionSW); //directionスイッチの立ち下がり割り込み設定 どちらも同じ関数に飛ぶ
MPPT51 0:3e0c71851fee 211 led3 = DIRECTION_SW.read();
MPPT51 0:3e0c71851fee 212 // HS_p16.rise(&handler_HS); //ホールセンサ立ち上がり割り込み設定
MPPT51 0:3e0c71851fee 213 }
MPPT51 0:3e0c71851fee 214
MPPT51 0:3e0c71851fee 215 /*メイン関数*/
MPPT51 0:3e0c71851fee 216 int main()
MPPT51 0:3e0c71851fee 217 {
MPPT51 0:3e0c71851fee 218 initINA226(); //INA226の初期設定
MPPT51 0:3e0c71851fee 219 initCAN();
MPPT51 0:3e0c71851fee 220 initBLDC(); //BLDC制御のための初期設定
MPPT51 0:3e0c71851fee 221 ticker1.attach(&handler_0t2s, 0.3); //0.3秒毎に飛ぶ「handler_0t3s」関数
MPPT51 0:3e0c71851fee 222
MPPT51 0:3e0c71851fee 223 while(1) {
MPPT51 0:3e0c71851fee 224 get_VCin1(); //Vipm(IPMへの入力電圧)とCipm(IPMへの入力電流)を取得
MPPT51 0:3e0c71851fee 225 get_temp(); //温度測定
MPPT51 0:3e0c71851fee 226 // write_toMSC(); //データをUSBメモリに保存
MPPT51 0:3e0c71851fee 227
MPPT51 0:3e0c71851fee 228 n++;
MPPT51 0:3e0c71851fee 229 if( n >= Vin1_LENGTH ){ //カウンタがサンプル数を超えたら,0に戻り,移動平均算出を続ける
MPPT51 0:3e0c71851fee 230 n = 0;
MPPT51 0:3e0c71851fee 231 }
MPPT51 0:3e0c71851fee 232
MPPT51 0:3e0c71851fee 233 M.setDutyCycle(dc); //モータを駆動する関数 引数dcは,PWMのデューティ比
MPPT51 0:3e0c71851fee 234 flagPrintf = 1;
MPPT51 0:3e0c71851fee 235 if( flagPrintf ){ //flagPrntfが1なら,以下を処理する
MPPT51 0:3e0c71851fee 236 flagPrintf = 0;
MPPT51 0:3e0c71851fee 237 pc.printf("Duty Cycle: %1.2f, Sector: %d\n\r",dc, M.getSector());
MPPT51 0:3e0c71851fee 238 pc.printf("Toggle the led takes %d us\n", abs(end - begin));
MPPT51 0:3e0c71851fee 239 pc.printf("%f rpm\n",rpm);
MPPT51 0:3e0c71851fee 240 pc.printf("%f km/h\n",speed);
MPPT51 0:3e0c71851fee 241 pc.printf("V,%f,C,%f\n",V,C);
MPPT51 0:3e0c71851fee 242 }
MPPT51 0:3e0c71851fee 243 /*
MPPT51 0:3e0c71851fee 244 if( CANsendOK ) {
MPPT51 0:3e0c71851fee 245 CANsendOK = 0;
MPPT51 0:3e0c71851fee 246 printf("Data in msgSlave.data[0] : %d\n\r", msgSlave.data[0]); //CANで送信したデータをそのまま表示
MPPT51 0:3e0c71851fee 247 printf("Data in msgSlave.data[1] : %d\n\r", msgSlave.data[1]); //上に同じ
MPPT51 0:3e0c71851fee 248 printf("Data in msgSlave.data[2] : %d\n\r", msgSlave.data[2]); //上に同じ
MPPT51 0:3e0c71851fee 249 printf("Data in msgSlave.data[3] : %d\n\r", msgSlave.data[3]); //上に同じ
MPPT51 0:3e0c71851fee 250 printf("Data in msgSlave.data[4] : %d\n\r", msgSlave.data[4]); //上に同じ
MPPT51 0:3e0c71851fee 251 printf("Data in msgSlave.data[5] : %d\n\r", msgSlave.data[5]); //上に同じ
MPPT51 0:3e0c71851fee 252 printf("Data in msgSlave.data[6] : %d\n\r", msgSlave.data[6]); //上に同じ
MPPT51 0:3e0c71851fee 253 printf("\n\r");
MPPT51 0:3e0c71851fee 254 }
MPPT51 0:3e0c71851fee 255 */
MPPT51 0:3e0c71851fee 256 }
MPPT51 0:3e0c71851fee 257 }