找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16830|回復: 25
打印 上一主題 下一主題
收起左側(cè)

STM32和uCGUI實現(xiàn)人體心電采集波形顯示(開源原理圖和工程文件

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113472 發(fā)表于 2016-4-11 22:27 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本設(shè)計主要實現(xiàn)了以STM32為核心的人體心電采集系統(tǒng)軟硬件的設(shè)計。軟件設(shè)計過程是在STM32上移植的uCGUI做圖形界面,并如實顯示采集到的心電波形信號,有SD卡存儲和USB數(shù)據(jù)傳輸功能,歡迎大家互相交流學習,有做不到的地方還需各路高手指導修正。

1、整體效果圖




2、ucgui


3、界面顯示


4、心電電路板和STM32


5、示波器顯示心電波形


6、STM32顯示心電波形


部分源碼(完整版本請下載附件):
  1. #include "..APPincludes.h"


  2. // A/D 通道選擇命令字和工作寄存器
  3. #define        CHX         0x90         //通道X+的選擇控制字        
  4. #define        CHY         0xd0        //通道Y+的選擇控制字

  5. //#define        CHX         0xd0         //通道X+的選擇控制字        
  6. //#define        CHY         0x90        //通道Y+的選擇控制字

  7. MATRIX  Matrix;//為了避免重復校準,可以保存該校準值

  8. //====================================================================================
  9. static void Delayus( int k)
  10. {
  11. int j;
  12.    
  13.     for(j=k;j > 0;j--);   
  14. }

  15. //====================================================================================
  16. void TP_Init(void)
  17. {
  18.   //PB10, PD9, PD10   CS,SI,CLK
  19.   GPIO_InitTypeDef GPIO_InitStructure;
  20.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽輸出
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  23.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  24.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9|GPIO_Pin_10 ;  
  25.   GPIO_Init(GPIOD, &GPIO_InitStructure);

  26.   //PENIRQ, SO        
  27.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
  28.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  29.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  30.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
  31.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  32.   //start_touch();
  33. }

  34. void start_touch()   
  35. {           
  36.         TP_DCLK_L();   
  37.         TP_CS_H();         
  38.         TP_DIN_H();  
  39.         TP_DCLK_H();   
  40.         TP_CS_L();         
  41. }

  42. //====================================================================================
  43. static void WR_CMD (u8 cmd)
  44. {
  45. //u8 buf;
  46.          
  47. }


  48. //====================================================================================
  49. static u16 RD_AD(void)
  50. {
  51.   u16 buf=0;
  52. u8 i;
  53.    
  54.     TP_DIN_L(); //TP_DIN(0);
  55.     TP_DCLK_H(); //TP_DCLK(1);
  56.     for(i=0; i<12; i++)
  57.     {        buf <<= 1;
  58.         
  59.         TP_DCLK_H(); //TP_DCLK(0);         
  60.         Delayus(5);
  61.         TP_DCLK_L(); //TP_DCLK(1);
  62.         
  63.         if(TP_DOUT)        buf |= 1;
  64.         
  65.         Delayus(5);
  66.         
  67.     }
  68.     TP_CS_H(); //TP_CS(1);
  69.     //buf>>=4;//只有12位有效
  70.     //buf&=0x0fff;
  71.     return(buf);
  72. }





  73. #define ReadLoop 13 //必須>2
  74. #define LOSS_DATA 5 //前后丟掉數(shù)據(jù)個數(shù)
  75. u16 Read_XY(u8 xy)
  76. {
  77. u16 i, j;
  78. u16 buf[ReadLoop];
  79. uint32 sum;
  80. u16 val;
  81.    
  82.     for(i=0; i<readloop; i++)
  83.     {
  84.        WR_CMD(xy);
  85.        //while(TP_BUSY);
  86.        Delayus(5);
  87.        buf[i]=RD_AD();
  88.       
  89.        //sum += buf[i];
  90.     }
  91.    
  92.     //排序
  93.     for(i=0; i<readloop-1; i++)
  94.     {
  95.        for(j=i+1; j<readloop; j++)
  96.        {
  97.           if(buf[i]>buf[j])
  98.           {
  99.              val=buf[i];
  100.              buf[i]=buf[j];
  101.              buf[j]=val;
  102.           }
  103.        }
  104.     }
  105.    
  106.     sum=0;
  107.     for(i=LOSS_DATA; i<readloop-1-loss_data; i++)
  108.        sum += buf[i];
  109.     val=sum/(ReadLoop-2*LOSS_DATA);
  110.    
  111.     return (val);   
  112. }

  113. //====================================================================================
  114. uint8 TP_GetAdXY(u16 *x, u16 *y)
  115. {
  116. //u16 adx,ady;
  117.    
  118.     *y=Read_XY(CHX);
  119.     *x=Read_XY(CHY);
  120.     //*x=adx;
  121.     //*y=ady;
  122.     if(*x<100 || *y<100)
  123.        return(0);
  124.     else
  125.        return(1);
  126. }

  127. /*
  128. 功能:讀取觸摸屏讀坐標,該坐標未做轉(zhuǎn)換,不能直接使用

  129. 返回:0=無效坐標
  130.       1=有效坐標

  131. 說明:本函數(shù)連續(xù)采樣2次,2次采樣結(jié)果+-5范圍內(nèi)才算有效
  132. */
  133. uint8 TP_GetAdXY2(u16 *x, u16 *y, uint32 delay)
  134. {u16 x1,y1;
  135. u16 x2,y2;
  136. u8 flag;

  137.     flag=TP_GetAdXY(&x1, &y1);
  138.    
  139.     if(flag==0)
  140.        return(0);
  141.    
  142. //    if(delay>=OS_TIME)
  143. //       os_dly_wait(delay/OS_TIME);//300ms后再采樣1次
  144.    
  145.     //do{
  146.        flag=TP_GetAdXY(&x2, &y2);
  147.     //}while(flag);
  148.    
  149.     if(flag==0)
  150.        return(0);
  151.    
  152.     if( ( (x2<=x1 && x1<x2+50) ||="" (x1<="x2" &&="" x2<x1+50)="" )="" 前后兩次采樣在+-5內(nèi)
  153.      && ( (y2<=y1 && y1<y2+50) ||="" (y1<="y2" &&="" y2<y1+50)="" )="" )
  154.     {
  155.         *x=(x1+x2)/2;
  156.         *y=(y1+y2)/2;
  157.         return(1);
  158.     }
  159.     else
  160.        return(0);
  161. }

  162. ///*
  163. //功能:讀取觸摸屏在LCD的坐標,該坐標已經(jīng)轉(zhuǎn)換為可用的視圖坐標
  164. //返回:0=不在顯示區(qū)域
  165. //      1=在顯示區(qū)域
  166. //*/
  167. //uint8 TP_GetLCDXY(u16 *x, u16 *y)
  168. //{POINT   displayPoint;
  169. // POINT   TouchSample;
  170. // uint16 xt,yt;        
  171. // uint8 flag;
  172. //
  173. //    flag=TP_GetAdXY2(&xt, &yt, 0);
  174. //    if(flag)
  175. //    {
  176. //       TouchSample.x=xt/4; TouchSample.y=yt/4;
  177. //       getDisplayPoint( &displayPoint, &TouchSample, &Matrix );
  178. //      
  179. //       if(IsDisplayArea(&displayPoint)) //判斷是否在顯示區(qū)域
  180. //       {
  181. //          flag=1;
  182. //          *x=displayPoint.x;
  183. //          *y=displayPoint.y;
  184. //       }
  185. //       else
  186. //          flag=0;
  187. //    }
  188. //   
  189. //    return(flag);
  190. //}
復制代碼

描述:工程文件 My_MiniSTM32VET_ECG_uCGUI_DEMO.rar (3.57 MB, 下載次數(shù): 348)

描述:ECG&STM32電路原理圖: 人體心電采集系統(tǒng)電路原理圖.zip (210.65 KB, 下載次數(shù): 252)

評分

參與人數(shù) 2黑幣 +11 收起 理由
AAA_MCU + 6 很給力!
fengye20101112 + 5

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發(fā)
ID:124631 發(fā)表于 2016-6-2 11:05 | 只看該作者
頂一個
回復

使用道具 舉報

板凳
ID:124604 發(fā)表于 2016-6-3 17:29 | 只看該作者
太棒了!
回復

使用道具 舉報

地板
ID:124675 發(fā)表于 2016-6-4 00:49 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:122102 發(fā)表于 2016-6-6 08:17 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

6#
ID:138931 發(fā)表于 2016-12-28 17:57 | 只看該作者
號帖子,有時間做一個
回復

使用道具 舉報

7#
ID:79034 發(fā)表于 2017-1-3 12:35 | 只看該作者
看到開源的好帖就的頂,讓大家都看看。。。
回復

使用道具 舉報

8#
ID:169125 發(fā)表于 2017-3-8 15:19 | 只看該作者
學習了這個貼對我?guī)椭艽?/td>

評分

參與人數(shù) 1黑幣 +5 收起 理由
fengye20101112 + 5

查看全部評分

回復

使用道具 舉報

9#
ID:236322 發(fā)表于 2017-9-28 13:50 | 只看該作者
贊一個,學習學習
回復

使用道具 舉報

10#
ID:68875 發(fā)表于 2018-3-21 20:52 | 只看該作者
謝謝分享
回復

使用道具 舉報

11#
ID:296103 發(fā)表于 2018-3-23 20:53 | 只看該作者
學習了這個貼對我?guī)椭艽?img src="static/image/smiley/default/em02.gif" smilieid="2" border="0" alt="" />
回復

使用道具 舉報

12#
ID:299488 發(fā)表于 2018-3-30 16:01 | 只看該作者
學習了
回復

使用道具 舉報

13#
ID:262100 發(fā)表于 2018-5-18 16:34 | 只看該作者
樓主,你的例程我下下來編譯報了個錯誤
hw_config.c(17): error:  #5: cannot open source input file "stm32f10x_lib.h": No such file or directory
樓主的工程中是不是少添加了這個.h的?
回復

使用道具 舉報

14#
ID:53978 發(fā)表于 2018-5-26 21:34 | 只看該作者
這個好棒 頂
回復

使用道具 舉報

15#
ID:370231 發(fā)表于 2018-7-26 15:08 | 只看該作者
漲見識了,厲害厲害
回復

使用道具 舉報

16#
ID:398578 發(fā)表于 2018-9-16 10:59 | 只看該作者

頂一個
回復

使用道具 舉報

17#
ID:477599 發(fā)表于 2019-2-18 10:06 | 只看該作者
請問編程環(huán)境是keil嗎
回復

使用道具 舉報

18#
ID:227731 發(fā)表于 2019-5-25 18:00 | 只看該作者
謝謝分享。
回復

使用道具 舉報

19#
ID:685272 發(fā)表于 2020-1-12 11:12 | 只看該作者
好東西,謝謝
回復

使用道具 舉報

20#
ID:239620 發(fā)表于 2020-5-27 13:29 | 只看該作者
下載下來學習一下,感謝分享
回復

使用道具 舉報

21#
ID:377382 發(fā)表于 2020-5-27 22:49 | 只看該作者
謝謝分享
回復

使用道具 舉報

22#
ID:630379 發(fā)表于 2021-3-25 13:37 | 只看該作者
很棒,試試看能不能改改
回復

使用道具 舉報

23#
ID:95059 發(fā)表于 2022-6-17 23:50 | 只看該作者
下載下來了,可是沒編譯過去,有4個錯誤,咋辦呢?"..\ObjFlash\STM32-FD-ucgui.axf" - 4 Error(s), 21 Warning(s).
回復

使用道具 舉報

24#
ID:95059 發(fā)表于 2022-6-17 23:51 | 只看該作者
chen.michael 發(fā)表于 2019-2-18 10:06
請問編程環(huán)境是keil嗎

是的。打開了文件,文件挺大的
回復

使用道具 舉報

25#
ID:1074983 發(fā)表于 2023-5-2 17:23 | 只看該作者
lanxichang 發(fā)表于 2022-6-17 23:50
下載下來了,可是沒編譯過去,有4個錯誤,咋辦呢?"..\ObjFlash\STM32-FD-ucgui.axf" - 4 Error(s), 21 War ...

你好,我下載了之后沒有看到project文件,想問問你是在哪里打開的呀
回復

使用道具 舉報

26#
ID:1074983 發(fā)表于 2023-5-2 17:24 | 只看該作者
lanxichang 發(fā)表于 2022-6-17 23:51
是的。打開了文件,文件挺大的

你好,請問在哪里打開呀,我咋沒看到project文件呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表