H8マイコンでC言語で、パルスモータを制御
パルスモータを使用した、自動車のパワーウィンドウシミュレートプログラムを作成したいのですが、if文の書き方がわかりません。
1.プログラム開始時、窓が閉まっている状態を想定。2.完全に閉じた状態から左回りに5回転したときの状態を完全に開いた状態とする。3.完全に開いた状態から右回りに5回転したときに、窓が完全に閉じた状態となる。
キー入力は、A :左回り全開:窓が完全に閉じた状態(5回転目)になるまで左回転し、停止。B :左回り部分開:キー押下時に左回転。キーを離す、窓が完全に閉じた状態になったら停止。C :右回り部分閉:キー押下時に右回転。キーを離す、窓が完全に開いた状態になったら停止。D :右回り全閉 :窓が完全に開いた状態(5回転目)になるまで右回転し、停止。
ヒントを教えてください。お願いします。
#include <stdio.h>
#include <key.h>
/* 外部ポート A1,B1,C1 */
#define EPA1 (*((unsigned char *)0x60000))
#define EPB1 (*((unsigned char *)0x60001))
#define EPC1 (*((unsigned char *)0x60002))
#define EPCW1 (*((unsigned char *)0x60003))
void wait(long);
void counterclockwise (void);
void clockwise (void);
unsigned char Keydat, count, cf, state;
int cwpuls,ccwpuls;
void main(){
//開始時は、窓が閉じている状態
state = 0;
//回転数を初期化
count = 0;
/* uPD71055(82c55) 初期化 */
init_key();
Keydat = 0;
cf = 0;
while (1) {
if((Keydat = get_key_code())==KEY_A){
//左回り全開
clockwise();
//全開(5回転目)になったら停止
EPC1 = 0; /* 一度電流OFF */
wait(90000);/* 時間まち */
} else if (Keydat == KEY_B){
//左回り部分開
clockwise();
//全開(5回転目)になったら停止
EPC1 = 0; /* 一度電流OFF */
wait(90000);/* 時間まち */
} else if (Keydat == KEY_C){
//右回り部分閉
counterclockwise();
//全閉(5回転目)になったら停止
EPC1 = 0;
wait(90000);
} else if (Keydat == KEY_D){
//左回り全閉
counterclockwise();
//全閉(5回転目)になったら停止
EPC1 = 0;
wait(90000);
}
}
}
void wait(long time)
{
long i;
for (i = 0; i < time; i++)
;
}
void counterclockwise (void){
for (cwpuls = 0; cwpuls < 96; cwpuls++){/* CW方向96パルス回す*/
cf++;
if (cf == 4) {
cf = 0;
} /* 励磁相カウンタ+1*/
switch (cf) {
case 0:EPC1 = 0x50; /* 励磁パターン出力 */
break;
case 1:EPC1 = 0x60;
break;
case 2:EPC1 = 0xa0;
break;
case 3:EPC1 = 0x90;
break;
}
wait(1000); // モーター速度
}
}
void clockwise (void){
for (ccwpuls = 0; ccwpuls < 96;ccwpuls++){/* CCW方向96パルス回す*/
cf--;
if (cf == 0xff) {
cf = 3;
} /* 励磁相カウンター -1 */
switch(cf) {
case 0:EPC1 = 0x50; /* 励磁パターン出力 */
break;
case 1:EPC1 = 0x60;
break;
case 2:EPC1 = 0xa0;
break;
case 3:EPC1 = 0x90;
break;
}
wait(1000); //200~500が限界
}
}
お礼
時計回りは右回りなんて北半球での常識で地球の常識じゃなかったのですね。目ウロコでした。ありがとうございました。