电磁循迹知识分享.docx

上传人:b****2 文档编号:24491899 上传时间:2023-05-28 格式:DOCX 页数:15 大小:129.78KB
下载 相关 举报
电磁循迹知识分享.docx_第1页
第1页 / 共15页
电磁循迹知识分享.docx_第2页
第2页 / 共15页
电磁循迹知识分享.docx_第3页
第3页 / 共15页
电磁循迹知识分享.docx_第4页
第4页 / 共15页
电磁循迹知识分享.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

电磁循迹知识分享.docx

《电磁循迹知识分享.docx》由会员分享,可在线阅读,更多相关《电磁循迹知识分享.docx(15页珍藏版)》请在冰豆网上搜索。

电磁循迹知识分享.docx

电磁循迹知识分享

电磁循迹

 

作者:

于电磁感应的循迹小车的设计

硬件设计

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;}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1