基于树莓派RP2040的嵌入式系统学习平台制作模拟电压表
本项目基于树莓派Pico的嵌入式系统学习平台的数字电压表,可扩展性强、集成方便,利用PIco的AD转换器采集电压,利用LCD模拟指针式显示显示方式实现双路电压表测量和显示。
标签
嵌入式系统
数字逻辑
接口
2022寒假在家练
anyaoy
更新2022-03-02
北京理工大学
846

内容介绍

基于树莓派RP2040的嵌入式系统学习平台制作模拟电压表

 

一、项目介绍

模拟电压表是采用数字化测量计数,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,本项目基于树莓派Pico的嵌入式系统学习平台的数字电压表,可扩展性强、集成方便,利用PIco的AD转换器采集电压,利用LCD模拟指针式显示显示方式实现双路电压表测量和显示。

二、设计思路

   利用PIco的AD转换器采集四向摇杆的两路电压,LCD上利用背景图的方式显示两路指针式表盘效果,根据电压的值来控制指针的指示方向。为了达到电位计指针有实际摆动效果,程序上需要对指针显示进行过程移动控制。流程图如下:FoDKQwZbYEyuv1gvWaqDnfb2fjGj

三、硬件介绍

采用树莓派Pico核心芯片RP2040:

1、双核Arm Cortex M0+内核,可以运行到133MHz

264KB内存

2、性能强大、高度灵活的可编程IO可用于高速数字接口

3、片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度

4、支持MicroPython、C、C++编程

板上功能:

1、240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789

2、四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制

3、板上外扩2MB Flash,预刷MicroPython的UF2固件

4、一个红外接收管 + 一个红外发射管

5、一个三轴姿态传感器MMA7660

6、一个蜂鸣器

7、双排16Pin连接器,有SPI、I2C以及2路模拟信号输入

8、可以使用MicroPython、C、C++编程

9、USB Type C连接器用于供电、程序下载

本项目主要用到RP2040的AD采集、四向摇杆和LCD屏幕,硬件框图如下:

FhH1C_rYkjkc1_jleK59ExLAymoI

四、实现功能及图片展示

实现双通道电压表指针式和数字显示电压

FoF0BjM_zaNTb-M8CLIbOjxr7UA0

Fp2ehU1BMfU-AuaDietCRWLSu1LnFtobhuBVq7y_ZiuunYyE-75di8NQ

五、主要代码片段及说明

1、指针代码,指针表盘制作角度是120度,电压0V对应角度30度,电压4V对应角度是150度。

  angle1=round(30+(oldduty*120/4))  #电压转换到对应角度
if angle1<90:
        jiaodu1=angle1*3.1415926/180.0    #指针偏转角度控制
        divy=math.sin(jiaodu1)*40
        divx=math.cos(jiaodu1)*40
        x=int(95-divx)
        y=int(100-divy)
        if old_x!=x:
            display.line(old_x-1,old_y,95,100,st7789.WHITE)#指针清除显示
        else:
            if old_y!=y:
                display.line(old_x-1,old_y,95,100,st7789.WHITE)#指针清除显示
        old_x=x
        old_y=y
        display.line(x-1,y,95,100,st7789.BLACK)
    else:
        angle1=180-angle1
        jiaodu1=angle1*3.1415926/180.0 #指针偏转角度控制
        divy=math.sin(jiaodu1)*40
        divx=math.cos(jiaodu1)*40
        x=int(95+divx)
        y=int(100-divy)
        if old_x!=x:
            display.line(old_x-1,old_y,95,100,st7789.WHITE)#指针清除显示
        else:
            if old_y!=y:
                display.line(old_x-1,old_y,95,100,st7789.WHITE) #指针清除显示
        old_x=x
        old_y=y
        display.line(x-1,y,95,100,st7789.BLACK)#指针显示

2、指针摆动效果,利用历史指针位置和当前指针位置比较,每次指针电压变动2V。

   if oldduty<duty-0.3:            #指针摆动控制
       oldduty = oldduty + 0.2
      else:
        if oldduty>duty+0.3:
            oldduty = oldduty - 0.1
        else:
            oldduty = duty
      if oldduty1<duty1-0.3:
       oldduty1 = oldduty1 + 0.2
      else:
        if oldduty1>duty1+0.3:
            oldduty1 = oldduty1 - 0.1
        else:
            oldduty1 = duty1

六、遇到的主要难题和解决办法

指针电压指示的准确性,需要表盘角度准确。前期制作表盘图片时表盘角度不标准,也没有完全左右对齐,做出来后指针指示电压有偏差。经过修改表盘图片角度,使其左右完全对齐后指针指示电压正常。

七、未来的计划或者建议

当前表盘利用画线的方式实现指针,后期改进计划可以利用图片做指针,更加美观,对于图片指针需要配置更高的硬件支持,利用图片指针的旋转算法来实现电压指示。

附件下载

ST7789.zip
代码文件

团队介绍

北京理工大学孙心宇
团队成员
anyaoy

评论

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