XSANG5z

electronic clock

 
Overview

本工程的MCU选自国民技术的N32G430C8L7,利用内部延时函数和内部ADC实现时间和温度显示的功能
以下主要分两个方面(硬件和软件)讲一下电路和程序的设计
一、硬件部分
1、最小系统
最小系统部分的设计参考自Nation《电路设计指南》的最小系统参考设计原理图
图片有些模糊,资料我在下面都会分享
mcu中预留了tft屏幕的引脚和程序烧录的引脚
这里面我舍去了32.768khz的晶振部分
2、复位按键
当NRST引脚上出现低电平(外部复位) 将产生系统复位。外部NRST引脚复位电路如下。
注意:复位引脚NRST在设计时不能悬空
复位按键上面添加了电阻,也可以不添加这个电阻,添加该电阻可以加快复位相应时间
以下是不添加电阻的电路设计参考图
3、滤波电路
滤波是电路不可或缺的一部分,滤波电路作用是尽可能减小脉动的直流电压中的交流成分,保留其直流成分,使输出电压纹波系数降低,波形变得比较平滑,也可以减小静电对电路的影响,保护电路元器件。
本设计中也存在许多滤波电路,如复位按键的MCU、AMS1117、TYPE_C等电路部分都有滤波电容的存在
 
这些滤波电容在画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母座
5、0.96寸tft屏幕
屏幕部分参考自开源工程
>https://oshwhub.com/FENG22784321/0-96-tft-cai-ping-qu-dong-ban_copy
这里面有详细的讲解我就不在赘述
以下是我焊接好的屏幕
屏幕显示还是不错的,就是拍的有点模糊了
5、程序烧录
这里主要用了两个GPIO和一组电源线完成
烧录的工具是ST_LINK烧录软件是KEIL,对于的资料我会发在附件
二、软件部分
1、屏幕显示
屏幕的通讯方式是spi
以下是屏幕使用到的管脚初始化函数
屏幕初始化函数
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}
还有一些调用的显示字符和数字的函数
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++;};    }}
这里采用了软件延时更新时间,这样的时间误差比较大,如需要时间更精确因使用定时器或时钟模块
同时这里有一个优化点就是周期和日期的自动更新,可以参考万年历的程序
最后附上一些其他的图片
这个是焊接好的图片(有个按键还没有到货)
这是空板的图片
参考设计图片
×
 
 
Search Datasheet?

Supported by EEWorld Datasheet

Forum More
Update:2025-06-19 20:24:44

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
community

Robot
development
community

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号