1、简单易用,可快速上手
2、流畅支持300个器件或1000个焊盘以下的设计规模
3、支持简单的电路仿真
4、面向学生、老师、创客
1、全新的交互和界面
2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计
3、更严谨的设计约束,更规范的流程
4、面向企业、更专业的用户
做了两个版本,一个是开发版版本,另一个是裸芯片版本。
设计大多数参考官方文档 —— 《简易数字示波器项目文档 (yuque.com)》
充电芯片采用IP5306移动电源充放电管理芯片,2.1A 充电和2.4 A放电对于示波器的小电池应该属于快充级别的了。芯片具有输出过流、过压、短路保护,输入过压、过充、过放、过流放电保护,整机过温保护。支持边冲边放,一键开关机,led电量显示。
上图为官方数据手册的参考电路设计原理图,太多的LED电量显示灯放在电路板上反而会不好看,所以计划保留一个指示灯用于充放电指示,在设计一个电量检测电路在屏幕上显示当前电量。
参考数据手册里的一颗灯的参考电路进行设计,电量检测使用两个电阻对电池电压进行分压,用单片机的ADC引脚检测电压大小。
分压计算公式:U BAT_v = R12 / ( R8 + R12) * UBAT
在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会错乱所以修改
在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);
}
下=在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;
加载中...
是否需要添加此工程到专辑?