学习内容

  1. 理解原理图
  2. 了解循迹原理
  3. 掌握循迹采样逻辑编写
  4. 了解抽象驱动接口

    学习目标

    原理图

    167.png

    循迹原理

    红外循迹电路是以ITR9909传感器为核心,使用模拟比较器进行检测输入状态,配合精度调整的电位器,测量距离在1mm~15mm范围内可调节。小车循迹一般是在白色地板上沿着一根黑线行走车底如果是白色地板,光线会被折射回去,此时接收管接收到信号,经过比较器输出低电平,LED指示灯亮,如果车行驶在黑线周边,红外光被黑色吸收,接收管接收不到发射的信号,此时比较器电路输出为高电平,LED指示灯熄灭。循迹其实也就是一个寻找黑线以及沿着黑线行走的过程。

    反射式光电开关

    反射式光电开关是一种常见的光电传感器,通常由光电发射器和光电接收器两部分组成。光电发射器会发射一束光线,当光线遇到被检测物体后反射回来,光电接收器就会接收到这些反射光线,并将其转换成电信号输出。
    反射式光电开关可以用于巡线,其原理如下:
    在反射式光电开关中,光电传感器和光源被放置在一起,并且光源发射的光束通过反射镜反射回光电传感器。当光电传感器接收到反射回来的光束时,就会输出一个电信号。
    在巡线过程中,光电开关被放置在车辆底部,照射在地面上,当车辆偏离了路线,光束的反射角度也会发生变化,这就会导致光束被反射到不同的位置,最终使得光电传感器接收到的信号发生改变。
    通过检测信号的改变,可以确定车辆是否偏离了路线。巡线时可以通过将多个光电开关并联在一起来提高精度,同时可以通过巡线算法来确定车辆偏离路线的程度和方向,从而进行调整。
    需要注意的是,反射式光电开关对地面的反射能力有一定的要求,如果地面反射能力不足,可能会导致检测精度下降,因此在选择光电开关时需要考虑地面的反射条件。
    212.png

    模拟比较器

    模拟比较器是一种基于模拟电路原理实现的电子元件,用于比较两个电压的大小。它通常具有高输入阻抗、低输入偏置电流、高增益和高速响应等特点。
    模拟比较器的工作原理是将两个电压进行比较,然后输出一个高电平或低电平的信号。通常情况下,将需要比较的两个电压分别连接到比较器的正输入端和负输入端。比较器会比较这两个电压的大小,然后将比较结果输出到其输出端。
    模拟比较器广泛应用于模拟电路和数字电路中。在模拟电路中,它可用于电压比较、电压控制开关、电流源等电路中;在数字电路中,它可以用作模拟信号与数字信号的接口,或作为数字信号比较器、电平转换器等电路中。

    XD393 / LM393P

    XD393 (LM393P) 是一种双路高速差分比较器,常用于模拟电路中的信号检测、电平转换和电路保护等应用。它的输入有两路,一个是正向输入IN+,一个是反向输入IN-,它们之间的差分信号将被放大后输出给输出端OUT。393具有高速、高精度、低功耗等优点,能够在大范围内稳定工作,常被应用于工业控制、仪器仪表等领域。在电子电路设计中,常使用393构成振荡器、比较器、滤波器等电路。

  5. 当反射开关的发射端信号没有被接收端收到时,开关断开,电流走向如下图:

173.png

  1. 当反射开关的发射端信号被接收端收到时,开关导通,电流走向如下图:

174.png

坐标系与状态

  1. 当前压线时,状态显示 (压倒黑线, 灯灭)

image.pngimage.png

  1. 当未压线时,状态丢失。以上一次状态为准

image.png

  1. 多个状态灭时,位置计算如下image.png

Pos = (32 + 64) / 2

驱动编写

  1. #ifndef __TRACK_H__
  2. #define __TRACK_H__
  3. #include "config.h"
  4. #define TRACK_4 P33
  5. #define TRACK_3 P32
  6. #define TRACK_2 P50
  7. #define TRACK_1 P06
  8. #define TRACK_0 P47
  9. // 数量
  10. #define TRACK_NUM 5
  11. //巡线器的状态
  12. #define TRACK_ON 0
  13. #define TRACK_OFF 1
  14. #define TRACK_PIN_INIT() {P3M1 &= ~0x0c;P3M0 &= ~0x0c;P5M1 &= ~0x01;P5M0 &= ~0x01;P0M1 &= ~0x40;P0M0 &= ~0x40;P4M1 &= ~0x80;P4M0 &= ~0x80;}
  15. void Track_init();
  16. int Track_get_pos();
  17. #endif
  1. #include "Track.h"
  2. #define TRACK_SPACE 32
  3. static int max;
  4. static int last_pos = 0;
  5. // 获取第几个传感器状态
  6. static u8 TRACK_STATE(u8 i) {
  7. if(i == 0) return TRACK_0;
  8. if(i == 1) return TRACK_1;
  9. if(i == 2) return TRACK_2;
  10. if(i == 3) return TRACK_3;
  11. if(i == 4) return TRACK_4;
  12. }
  13. void Track_init() {
  14. TRACK_PIN_INIT();
  15. if(TRACK_NUM % 2 == 0) {
  16. max = (TRACK_NUM / 2 - 1) * TRACK_SPACE + TRACK_SPACE / 2;
  17. } else {
  18. max = TRACK_NUM / 2 * TRACK_SPACE;
  19. }
  20. }
  21. int Track_get_pos() {
  22. u8 i;
  23. int count, total, value;
  24. value = max;
  25. count = 0;
  26. total = 0;
  27. for(i = 0;i < TRACK_NUM;i++) {
  28. if(TRACK_STATE(i) == TRACK_ON) {
  29. //压线了
  30. total += value;
  31. count ++;
  32. }
  33. value -= TRACK_SPACE;
  34. }
  35. if(count == 0) {
  36. // 没有压线
  37. return last_pos;
  38. } else {
  39. last_pos = total / count;
  40. return last_pos;
  41. }
  42. }

循迹模块异常调试

根据原理图,每个循迹模块包含四个主要部分:

  1. 光电传感器ITR9909
  2. 10K滑动电阻
  3. XD393比较器
  4. LED灯

上电即可测试单组(共5组)循迹模块是否正常,即光电传感器下有光线反射,LED亮起,否则LED熄灭。如果LED长灭不能亮起,则说明模块出现异常,可按照以下流程进行排错。
循迹功能 - 图9

  1. 首先将异常模块相关的所有引脚都用烙铁进行上锡,确保没有短接(正反面)、虚焊情况。
  2. 设备上电,对着笔记本电脑摄像头(不可用手机摄像头),看对应的上边白灯是否亮起(颜色为紫红色),没有亮起则检查R9-330Ω电阻两侧是否有电压,光电传感器是否虚焊,没有虚焊则考虑更换光电传感器。

image.png

  1. 金属物品短接光电传感器接收端两极,模拟收到信号,观察对应LED灯是否正常亮起,如果无法亮起,则检查电阻及XD393相关的引脚是否虚焊,考虑LED灯是否损坏,没有则进行下一步。image.png
  2. 调整滑动变阻器,向右顺时针拧,可增大XD393引脚2输入电压,确保引脚3为低电平时,引脚1可输出低电平,让LED亮起。(如果是常亮不灭,则需要向左逆时针拧,降低比XD393引脚2输入电压)观察灯是否可以正常亮灭。

    练习

  3. 循迹驱动编写