用沁恒CH32V003在没有USB、触摸、LCD驱动芯片的情况下实现3位7段LCD显示

描述

 一个非常硬核的黑客项目,以极简的设计,使用沁恒的 ch32v003,在不使用驱动芯片的前提下,实现支持 USB-C、触控的 7 段 LCD 屏幕。 

ch32  项目概览

在电子工程领域,通过创新的软硬件协同设计,可以在极简的硬件平台上实现复杂功能,本项目即是对此理念的一次成功实践。项目把一块普通的7段LCD,转化为一个具备触摸感应能力并通过USB-C接口与主机通信的功能性设备。整个系统的核心是一颗 CH32V003 RISC-V 单片机,神奇的地方在于它本身并不具备 USB 通信、LCD 驱动或触摸感应的专用硬件支持

看下设计的原理图,芯片就一个成本一块多的 ch32v003 加一个 5V 转 3.3 V 的 LDO XC6206P332MR-G,没有任何额外的驱动芯片:

ch32J1 也并没有使用 USB 接插件,而是直接把 PCB 做成了插头:ch32为了确保正常的拔插,要求:
  • PCB 厚度必须为 0.6 mm
  • PCB 应使用 ENIG(化学镀镍浸金) 工艺,而不是 HASL(热风整平或喷锡),因为 HASL 可以提供更平滑、耐磨的接触面。
ch32CH32V003 无需预编程,只需能接触到 GND/SWIO/5V 引脚即可烧录引导加载程序(bootloader)。LCD 屏是淘宝上找来的,不带驱动,驱动电压为 3V,符合以下规格:ch32ch32ch32

USB 协议的软件实现

由于 CH32V003 并不带原生的 USB 控制器,作者使用了 Bit-Banged 的技术理念,利用软件直接操控 GPIO 引脚来模拟硬件协议,生成速率为 1.5Mbps 的差分信号。虽然会占用大量CPU开销,但还是成功模拟了一个 USB1.1 设备。

当然,需要对这一做法进行权衡:虽然节省了 USB PHY 物理层和控制器硬件的成本,但牺牲了宝贵的CPU周期和系统的稳定性。

在此基础上,还开发了自定义的引导加载程序(Bootloader),使得设备固件可以直接通过USB接口进行更新,无需借助外部编程器。

GPIO 直接驱动 LCD

对于无源 LCD 的驱动,项目通过单片机的 GPIO 引脚产生精确的时序脉冲,并利用其内部的上下拉电阻,以软件模拟专用驱动芯片的功能,从而控制各笔段的显示。与简单的直流驱动 LED 数码管不同 ,扭曲向列(Twisted Nematic, TN)液晶显示器(LCD)需要交流(AC)驱动波形,以防止液晶材料发生电化学降解。完全通过软件直接生成了这种复杂的驱动波形 

对于基本的 LCD 输出,可以使用一个简单的 10 阶段波形

  • 阶段 0-3 = 依次将特定的 COM(公共电极)引脚驱动为低电平,同时将任何需要点亮的 SEG(段电极)引脚驱动为高电平

  • 阶段 4 = 空闲时间,确保没有电压差。这也有助于控制对比度。

  • 阶段 5-8 = 依次将特定的 COM 引脚驱动为高电平,同时将任何需要点亮的 SEG 引脚驱动为低电平

  • 阶段 9 = 用于控制对比度的另一半空闲时间。

ch32

可以看到,使用 USB 会把事情搞砸,因为当 USB 运行时,它无法将 SEG 引脚的电压稳定在 VCC 的一半。

ch32对于触摸功能,输出会通过内部上拉电阻从低电压状态重复释放,同时使用 ADC 测量电压以获取触摸量。ch32这看起来很完美,直到 USB 来搅局。ch32

基于 ADC 的电容式触摸感应

这或许是项目最具创新性的部分。它在没有任何额外硬件的情况下,将 LCD 的引脚转变成了电容式触摸传感器。这一功能的实现,巧妙地利用了 CH32V003 内置的10位模数转换器(ADC)  

其测量过程是一个经过精确计时的序列:

  1. 首先将线路驱动至低电平,以对任何电容进行放电。

  2. 在启动 ADC 采样的同时,为 LCD 的所有端口应用上拉电阻。ADC 的设置和采样时间点必须精确对齐到 Fcpu/2  

  3. 这个过程使得 LCD 引脚上的电压开始上升,其上升速率与引脚上的总电容成反比。当手指触摸玻璃时,会引入额外的人体电容,从而减缓电压上升的速度。

  4. 通过高速、多次的采样(即过采样技术),系统能够从噪声中提取出这一微弱的电容变化信号,从而判断触摸事件的发生。

  5. 为提高输入的可靠性,软件层面还集成了迟滞算法,用以有效区分真实的“按下”与“释放”动作,防止了误触发。

并发性的挑战

该项目的核心成就不仅在于实现了以上三项功能,更在于让它们在一个资源极其有限(2KB SRAM, 16KB Flash)的单核MCU上并发运行  

这三项任务对系统资源的要求是相互冲突的:USB 需要高优先级时序来保证其比特流的完整性;LCD 需要一个持续、有节奏的刷新率(约30-60 Hz)来避免闪烁;而触摸感应则需要一个安静、稳定的模拟环境以进行精确的 ADC 读数。

波形图中的干扰现象 ,是系统运行在其能力极限的典型症状。来自 USB 任务的中断可能会延迟 LCD 的刷新,导致可见的闪烁,或者扰乱触摸感应的 ADC 采样窗口,导致错误的读数。与基于硬件的解决方案相比,这是位冲撞(软件)方法最主要的缺点和风险   

该项目的成功严重依赖 于CH32V003 的青稞 V2A 内核及其 GPIO 端口的特定且可预测的性能特征。将此代码移植到另一个 MCU,即使规格相似,也极有可能需要对所有时序关键的循环和中断处理程序进行全面的重新校准。所以说这并非一个可移植的解决方案。太黑科技了!

一定要那么省钱?那么黑科技么?

该方案过于黑科技,对技术要求的门槛较高,且不易移植,主要目的是炫技+装逼 :P。从产品开发的角度看,这可能并不是一个好的方案,虽然成本很低、BOM极简,但同时带来了系统不稳定的问题。因此,基于不同的场景,需要采用的方案。作为对比,我们完全可以使用性能更强、外设更多的 MCU,下表是一个 MCU 解决方案的对比,可做参考:ch32同样的,如果不拘泥于成本,对稳定性要求较高,我们也完全可以使用外部的驱动芯片,这样会极大的降低固件的复杂性,对开发人员更友好,也利于缩短开发难度和周期。下图是一个简单的对比:ch32当然,除了升级硬件、使用外部 IC 外,也可以使用更直接的方法:购买与集成的显示模块,比如直接采购 SparkFun 的串行7段显示器(板载ATMega328)。

结束语

该项目成功地将无连接器 USB-C 设计、软件实现的 USB 通信以及新颖的电容式触摸感应方法整合在一套极低成本的硬件方案中。它充分展示了在资源受限的微控制器上,凭借对电子原理的深刻理解和精巧的软件工程,依然能够开发出功能丰富且实用的嵌入式系统。当然,黑客的项目虽然很酷,但在实际的产品设计中并不常用。我们应该根据不同的需求、场景,制定合理的方案。这也是硬件开发好玩的地方!最后,项目的仓库在这里:

https://github.com/cnlohr/ch32v003_3digit_lcd_usb/

有兴趣的小伙伴可以自己尝试复刻!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分