电子时钟 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 电子时钟

  • 1.8k
  • 6
  • 24

简介:这是一个简单的电子时钟,可以显示温度,时间,星期,年月日。

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2022-09-25 20:31:25
更新时间: 2023-07-27 12:03:35
描述

本工程的MCU选自国民技术的N32G430C8L7,利用内部延时函数和内部ADC实现时间和温度显示的功能

以下主要分两个方面(硬件和软件)讲一下电路和程序的设计

一、硬件部分

1、最小系统

最小系统部分的设计参考自Nation《电路设计指南》的最小系统参考设计原理图

g5YUnL7RjTHsOXyj4XqFrBtWy62rY5YUxhtTbaTC.png

图片有些模糊,资料我在下面都会分享

6ciQ0074ai5YV642lMCICrhvATlUQX0YZARX7iB9.png

mcu中预留了tft屏幕的引脚和程序烧录的引脚

这里面我舍去了32.768khz的晶振部分

2、复位按键

当NRST引脚上出现低电平(外部复位) 将产生系统复位。外部NRST引脚复位电路如下。

mmVCufmIDgR8jt91Xda4H8oM1g8k28yM5RRc4fOe.png

注意:复位引脚NRST在设计时不能悬空

复位按键上面添加了电阻,也可以不添加这个电阻,添加该电阻可以加快复位相应时间

以下是不添加电阻的电路设计参考图

XhsKjL6Z05JJjKYEq9cwAN16ntvIPGF0VFo5DMtP.png

3、滤波电路

滤波是电路不可或缺的一部分,滤波电路作用是尽可能减小脉动的直流电压中的交流成分,保留其直流成分,使输出电压纹波系数降低,波形变得比较平滑,也可以减小静电对电路的影响,保护电路元器件。

本设计中也存在许多滤波电路,如复位按键的MCU、AMS1117、TYPE_C等电路部分都有滤波电容的存在

6WOUZEjcrrxRkHip3FvZqJ4MDnVz11qyp9oTlcrD.png

 

0XfH6zYvY6RlI5wU9BdFj6rwGTh9fIkkpvobnFea.png

这些滤波电容在画pcb时因都尽可能的靠近需要滤波的管脚,如果离的太远那么滤波效果可能也就甚微

4、TYPE_C

USBType-C接口(简称Type-C)是一种通用串行总线(USB)的硬件接口形式,其规范由USB开发者论坛(USB-IF)发布。它的特点在于更加纤薄的设计、更快的传输速度(USB3.1最高10Gbps)以及更强悍的电力传输(最高100W),更重要的是Type-C插接口支持USB接口双面插入,正式解决了“USB永远插不准”的世界性难题。在USBType-C规范发布后,许多新款的Android移动设备、笔记本电脑、台式机甚至是游戏机等3C设备开始使用这种连接端口。

但是本电路中TYPE_C只是用来供电,所以在此选用了6pin的type_c母座

HDa88ajDo0KArAC7Le8yoTWwuqd0myF1yKr4IxCK.png

5、0.96寸tft屏幕

屏幕部分参考自开源工程

>https://oshwhub.com/FENG22784321/0-96-tft-cai-ping-qu-dong-ban_copy

这里面有详细的讲解我就不在赘述

以下是我焊接好的屏幕

thUltESv6fFps1EAnN07tLni03lt1agWjTSCJ6TX.jpeg

WFDdVHVqAgzhaYwZ56bZ2hTPqilESbIL0OSAhWQq.png

屏幕显示还是不错的,就是拍的有点模糊了

5、程序烧录

这里主要用了两个GPIO和一组电源线完成

UXnVOMFoo1DJC8WNgQ1N4OkbuK29WXEeDolwkhLD.png

烧录的工具是ST_LINK烧录软件是KEIL,对于的资料我会发在附件

二、软件部分

1、屏幕显示

屏幕的通讯方式是spi

以下是屏幕使用到的管脚初始化函数

cAjtPRyE7tl5edEhbX0IRw8p6DVmdGQ5VFTdkBlk.png

屏幕初始化函数

void LCD_Init(void)
{
//    RCC_Configuration();
    LCD_GPIO_Init();//初始化GPIO
    
    LCD_RES_Clr();//复位
    SysTick_Delay_Ms(100);
    LCD_RES_Set();
    SysTick_Delay_Ms(100);

    LCD_BLK_Set();//打开背光
    SysTick_Delay_Ms(100);

    //************* Start Initial Sequence **********//
    LCD_WR_REG(0x11); //Sleep out
    SysTick_Delay_Ms(120);              //Delay 120ms
    //------------------------------------ST7735S Frame Rate-----------------------------------------//
    LCD_WR_REG(0xB1);
    LCD_WR_DATA8(0x05);
    LCD_WR_DATA8(0x3C);
    LCD_WR_DATA8(0x3C);
    LCD_WR_REG(0xB2);
    LCD_WR_DATA8(0x05);
    LCD_WR_DATA8(0x3C);
    LCD_WR_DATA8(0x3C);
    LCD_WR_REG(0xB3);
    LCD_WR_DATA8(0x05);
    LCD_WR_DATA8(0x3C);
    LCD_WR_DATA8(0x3C);
    LCD_WR_DATA8(0x05);
    LCD_WR_DATA8(0x3C);
    LCD_WR_DATA8(0x3C);
    //------------------------------------End ST7735S Frame Rate---------------------------------//
    LCD_WR_REG(0xB4); //Dot inversion
    LCD_WR_DATA8(0x03);
    //------------------------------------ST7735S Power Sequence---------------------------------//
    LCD_WR_REG(0xC0);
    LCD_WR_DATA8(0x28);
    LCD_WR_DATA8(0x08);
    LCD_WR_DATA8(0x04);
    LCD_WR_REG(0xC1);
    LCD_WR_DATA8(0XC0);
    LCD_WR_REG(0xC2);
    LCD_WR_DATA8(0x0D);
    LCD_WR_DATA8(0x00);
    LCD_WR_REG(0xC3);
    LCD_WR_DATA8(0x8D);
    LCD_WR_DATA8(0x2A);
    LCD_WR_REG(0xC4);
    LCD_WR_DATA8(0x8D);
    LCD_WR_DATA8(0xEE);
    //---------------------------------End ST7735S Power Sequence-------------------------------------//
    LCD_WR_REG(0xC5); //VCOM
    LCD_WR_DATA8(0x1A);
    LCD_WR_REG(0x36); //MX, MY, RGB mode
    if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
    else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
    else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
    else LCD_WR_DATA8(0xA0);
    //------------------------------------ST7735S Gamma Sequence---------------------------------//
    LCD_WR_REG(0xE0);
    LCD_WR_DATA8(0x04);
    LCD_WR_DATA8(0x22);
    LCD_WR_DATA8(0x07);
    LCD_WR_DATA8(0x0A);
    LCD_WR_DATA8(0x2E);
    LCD_WR_DATA8(0x30);
    LCD_WR_DATA8(0x25);
    LCD_WR_DATA8(0x2A);
    LCD_WR_DATA8(0x28);
    LCD_WR_DATA8(0x26);
    LCD_WR_DATA8(0x2E);
    LCD_WR_DATA8(0x3A);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x01);
    LCD_WR_DATA8(0x03);
    LCD_WR_DATA8(0x13);
    LCD_WR_REG(0xE1);
    LCD_WR_DATA8(0x04);
    LCD_WR_DATA8(0x16);
    LCD_WR_DATA8(0x06);
    LCD_WR_DATA8(0x0D);
    LCD_WR_DATA8(0x2D);
    LCD_WR_DATA8(0x26);
    LCD_WR_DATA8(0x23);
    LCD_WR_DATA8(0x27);
    LCD_WR_DATA8(0x27);
    LCD_WR_DATA8(0x25);
    LCD_WR_DATA8(0x2D);
    LCD_WR_DATA8(0x3B);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x01);
    LCD_WR_DATA8(0x04);
    LCD_WR_DATA8(0x13);
    //------------------------------------End ST7735S Gamma Sequence-----------------------------//
    LCD_WR_REG(0x3A); //65k mode
    LCD_WR_DATA8(0x05);
    LCD_WR_REG(0x29); //Display on
}

还有一些调用的显示字符和数字的函数

oXttWyVkQyAnbcPyra96wVWpLTCrLj7c8afNScBt.png

HCP9Jxg8pKujNZPDA0JeGUvKPOYGB3fhpWc2c9vJ.png

2、内部ADC——温度采集

2.1N32G430的ADC简介

12 位 ADC 是使用逐次逼近的高速模数转换器。
它有多个通道,19 个通道,可测量 16 个外部和 3 个内部
信号源。 每个通道的 A/D 转换有四种执行模式:单次、连续、扫描或间断。 ADC 转换值存储(左对齐/
右对齐)在 16 位数据寄存器中。
可以通过模拟看门狗检测输入电压是否在用户定义的高/低阈值内,并且
ADC 的输入时钟的最大频率为 80MHz。
ADC 需要三个时钟,ADC_CLK,HCLK, ADC_1MCLK。
 HCLK 用于寄存器的访问时钟。
 ADC_CLK 为 ADC 的工作时钟,ADC_CLK 有两个源(HCLK 的分频或 PLL 的分频),HCLK 分频与
系统是同步时钟,PLL 的分频与系统是异步时钟,用同步时钟的好处是在触发 ADC 响应触发时,没有
不确定性,用 PLL 的分频时钟的好处是可以独立处理 ADC 的工作时钟,不会影响到挂在 HCLK 的其
他模块。
 ADC_1MCLK 用于内部计时功能,在 RCC 中配置,频率大小必须配置成 1M。
2.2ADC对于通道
温度传感器连接到通道 ADC_IN17
2.3温度采集设置
设置 ADC_CTRL2.TEMPEN 位为 1,使能温度传感器和 VREFINT,设备工作时使用温度传感器检测环境温
度。温度传感器采样的输出电压通过 ADC_IN17 通道转换为数字值。温度传感器工作时,理想的采样时间
为 17.1us;当温度传感器不工作时,ADC_CTRL2.TEMPEN 位可通过软件清零以降低功耗。
温度传感器的输出电压随温度线性变化。不同的芯片由于生产工艺的不同,在温度曲线上会有不同的偏移
量。通过测试,发现最大偏移为 3°C。这一特性使得内部温度传感器更适合检测温度变化。不适合测量绝对
温度。当需要精确的温度测量时,应使用外部温度传感器
2.4测量温度值
1. 配置通道(ADC_IN17)和通道的采样时间为 17.1us
2. 将 ADC_CTRL2.TEMPEN 位设置为 1 以启用温度传感器和 VREFINT
3. 设置 ADC_CTRL2.ON 位为 1 以启动 ADC 转换(或通过外部触发)
4. 读取 ADC 数据寄存器中的温度数据,通过以下公式计算温度值:
温度 (°C) = {(V25 - VSENSE) / Avg_Slope} + 25
其中:
V25 = 25 摄氏度时的 VSENSE
Avg_Slope = 温度和 VSENSE 曲线的平均斜率(mV/°C 或 μV/°C)
参考数据手册的电气特性章节中 V25 和 Avg_Slope 的实际值。
注意:在传感器从断电模式唤醒到正确输出 VSENSE 之前,有一个建立时间; ADC 上电后还有一个建立
时间,所以为了缩短延迟,ADC_CTRL2.TEMPEN 和 ADC_CTRL2.ON 位应该同时置位。
3、mian函数
int main(void)
{
    RCC_Configuration();
    ADC_INIT();
    DMA_INIT();
    LCD_GPIO_Init();
    SysTick_Delay_Ms(1000);
    LCD_Init();
  LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  LCD_ShowString(14,25,"2022-9-25",BLACK,WHITE,16,0);
    LCD_ShowString(96,25,"Sunday",BLACK,WHITE,16,0);
    LCD_ShowString(14,85,"Clock TC",BLACK,WHITE,16,0);
    LCD_ShowString(96,85,"T:   C",RED,WHITE,16,0);
    while(1)
    {
          TempValue = TempCal(ADCConvertedValue);
            LCD_ShowIntNum(112,85,TempValue,2,RED,WHITE,16);
        SysTick_Delay_Ms(900);
            LCD_ShowIntNum(14,47,time_shi,2,RED,WHITE,32);
            LCD_ShowString(44,47,":",RED,WHITE,32,0);
            LCD_ShowIntNum(55,47,time_fen,2,RED,WHITE,32);
            LCD_ShowString(85,47,":",RED,WHITE,32,0);
            LCD_ShowIntNum(96,47,time_miao,2,RED,WHITE,32);
            time_miao++;
            if(time_miao>=60){time_miao=0;time_fen++;};
            if(time_fen>=60) {time_fen =0;time_shi++;};
            if(time_shi>=24) {time_shi =0;time_fen++;};
    }
}
这里采用了软件延时更新时间,这样的时间误差比较大,如需要时间更精确因使用定时器或时钟模块
同时这里有一个优化点就是周期和日期的自动更新,可以参考万年历的程序
最后附上一些其他的图片
TGkS884l6EyLY3p6OG3tcBMsxDo9DeE2aAHkLUcX.jpeg
这个是焊接好的图片(有个按键还没有到货)
FUaybid7EiwLiJXvKozu3FVTpN8Blp0PKxpADP4c.jpeg
这是空板的图片
设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP