无线电轨智能车校内赛 | 如何在ESP32控制板上进行ADC实验?

  • Ask/Aim:
  • Principle:
  • Practice:
  • Linkage:
  • Exercise/Experiment:

01 线电轨


一、问题/目标

  这个无线电轨智能小车主控板上设计有 五路ADC通道, 用于测量外部电压的。 其中 ADC0 用于测量内部电源电压。 另外四路 ADC1 至 ADC4 用于测量外部电磁场传感器的电压。  下面通过一个小实验来读取、显示这五路模拟电压数值, 观察它们变化情况。  为后面实现智能车更好的控制打下基础。

GM1690285010_1280_720.MPG|_-3

▲ 图1.1.1 ESP32控制板

▲ 图1.1.1 ESP32控制板

二、基本原理

  首先在电路板上认识一下这些 AD 端口的位置,  四路 AD输入端口位于电路板左侧的这个 6 针的插座, 其中包括有四个模拟信号线 以及 VCC, GND 两个电源线。  这个端口可以直接接驳外部 电感传感器。 另外一个模拟输出口位于电路板内部的电源分压电阻上。   这是用于显示 ADC转换结果的 OLED 屏幕。  

  下面在来认识一下这些端口在原理图上的标识, 这是ADC1 到 ADC4 对应的检测端口。  内部 ADC0 通过两个分压电阻反应电源的电压。  下面在对照一下ADC0 到ADC4 连接 ESP32的端口。 找到这些端口, 可以为后面程序编写提供对应的端口参数。  这里是 ADC0,  下面是 ADC1,2,3,4。   下面四个 ADC对应的 ESP32 端口表示的比较清楚, 分别对应的IO34,35, 32 以及 33。   ADC0 对应的端口, 通过查阅 ESP32 数据手册,  可以知道它对应 IO36。 这些参数在编程的时候需要用到。

GM1690293454_1280_720.MPG|_-13

三、应用举例

1、程序设计

  下面先看一下实验程序。 这个程序是在给定的测试程序的基础上进行的修改。  先看一下程序前半部分的初始化程序。  最初的两句是 import 所需要的 MicroPython 内部的模块, 包括 ADC, Pin, SPI 端口, time是用于定时的模块。  接下来是 OLED 驱动文件模块。 这个模块需要预先通过 Thonny 软件存在 ESP32 内部的 文件区内。  接下来是处定义五个 ADC 通道。  其中后面四个, 从 ADC1 到 ADC4 是给定示例程序中已经有的。  上面这两行, 定义了 ADC0 端口, 这是后来增加的部分。 大家手工增加到示例文件中。  声明ADC端口, 包括两个步骤, 显示指明 ADC 对应的管教。 这可以从刚才的原理图中查到。  第二个部分是设置 ADC 的参数, 在这场是设置了ADC输入信号衰减倍数。 对应衰减 11 dB, 有效的 ADC 输入电压范围可以达到 3.3V。  需要说明的是, ESP32 的ADC转换的位数是 12位, 3.3V 对应的电压输出为 0xfff, 是 4095

GM1690294121_1280_720.MPG|_-10
  接下来看下面的程序,  中间这部分代码, 定义了 OLED 液晶屏的接口, 这部分没有进行修改。 直接使用原来示例程序中的代码就好。  在这里 定义了五个全局变量, 用于存储 五路 ADC 转换结果。 请注意, val0 是后来增加的。  这些变量被初始化为 0, 用于在主循环程序 和 显示子程序之间传递数据。  接下来是 OLED 显示 ADC结果的子程序。  程序中将五个全局变量对应的数值, 显示在 OLED屏幕上。  这里的代码做了写调整, 为的是能够在 OLED屏幕上 均匀显示出五行 ADC 结果。   对于这部分的代码, 在这里就不做过多的解读,  大家可以自行分析。  接下来是程序的最后一部分。   使用 oled 对象的 show 成员函数, 刷新屏幕,  下面是循环主程序,  前面通过调用 ADC 对象的 read 函数读取外部五路模拟电压的转换数值,  通过 print 函数显示在 Thonny 的 Shell 窗口,  调用前面定义的 Show 函数, 将结果显示在 OLED 屏幕上。  最后利用 time 延时 0.5 秒钟。  这就是整个实验程序的代码。 接下来通过 Thonny 软件进行测试。

GM1690294534_1280_720.MPG|_-20

2、运行结果

  由于这个程序需要使用到 OLED 显示屏, 所以需要实现将 OLED096 这个文件存储到 ESP32 单片机中。  接下来将 Test ADC 程序拷贝到 Thonny 程序编辑区, 存储在 ESXP32中, 之后允许改成。  可以看到改动之后的程序 在OLED屏上显示了 五个 ADC 数值,  其中 ADC0 对应着电源分压之后的数值。 这个数值相对稳定。 前面四个通道数值由于悬空, 所以电压跳动比较大。  如果使用手指触碰 ADC端口, 可以看到 前面四个通道数值变化比较大。 对应 ADC0 的数值仍然保持原来的读数。

GM1690285508_1280_720.MPG|_-5

四、练习/实验

  由于手边大家可能使用的电子设备不多, 所以这个测试就到这里为止。  通过这个程序, 大家熟悉了读取外部电压的过程。  这些数值可以用于之后的车模运动控制, 包括方向和速度。  最终使得车模能够更好地感知环境和适应环境。 大家也可以想想看, 还可以利用这些 ADC通道做哪些有趣的事情?

GM1690285925_1280_720.MPG|_-5

02 座资料


一、讲座视频

如何在ESP32控制板上进行ADC实验?

1、测试程序

from machine import ADC ,Pin , SoftSPI
import time
from LQ_OLED096 import OLED096_SPI

adc0 = ADC(Pin(36))
adc0.atten(ADC.ATTN_11DB)  # Config input range as 3.3V
adc1 = ADC(Pin(33))
adc1.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3V
adc2 = ADC(Pin(32))
adc2.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3V
adc3 = ADC(Pin(34))
adc3.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3V
adc4 = ADC(Pin(35))
adc4.atten(ADC.ATTN_11DB)  # 这里配置测量量程为3.3V

spi=SoftSPI(baudrate=100000,polarity=1,phase=0,sck=Pin(18),mosi=Pin(23),miso=Pin(19)) #创建软件模拟spi
dc=Pin(15,Pin.OUT)
res=Pin(13,Pin.OUT)
cs=Pin(19,Pin.OUT)
oled=OLED096_SPI(128,64,spi,dc,res,cs)  #创建oled对象

val1 =val2 = val3 =val4 = 0
val0 = 0

def Show():   #显示
    txt = ""
    oled.fill(0)   #清屏
    txt = ("    ADC_Test    ")
    oled.text(txt, 6*0, 8*0 ,1)
    txt = ("ADC1:   %d  ") % (val1)
    oled.text(txt, 6*0, 10*1+6 ,1)
    txt = ("ADC2:   %d  ") % (val2)
    oled.text(txt, 6*0, 10*2+6 ,1)
    txt = ("ADC3:   %d  ") % (val3)
    oled.text(txt, 6*0, 10*3+6 ,1)
    txt = ("ADC4:   %d  ") % (val4)
    oled.text(txt, 6*0, 10*4+6 ,1)
    txt = ("ADC0:   %d  ") % (val0)
    oled.text(txt, 6*0, 10*5+6 ,1)

    oled.show()

while True:
    val1 = adc1.read()  # 0-4095
    val2 = adc2.read()  # 0-4095
    val3 = adc3.read()  # 0-4095
    val4 = adc4.read()  # 0-4095
    val0 = adc0.read()  # 0-4095

    print(val1,val2,val3,val4,val0)
    Show()
    time.sleep(0.5)

二、讲座资料

▲ 图2.2.1  电路板测试

▲ 图2.2.1 电路板测试


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/131924829