最大電圧値を取得するために、信号の位相を0から360に段階的に変更しています。信号の位相を変更すると、電圧も変化するためです。最大値を見つけるための休憩コードがあります。
void Maxphase(float *max, unsigned int *index)
{
*max = 0.0;
float value;
unsigned int i, data;
for (i=0;i<=360;i++)
{
phaseset(i);
delay_ms(100);
data = readvalue();
value = voltage(mux1);
if(value > *max) //find max value
{
*max = value; //max voltage
*index = i;
}
}
}
上記のコードから、38秒(360 * 100)後に最大値(電圧)を取得しています。これは、読み取り操作ごとにデバイスに100msの遅延が必要なためです。これは大きすぎてハードウェアを変更できないので、ソフトウェアを最適化して2〜3秒以内に最大値を取得したいと思います。それから私は休閑コードで試しました。
void Maxphase(float *max1, unsigned int *index1)
{
max = 0.0;
float value;
unsigned int i,j,data;
for (i=0;i<=360;i+=10)
{
phaseset(i);
delay_ms(100);
data = readvalue();
value = voltage(mux1);
if(value > max) //find max value
{
max = value; //max voltage
index = i;
}
}
*max1=max;
*index1=index;
for (i=*index1-9;i<=*index1+9;i+=1)
{
j=i;
phaseset(j);
delay_ms(100);
data = readvalue();
value = voltage(mux1);
if(value > *max1) //find max value
{
*max1 = value; //max voltage
*index1 = i;
}
}
}
時間を45秒から7秒に短縮しました。反復回数を360から54(54 * 100)に減らしました。7秒から2秒に短縮したい。
誰かが2秒で(0から360)までの最大値を取得できるより良いアルゴリズムで私を助けることができますか?
スコープを使って相を変えて電圧値を測定しました。相によって電圧がどのように変化するかを以下に書きました。
Phase (degree) voltage(max)
0 0.9mv
45 9.5mv
90 9.0mv
135 0.9mv
180 292mv
225 601mv
270 555mv
315 230mv
360 0.9mv
私はCプログラミングに不慣れです。誰でも最高のアルゴリズムのサンプルコードを提供できますか?