
开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
简易数字示波器
做了两个版本,一个是开发版版本,另一个是裸芯片版本。
设计大多数参考官方文档 —— 《简易数字示波器项目文档 (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 codeif(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
克隆工程工程成员
知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。





评论