本設計主要實現了以STM32為核心的人體心電采集系統軟硬件的設計。軟件設計過程是在STM32上移植的uCGUI做圖形界面,并如實顯示采集到的心電波形信號,有SD卡存儲和USB數據傳輸功能,歡迎大家互相交流學習,有做不到的地方還需各路高手指導修正。
1、整體效果圖
5b23786f9da9b5bafdda9b3a688f5683.jpg (182.18 KB, 下載次數: 200)
下載附件
2016-4-11 23:57 上傳
ace464ded468164cdacece631f2a3d9d.jpg (208.39 KB, 下載次數: 185)
下載附件
2016-4-11 23:57 上傳
2、ucgui
c3268e993e46bd447165652e9134a068.jpg (148.56 KB, 下載次數: 194)
下載附件
2016-4-11 23:57 上傳
3、界面顯示
f8762d6beae018137cb0620b52413bd4.jpg (179.76 KB, 下載次數: 181)
下載附件
2016-4-11 23:57 上傳
4、心電電路板和STM32
25079e0e2e1c246d6f959617ed2722af.jpg (174.51 KB, 下載次數: 175)
下載附件
2016-4-11 23:57 上傳
5、示波器顯示心電波形
f1589c83e3fbfb576e03f4d5d86e3032.jpg (90.31 KB, 下載次數: 203)
下載附件
2016-4-11 23:57 上傳
6、STM32顯示心電波形
75badb49d2165e9fff690ccddbe758b7.jpg (668.22 KB, 下載次數: 203)
下載附件
2016-4-11 23:57 上傳
部分源碼(完整版本請下載附件):
- #include "..APPincludes.h"
- // A/D 通道選擇命令字和工作寄存器
- #define CHX 0x90 //通道X+的選擇控制字
- #define CHY 0xd0 //通道Y+的選擇控制字
- //#define CHX 0xd0 //通道X+的選擇控制字
- //#define CHY 0x90 //通道Y+的選擇控制字
- MATRIX Matrix;//為了避免重復校準,可以保存該校準值
- //====================================================================================
- static void Delayus( int k)
- {
- int j;
-
- for(j=k;j > 0;j--);
- }
- //====================================================================================
- void TP_Init(void)
- {
- //PB10, PD9, PD10 CS,SI,CLK
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10 ;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- //PENIRQ, SO
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- //start_touch();
- }
- void start_touch()
- {
- TP_DCLK_L();
- TP_CS_H();
- TP_DIN_H();
- TP_DCLK_H();
- TP_CS_L();
- }
- //====================================================================================
- static void WR_CMD (u8 cmd)
- {
- //u8 buf;
-
- }
- //====================================================================================
- static u16 RD_AD(void)
- {
- u16 buf=0;
- u8 i;
-
- TP_DIN_L(); //TP_DIN(0);
- TP_DCLK_H(); //TP_DCLK(1);
- for(i=0; i<12; i++)
- { buf <<= 1;
-
- TP_DCLK_H(); //TP_DCLK(0);
- Delayus(5);
- TP_DCLK_L(); //TP_DCLK(1);
-
- if(TP_DOUT) buf |= 1;
-
- Delayus(5);
-
- }
- TP_CS_H(); //TP_CS(1);
- //buf>>=4;//只有12位有效
- //buf&=0x0fff;
- return(buf);
- }
- #define ReadLoop 13 //必須>2
- #define LOSS_DATA 5 //前后丟掉數據個數
- u16 Read_XY(u8 xy)
- {
- u16 i, j;
- u16 buf[ReadLoop];
- uint32 sum;
- u16 val;
-
- for(i=0; i<readloop; i++)
- {
- WR_CMD(xy);
- //while(TP_BUSY);
- Delayus(5);
- buf[i]=RD_AD();
-
- //sum += buf[i];
- }
-
- //排序
- for(i=0; i<readloop-1; i++)
- {
- for(j=i+1; j<readloop; j++)
- {
- if(buf[i]>buf[j])
- {
- val=buf[i];
- buf[i]=buf[j];
- buf[j]=val;
- }
- }
- }
-
- sum=0;
- for(i=LOSS_DATA; i<readloop-1-loss_data; i++)
- sum += buf[i];
- val=sum/(ReadLoop-2*LOSS_DATA);
-
- return (val);
- }
- //====================================================================================
- uint8 TP_GetAdXY(u16 *x, u16 *y)
- {
- //u16 adx,ady;
-
- *y=Read_XY(CHX);
- *x=Read_XY(CHY);
- //*x=adx;
- //*y=ady;
- if(*x<100 || *y<100)
- return(0);
- else
- return(1);
- }
- /*
- 功能:讀取觸摸屏讀坐標,該坐標未做轉換,不能直接使用
- 返回:0=無效坐標
- 1=有效坐標
- 說明:本函數連續采樣2次,2次采樣結果+-5范圍內才算有效
- */
- uint8 TP_GetAdXY2(u16 *x, u16 *y, uint32 delay)
- {u16 x1,y1;
- u16 x2,y2;
- u8 flag;
-
- flag=TP_GetAdXY(&x1, &y1);
-
- if(flag==0)
- return(0);
-
- // if(delay>=OS_TIME)
- // os_dly_wait(delay/OS_TIME);//300ms后再采樣1次
-
- //do{
- flag=TP_GetAdXY(&x2, &y2);
- //}while(flag);
-
- if(flag==0)
- return(0);
-
- if( ( (x2<=x1 && x1<x2+50) ||="" (x1<="x2" &&="" x2<x1+50)="" )="" 前后兩次采樣在+-5內
- && ( (y2<=y1 && y1<y2+50) ||="" (y1<="y2" &&="" y2<y1+50)="" )="" )
- {
- *x=(x1+x2)/2;
- *y=(y1+y2)/2;
- return(1);
- }
- else
- return(0);
- }
- ///*
- //功能:讀取觸摸屏在LCD的坐標,該坐標已經轉換為可用的視圖坐標
- //返回:0=不在顯示區域
- // 1=在顯示區域
- //*/
- //uint8 TP_GetLCDXY(u16 *x, u16 *y)
- //{POINT displayPoint;
- // POINT TouchSample;
- // uint16 xt,yt;
- // uint8 flag;
- //
- // flag=TP_GetAdXY2(&xt, &yt, 0);
- // if(flag)
- // {
- // TouchSample.x=xt/4; TouchSample.y=yt/4;
- // getDisplayPoint( &displayPoint, &TouchSample, &Matrix );
- //
- // if(IsDisplayArea(&displayPoint)) //判斷是否在顯示區域
- // {
- // flag=1;
- // *x=displayPoint.x;
- // *y=displayPoint.y;
- // }
- // else
- // flag=0;
- // }
- //
- // return(flag);
- //}
復制代碼
描述:工程文件
My_MiniSTM32VET_ECG_uCGUI_DEMO.rar
(3.57 MB, 下載次數: 348)
2016-4-11 22:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
描述:ECG&STM32電路原理圖:
人體心電采集系統電路原理圖.zip
(210.65 KB, 下載次數: 252)
2016-4-11 22:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|