#训练营#数字示波器 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

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

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

3、支持简单的电路仿真

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

专业版 professional

1、全新的交互和界面

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

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

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

专业版 #训练营#数字示波器

简介:基于GD32的简易示波器,兼容STM32,CW32单片机。

开源协议: GPL 3.0

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

已参加:简易数字示波器训练营

创建时间: 2024-03-04 20:15:22
更新时间: 2024-04-06 15:11:50
描述

简易数字示波器                                                                          

做了两个版本,一个是开发版版本,另一个是裸芯片版本。

设计大多数参考官方文档 —— 《简易数字示波器项目文档 (yuque.com)》

引脚功能图

充电电路设计

 

充电芯片采用IP5306移动电源充放电管理芯片,2.1A 充电和2.4 A放电对于示波器的小电池应该属于快充级别的了。芯片具有输出过流、过压、短路保护,输入过压、过充、过放、过流放电保护,整机过温保护。支持边冲边放,一键开关机,led电量显示。

上图为官方数据手册的参考电路设计原理图,太多的LED电量显示灯放在电路板上反而会不好看,所以计划保留一个指示灯用于充放电指示,在设计一个电量检测电路在屏幕上显示当前电量。

参考数据手册里的一颗灯的参考电路进行设计,电量检测使用两个电阻对电池电压进行分压,用单片机的ADC引脚检测电压大小。

分压计算公式:U BAT_v = R12 / ( R8 + R12) * UBAT

电源电路设计

屏幕驱动电路设计

模拟前端电路设计

比较测频电路

芯片核心和外围电路设计

核心电路

外围电路

其他电路设计

按键电路

LED指示灯电路

编码器电路

代码修改

修改屏幕方向

在Hardware/tft_init.h中修改一下宏定义

#define USE_HORIZONTAL 2  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

修改屏幕像素偏移

在Hardware/tft_init.c中修改函数TFT_Address_Set中对x1,x2,y1,y2加减进行偏移

        TFT_WR_REG(0x2a);//列地址设置
        TFT_WR_DATA(x1+1);
        TFT_WR_DATA(x2+1);
        TFT_WR_REG(0x2b);//行地址设置
        TFT_WR_DATA(y1+2);
        TFT_WR_DATA(y2+2);
        TFT_WR_REG(0x2c);//储存器写

修改全屏波形

源代码的波形显示区域太小,观察频率较低的波形不直观所以修改

在Hardware/tft.c中修改画折线函数drawCurve修改显示宽度小于160。

/*
*   函数内容:画折线
*   函数参数:short int rawValue--Y轴参数值
*   返回值:  无
*/
void drawCurve(uint8_t yOffset,short int rawValue)  
{
uint16_t x=0,y=0,i=0;
    
if((rawValue >= 40)||(rawValue < 0)){
rawValue=40;
}
    
y = yOffset - rawValue;  //data processing code
if(firstPoint)//如果是第一次画点,则无需连线,直接描点即可
{
TFT_DrawPoint(0,y,CurveColour);   
lastX=0;
lastY=y;
firstPoint=0; 
}
else
{
x=lastX+1;
        
if(x<160)  //不超过屏幕宽度
{
TFT_DrawLine(lastX,lastY,x,y,CurveColour);
for(i=0;i<=50;i++)
{
TFT_DrawPoint(x+1,i,BLACK);//画点
}
lastX=x;
lastY=y;
}
else  //超出屏幕宽度,清屏,从第一个点开始绘制,实现动态更新效果
{         
TFT_DrawPoint(0,y,CurveColour);   
lastX=0;
lastY=y;
}
  }
}

修改显示UI

将波形的显示区域修改后原来的显示ui会错乱所以修改

在Hardware/tft.c中修改静态ui显示函数TFT_StaticUI和显示参数函数TFT_ShowUI

/*
*   函数内容:静止UI界面
*   函数参数:无
*   返回值:  无
*/
void TFT_StaticUI(void)
{
    uint16_t i=0,j=0;
    
    char showData[32]={0};
    
    //TFT_ShowChinese(10,0,(uint8_t *)"简易示波器",BLACK,GREEN,16,0);
    
    sprintf(showData,"  PWM ");
    TFT_ShowString(5,72,(uint8_t *)showData,BLACK,YELLOW,16,0);  
    memset(showData,0,32);
    
    TFT_ShowChinese(55,56,(uint8_t *)"输出状态",WHITE,PURPLE,12,0);
    
    sprintf(showData,"      ");
    TFT_ShowString(55,72,(uint8_t *)showData,BLACK,YELLOW,16,0);  
    memset(showData,0,32);
    
    TFT_ShowChinese(110,56,(uint8_t *)"输出频率",WHITE,PURPLE,12,0);
    
    sprintf(showData,"      ");
    TFT_ShowString(110,72,(uint8_t *)showData,BLACK,YELLOW,16,0);  
    memset(showData,0,32);
    
    sprintf(showData,"        ");
    TFT_ShowString(110,92,(uint8_t *)showData,WHITE,PURPLE,12,0);  
    memset(showData,0,32);
    TFT_ShowChinese(118,92,(uint8_t *)"占空比",WHITE,PURPLE,12,0);
    
    sprintf(showData,"      ");
    TFT_ShowString(110,106,(uint8_t *)showData,BLACK,YELLOW,16,0);  
    memset(showData,0,32);
    
    TFT_ShowChinese(5,92,(uint8_t *)"输入幅值",WHITE,PURPLE,12,0);
    
    TFT_ShowChinese(55,92,(uint8_t *)"输入频率",WHITE,PURPLE,12,0);
    
    for(i=0;i<=128;i=i+2)
    {
        TFT_DrawPoint(106,i,YELLOW);
    }
    
    for(i=0;i<160;i++)
    {
        TFT_DrawPoint(i,51,BorderColour);
    }
    for(i=0;i<=50;i++)
    {
        TFT_DrawPoint(0,i,BorderColour);
    }
    for(i=0;i<16;i++)
    {
        TFT_DrawPoint((i*10)+2,52,BorderColour); 
        TFT_DrawPoint((i*10)+3,52,BorderColour); 
    }
    for(i=0;i<16;i++)
    {
        TFT_DrawPoint((i*10)+2,53,BorderColour); 
        TFT_DrawPoint((i*10)+3,53,BorderColour);
    }
}
/*
*   函数内容:  显示字符串
*   函数参数:  uint16_t vpp--峰峰值
*               uint16_t freq-频率
*               float DoBias--直流偏执信号
*   返回值:    无
*/
void TFT_ShowUI(volatile const struct Oscilloscope *value)
{
    char showData[32]={0};
    
    sprintf(showData,"%1.2fV ",(*value).vpp);
    TFT_ShowString(5,106,(uint8_t *)showData,BLACK,GREEN,16,0);  
    memset(showData,0,32);
    
    if((*value).gatherFreq>=1000)
    {
        sprintf(showData,"%2.0fKHz",(*value).gatherFreq/1000.0f);
        TFT_ShowString(55,106,(uint8_t *)showData,BLACK,GREEN,16,0);  
        memset(showData,0,32);
    }
    else
    {
        sprintf(showData,"%3.0fHz ",(*value).gatherFreq);
        TFT_ShowString(55,106,(uint8_t *)showData,BLACK,GREEN,16,0);  
        memset(showData,0,32);  
    }

    if((*value).ouptputbit == 1)
    {   
        TFT_ShowChinese(55,72,(uint8_t *)"打开",BLACK,YELLOW,16,0);
    }
    else
    {
        TFT_ShowChinese(55,72,(uint8_t *)"关闭",BLACK,YELLOW,16,0);     
    }
    
    if((*value).outputFreq>=1000)
    {
        sprintf(showData,"%3dKHz",(*value).outputFreq/1000);
        TFT_ShowString(110,72,(uint8_t *)showData,BLACK,YELLOW,16,0);  
        memset(showData,0,32); 
    }
    else
    {
        sprintf(showData," %3dHz",(*value).outputFreq);
        TFT_ShowString(110,72,(uint8_t *)showData,BLACK,YELLOW,16,0);  
        memset(showData,0,32);
    }  

    sprintf(showData,"%3.1f%%  ",(((*value).pwmOut)/((*value).timerPeriod+0.0f))*100);
    TFT_ShowString(110,106,(uint8_t *)showData,BLACK,YELLOW,16,0);  
    memset(showData,0,32);        
}

增加pwm开启指示灯

下=在Hardware/key.c中添加led指示灯的头文件,在按键处理函数Key_Handle中修改

        case KEY2:
            if((*value).ouptputbit == 0)
            {
                (*value).ouptputbit=1;
                timer_enable(TIMER14);
                Open_LED(1);
            }
            else
            {
                (*value).ouptputbit=0;
               timer_disable(TIMER14); 
                CLose_LED(1);
            }
            break;

 

成品展示

 

 

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
序号 文件名称 下载次数
1

示波器外壳.zip

1
2

Oscilloscope.zip

6
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

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

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

服务时间

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

support
  • 开源平台公众号

MP