基
于
电
磁
感
应
的
循
迹
小
车
的
设
计
作者: 陈
一、硬件设计
传感器
单片机
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_();