Hブリッジ制御について
Posted: 2015年10月20日(火) 17:05
Hブリッジ回路の制御について質問です。
回路構成は次の通りです。
Vcc Vcc
| |
| |
| |
FET1 FET2
| |
| |
| |
-------MOT-------
| |
| |
| |
| |
| |
FET3 FET4
| |
| |
| |
GND GND
4つのポートでマイコンから各FETを制御します。
//MOTリセット
LATCbits.LATC0= 0 or 1; FET1
LATCbits.LATC1= 0 or 1; FET2
LATCbits.LATC2= 0 or 1; FET3
LATCbits.LATC3= 0 or 1; FET4
2つのSwitchの状態に応じて、次の通り動作させようとしています。
SW両方がON: ブレーキ
SW1がON、SW2がOFF: CW回転
SW1がOFF、SW2がON: CCW回転
SW両方がOFF: 前の状態を保持
このコードでSWに対応した動作を行うことはできますが、次の課題があります。
swの状態が切り替わるタイミングで、一度各FETを0に設定したい。(理由は、FET1/3及びFET2/4の同時ONを防ぎたいため)
次のコードをcase分の中に書くと、MOTリセットも無限ループで繰り返されてしまいます。
一度だけ、MOTをリセットして、swの状態に応じたモータ動作を行うためにはどうすれば良いのでしょうか。
//MOTリセット
LATCbits.LATC0= 0; FET1 OFF
LATCbits.LATC1= 0; FET2 OFF
LATCbits.LATC2= 0; FET3 OFF
LATCbits.LATC3= 0; FET4 OFF
回路構成は次の通りです。
Vcc Vcc
| |
| |
| |
FET1 FET2
| |
| |
| |
-------MOT-------
| |
| |
| |
| |
| |
FET3 FET4
| |
| |
| |
GND GND
4つのポートでマイコンから各FETを制御します。
//MOTリセット
LATCbits.LATC0= 0 or 1; FET1
LATCbits.LATC1= 0 or 1; FET2
LATCbits.LATC2= 0 or 1; FET3
LATCbits.LATC3= 0 or 1; FET4
2つのSwitchの状態に応じて、次の通り動作させようとしています。
SW両方がON: ブレーキ
SW1がON、SW2がOFF: CW回転
SW1がOFF、SW2がON: CCW回転
SW両方がOFF: 前の状態を保持
このコードでSWに対応した動作を行うことはできますが、次の課題があります。
swの状態が切り替わるタイミングで、一度各FETを0に設定したい。(理由は、FET1/3及びFET2/4の同時ONを防ぎたいため)
次のコードをcase分の中に書くと、MOTリセットも無限ループで繰り返されてしまいます。
一度だけ、MOTをリセットして、swの状態に応じたモータ動作を行うためにはどうすれば良いのでしょうか。
//MOTリセット
LATCbits.LATC0= 0; FET1 OFF
LATCbits.LATC1= 0; FET2 OFF
LATCbits.LATC2= 0; FET3 OFF
LATCbits.LATC3= 0; FET4 OFF
st=0;
left=0;
right=0;
delay_ms(100);
while(1){
sw = PORTB & 0x03;
switch(sw){
case 0:
LATCbits.LATC0= 1; //FET1 ON
LATCbits.LATC1= 1; //FET2 ON
LATCbits.LATC2= 0; //FET3 OFF
LATCbits.LATC3= 0; //FET4 OFF
st=1;
left=0;
right=0;
delay_ms(30);
break;
case 1:
LATCbits.LATC0= 1; //FET1 ON
LATCbits.LATC1= 0; //FET2 OFF
LATCbits.LATC2= 0; //FET3 OFF
LATCbits.LATC3= 1; //FET4 ON
left=1;
delay_ms(30);
break;
case 2:
LATCbits.LATC0= 0; //FET1 OFF
LATCbits.LATC1= 1; //FET2 ON
LATCbits.LATC2= 1; //FET3 ON
LATCbits.LATC3= 0; //FET4 OFF
right=1;
delay_ms(30);
break;
case 3:
if (st==1){
LATCbits.LATC0= 1; //FET1 ON
LATCbits.LATC1= 1; //FET2 ON
LATCbits.LATC2= 0; //FET3 OFF
LATCbits.LATC3= 0; //FET4 OFF
st=0;
}
else if (left==1){
LATCbits.LATC0= 1; //FET1 ON
LATCbits.LATC1= 0; //FET2 OFF
LATCbits.LATC2= 0; //FET3 OFF
LATCbits.LATC3= 1; //FET4 ON
left=0;
}
else if (right==1){
LATCbits.LATC0= 0; //FET1 OFF
LATCbits.LATC1= 1; //FET2 ON
LATCbits.LATC2= 1; //FET3 ON
LATCbits.LATC3= 0; //FET4 OFF
right=0;
}
break;
default:break;
}
}