单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 plusesensor ADS1292R

OLED显示屏刷新速度考虑,肯定用硬件SPI驱动OLED屏幕。

OLED示波器,数组data[128]表示,数组长度为128,也就是OLED有128列,每一列一个数值,数值大小就是纵坐标,0~63,借用队列实现示波器的话:
(1)传感器有新的数据了,队列满的就删除队列头,然后向队列尾插入新数据。
(2)OLED刷新就是遍历队列所有元素。

考虑到心率显示效果,传感器采样速度虽然很快,但向队列插入新数据的时间点需要控制,比如10ms向队列写入新数据,那整个屏幕周期是1270ms。

这样的话依旧是一次移动一个数据,心率刷新效果未可知。如果想心率显示整段往前平移,比如有了新的五个数据点后,刷新一次屏幕。这样显示效果又会不同。这样的话,新建队列的时候就得依照移动条件。

借助于以上的想法和https://blog.csdn.net/song_hui_xiang/article/details/47146503这个实现,去完成这个设计。

Signal 是ADC采集0到4095,用plusesensor,采集的数值一般是800以上,3000以下,良好归一化到取件0到63:temp = 64 - ((Signal - 800) / (2200 / 62));
新数据有ECG_move个后则满足(data_count == ECG_move) 就刷新显示。


#pragma vector = ADC12_VECTOR
__interrupt void ADC10(void)
{
    
    
    Signal = ADC12MEM0;
}

#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
    
    
    unsigned char temp;
    static char data_count = 0;

    if (Signal > 800)
    {
    
    
        temp = 64 - ((Signal - 800) / (2200 / 62));
        if (temp < 64)
        {
    
    
            AddQ(q, temp);                     //添加新数据
            data_count++;
        }
    }

    if (data_count == ECG_move)
    {
    
    
        data_count = 0;
        PrintQueue_len128(q);                     //刷新显示
    }
}

在这里插入图片描述

在这里插入图片描述

同样,使用ADS1292R采集的数据依照时间将数据添加到队列显示即可。

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/108722830