2013/06/19

PWM・シリアル変換基板の作成

どうも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 件のコメント:

コメントを投稿