どうも3年のKです。
先輩のプログラムがどうしてもコンパイルできないので、設定の変更で使うためにPWM・シリアル変換基板を作成しました。
立ち上がり時にタイマー1を記録し、立ち下がり時に差分を計算し、その結果をPWM値と設定する。
一定間隔で値をシリアル信号で出力するといったものです。
パリティの計算は以前のサイトを参考に
parity = (data & 0x55) + ((data >> 1) & 0x55);
parity = (parity & 0x33) + ((parity >> 2) & 0x33);
parity = (parity & 0x0f) + ((parity >> 4) & 0x0f);
parity &= 0x01;
としてみました。 おそらくちょっとは速くなっていると思います。
XC8では256byteより大きい配列が扱えないので次のように分割しました。
switch(diff.high){
case 0:
g_pwm[i].value = COUNT_TO_PWM0[diff.low];
break;
case 1:
g_pwm[i].value = COUNT_TO_PWM1[diff.low];
break;
case 2:
g_pwm[i].value = COUNT_TO_PWM2[diff.low];
break;
case 3:
g_pwm[i].value = COUNT_TO_PWM3[diff.low];
break;
case 4:
g_pwm[i].value = COUNT_TO_PWM4[diff.low];
break;
}
しかし問題はつきもの。どうもたまに変な値を取得したのか、変な挙動がします。
元のPWM信号に問題があるのか変換基板に問題があるのか。
元の出力信号の精度を上げるために
・PICのA/D変換
・PICのデジタル出力
をそれぞれ確認してみたところ、問題はありませんでした。(多少の改善はしましたが)
これは変換基板側でどうにかするしかありません。
とりあえず変化+10以上では直接データを書き換えないで、もう一回の測定を待つようにしましたが、どうも細かい調整が出来ません。困ったなあ
0 件のコメント:
コメントを投稿