考试总算考完了大半,终于有时间写帖子了。
这段时间吧程序改成了FREERTOS版本了,加入OS后多任务处理起来会方便许多,ADC采样并计算心率创建一个任务,波形显示创建一个任务,还有一个任务用来翻转led提示系统正在运行。
心率的采样和计算在上一章帖子里已经一直好了,这次只需要复制过来即可。本次的重点是波形的OLED 显示。不过效果并不像在示波器和上位机上那样理想,毕竟像素只有128*64。
先上显示部分的程序,如下:
void Show_Pulse() { u8 cur=Cur,i; OLED_CLS(); if(cur<127) { i=cur+128; for(; i!=0; i++) { if(Pulser[i] < 1900 || Pulser[i] > 2300)continue; else OLED_PutPixel(i-cur-128,64-(Pulser[i]-1900)/7); } i=0; for(; i<cur; i++) { if(Pulser[i] < 1900 || Pulser[i] > 2300)continue; else OLED_PutPixel(i-cur+128,64-(Pulser[i]-1900)/7); } } else { i=cur-128; for(; i<cur; i++) { if(Pulser[i] < 1900 || Pulser[i] > 2300)continue; else OLED_PutPixel(i-cur+128,64-(Pulser[i]-1900)/7); } } }
OLED 屏幕的显示列数为128,所以我定义的波形缓存为256点。OLED刷新频率为10Hz。每次刷新时先获取ADC缓存到哪一个点了,然后将前128个点用打点函数更新即可,注意如何正确的获取前128 点。然后还有一个问题是压缩变换,将读到到ADC值压缩变换到0-63范围内,因为OLED 只有64行,由于制造厂家的不同,ADC值的范围会有所不同,压缩变换时的算法根据实际情况做相应的调整。
下一步打算做一个扩展板,毕竟用杜邦线看起来实在是太乱了,也是作为最后压轴上场的最终版“跳动的心”
最后附上本帖配套的程序