本帖最后由 天问51单片机 于 2023-5-18 09:22 编辑
一、 项目介绍
1.1 设计初衷时间的流易和不可逆性是一个古今中外一再提到的内容,中国古代的计时仪器有太阳钟和机械钟两类。太阳钟是以太阳的投影和方位来计时,分别以土圭、圭表、日晷为代表。由于地球轨道偏心率以及地球倾角的影响,真太阳时和平太阳时是不一致的,机械钟应运而生,代表有水钟、香篆钟、太阳仪。 电子爱好者喜欢DIY各种创意时钟,主要有辉光管时钟、点阵屏时钟、液晶屏时钟这几种形态,基本功能包括计时、闹钟,还有些可以通过网络自动校时,天气预报等。
这次准备设计一个超迷你的时钟,在一个0.56英寸的数码管的基础上实现基本计时、闹钟功能,整体硬件成本极低。
时钟项目很适合嵌入式初学者的第一个综合作品,综合运用了数码管驱动显示技术,RTC时钟模块的I2C驱动,蜂鸣器的PWM驱动,按键的长短按处理,定时器的多任务时序控制。
1.2 演示视频
扫码查看
项目全部源文件开源在Gitee https://gitee.com/haohaodada-official/mini_clock 二、 功能设计
1.1 功能需求
计时功能:能显示年、月、日、时、分、秒。 闹钟功能:设定好几点几分后,到了设定时间会播放闹铃。 供电要求:内置锂电池,可独立工作3天以上,也可以通过USB线外接供电和充电。 成本要求:BOM价格控制在5元以内。 尺寸要求:长宽和0.56英寸的数码管基本相同,厚度在满足锂电池容量要求下。
1.2 功能分析我们选用的数码管只有4位,要显示这么多内容,就需要轮流来显示,我们定义第一页显示年,效果如下图所示:
第二页显示月和日,效果如下图所示:
第三页显示时和分,同时用冒号每隔1秒闪烁来表示秒,效果如下图所示:
现在我们可以让数码管轮流显示上述几个页面,就可以实现计时功能。 接下来,我们要能校准时间,需要通过按键来实现,这里我们用一个按键来实现,通过按键的短按和长按来实现。 我们定义短按来修改具体的数值大小,每短按一次,数值加1,超过范围后,返回到最小值。比如设置小时,超过23后要回到0开始,设置分钟,超过59后要回到0开始,其它类似处理。 我们定义长按来切换不同的页面,同时也是一个确认操作。另外我们还有一个闹钟功能,闹钟也需要设置,闹钟只是设置小时和分,设置的界面和小时分钟界面一样,这样容易让用户不容易察觉,所以我们可以在切换到闹钟界面时,用蜂鸣器发出声音来提示下,表示设置闹钟成功。 当每天时间到了设定的闹钟时间时,蜂鸣器发出闹铃声,我们可以通过短按按键来关闭闹铃。 电源部分需要增加锂电池电源管理来解决,同时要考虑整个系统的功耗。
三、 硬件设计
1.1 电源管理模块这里选用TP4056作为锂电池充放电管理芯片,该芯片支持单节锂离子电池恒流/恒压线性充电,充电电流可以设置,最大支持1000mA,带有电池温度监测,欠压锁定,自动再充电和两个状态引脚以显示充电和充电终止功能。
这里,我们把TEMP引脚接地,不使用温度监测功能。我们把R13电阻设置为1.2K,这样就设置充电电流大小为1000mA,内部计算公式如下:
设置红色LED为充电状态指示灯,蓝色LED为充满状态指示灯,分别连接到CHRG和STDBY引脚,充电状态表如下图所示:
整个系统,在锂电池供电时,系统电压就是锂电池的电压(3~4.2V),在USB插入充电时,系统电压稳定在4.2V。
1.2 单片机最小系统CH32V003系统工作电压范围为2.7~5.5V,通过数据手册可以看到CH32V003复位引脚有别于常见的单片机,需要外接上拉电阻,芯片已经内置上拉电阻,我们只需要外接一个0.1uF电容到地就可以,这里我们也不需要按键来复位。
所以CH32V003只需要给VSS和VDD引脚供电就可以工作了,当然为了方便程序下载调试,我们还需要引出SWIO口,芯片内核自带一个串行单线调试的接口,SWIO 引脚(Single Wire Input Output)。系统上电或复位后默认调试接口引脚功能开启。SWIO口也可以通过程序配置设置通用IO口。
程序出了可以用SWIO口连接专用下载器来下载以外,我们也可以通串口的ISP功能来更新程序,天问五幺出厂的CH32V003已经内置了ISP Bootloader在里面,可以用通用的USB转串口模块来下载程序,这里我们选用Type-C接口来作为充电和程序下载接口。
1.3 显示模块
数码管的每个8字的一小段,内部实际就是一个LED,用A/B/C/D/E/F/G 7来标示对应的段,外加用DP来标示一个小数点或者冒号,设置对应的段亮,就可以组成0到F 十六个字符,根据公共端是共阴还是共阳,分为共阴数码管和共阳数码管两种。
四位数码管就有四个公共端,我们一般称作位码,当我设置好需要显示的段码后,选通对应的位码,就可以在对应的位上显示相应的字符。
但是如果我们要显示上图所示的123,要怎么操作呢?我们可以先设置段码显示字符3,同时选通第4位,然后设置段码显示字符2,同时选通第2位,最后设置段码显示字符1,同时选通第2位。这样轮流显示,只要速度够快,人的眼睛还没反应过来,就已经显示下一位了,这是利用了人眼的视觉暂留现象,这种显示技术,我们叫做动态扫描。 显示部分的整体电路如下图所示:
我们选用的数码管是12脚的0.56英寸的共阴数码管,为了降低成本和做到最小体积,不用TM1650这类的数码管专用显示芯片,采用单片机引脚直驱模式,用PC端口连接段码,方便后续程序处理。因为我们选用的是带中间冒号的类型,所以DP脚控制的是中间冒号的亮灭,数码管的亮度可以通过串联的电阻来控制,我们这里综合考虑亮度和功耗后选用1K。因为IO口驱动电流比较小,四个公共端通过NPN三极管来控制通断。
1.4 时钟模块CH32V003内部没有RTC模块,我们需要外接一个时钟模块,这里我们选用PCF8563时钟芯片,基于32.768kHz计时,可以提供年、月、日、时、分、秒、星期数据,通过I2C总线通讯,支持报警时间设置,工作电压范围为1.0~5.5V。
两个I2C总线引脚需要上拉电阻到电源,掉电备用电池选用CR1220纽扣电池,D3二极管为防止VCC对电池充电,CR1220为非可充电电池;D4二极管为防止电池对VCC电路放电,快速消耗电池电量。备用电池可以不用,即把锂电池当作备用电池来使用。 1.5 按键模块按键部分这里因为电路板空间问题,没加上拉电阻,到时通过设置IO口上拉输入,采用芯片内部上拉,按键按下时电平为低,松开时电平为高。
1.6 蜂鸣器模块采用无源蜂鸣器,后续程序里可以通过PWM驱动,发出特定声音,蜂鸣器驱动电流比较大,我们通过三极管来驱动,电阻R14为限流电阻,防止流过基极电流过大损坏三极管。电阻R15有着重要的作用,第一个作用:R15 相当于基极的下拉电阻。如果A端被悬空则由于R15的存在能够使三极管保持在可靠的关断状态,如果删除R15则当BEEP输入端悬空时则易受到干扰而可能导致三极管状态发生意外翻转或进入不期望的放大状态,造成蜂鸣器意外发声。第二个作用:R15可提升高电平的门槛电压。如果删除R15,则三极管的高电平门槛电压就只有0.7V,即A端输入电压只要超过0.7V 就有可能导通,添加R15的情况就不同了,当从A端输入电压达到约2.2V 时三极管才会饱和导通。
有源蜂鸣器和无源蜂鸣器的驱动电路区别主要在于无源蜂鸣器本质上是一个感性元件, 其电流不能瞬变,因此必须有一个续流二极管提供续流。否则,在蜂鸣器两端会有反向感应电动势,产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其它部分。而如果电路中工作电压较大,要使用耐压值较大的二极管,而如果电路工作频率高,则要选用高速的二极管。这里选择的是 IN4148 的开关二极管。
|