ryou sato / Mbed 2 deprecated LPC11U35_CTswitch_relay

Dependencies:   mbed LPC11U35_MCP41HV51-503EST

Revision:
5:5d7483b46cda
Parent:
4:e69f73c66598
Child:
6:91eec3396ee9
--- a/main.cpp	Sun Aug 30 11:40:51 2020 +0000
+++ b/main.cpp	Sun Sep 06 08:09:33 2020 +0000
@@ -84,7 +84,7 @@
 
     WLATn = 1;      //MCP41HV51-503EST ワイパーラッチ
     SCT_AMP = 0;    //CT入力アンプ 60Aレベル切替え
-    SHDNn = 0;      //電流帰還アンプ シャットダウンしない
+    SHDNn = 1;      //電流帰還アンプ シャットダウンしない
 }
 
 void serialstart(){
@@ -192,13 +192,13 @@
             addr2 = 0;
             }
         else if(addr == 1){
-            addr0 = 1;
-            addr1 = 0;
+            addr0 = 0;
+            addr1 = 1;
             addr2 = 0;
             }
         else if(addr == 2){
-            addr0 = 0;
-            addr1 = 1;
+            addr0 = 1;
+            addr1 = 0;
             addr2 = 0;
             }
         else if(addr == 3){
@@ -347,7 +347,7 @@
     coilEN1 = 0;    //50Hz切替え
     
     SCT_AMP = 0;    //CT入力アンプ 60Aレベル切替え
-    SHDNn = 0;      //電流帰還アンプ シャットダウンしない
+    SHDNn = 1;      //電流帰還アンプ シャットダウンしない
     
     //TRANS_OUT初期設定
     coilEN2 = 0;    //TRANS_OUTをAD入力方向へ切替え
@@ -709,23 +709,25 @@
 
     wait(0.05);
     
-    timerint.attach(&AVrefcal,0.020408);
+    
+    //timerint.attach(&AVrefcal,0.020408);  //49Hz
+    timerint.attach(&AVrefcal,0.008);     //125Hz
     
     timecount.start();
     
     while(1){
-        if(AD_count < 98 && AD_flag == 1){    //サンプリング数0~Nで、サンプル取得されたとき
+        if(AD_count < 250 && AD_flag == 1){    //サンプリング数0~Nで、サンプル取得されたとき
             AD_count ++;
             AD_val_sum += AD_val;
             AD_flag = 0;
             if(AD_count == 0){timecount.start();} //0~Nのサンプリング時間計測用スタート時
-            else if(AD_count == 98){        //0~Nのサンプリング時間計測用ストップ時
+            else if(AD_count == 250){        //0~Nのサンプリング時間計測用ストップ時
                 timecount.stop();
-                //serial.printf("\r\n t = %f",timecount.read());
+                serial.printf("\r\n t = %f",timecount.read());  //計測時間表示
                 timecount.reset();
             }
         }
-        else if(AD_count < 98 && AD_flag == 0){}    //サンプリング数0~Nで、サンプル取得されてないとき
+        else if(AD_count < 250 && AD_flag == 0){}    //サンプリング数0~Nで、サンプル取得されてないとき
         else{                                       //サンプリング完了時
             Vref = AD_val_sum / AD_count;
             ActualVref[mode_p] = Vref;              //格納
@@ -782,23 +784,24 @@
 
     wait(0.05);
     
-    timerint.attach(&timerAD,0.020408);
+//    timerint.attach(&timerAD,0.020408);
+    timerint.attach(&timerAD,0.008); //125Hz
     
     timecount.start();
             
     while(1){
-        if(AD_count < 49 && AD_flag == 1){      //サンプリング数0~Nで、サンプル取得されたとき
+        if(AD_count < 250 && AD_flag == 1){      //サンプリング数0~Nで、サンプル取得されたとき
             AD_count ++;
             AD_val_sum += AD_val;
             AD_flag = 0;
             if(AD_count == 0){timecount.start();}   //0~Nのサンプリング時間計測用スタート時
-            else if(AD_count == 49){          //0~Nのサンプリング時間計測用ストップ時
+            else if(AD_count == 250){          //0~Nのサンプリング時間計測用ストップ時
                 timecount.stop();
                 //serial.printf("\r\n t = %f",timecount.read());
                 timecount.reset();
             }
         }
-        else if(AD_count < 49 && AD_flag == 0){}//サンプリング数0~Nで、サンプル取得されてないとき
+        else if(AD_count < 250 && AD_flag == 0){}//サンプリング数0~Nで、サンプル取得されてないとき
         else{                                       //サンプリング完了時
             AD_val_sum /= AD_count;
             Vrms = sqrtf(AD_val_sum);
@@ -814,7 +817,8 @@
 //デバッグ用
 void att(int mode){
     mode_p = mode;
-    timerint.attach(&timerAD,0.020408);    //サンプリング数=49  20.4ms周期
+    //timerint.attach(&timerAD,0.020408);    //サンプリング数=49  20.4ms周期
+    timerint.attach(&timerAD,0.008);
     } 
 void det(){timerint.detach();}
 
@@ -825,6 +829,8 @@
 /******************************************************************************/
 void auto_adj(int mode){
 
+    int CTrange = 0;    //[60A:120A] [0:1]
+    
 ///////////////////////////////////////////////////////////////////////////////
     POTini(mode);   //POTを初期値に設定
 ///////////////////////////////////////////////////////////////////////////////
@@ -850,9 +856,11 @@
                     count = 0;                                                  //文字カウンタをリセット
                     if     (strcmp(moji, "60A") == 0){
                         SCT_AMP = 0;        //CT入力アンプ 60Aレベル切替え
+                        CTrange = 0;
                         break;}
                     else if(strcmp(moji, "120A") == 0){
                         SCT_AMP = 1;        //CT入力アンプ 120Aレベル切替え
+                        CTrange = 1;
                         break;}
                     else serial.printf("\r\n\r\n NG!\r\n");
                     }
@@ -944,9 +952,14 @@
                     }
                     else if(mode==2 || mode==3){
                         if(setval >= 10 && setval <= 120){
-                            setval = setval / 3000 * 10 * 5.666667;  //3000:CT比 10:終端抵抗 5.666667:分圧抵抗比
+                            if(setval >= 61 && setval <= 120){SCT_AMP = 1; CTrange = 1;}
+                            if(CTrange == 0){
+                                setval = setval / 3000 * 10 * 5.666667;  //3000:CT比 10:終端抵抗 5.666667:分圧抵抗比
+                            }
+                            else if(CTrange == 1){
+                                setval = setval / 3000 * 10 * 2.833333;  //3000:CT比 10:終端抵抗 2.833333:分圧抵抗比
+                            }
                             serial.printf("\r\n setval = %f",setval);
-                            if(setval >= 61 && setval <= 120){SCT_AMP = 1;}
                             break;  //adjnumループ ブレイク
                         }
                         else{
@@ -987,20 +1000,85 @@
         else if(diff == 0){break;}  //差分無し ループ2ブレイク
         serial.printf("\r\n diff = %f",diff);
         serial.printf("\r\n incr = %d",incr);
+
+
+        //粗、微 読み取り
+        ADDR(mode * 2);             //TRANS粗調整POT
+        int read_val_Coarse = spi.write(0x0C00);
+        read_val_Coarse &= 0x00FF;
+    
+        wait(0.001);
+    
+        ADDR(mode * 2 - 1);         //TRANS微調整POT
+        int read_val_Fine = spi.write(0x0C00);
+        read_val_Fine &= 0x00FF;
         
-        //粗・微 調整判定
-        if(diff >= 0.03){CorF = 2;} //粗
-        else if(diff < 0.03){
-            CorF = 1;               //微
-            if(diff < 0.002){break;}//差分微小 ループ2ブレイク(通常最終ゴール)
+        //serial.printf("\r\n read_val_Coarse = %d",read_val_Coarse);
+        //serial.printf("\r\n read_val_Fine = %d",read_val_Fine);
+
+
+        if(mode == 1){
+            //粗・微 調整判定
+            float diffref_C = 0.000412 / 255 * read_val_Fine + 0.0032;
+            float diffref_F = 0.000412 / 255 * read_val_Coarse + 0.000165;
+            float diffcom = diffref_C * 1.5;
+            //serial.printf("\r\n diffref_C = %f",diffref_C);
+            //serial.printf("\r\n diffref_F = %f",diffref_F);
+            //serial.printf("\r\n diffcom = %f",diffcom);
+            if(diff >= diffcom){CorF = 2;} //粗
+            else if(diff < diffcom){
+                CorF = 1;               //微
+                if(diff < 0.001){break;}//差分微小 ループ2ブレイク(通常最終ゴール)
+            }
+            serial.printf("\r\n CorF = %d",CorF);
+        
+            //調整tap値算出
+            if(CorF == 2){val = diff / diffref_C;}
+            else if(CorF == 1){val = diff / diffref_F;}
+            serial.printf("\r\n tap(val) = %d",val);
         }
-        serial.printf("\r\n CorF = %d",CorF);
+        else if(mode==2 || mode==3){
+            if(CTrange == 0){   //60Aのとき
+                //粗・微 調整判定
+                float diffref_C = 0.001966 / 255 * read_val_Fine + 0.00885;
+                float diffref_F = 0.001966 / 255 * read_val_Coarse + 0.000145;
+                float diffcom = diffref_C * 1.5;
+                serial.printf("\r\n diffref_C = %f",diffref_C);
+                serial.printf("\r\n diffref_F = %f",diffref_F);
+                serial.printf("\r\n diffcom = %f",diffcom);
+                if(diff >= diffcom){CorF = 2;} //粗
+                else if(diff < diffcom){
+                    CorF = 1;               //微
+                    if(diff < 0.001){break;}//差分微小 ループ2ブレイク(通常最終ゴール)
+                }
+                serial.printf("\r\n CorF = %d",CorF);
         
-        //調整tap値算出
-        if(CorF == 2){val = diff / 0.02;}
-        else if(CorF == 1){val = diff / 0.002;}
-        serial.printf("\r\n tap(val) = %d",val);
+                //調整tap値算出
+                if(CorF == 2){val = diff / diffref_C;}
+                else if(CorF == 1){val = diff / diffref_F;}
+                serial.printf("\r\n tap(val) = %d",val);
+                }
+            else if(CTrange == 1){  //120Aのとき
+                //粗・微 調整判定
+                float diffref_C = 0.000983 / 255 * read_val_Fine + 0.0044;
+                float diffref_F = 0.000983 / 255 * read_val_Coarse + 0.0000993;
+                float diffcom = diffref_C * 1.5;
+                serial.printf("\r\n diffref_C = %f",diffref_C);
+                serial.printf("\r\n diffref_F = %f",diffref_F);
+                serial.printf("\r\n diffcom = %f",diffcom);
+                if(diff >= diffcom){CorF = 2;} //粗
+                else if(diff < diffcom){
+                    CorF = 1;               //微
+                    if(diff < 0.001){break;}//差分微小 ループ2ブレイク(通常最終ゴール)
+                }
+                serial.printf("\r\n CorF = %d",CorF);
         
+                //調整tap値算出
+                if(CorF == 2){val = diff / diffref_C;}
+                else if(CorF == 1){val = diff / diffref_F;}
+                serial.printf("\r\n tap(val) = %d",val);
+                }
+        }
         //ワイパー位置移動
         incdec(incr, val, CorF, mode);
         
@@ -1008,8 +1086,8 @@
          
     } //ループ2
     
-    if(mode==1){coilEN2 = 0;}                                //TRANS_OUTを外部出力へ切替え
-    else if(mode==2 || mode==3){coilEN3 = 0; coilEN4 = 0;}   //CT1_OUT1と2を外部出力へ切替え
+    if(mode==1){coilEN2 = 1;}                                //TRANS_OUTを外部出力へ切替え
+    else if(mode==2 || mode==3){coilEN3 = 1; coilEN4 = 0;}   //CT1_OUT1と2を外部出力へ切替え
     
     serial.printf("\r\n ADJ END");
 }
@@ -1031,6 +1109,10 @@
     coilEN4 = b;
     serial.printf("\r\n OK");
 }
+void Rswitch(int a){
+    SCT_AMP = a;
+    serial.printf("\r\n OK");
+}
 
 /******************************************************************************/
 //シリアル入力受付 [メイン]
@@ -1066,6 +1148,8 @@
             else if(strcmp(moji, "CT1_OUT_ADINT") == 0){Cswitch(0,0);}              //CT1_OUT内部AD入力
             else if(strcmp(moji, "CT2_OUT_ADINT") == 0){Cswitch(0,1);}              //CT2_OUT内部AD入力
             else if(strcmp(moji, "CT_OUT_EXT") == 0){Cswitch(1,0);}                 //CT1,2_OUT外部出力
+            else if(strcmp(moji, "CTrange_60A") == 0){Rswitch(0);}                  //CT入力アンプゲイン60A    
+            else if(strcmp(moji, "CTrange_120A") == 0){Rswitch(0);}                 //CT入力アンプゲイン120A    
             
             else if(strcmp(moji, "TRANS_offset") == 0){offsetcal(1);}               //TRANS_OUT ADオフセット補正
             else if(strcmp(moji, "CT1_offset") == 0){offsetcal(2);}                 //CT1_OUT ADオフセット補正
@@ -1098,6 +1182,13 @@
             else if(strcmp(moji, "AD1_Vrms") == 0){ADVrms(1);}
             else if(strcmp(moji, "AD2_Vrms") == 0){ADVrms(2);}
             else if(strcmp(moji, "AD3_Vrms") == 0){ADVrms(3);}
+            else if(strcmp(moji, "ADDR1") == 0){ADDR(1);}
+            else if(strcmp(moji, "ADDR2") == 0){ADDR(2);}
+            else if(strcmp(moji, "ADDR3") == 0){ADDR(3);}
+            else if(strcmp(moji, "ADDR4") == 0){ADDR(4);}
+            else if(strcmp(moji, "ADDR5") == 0){ADDR(5);}
+            else if(strcmp(moji, "ADDR6") == 0){ADDR(6);}
+            
                    
             else serial.printf("\r\n\r\n NG!\r\n");
         }