#include <math.h>
#include <stdio.h>
__declspec(dllexport) void simuser (t, delt, in, out)
double t, delt;
double *in, *out;
{
static double f1=10000,f2=60,v=0,n=0,h=0,c=0,x1=0,x2=0,s=0,im=0;
double vout=0,k1,k2,vs,vtri,vt,pai=3.14,rad,vsin,i,j,k3,k4,va,vs1=0,vs2=0,iout,ts=0.0000025;
三角波
vtri=2;
k1=1/delt;
k2=(k1/f1)/2;
vs=vtri/k2;
h=h+1;
if(h<=k2){
v=v+vs;
}else if(h>=k2){
v=v-vs;
}else{
v=v;
}
if(h>=(k2*2)){
h=0;
}
vt=v-(vtri/2);
正弦波
j=90;
k3=1/delt;
k4=(k3/f2)/4;
i=j/k4;
n=n+i;
rad=(pai*n)/180;
vsin=sin(rad);
スイッチ制御1
if(vsin<vt){
x1=x1+delt;
if(x1>=ts){
vs1=1;
}else if(x1<ts){
vs1=0;
}else{
x1=x1;
}
}else if(vsin>vt){
vs1=0;
x1=0;
}else{
vs1=vs1;
}
スイッチ制御2
if(vsin<vt){
vs2=0;
x2=0;
}else if(vsin>vt){
x2=x2+delt;
if(x2>=ts){
vs2=1;
}else if(x2<ts){
vs2=0;
}else{
x2=x2;
}
}else{
vs2=vs2;
}
フィードバック 制御 ここが上手くいきません。
iout=in[0];
im=1.5;
if(im<iout){
vsin=vsin*0.09;
}else if(im>iout){
vsin=vsin*1.01;
}else if(im=iout){
vsin=vsin;
}
out[0]=vs1;
out[1]=vs2;
out[2]=vt;
out[3]=vsin;
}
このプログラムは三角波と正弦波を使って、二つを比較し、vs1、vs2が交互にオンオフしてその結果ioutに値が出力されます。
分からないのが、その出力された値をフィードバックして目標値に近づけるプログラムです。
まず値を制御するためにはvsinを増減することでioutの値を変えることができます。なのでioutをフィードバックし、目標値と比べ、大きければ0.09をかけ小さければ1.01をかけてやればいいと思ったのですが上手くいきません。
c言語は初心者なので全然わかりません。良ければ教えていただけませんか?
電流のフィードバック制御
Re: 電流のフィードバック制御
まずフォーラムルールと投稿前チェックリストをお読みください。
そしてソースコードはcodeタグで囲んでください。
授業で配布されたソースコードなのでしょうけど、随分と古い書き方ですね。
ソースコードの中身はまだ読んでませんが(というか、codeタグを使ってインデントしてくれないと
読む気になりませんが)、0.09とか1.01のような固定値でいいんでしょうか。
目標値との差に比例して大きな値を掛けたりしたほうが速く目標値になると思います。
そしてソースコードはcodeタグで囲んでください。
授業で配布されたソースコードなのでしょうけど、随分と古い書き方ですね。
ソースコードの中身はまだ読んでませんが(というか、codeタグを使ってインデントしてくれないと
読む気になりませんが)、0.09とか1.01のような固定値でいいんでしょうか。
目標値との差に比例して大きな値を掛けたりしたほうが速く目標値になると思います。
Re: 電流のフィードバック制御
インバータなのかな?
こっちはインバータには素人なので、どうしたいのかはそっちで考えてもらわなきゃ、プログラムの話でないと
手助けできません。
わかることは、ここがうまくいきませんのコメント行から7行下にあるif文が代入だけどいいのかなってことぐらい。
こっちはインバータには素人なので、どうしたいのかはそっちで考えてもらわなきゃ、プログラムの話でないと
手助けできません。
わかることは、ここがうまくいきませんのコメント行から7行下にあるif文が代入だけどいいのかなってことぐらい。
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 電流のフィードバック制御
スイッチング電源をマイコンでPWM制御しているものでしょうか?
ioutをimに出来るだけ近づければ良いんでしょうか?
ただし、ioutとimが完全に一致することはありませんので妥協する閾値が必要です。
ioutをimに出来るだけ近づければ良いんでしょうか?
ただし、ioutとimが完全に一致することはありませんので妥協する閾値が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 電流のフィードバック制御
とりあえず、↓を参考にしては?
http://oshiete.goo.ne.jp/qa/7178712.html
http://oshiete.goo.ne.jp/qa/7178712.html
-
れい
Re: 電流のフィードバック制御
みなさんありがとうございます。
タグで囲んでなくて申し訳ありません。
固定値だとよろしくないんでしょうか?
これは、ハーフブリッジインバータです。このプログラムを実行しても、出力される値は変わりませんでした。
初心者なのでif文など使い方が明確に分かっていません。
ioutとimはおおよそで良いと考えています。
どこをどう直し、なぜそうなるかを教えていただきたいです。
タグで囲んでなくて申し訳ありません。
固定値だとよろしくないんでしょうか?
これは、ハーフブリッジインバータです。このプログラムを実行しても、出力される値は変わりませんでした。
初心者なのでif文など使い方が明確に分かっていません。
ioutとimはおおよそで良いと考えています。
どこをどう直し、なぜそうなるかを教えていただきたいです。
-
TT414
Re: 電流のフィードバック制御
質問の回答ではありませんが気になったので。
if(h<=k2){/*h<k2ではないですか?*/
v=v+vs;
}else if(h>=k2){/*h>k2ではないですか?上がh<=k2のときh==k2はありえません*/
v=v-vs;
}else{/*上がh<=k2とh>=k2のときは絶対にここに来ません*/
v=v;
}
if(im<iout){
vsin=vsin*0.09;
}else if(im>iout){
vsin=vsin*1.01;
}else if(im=iout){/* if(im=iout)はいりません、あっても今回は影響ないですが*/
vsin=vsin;
}
if(h<=k2){/*h<k2ではないですか?*/
v=v+vs;
}else if(h>=k2){/*h>k2ではないですか?上がh<=k2のときh==k2はありえません*/
v=v-vs;
}else{/*上がh<=k2とh>=k2のときは絶対にここに来ません*/
v=v;
}
if(im<iout){
vsin=vsin*0.09;
}else if(im>iout){
vsin=vsin*1.01;
}else if(im=iout){/* if(im=iout)はいりません、あっても今回は影響ないですが*/
vsin=vsin;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 電流のフィードバック制御
とりあえず回答がないのは、れいさんがインデントを直したものを再度貼りつけてないことと、フォーラムルールに違反している為です。
フォーラムルールの確認をお願いします。
http://dixq.net/board/board.html
フォーラムルールの確認をお願いします。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。