电磁循迹知识分享.docx
《电磁循迹知识分享.docx》由会员分享,可在线阅读,更多相关《电磁循迹知识分享.docx(15页珍藏版)》请在冰豆网上搜索。
电磁循迹知识分享
电磁循迹
作者:
陈
于电磁感应的循迹小车的设计
硬件设计
1、传感器模块由10mh的电感与6.8nf电容并联组成谐振电路用于检测轨道中的电线产生的交变磁场。
由于传感器转换得到的电信号为交流信号且较为微弱,难以被AD模块釆集利用,所以需经过检波运放电路处理后输入AD模块再给单片机。
因为其信号频率为20kHz,因此可以采取包络检波将其峰值转换为直流信号,再经过LM358运算放大器进行电压放大(釆用电压反馈放大)。
2、此次单片机选用51单片机,型号为stc89c52,其操作简单,价格低廉,性能也足以满足设计所需,但由于其片内资源有限,无自带AD模块,所以外加一个16位4路AD模块ADS1115o
3、电机驱动模块釆用常见的LM298N用于驱动直流电机,并且给其12V供电可引出5v给单片机供电,解决电源问题。
检波放大电路图如下:
单片机与AD模块连接图如下:
M/MA
AS/KI
GNO
SV
软件设计
开始
直行命令
右拐命令
左拐命令
IIC协议读取左右两路AD数字呈Al、A2
・•\参考资料\ADS1115中文资料.pdf
主要通过lie时序读取返回值,需要配置三个寄存器,
POINTERREGISTER
Thefourregistersareaccessedbywritingtothe
Pointerregisterbyte:
see图30.表6and表7indicatethePointerregisterbytemap.
表6.RegisterAddress
BIT1
BIT0
REGISTER
0
0
conversionregister
0
1
Configregister
1
0
Lojhreshregister
1
1
Hithreshregister
CONVERSIONREGISTER
The16-bitregistercontainstheresultofthelastconversioninbinarytwoscomplementformat.Followingresetorpower-up・theConversionregisterisclearedtoandremains*0*untilthefirstconversioniscompleted.
Theregisterformatisshownin表8.
CONFIGREGISTER
详见参考资料。
The16-bitregistercanbeusedtocontroltheADS1113/4/5operatingmode,Inputselection,datarate,PGAsettings・andcomparatormodes.Theregisterformatisshownin表9.
三、调试
数码管显示返回数值,在跑道上纪录直道,左右转各自的数值范围,用于程序调试最终适应相关跑道。
(因完成的比较仓促,并未运用PID算法,在低速下足以循迹)
四、附录
电路仿真图:
实物图:
参考程序:
#include
#include
#deflneucharunsignedchai
#deflneunitunsignedmt
sbitpwm_i=P2A0;
sbitpwm_l=P2A1;
sbitSDA=P1AO;
sbitSCL=P1A1;
sbitDU=P2人6;〃数码管段选
sbitWE=P2人7;〃数码管位选
unitwidtliL=39;
unitwidtliR=37;
unitfie=40;
mta;
ucharcodetable[]={
//012345678
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,
//9ABCDEF-关显示
0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x80,0x00
};
r
数码管位选码
〃第1位2位3位4位5位6
位7位8位
ucharcodeT_COM[]={Oxfe,Oxfd,Oxfb.0xf7,OxefOxdf,Oxbf,0x7f};//数码管位码
严5us延时*/
voiddelay_5us()
_nop_();
}
/*lMs延时*/
voiddelay(umtz)
{
unitx,y;
fbr(x=z;x>0;x—)for(y=114;y>0;y-);
}
voidDisplay(uintValue)
{
//
DU=1;
P0=table[Value/10000];
DU=0;
P0=Oxff;
WE=1;
PO=T_COM[0];
WE=0;delay(3);
//
DU=1;
PO=table[Value%10000/1000];
DU=0;
PO=Oxff;
WE=1;
P0=T_COM[l];
WE=0;delay(3);
//
DU=1;
PO=Sble[VaIue%10000%1000/100];
DU=0;
PO=Oxff;
WE=1;
P0=T_COM[2];
WE=O;
delay(3);
//
DU=1;
PO=table[Value%10000%1000%100/10];DU=0;
PO=Oxff;
WE=1;
PO=T_COM[3];
WE=0;
delay(3);
//
DU=1;
PO=Sble[Value%10000%1000%100%10];DU=0;
PO=Oxff;
WE=1;
PO=T_COM[4];
WE=0;
delay(3);
}
/*lMs延时*/
/*voiddelay(umtz)
{
uintx,v;
foi(x=z;x>0;x—)for(y=114;y>0;y-);
}*/
****************J2C部分*******************
*/
/*I2C初始化*/
voidI2C_imtO
SDA=1;_nop_();
SCL=1;_nop_();
}
/*I2C起始信号*/
voidI2C_Start()
{
SCL=1;_nop_();
SDA=1;delay_5us(j;
SDA=0;delay_5us(j;
}
/*I2C终止信号*/
voidI2C_Stop()
{
SDA=0;_nop_();
SCL=1;delay_5us(j;
SDA=1;delay_5us(j;
}
voidiespoiis()
{
SCL=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}
voidnoresponsO
{
SCL=1;_nop_();
SDA=1;
_nop_();
严发送一个字节勺
voidI2C_send_byte(ucharbyte)
uchari;
fbi(i=0;i<8;i卄)
SCL=0;_nop_();
if(byte&0x80)
SDA=1;_nop_();
}else
SDA=0;_nop_();
}
SCL=1;
_nop_();
byte«=1;//01010100B
}
SCL=0;
_nop_();
SDA=1;
_nop_();
/*I2C读一字节*/
ucharI2C_read_byte()
{
uchardat,i;
SDA=1;
_nop_();
SCL=0;
_nop_();
for(i=0;i<8;i++)
SCL=1;
_nop_();
if(SDA)dat|=0x01;
if(iv7)dat«=l;
SCL=0;
_nop_();
}
letuindat;
/*****************AI
严ADS1115写入数据*/
voidconfige_wnte()
}
voidpointei()
{
I2C_Start();
12C_send_byte(0x90);lesponsQ;
I2C_send_byte(0x01);lesponsQ;
12C_send_byte(0x82);lesponsQ;
I2C_send_byte(0xe3);lesponsQ;
I2C_StopQ;
I2C_Start();
12C_send_byte(0x90);lesponsQ;
I2C_send_byte(0x00);lesponsQ;
I2C_StopQ;
}
/*ADS1115读取数据*/
unitconversion_readQ
ucharresultlijesultl;unitresult;
I2C_Start();
I2C_send_byte(0x91);responsQ;
lesulth=I2C_read_byte();noresponsQ;
lesultl=I2C_iead_bvte();noresponsQ;
iesult=resulth«8|resultl;
letuinresult;
}unitget_ad()
{
uuitvalue;confige_wiiteQ;
delay_5usQ;
pointei();
delay_5usQ;value=conversion_read();returnvalue;
****************
//2nis/40=0.05nis
TMOD=0x02;
THO=210;
TLO=210;
ET0=l;//开定时器0中断
TRO=1;//启动定时器0
EA=1;〃开总中断
****************
voidmam()
init();
I2C_mit();
while(l)
{
a=get_ad();
if(〜a>3000&&〜a<30000)
{
widthL=0;widtliR=]&
}
elseif(a>3000&&a<30000)
{
widthL=19;
widtliR=0;
}
widthL=25;widtliR=24;}
}
}
****************
定时器0中断,产生pwm
*******************
*/
voidtO_uit()uitemipt1
{
staticintcount;
count十+;
if(count>widthL)pwm_l=0;
if(count>widtliR)pwm_f=0;
if(count==fie)
{
count=0;
pwm_r=pwm_l=1;}