站内搜索
发作品签到
专业版

#训练营#数字示波器

工程标签

936
0
0
1

简介

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

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

开源协议

GPL 3.0

(未经作者授权,禁止转载)
创建时间:2024-03-04 20:15:22更新时间:2024-04-07 11:55:44

描述

简易数字示波器                                                                          

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

设计大多数参考官方文档 —— 《简易数字示波器项目文档 (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;

 

成品展示

 

 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
示波器外壳.zip
6
2
Oscilloscope.zip
27
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航