糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 pulsesensor ADS1292R

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

时间:2019-05-30 18:13:17

相关推荐

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

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

OLED示波器,数组data[128]表示,数组长度为128,也就是OLED有128列,每一列一个数值,数值大小就是纵坐标,0~63,借用队列实现示波器的话:

(1)传感器有新的数据了,队列满的就删除队列头,然后向队列尾插入新数据。

(2)OLED刷新就是遍历队列所有元素。

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

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

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

Signal 是ADC采集0到4095,用pulsesensor,采集的数值一般是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采集的数据依照时间将数据添加到队列显示即可。

本来我做这个是做着玩,但是好像大家对这个都挺感兴趣的现在我给大家指几条道路。

这个肯定是用430单片机更容易在评委心里加分!

我介绍一下源码:

写的是读取pulsesensor的代码,不是读取ADS1292R的代码。

pulsesensor是一种光能转电压的传感器,能读取手指的心电变化。

ADC读取pulsesensor即可,读取后在OLED屏幕上打点。

单片机的SPI寄存器控制SPI的OLED,这样速度才跟得上,基本上是秒出图像,这也可以用于别的事情。

可以通过片选CS选择,CS选择OLED就读取OLED,CS选择ADS1292R就读取ADS1292R,

但鉴于在电脑端看到的波形都那么丑,我就没做下一步了。

OLED的SPI寄存器设置和ADS1292R的并不是一样的。

Msp430f5529单片机有UCA0模块和UCB0模块,UCA0可以支持SPI、UART,UCB0可以支持SPI、IIC,为了把串口留出来,所以不能用UCA0。源码里面我OLED用的是UCB0的SPI,只要通过片选CS就能够让很多器件都接在单片机的SPI口,单片机并不需要那么多SPI模块。

有人用模拟器出来的波形很漂亮:

这个波形确实很漂亮,和pulsesensor差不多的波形了。

[一个建议,点我]

像上面这个链接里面的所展示的这样,比较器或许能简化计算心率。

但是,也可以完全依靠原来数据计算心率,就需要下面这个压缩包里的东西了,里面就是用pulsesensor原数据计算心率的代码~

如果觉得《单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 pulsesensor ADS1292R》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。