金牌会员
 
- 积分
- 1073
- 金钱
- 1073
- 注册时间
- 2017-6-10
- 在线时间
- 279 小时
|

楼主 |
发表于 2018-1-18 12:11:33
|
显示全部楼层
本帖最后由 rjx007 于 2018-1-20 18:51 编辑
刷屏慢的问题解决了。高兴!!!感谢5楼的提醒。
方法是两个:
1、将OLED原来的显示条柱的函数里的更新显存的的语句去掉,等所有数据都传递完了后再刷显存。
//x1,y1,x2,y2 填充区域的对角坐标
//确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63
//dot:0,清空;1,填充
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)
{
u8 x,y;
for(x=x1;x<=x2;x++)
{
for(y=y1;y<=y2;y++)OLED_DrawPoint(x,y,dot);
}
//OLED_Refresh_Gram();//更新显示,这句去掉
}
2、更新每根柱条高度时,不能将前一屏全屏都刷掉,那样会浪费太多的时间,而是那个频点有变化,在原来的高度上做增减即可。
void dsp_column_1(void)
{
u8 x,i,j=2;
for(i=0;i<26;i++)
{
if(COLUMN1>COLUMN1_LOD) //新值大于老值,在原高度上增加
{
x=COLUMN1-COLUMN1_LOD;
OLED_Fill(j,COLUMN1_LOD,j+3,COLUMN1_LOD+x,1);
}
if(COLUMN1<COLUMN1_LOD) //新值小于老值,将高度超过的部分去掉
{ OLED_Fill(j,COLUMN1,j+3,COLUMN1_LOD,0);}
j=j+5;
COLUMN1_LOD =COLUMN1;
}
OLED_Refresh_Gram(); //在这里更新显存
delay_ms(100); //稍作延时,不然刷屏太快,有闪烁感
}
另外,硬件部分还要完善:
1、要增加自动增益控制,以免输入信号过大损坏ADC的输入端,再则输入过大会死机。
2、增加电瓶平移电路,因为输入的信号是交流信号,有负值部分,要抬高到全部为正值。
3、增加低通滤波电路,因大于20K的高频信号会带来干扰,导致频谱叠加和栅栏效应。
还要继续折腾,到完善为止。
视频拍的不好,意思能表达就行了。
|
|