用树莓派pico制作一个电压表
调节电位计产生0-3.3V之间变化的电压,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,再通过OLED显示屏显示出来
标签
嵌入式系统
测试
数字逻辑
显示
2023寒假在家练
项目学习
siu
更新2023-03-29
河南工业大学
930

内容介绍

                                 寒假在家一起练——基于step-pico 的电压表

 

1.项目介绍: 制作一个电压表

 具体要求:利用板上的电位计调节电压从0-3.3V之间变化,在OLED显示屏上显示电压值,可以以数字的方式,也可以以图形的方式来显示,实现方式:调节电位计产生0-3.3V之间变化的电压,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,再通过OLED显示屏显示出来

 

2.设计思路

   2.1基本设计思路

利用树莓派mcu板载12位adc采集电位计的电压以及树莓派片内温度传感器,然后mcu采集12位的数据并进行处理转化,再由mcu控制基于spi协议的oled显示屏显示处理转化后的电压值以及温度;

   2.2详细设计思路(基于micropython)

   1:初始化ADC

ADC这个对象在machine这个类里;初始化ADC对象有两种方法;machine.ADC(id),参数id可以使用Pin对象,也可直接指定为ADC通道使用Pin对象时,指定的GPIO需要支持ADC功能,即GPIO26-29使用指定ADC通道时,通道0-3对应GPIO26-29,通道4则对应内部温度传感器其中采集电位器电压的ADC对应的是GPIO28,ADC通道2

FgZApl7DGHSMIEbt7UrLwUYzlZM1

片内温度传感器是集成在rp2040微控制芯片内部的一个外设,没有对应的GPIO,但有与之对应的ADC通道4。

 

   2:初始化oled(SPI协议)

 OLED(OrganicLight-Emitting Diode),又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。

       SPI协议

FhzXwvURHh_GgTnIIz8UCTKxLF4h

 

 

通讯开始/停止

标号①处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。

在图中⑥的标号处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

数据有效传输

SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线来进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。

 核心代码初始化:

spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))

oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc),Pin(pin_cfg.spi1_rstn),Pin(pin_cfg.spi1_cs))

3:转化电压和温度

将ADC读取的12位数字量先经过比例缩放转化为16位数字量,由于参考电压是3.3V,且比例缩放转化为16位数字量之后ADC分辨率变为3.3/65536   

核心代码

reading_ADC2 = ADC2.read_u16()*3.3/65535

reading_ADC4 = Internal_sensor_temp.read_u16()*3.3/65535

    再根据官方给的片内温度与电压转换的关系得到温度:

 temperature = 27 - (reading_ADC4 - 0.706)/0.001721

4:显示电压值以及温度

将操作3得到的数据显示到oled屏幕上,调用oled库的函数即可实现;

 

3.设计思路框图

 

FoCnibKM7N7s8FDG3aflEKqCJWrX

 4软件流程图

 

                           FrTIU7MrdFhJpqUgx88j8L49v9Bq

 

 5硬件介绍

 

Fi2YI7Aa48aBNYzfznFsJv6BHNJCFs4zW5P8fcL42PkTum-zrac8bR-s

本次完成项目所用到的硬件有RP2040微控制器芯片,电位器分压电路,片内温度传感器,以及基于SPI协议驱动的oled屏幕

 

                          FgTH28pLI80kAVQXu161Fx1wotU9

6:功能实现

mcu采集到电位器的电压数字量以及片内温度传感器的电压数字量,并转化为电压和温度在oled上显示

显示界面如下

 

                 FsP3QZYxHAqnDS6L9sSnL9aTjG8G                                 

 

7:主函数代码

 

 while True:

        reading_ADC2 = ADC2.read_u16()*3.3/65535#12的ADC经过扩放后分辨率为3.3/65535

        reading_ADC4 = Internal_sensor_temp.read_u16()*3.3/65535

        '''

       官方给出的温度计算公式

        '''

      temperature = 27 - (reading_ADC4 - 0.706)/0.001721

      oled_string_or_shuzhi(str(round(temperature,2)),3,50)

      oled_string_or_shuzhi(str(round(reading_ADC2,2)),37,50)

      oled.show()

      sleep_ms(200) 

 

8:遇到的主要难题

1:初始化AD时machine.ADC(id),id这个参数配置并未理清楚,导致测量电压一直没有变化,最后通过翻阅pico的datasheet以及在micropython官方文档下终于解决。ADC这个对象在machine这个类里;初始化ADC对象有两种方法;machine.ADC(id),参数id可以使用Pin对象,也可直接指定为ADC通道使用Pin对象时,指定的GPIO需要支持ADC功能,即GPIO26-29使用指定ADC通道时,通道0-3对应GPIO26-29,通道4则对应内部温度传感器

2:oled库移植显示中文,通过阅读大量的CSDN博客,找到最佳的移植方法,然后在github寻找oled显示中文的库,在取模软件上取到对应的字模。花了好几天终于解决。

 

9:未来的计划或建议

1:未来的计划

我计划在嵌入式行业深究,本科毕业前熟悉 ARM、STM32 系列等嵌入式开发,熟悉常用接口硬件设计与驱动调试,包括 SPI,I2C、PCIe、USB、UART 等常见总线协议硬件原理设计、调试手段、驱动开发,能够对系统与设备问题进行分析定位熟练掌握自动化设备控制流程、深入了解硬件接口,精通硬件通信协议。我打算32就跑跑嵌入式实时操作系统,例如 freertos,rtthread 等,实现快速开发;

 2:建议

望自己不要计较其他得失,学会技术才是关键,确定了这个方向就要坚定的走下去,多跟大佬交流,感受自己的差距。

 

 10:最后的最后

 感谢硬禾学堂举办的活动,真的挺好,很能鼓励像我这样的小白,望硬禾学堂越办越好,我在这里由衷的谢谢你们了。

 

附件下载

项目需要库.rar
工程文件以及项目所需的库

团队介绍

河南工业大学本科生寇高阁

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号