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 LPC11U35_MCP41HV51-503EST
Diff: main.cpp
- 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");
}