• 締切済み

H8を使って、モータの正逆回転を制御するプログラムを作成したいのですが

H8を使って、モータの正逆回転を制御するプログラムを作成したいのですがうまくいきません。よろしくお願いします。  h8 <3067F.h>を使ってDC電圧を入力してモータを制御するプログラムなのですが、入力電圧が2.5V(0x80)時は静止、2.5V(0x80)以上なら正回転、2.5V(0x80)以下なら逆回転するようにしたいのですがうまくいきません。プログラムはこんな感じです。 #include <3067F.h> #pragma interrupt(adi) void initITU(void); void initITU1(void); void initAD(void); void initPA(void); main() { initPA(); initAD(); initITU(); initITU1(); /* Initalize ITU ch1 */ ITU.TSTR.BIT.STR1 = 1; /* Start ITU ch1 */ AD.CSR.BIT.ADST = 1; /* A/D変換 start */ while(1){ ; } } void initPA(void){ PADDR = 0xff; /* PortA 出力モード */ PADR.BYTE = 0x00; /* PA Clear */ } void initAD(void){ AD.CR.BIT.TRGE = 0; /* AD変換外部トリガ開始禁止 */ AD.CSR.BYTE = 0x00; /* ADCSR初期化, ch0のみ */ AD.CSR.BIT.ADIE = 1; /* AD変換終了後割り込み */ AD.CSR.BIT.CKS = 0; /* AD変換時間 : 135ステート */ AD.CSR.BIT.SCAN = 0; /* 単一モード */ } void initITU(void) { ITU.TSTR.BYTE = 0x00; ITU.TSNC.BYTE = 0x00; ITU.TISRA.BYTE = 0x00; /* Disable Interruption */ ITU.TISRB.BYTE = 0x00; /* Disable Interruption */ ITU.TISRC.BYTE = 0x00; /* Disable Interruption */ } void initITU1(void) { ITU.TMDR.BIT.PWM1 = 1; /* CH1 PWM mode */ ITU1.TCR.BYTE = 0x20; /* clear GRA comparematch,1/clock */ ITU1.GRA = 0; /* A/D変換器の保証bitは上位8bit */ ITU1.GRB = 0; ITU1.TIOR.BYTE = 0X00; /* prohibit GRA&GRB'output of comparematch */ } void adi(void) { AD.CSR.BIT.ADST = 0; /* A/D変換停止 */ if(ITU1.GRB > 0x80)            2.5v以上かの場合分け { ITU1.GRB = (AD.DRA - 0x80 >> 8); ここで正回転の方向と速度を決める。 PADR.BIT.B1 = 1; PADR.BIT.B2 = 0; } else                    その他 { ITU1.GRB = (0x80 - AD.DRA >> 8); ここで逆回転の方向と速度を決める。 PADR.BIT.B1 = 0;               PADR.BIT.B2 = 1; } AD.CSR.BIT.ADF = 0; AD.CSR.BIT.ADST = 1; /* A/D変換開始 */ }  if文のところで、減算を行い正なら正回転、elseは減算したら負になり逆回転する命令にしたいのですがどうしたらいいでしょうか。 よろしくお願いします。

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

コンパイラがHEWかGCC Developer Liteか、というかぶっちゃけSFRがどう定義されているかが不明なので想像ですが、AD結果を16bitアクセスしたあとで、先に上位8bitを抽出してないのが最初のつまづきの原因だと思います。 > if(ITU1.GRB > 0x80)            2.5v以上かの場合分け 判定に使うのはAD値、つまりAD.DRAの中身では? ITU1.GRB = (AD.DRA - 0x80 >> 8);ここで正回転の方向と速度を決める。 ITU1.GRB = (0x80 - AD.DRA >> 8);ここで逆回転の方向と速度を決める。 計算が無意味です。 8bit右シフトする=下位8bitは消滅する、ということですから、0x80は消えてなくなってしまいます。 このケースなら、 unsigned char result; result = AD.DRA >> 8; if(result & 0x80) { ... }else{ ... } と考えた方が間違わないと思いますよ。

onimotu
質問者

お礼

ありがとうございます。 これでチャレンジしてみます。

関連するQ&A