学习内容
- 理解原理图
- 了解循迹原理
- 掌握循迹采样逻辑编写
-
学习目标
原理图
循迹原理
红外循迹电路是以ITR9909传感器为核心,使用模拟比较器进行检测输入状态,配合精度调整的电位器,测量距离在1mm~15mm范围内可调节。小车循迹一般是在白色地板上沿着一根黑线行走车底如果是白色地板,光线会被折射回去,此时接收管接收到信号,经过比较器输出低电平,LED指示灯亮,如果车行驶在黑线周边,红外光被黑色吸收,接收管接收不到发射的信号,此时比较器电路输出为高电平,LED指示灯熄灭。循迹其实也就是一个寻找黑线以及沿着黑线行走的过程。
反射式光电开关
反射式光电开关是一种常见的光电传感器,通常由光电发射器和光电接收器两部分组成。光电发射器会发射一束光线,当光线遇到被检测物体后反射回来,光电接收器就会接收到这些反射光线,并将其转换成电信号输出。
反射式光电开关可以用于巡线,其原理如下:
在反射式光电开关中,光电传感器和光源被放置在一起,并且光源发射的光束通过反射镜反射回光电传感器。当光电传感器接收到反射回来的光束时,就会输出一个电信号。
在巡线过程中,光电开关被放置在车辆底部,照射在地面上,当车辆偏离了路线,光束的反射角度也会发生变化,这就会导致光束被反射到不同的位置,最终使得光电传感器接收到的信号发生改变。
通过检测信号的改变,可以确定车辆是否偏离了路线。巡线时可以通过将多个光电开关并联在一起来提高精度,同时可以通过巡线算法来确定车辆偏离路线的程度和方向,从而进行调整。
需要注意的是,反射式光电开关对地面的反射能力有一定的要求,如果地面反射能力不足,可能会导致检测精度下降,因此在选择光电开关时需要考虑地面的反射条件。
模拟比较器
模拟比较器是一种基于模拟电路原理实现的电子元件,用于比较两个电压的大小。它通常具有高输入阻抗、低输入偏置电流、高增益和高速响应等特点。
模拟比较器的工作原理是将两个电压进行比较,然后输出一个高电平或低电平的信号。通常情况下,将需要比较的两个电压分别连接到比较器的正输入端和负输入端。比较器会比较这两个电压的大小,然后将比较结果输出到其输出端。
模拟比较器广泛应用于模拟电路和数字电路中。在模拟电路中,它可用于电压比较、电压控制开关、电流源等电路中;在数字电路中,它可以用作模拟信号与数字信号的接口,或作为数字信号比较器、电平转换器等电路中。XD393 / LM393P
XD393 (LM393P) 是一种双路高速差分比较器,常用于模拟电路中的信号检测、电平转换和电路保护等应用。它的输入有两路,一个是正向输入IN+,一个是反向输入IN-,它们之间的差分信号将被放大后输出给输出端OUT。393具有高速、高精度、低功耗等优点,能够在大范围内稳定工作,常被应用于工业控制、仪器仪表等领域。在电子电路设计中,常使用393构成振荡器、比较器、滤波器等电路。
当反射开关的发射端信号没有被接收端收到时,开关断开,电流走向如下图:
- 当反射开关的发射端信号被接收端收到时,开关导通,电流走向如下图:
坐标系与状态
- 当前压线时,状态显示 (压倒黑线, 灯灭)
- 当未压线时,状态丢失。以上一次状态为准
- 多个状态灭时,位置计算如下
驱动编写
#ifndef __TRACK_H__
#define __TRACK_H__
#include "config.h"
#define TRACK_4 P33
#define TRACK_3 P32
#define TRACK_2 P50
#define TRACK_1 P06
#define TRACK_0 P47
// 数量
#define TRACK_NUM 5
//巡线器的状态
#define TRACK_ON 0
#define TRACK_OFF 1
#define TRACK_PIN_INIT() {P3M1 &= ~0x0c;P3M0 &= ~0x0c;P5M1 &= ~0x01;P5M0 &= ~0x01;P0M1 &= ~0x40;P0M0 &= ~0x40;P4M1 &= ~0x80;P4M0 &= ~0x80;}
void Track_init();
int Track_get_pos();
#endif
#include "Track.h"
#define TRACK_SPACE 32
static int max;
static int last_pos = 0;
// 获取第几个传感器状态
static u8 TRACK_STATE(u8 i) {
if(i == 0) return TRACK_0;
if(i == 1) return TRACK_1;
if(i == 2) return TRACK_2;
if(i == 3) return TRACK_3;
if(i == 4) return TRACK_4;
}
void Track_init() {
TRACK_PIN_INIT();
if(TRACK_NUM % 2 == 0) {
max = (TRACK_NUM / 2 - 1) * TRACK_SPACE + TRACK_SPACE / 2;
} else {
max = TRACK_NUM / 2 * TRACK_SPACE;
}
}
int Track_get_pos() {
u8 i;
int count, total, value;
value = max;
count = 0;
total = 0;
for(i = 0;i < TRACK_NUM;i++) {
if(TRACK_STATE(i) == TRACK_ON) {
//压线了
total += value;
count ++;
}
value -= TRACK_SPACE;
}
if(count == 0) {
// 没有压线
return last_pos;
} else {
last_pos = total / count;
return last_pos;
}
}
循迹模块异常调试
根据原理图,每个循迹模块包含四个主要部分:
- 光电传感器ITR9909
- 10K滑动电阻
- XD393比较器
- LED灯
上电即可测试单组(共5组)循迹模块是否正常,即光电传感器下有光线反射,LED亮起,否则LED熄灭。如果LED长灭不能亮起,则说明模块出现异常,可按照以下流程进行排错。
- 首先将异常模块相关的所有引脚都用烙铁进行上锡,确保没有短接(正反面)、虚焊情况。
- 设备上电,对着笔记本电脑摄像头(不可用手机摄像头),看对应的上边白灯是否亮起(颜色为紫红色),没有亮起则检查R9-330Ω电阻两侧是否有电压,光电传感器是否虚焊,没有虚焊则考虑更换光电传感器。