拿到811也快一个月了,可我的心得还没写完800字呢,这不又来凑字数来了,奋斗了两周,我基于811控制的循迹小车终于基本完成了,先说说我的硬件部分吧,买了一个车底盘,电机驱动和传感器部分自己动手焊的,循迹部分没怎么弄好,但是幸好811有ADC,也能凑合着用。小车轨道是自己画的椭圆状的,能完成循迹,小车模样
循迹部分原理图电机驱动部分
下面是控制部分代码unsigned int abs(signed int xx)//将相互之间采回的电压差值转换成正数
{
unsigned int yy;
if(xx<0)
yy=-xx;
else
yy=xx;
return yy;
}
unsigned int find_min(unsigned int x1,unsigned int x2,unsigned int x3)//寻找哪两个传感器之间的差值最小,
//从而判断是否有发生小偏
{
unsigned int min;
if(x1<=x2&&x1<=x3)
min=1;//表示没偏
if(x2<=x3&&x2<=x1)
min=2;//向左有小偏
if(x3<=x2&&x3<=x1)
min=3;//向右有小偏
return min;
}
void main()
{
unsigned int i;
unsigned long Value[3];//Value[0],Value[1],Value[3]分别对应左中右三个传感器对应电压
unsigned int daLR,daLM,daMR;//三个传感器相互之间电压差值,以此判断是左偏还是右偏
SysClockInt(); //时钟配置
ADC_Init();//ADC 初始化'
PWMInit();//PWM初始化
// timerInt();
SysEnable();//设置控制减速电机IO口
while(1)
{
ADC_Sample(Value);//开始采样
for (i = 0; i < 3; i++)
{
Value = (Value * 3000) / 1024; // 转换成电压值
}
daLR=abs(Value[0]-Value[2]);
daLM=abs(Value[0]-Value[1]);
daMR=abs(Value[1]-Value[2]);
while(Value[0]>Value[1]&&Value[0]>Value[2])//说明小车向左出现大偏,
{
goleft(); //向左转
ADC_Sample(Value);
for (i = 0; i < 3; i++)
{
Value = (Value * 3000) / 1024; // 转换成电压值
}
daLR=abs(Value[0]-Value[2]);
daLM=abs(Value[0]-Value[1]);
daMR=abs(Value[1]-Value[2]);
if(find_min(daLR,daLM,daMR)==1)//如果转到中间的传感器正对黑线,跳出循环前进
break;
SysCtlDelay(30 * (TheSysClock / 3000));
}
while(Value[2]>Value[1]&&Value[2]>Value[0])//说明小车向右出现大偏,
{
goright();
ADC_Sample(Value);
for (i = 0; i < 3; i++)
{
Value = (Value * 3000) / 1024; // 转换成电压值
}
daLR=abs(Value[0]-Value[2]);
daLM=abs(Value[0]-Value[1]);
daMR=abs(Value[1]-Value[2]);
if(find_min(daLR,daLM,daMR)==1)//如果转到中间的传感器正对黑线,跳出循环前进
break;
SysCtlDelay(30 * (TheSysClock / 3000));
}
switch(find_min(daLR,daLM,daMR))//判断是向左还是右出现小偏,或没偏
{
case 1:gostright(); break;
case 2://向左出现小偏
{
while(find_min(daLR,daLM,daMR)!=1)//小车左转,直到中间传感器对准黑线
{
ADC_Sample(Value);
for (i = 0; i < 3; i++)
{
Value = (Value * 3000) / 1024; // 转换成电压值
}
daLR=abs(Value[0]-Value[2]);
daLM=abs(Value[0]-Value[1]);
daMR=abs(Value[1]-Value[2]);
goleft();//左转
SysCtlDelay(50 * (TheSysClock / 3000));
}
} break;
case 3:
{
while(find_min(daLR,daLM,daMR)!=1)//小车右转,直到中间传感器对准黑线
{
ADC_Sample(Value);
for (i = 0; i < 3; i++)
{
Value = (Value * 3000) / 1024; // 转换成电压值
}
daLR=abs(Value[0]-Value[2]);
daLM=abs(Value[0]-Value[1]);
daMR=abs(Value[1]-Value[2]);
goright();//右转
SysCtlDelay(50 * (TheSysClock / 3000));
}
} break;
}
SysCtlDelay(100 * (TheSysClock / 3000));
}
}