logo资料库

基于51单片机的简易电磁循迹车.docx

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
基 于 电 磁 感 应 的 循 迹 小 车 的 设 计 作者: 陈
一、硬件设计 传感器 单片机 Stc89c52 电机驱动 LM298N 1、传感器模块由 10mh 的电感与 6.8nf 电容并联组成谐振电路用于检测轨道 中的电线产生的交变磁场。由于传感器转换得到的电信号为交流信号且 较为微弱,难以被 AD 模块采集利用,所以需经过检波运放电路处理后输 入 AD 模块再给单片机。因为其信号频率为 20kHz,因此可以采取包络检 波将其峰值转换为直流信号,再经过 LM358 运算放大器进行电压放大(采 用电压反馈放大)。 2、此次单片机选用 51 单片机,型号为 stc89c52,其 操作简单,价格低廉, 性能也足以满足设计所需,但由于其片内资源有限,无自带 AD 模块,所 以外加一个 16 位 4 路 AD 模块 ADS1115。 3、电机驱动模块采用常见的 LM298N 用于驱动直流电机,并且给其 12V 供电 可引出 5v 给单片机供电,解决电源问题。 检波放大电路图如下: 单片机与 AD 模块连接图如下:
二、软件设计 开始 IIC 协议读取左右两 路 AD 数字量 A1、A2 即 A1-A2<设定值 设定值需根据实际 调试测得 A1==A2? 否 是 是 A1>A2? 否 是 A1右) 左拐命令 (PWM 右>左) ..\参考资料\ADS1115 中文资料.pdf 主要通过 IIC 时序读取返回值,需要配置三个寄存器, 详见参考资料。
三、调试 数码管显示返回数值,在跑道上纪录直道,左右转各自的数值范围,用于 程序调试最终适应相关跑道。(因完成的比较仓促,并未运用 PID 算法,在 低速下足以循迹) 四、附录 电路仿真图:
实物图: 参考程序: # include # include #define uchar unsigned char #define uint unsigned int sbit pwm_r = P2^0; sbit pwm_l = P2^1; sbit SDA = P1^0; sbit SCL = P1^1; sbit DU = P2^6; sbit WE = P2^7; //数码管段选 //数码管位选 uint widthL = 39; uint widthR = 37; uint fre = 40; int a; uchar code table[]={ //0 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, //9 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00 E F A 2 D 1 C - . B 3 4 5 }; 6 7 8 关显示
/*==================================== 数码管位选码 ====================================*/ 位 uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//数码管位码 //第 1 位 2 位 3 位 4 位 5 位 6 位 7 位 8 _nop_(); /*5us 延时*/ void delay_5us() { } /*1Ms 延时*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } void Display(uint Value) { //------------------------------ DU = 1; P0 = table[Value/10000]; DU = 0; P0 = 0xff; WE = 1; P0 = T_COM[0]; WE = 0; delay(3); //------------------------------- DU = 1; P0 = table[Value%10000/1000]; DU = 0; P0 = 0xff; WE = 1; P0 = T_COM[1];
WE = 0; delay(3); //------------------------------- DU = 1; P0 = table[Value%10000%1000/100]; DU = 0; P0 = 0xff; WE = 1; P0 = T_COM[2]; WE = 0; delay(3); //------------------------------- DU = 1; P0 = table[Value%10000%1000%100/10]; DU = 0; P0 = 0xff; WE = 1; P0 = T_COM[3]; WE = 0; delay(3); //------------------------------- DU = 1; P0 = table[Value%10000%1000%100%10]; DU = 0; P0 = 0xff; WE = 1; P0 = T_COM[4]; WE = 0; delay(3); uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*1Ms 延时*/ /*void delay(uint z) {
}*/ /*****************I2C 部分********************/ /*I2C 初始化*/ void I2C_init() { } /*I2C 起始信号*/ void I2C_Start() { } /*I2C 终止信号*/ void I2C_Stop() { } void respons() { } SDA = 1; _nop_(); SCL = 1; _nop_(); SCL = 1; _nop_(); SDA = 1; delay_5us(); SDA = 0; delay_5us(); SDA = 0; _nop_(); SCL = 1; delay_5us(); SDA = 1; delay_5us(); SCL=1; _nop_(); SDA=0; _nop_(); SCL=0; _nop_();
分享到:
收藏