DSC02199.JPG

間に合わせだけど,回路系が整ってきた.

DSC02202.JPG

机に固定.

初実戦投入のドライバ,FETが2回焼ける.トラブルを乗り越えての実験.
初めてにしてはまずまず.
このときはデューティー比を40%以下で運用.
以下,ソース.
Arduino

// 感圧センサによりDCモータを制御するプログラム
// リミットスイッチ付き
// 2012.12.26 shiroku
#define VOLUMEPIN (2)
#define IN1PIN (9)
#define IN2PIN (10)
#define LIMIT1 (18)
#define LIMIT2 (19)
int i;//pwmValue
int f;//dedtimeShiftFlag
int pwmPin;
int H1 = 10;
int H2 = 9;
int L1 = 14;
int L2 = 15;
void pwmPinSet(int, int, int);
void dedTime(int);
void setup()
{
Serial.begin(9600);
pinMode(L1,OUTPUT);
pinMode(L2,OUTPUT);
pwmPinSet(1,0,2);
}
int Map( double iIn, int iLimit1, int iLimit2, double iIn1, double iIn2, int iOut1, int iOut2, boolean bConstrain = false )
{
static int flag = 0;
static double iIn_total = 0.0;
static double iIn_ave = 0.0;
double iIn_max = 0.0;
double iIn_min = 0.0;
// 感圧センサ値の平均化
if(flag == 0){
iIn_ave = iIn;
}
else if(flag == 4){
iIn_ave = iIn_total / (4-1);
iIn_total = 0;
flag = 1;
}
iIn_total = iIn_total + iIn;
iIn = iIn_ave; //上書き
flag ++; //カウントアップ
// 感圧センサ値の出力
Serial.print( “iIn_ave : ” );
Serial.print(iIn_ave);
Serial.print( “, ” );
//フィードフォワード制御
double dValue = (double)(iIn – iIn1) * (iOut2 – iOut1) / (iIn2 – iIn1) + iOut1;
//中立
iIn_max = (iIn2 – iIn1)/2 + iIn1 + 50;
iIn_min = (iIn2 – iIn1)/2 + iIn1 – 50;
if((iIn > iIn_min) && (iIn < iIn_max)){ dValue = 0; } if( dValue > 255.0 ) dValue = 255.0; //制御量の上限値
if( dValue < -255.0 ) dValue = -255.0; //制御量の加減値 int iValue = (0 < dValue) ? (int)(dValue + 0.5) : (int)(dValue - 0.5); //制御量を四捨五入し,int型に型変換 // リミットスイッチ if(iLimit1 == 0 && iValue > 0) iValue = 0;
if(iLimit2 == 0 && iValue < 0) iValue = 0; if( bConstrain ){ int iOutMin, iOutMax; if( iOut1 < iOut2 ){ iOutMin= iOut1; iOutMax= iOut2; } else{ iOutMin= iOut2; iOutMax= iOut1; } if( iOutMin > iValue ){
return iOutMin;
}
if( iOutMax < iValue ){ return iOutMax; } } return iValue; } void pwmPinSet(int L1V, int L2V,int pwmPinV) //L1,L2,H1,H2がそれぞれのピン番号でグローバル宣言ある必要あり. //pwmPinがグローバル宣言してある必要有り. //L1V,L2Vはそれぞれのピンの状態指定(L(0)/H(1)). //pwmPinSelectorで指定されたFET番号をH1/H2にセット,逆をLOWにセット. //pwmPinSelectorで1/2以外が指定された場合は1/2をanalgWriteで0に指定. { if(1 == L1V){ digitalWrite(L1,HIGH); }else{ digitalWrite(L1,LOW); } if(1 == L2V){ digitalWrite(L2,HIGH); }else{ digitalWrite(L2,LOW); } switch(pwmPinV) { case 1: analogWrite(H2,LOW); pwmPin = H1; break; case 2: analogWrite(H1,LOW); pwmPin = H2; break; default: analogWrite(H1,0); analogWrite(H2,0); break; } Serial.print( "L1V : " ); Serial.print(L1V); Serial.print( ", " ); Serial.print( "L2V : " ); Serial.print(L2V); Serial.print( ", " ); return; } void dedTime(int t) { Serial.print( "!!dedTime!!" ); digitalWrite(L1,HIGH); digitalWrite(L2,HIGH); digitalWrite(H1,LOW); digitalWrite(H2,LOW); delay(t); return; } void MotorDrive( int iIn1Pin, int iIn2Pin, int iMotor ){ if( -5 < iMotor && 5 > iMotor ){
//モータ停止
digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
}
else if( 0 < iMotor ){ if(f == 2) dedTime(100); pwmPinSet(1,0,2); //モータ正回転 f = 1; } else{ if(f == 1) dedTime(100); pwmPinSet(0,1,1); //モータ逆回転 f = 2; } Serial.print( "iMotor : " ); Serial.print(iMotor); Serial.print( ", " ); if(0 > iMotor) iMotor = iMotor * (-1);
analogWrite(pwmPin,iMotor); //pwmPinSet関数によりpwmPinを決定.iは0~255.
// モータ制御量の出力
Serial.print( “pwmPin : ” );
Serial.print(pwmPin);
Serial.print( “, ” );
Serial.print( “f : ” );
Serial.print(f);
Serial.print( “, ” );
Serial.print( “i : ” );
Serial.print(iMotor);
Serial.print( “, ” );
}
void loop()
{
int iValue = analogRead(VOLUMEPIN);
int iLimit1 = digitalRead(LIMIT1);
int iLimit2 = digitalRead(LIMIT2);
int iMotor = Map(iValue, iLimit1, iLimit2, 0, 1023, -100, 100, true);
MotorDrive( IN1PIN, IN2PIN, iMotor ); //モータへ出力
// リミットスイッチの状態
Serial.print( “L1 : ” );
Serial.print(iLimit1);
Serial.print( “, ” );
Serial.print( “L2 : ” );
Serial.print(iLimit2);
Serial.print( “\n” );
delay(10);
}