前提
PID制御の勉強のために昇圧回路で試行中です。
(PID制御を使わないと制御できます)
パラメータの設定などほぼ初心者です。
環境
PC:Mac OS Big Sur
IDE:STM32CubeIDE(v1.7.0)
マイコン:Nucleo-F303K8
実現したいこと(仕様)
- 起動時間:昇圧開始から1.5秒〜2秒(許容できて5秒)で2段階でも構わないので100Vになるようにしたい(起動からではなく立ち上がり始めてから)
- スイッチング周波数は100kHz固定(可変はしない)
- TL431とPC817を使ったフィードバック回路を使用する。
- duty比のリミット範囲は25%〜75%(25%のままだと1時間経過しても100Vに到達しない)
- 負荷が変動してから2ms以内に目標電圧に復旧する必要がある。
発生している問題・エラーメッセージ
10/2 時点
1秒以内で立ち上がったり、立ち上がっても軽負荷になると目標電圧がズレる(上がる傾向にある)
Kp=0.1,Ki=0.1,Kp=0.0 だと起動までに時間がかかって(負荷変動すると復旧まで時間がかかる
抵抗負荷(回路図上のRL1)を取りつけた状態で起動し、取り外すと電圧が上昇してしまう(150V程度で維持されている?)
10/10 時点
起動時の電圧が目標電圧の100Vになるようにはなった。(PID設定値にもよりオーバーシュートすることもあるが)
目標値になった時点でRL負荷を外すと電圧が130V程度まで上がってしまう。(元に戻ろうとするが125Vで維持されてしまう。)
そこから再びRLを取り付けるとと93V付近まで低下する(10秒程度は93Vを維持しその後0.5秒程度で100Vに戻る)
該当の回路図
該当のソースコード
c
1/* USER CODE BEGIN 0 */ 2 3float kp = 0.7f * 1.0f; 4float ki = 0.0f * 1.0f;//立ち上がりが早くなるだけ(0.001~0.1) 5float kd = 2.0f * 1.0f; 6 7/* USER CODE END 0 */ 8 9/* USER CODE BEGIN 4 */ 10 11void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) 12{ 13 //HAL_GPIO_TogglePin (GPIOB, GPIO_PIN_3); 14 15 //処理完了までの時間 16 float us_time = 35.0f; 17 18 const float Target = 256; // 目標値 19 20 float x = 0.00f;//現在値 21 static float P=0.00f , I=0.00f , D=0.00f ; 22 static float Old_P = 0.00f;//1つ前の偏差 23 float u = 0.00f;//操作量 24 25 // 現在値(出力電圧)の取得・数値変換 26 x = HAL_ADC_GetValue(&hadc1); 27 x = (x / 4095.0f) * TIM1->ARR ; 28 29 // 偏差の計算 30 P = Target - x; 31 32 // 積分項の計算 33 I += P * (us_time * 1e-6); 34 35 //微分項の計算 36 D = (P - Old_P) / (us_time * 1e-6) ; 37 38 //偏差の更新 39 Old_P = P ; 40 41 // 操作量の計算(PID 制御) 42 u = kp * P + ki * I + kd * D ; 43 44 45 /* 46 32000kHz/100kHz = 320 47 400 * 0.25 = 80 48 400 * 0.75 = 240 49 */ 50 51 // リミット演算 52 if (u < 80) 53 { 54 u = 80; 55 } 56 if (u > 240) 57 { 58 u = 240; 59 } 60 61/* 62タイマー反映処理 63*/ 64} 65 66/* USER CODE END 4 */
※void HAL_ADC_ConvCpltCallbac()は無限ループプログラムだと思ってもらって構いません。
main関数等は省略しています。
該当の波形
起動時の波形(RL接続済)
抵抗RLを外す
抵抗RLを再取り付け
試したこと
限界感度法
試そうとしたが、オーバーシュートするまで確認すると200Vまで上昇して過電圧になり壊れる可能性があるため断念
ランダムに調節
P=1.0 I=0.5 D=0.5を初期値として確認した
【Pだけを上げる】
0.9で目標電圧にはなるが、1.0秒で目標電圧に到達してしまう。それ以下だと立ち上がりが遅く、その逆だと早くなる
【Iだけをあげる】
0.1〜3.0まで確認したが目標電圧が数V上がっただけ(立ち上がりは全く変わらず)
【Dだけをあげる】
Iと同様の動作をした。
IとDを1,5,10,20と変化させたが立ち上がり・目標電圧は変わらず。
試していること
ozwkさんの回答を参考に、起動から1.5〜2秒間はあるPIDパラメータにしその後別のパラメータの2段階のような形式となってしまいますが、その方法で現在試行中です。
フォトカプラ経由のフィードバック回路から分圧抵抗を直接接続する回路に変更しました。
目標値のプログラムも変更しました。
(アナログデータとして読み取るため)
const float Target = ; // 目標値 float Target = TargetVolt * ( R2) / (R1 + R2 ) / 3.3f * 4095.0f ; //R1が上側抵抗値(回路図上のR6)でR2が下側抵抗値(回路図のR7+VR)
確認したいこと
このあたりのADCの読み取り・変換の部分で何か間違っているものはありますか?
x = HAL_ADC_GetValue(&hadc1); x = (x / 4095.0f) * TIM1->ARR ;
この辺りのPID制御処理の計算が間違っているものはありますか?
// 偏差の計算 P = Target - x; // 積分項の計算 I += P * (us_time * 1e-6); //微分項の計算 D = (P - Old_P) / (us_time * 1e-6) ; //偏差の更新 Old_P = P ; // 操作量の計算(PID 制御) u = kp * P + ki * I + kd * D ;
補足情報(FW/ツールのバージョンなど)

回答1件
あなたの回答
tips
プレビュー