標題: STM32單片機+ads1292心率檢測顯示程序 [打印本頁]

作者: 1418233104    時間: 2023-3-20 00:48
標題: STM32單片機+ads1292心率檢測顯示程序
該演示程序使用的芯片為:STM32F103C8T6

功能:
    單片機采集ADS1292模塊數(shù)據(jù),通過串口輸出。
串口:
    UART1
    波特率:115200
    停止位:1
    數(shù)據(jù)為:8
    奇偶校驗:無   


引腳定義及連線:
    1292模塊--STM32F1:
    VDD---3.3V/5V
    GND---GND
    DRDY---PA8
    CS---PB12
    SCK---PB13
    MISO---PB14
    MOSI---PB15

單片機源程序如下:
  1. #include "ADS1292.h"
  2. #include "spi.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "Timer.h"
  6. #include "key.h"
  7. #include "led.h"



  8. #define DEBUG_ADS1292        //寄存器printf調(diào)試


  9. u8 ADS1292_REG[12];                //ads1292寄存器數(shù)組
  10. ADS1292_CONFIG1         Ads1292_Config1                ={DATA_RATE};                                                                                                                                                                //CONFIG1
  11. ADS1292_CONFIG2         Ads1292_Config2                ={PDB_LOFF_COMP,PDB_REFBUF,VREF,CLK_EN,INT_TEST};                //CONFIG2
  12. ADS1292_CHSET                 Ads1292_Ch1set                ={CNNNLE1_POWER,CNNNLE1_GAIN,CNNNLE1_MUX};                                        //CH1SET
  13. ADS1292_CHSET                 Ads1292_Ch2set                ={CNNNLE2_POWER,CNNNLE2_GAIN,CNNNLE2_MUX};                                        //CH2SET
  14. ADS1292_RLD_SENS        Ads1292_Rld_Sens        ={PDB_RLD,RLD_LOFF_SENSE,RLD2N,RLD2P,RLD1N,RLD1P};        //RLD_SENS
  15. ADS1292_LOFF_SENS        Ads1292_Loff_Sens        ={FLIP2,FLIP1,LOFF2N,LOFF2P,LOFF1N,LOFF1P};                                        //LOFF_SENS
  16. ADS1292_RESP1                        Ads1292_Resp1                        ={RESP_DEMOD_EN1,RESP_MOD_EN,RESP_PH,RESP_CTRL};                //RSP1
  17. ADS1292_RESP2                        Ads1292_Resp2                        ={CALIB,FREQ,RLDREF_INT};                                                                                                                //RSP2

  18.        

  19. //ADS1292的IO口初始化       
  20. void ADS1292_Init(void)
  21. {               
  22.                 GPIO_InitTypeDef         GPIO_InitStructure;       
  23.                 EXTI_InitTypeDef         EXTI_InitStructure;
  24.                 NVIC_InitTypeDef        NVIC_InitStructure;
  25.        
  26.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);          
  27.                 SPI2_Init();//初始化SPI引腳       
  28.                                                                         //250ns 頻率4.5M        發(fā)送八組時鐘需要23 us       
  29.                                                                         //125ns 頻率9M,                發(fā)送八組時鐘需要14 us       
  30.                                                                         //55ns 頻率18M                發(fā)送八組時鐘需要9.2us
  31.                                                                         //30ns 36M                                發(fā)送八組時鐘需要9.2us
  32.                                                                         //手冊10頁里寫的最小時鐘周期為50ns                       
  33.                 //DRDY        //待機時高電平,采集時低電平有效
  34.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  35.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
  36.                 GPIO_Init(GPIOC, &GPIO_InitStructure);               
  37.                 //CS
  38.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  39.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  40.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
  41.                 GPIO_Init(GPIOB, &GPIO_InitStructure);       
  42.                
  43. //                //RESRT
  44. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  45. //                GPIO_Init(GPIOA, &GPIO_InitStructure);       
  46. //                //START
  47. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  48. //                GPIO_Init(GPIOA, &GPIO_InitStructure);       
  49. //                //CLKSEL
  50. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  51. //                GPIO_Init(GPIOA, &GPIO_InitStructure);               


  52.                 //DRDY中斷初始化
  53.           EXTI_ClearITPendingBit(EXTI_Line8);//清除中斷標志
  54.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);//選擇管腳
  55.           EXTI_InitStructure.EXTI_Line=EXTI_Line8;                                                 //選擇中斷線路
  56.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //設(shè)置為中斷請求,非事件請求
  57.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
  58.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                 //外部中斷使能
  59.           EXTI_Init(&EXTI_InitStructure);         
  60.                
  61.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  62.           NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                                        //選擇中斷通道
  63.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //搶占優(yōu)先級
  64.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                //子優(yōu)先級
  65.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                //使能外部中斷通道
  66.           NVIC_Init(&NVIC_InitStructure);
  67.                
  68.                 EXTI->IMR &= ~(EXTI_Line8);//屏蔽外部中斷       
  69.                 ADS_CS=1;               
  70.                 ADS1292_PowerOnInit();//上電復(fù)位,進入待機模式       
  71. }

  72. volatile u8 ads1292_recive_flag=0;        //數(shù)據(jù)讀取完成標志
  73. volatile u8 ads1292_Cache[9];        //數(shù)據(jù)緩沖區(qū)


  74. void EXTI9_5_IRQHandler(void)
  75. {
  76.        
  77.                 if(EXTI->IMR&EXTI_Line8 && ADS_DRDY==0)//數(shù)據(jù)接收中斷                               
  78.                 {               
  79.                                 EXTI_ClearITPendingBit(EXTI_Line8);        
  80.                                 ADS1292_Read_Data(ads1292_Cache);//數(shù)據(jù)存到9字節(jié)緩沖區(qū)
  81.                                 ads1292_recive_flag=1;
  82.                 }       
  83. }



  84. //讀取72位的數(shù)據(jù)1100+LOFF_STAT[4:0]+GPIO[1:0]+13個0+2CHx24位,共9字節(jié)
  85. //        1100        LOFF_STAT[4                        3                        2                        1                        0        ]        //導(dǎo)聯(lián)脫落相關(guān)的信息在LOFF_STAT寄存器里
  86. //                                                                        RLD                1N2N        1N2P        1N1N        1N1P       
  87. //        例        C0 00 00 FF E1 1A FF E1 52       

  88. u8 ADS1292_Read_Data(u8 *data)//72M時鐘下函數(shù)耗時大約10us  8M時鐘下 函數(shù)耗時大約 100us
  89. {               
  90.                 u8 i;       
  91.                
  92.                 ADS_CS=0;//讀9個字節(jié)的數(shù)據(jù)
  93.                 //delay_us(10);
  94.                 for(i=0;i<9;i++)
  95.                 {       
  96.                                 *data=ADS1292_SPI(0X00);       
  97.                                 data++;
  98.                 }
  99.                 //delay_us(10);
  100.                 ADS_CS=1;               
  101.                 return 0;
  102. }


  103. //設(shè)置寄存器數(shù)組
  104. void ADS1292_SET_REGBUFF(void)
  105. {
  106.         ADS1292_REG[ID] =        ADS1292_DEVICE;//ID只讀
  107.          
  108.         ADS1292_REG[CONFIG1] =        0x00;                //0000 0aaa        [7] 0連續(xù)轉(zhuǎn)換模式  [6:3] 必須為0
  109.         ADS1292_REG[CONFIG1] |=        Ads1292_Config1.Data_Rate;//[2:0] aaa 采樣率設(shè)置采樣率

  110.         ADS1292_REG[CONFIG2] =        0x00;                //1abc d0e1        [7] 必須為1  [2] 必須為0  [0] 設(shè)置測試信號為1HZ、±1mV方波
  111.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Pdb_Loff_Comp<<6;        //[6]a 導(dǎo)聯(lián)脫落比較器是否掉電
  112.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Pdb_Refbuf<<5;                //[5]b 內(nèi)部參考緩沖器是否掉電
  113.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Vref<<4;                                        //[4]c 內(nèi)部參考電壓設(shè)置,默認2.42V
  114.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Clk_EN<<3;                                //[3]d CLK引腳輸出時鐘脈沖?
  115.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Int_Test<<1;                        //[1]e 是否打開內(nèi)部測試信號,
  116.         ADS1292_REG[CONFIG2] |=        0x81;//設(shè)置默認位
  117.        
  118.         ADS1292_REG[LOFF] =        0x10;//[7:5]        設(shè)置導(dǎo)聯(lián)脫落比較器閾值 [4]        必須為1                 [3:2] 導(dǎo)聯(lián)脫落電流幅值                [1]        必須為0        [0]        導(dǎo)聯(lián)脫落檢測方式 0 DC 1 AC

  119.         ADS1292_REG[CH1SET] =        0x00;         //abbb cccc
  120.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.PD<<7;                //[7]  a                 通道1斷電?
  121.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.GAIN<<4;        //[6:4]bbb        設(shè)置PGA增益
  122.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.MUX;                        //[3:0]cccc        設(shè)置通道1輸入方式

  123.         ADS1292_REG[CH2SET] =        0x00;        //abbb cccc
  124.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.PD<<7;                //[7]  a                 通道2斷電?
  125.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.GAIN<<4;        //[6:4]bbb        設(shè)置PGA增益
  126.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.MUX;                        //[3:0]cccc        設(shè)置通道2輸入方式
  127.        
  128.         ADS1292_REG[RLD_SENS] = 0X00; //11ab cdef        [7:6] 11 PGA斬波頻率        fMOD/4
  129.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Pdb_Rld<<5;                                        //[5]a        該位決定RLD緩沖電源狀態(tài)
  130.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld_Loff_Sense<<4;        //[4]b        該位使能RLD導(dǎo)聯(lián)脫落檢測功能
  131.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2N<<3;                                                //[3]c        這個位控制通道2負輸入        用于右腿驅(qū)動的輸出
  132.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2P<<2;                                                //[2]d        該位控制通道2正輸入                用于右腿驅(qū)動的輸出
  133.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1N<<1;                                                //[1]e        這個位控制通道1負輸入        用于右腿驅(qū)動的輸出
  134.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1P;                                                        //[0]f        該位控制通道1正輸入                用于右腿驅(qū)動的輸出       
  135.         ADS1292_REG[RLD_SENS] |=        0xc0;//設(shè)置默認位

  136.         ADS1292_REG[LOFF_SENS] = 0X00;  //00ab cdef        [7:6] 必須為0
  137.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip2<<5;                //[5]a        這個位用于控制導(dǎo)聯(lián)脫落檢測通道2的電流的方向
  138.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip1<<4;                //[4]b        這個位控制用于導(dǎo)聯(lián)脫落檢測通道1的電流的方向
  139.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2N<<3;        //[3]c        該位控制通道2負輸入端的導(dǎo)聯(lián)脫落檢測
  140.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2P<<2;        //[2]d        該位控制通道2正輸入端的導(dǎo)聯(lián)脫落檢測
  141.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1N<<1;        //[1]e        該位控制通道1負輸入端的導(dǎo)聯(lián)脫落檢測
  142.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1P;                        //[0]f        該位控制通道1正輸入端的導(dǎo)聯(lián)脫落檢測
  143.        
  144.         ADS1292_REG[LOFF_STAT] =        0x00;                //[6]0 設(shè)置fCLK和fMOD之間的模分頻比 fCLK=fMOD/4  [4:0]只讀,導(dǎo)聯(lián)脫落和電極連接狀態(tài)
  145.        
  146.         ADS1292_REG[RESP1] = 0X00;//abcc cc1d
  147.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_DemodEN<<7;//[7]a                這個位啟用和禁用通道1上的解調(diào)電路               
  148.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_modEN<<6;        //[6]b                這個位啟用和禁用通道1上的調(diào)制電路       
  149.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_ph<<2;                        //[5:2]c        這些位控制呼吸解調(diào)控制信號的相位       
  150.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_Ctrl;                        //[0]d                這個位設(shè)置呼吸回路的模式
  151.         ADS1292_REG[RESP1] |=        0x02;//設(shè)置默認位       
  152.        
  153.         ADS1292_REG[RESP2] = 0x00; //a000 0bc1        [6:3]必須為0 [0]必須為1
  154.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.Calib<<7;                                //[7]a 啟動通道偏移校正?
  155.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.freq<<2;                                //[2]b 呼吸頻率設(shè)置
  156.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.Rldref_Int<<1;        //[1]c RLDREF信號源外部饋電?
  157.         ADS1292_REG[RESP2] |= 0X01;//設(shè)置默認位       

  158.         ADS1292_REG[GPIO] =        0x0C;                        //GPIO設(shè)為輸入                [7:4]必須為0         [3:2]11 GPIO為輸入 [1:0] 設(shè)置輸入時,指示引腳電平,設(shè)置輸出時控制引腳電平
  159. }

  160. //通過SPI總線與ADS1292通信
  161. u8 ADS1292_SPI(u8 com)
  162. {       
  163.                 return SPI2_ReadWriteByte(com);
  164. }
  165. //寫命令
  166. void ADS1292_Send_CMD(u8 data)
  167. {
  168.                 ADS_CS=0;
  169.                 delay_us(100);
  170.                 ADS1292_SPI(data);               
  171.                 delay_us(100);       
  172.                 ADS_CS=1;
  173. }


  174. /*ADS1291、ADS1292和ADS1292R串行接口以字節(jié)形式解碼命令,需要4個tCLK周期來解碼和執(zhí)行.
  175. 因此,在發(fā)送多字節(jié)命令時,4 tCLK周期必須將一個字節(jié)(或操作碼)的結(jié)束與下一個字節(jié)(或操作碼)分開。
  176. 假設(shè)CLK(時鐘)為512 kHz,則tSDECODE (4 tCLK)為7.8125 us。
  177. 當SCLK(數(shù)據(jù)速率)為16mhz時,一個字節(jié)可以在500ns中傳輸,此字節(jié)傳輸時間不符合tSDECODE規(guī)范;
  178. 因此,必須插入一個延遲,以便第二個字節(jié)的末尾晚于7.3125us到達。
  179. 如果SCLK為1 MHz,則在8u秒內(nèi)傳輸一個字節(jié)。由于此傳輸時間超過tSDECODE規(guī)范,處理器可以不延遲地發(fā)送后續(xù)字節(jié)。
  180. 在后面的場景中,可以對串行端口進行編程,使其從每個循環(huán)的單字節(jié)傳輸轉(zhuǎn)移到多個字節(jié)*/

  181. //讀寫多個寄存器
  182. void ADS1292_WR_REGS(u8 reg,u8 len,u8 *data)
  183. {
  184.                 u8 i;
  185.                 ADS_CS=0;       
  186.                 delay_us(100);
  187.                 ADS1292_SPI(reg);
  188.                 delay_us(100);
  189.                 ADS1292_SPI(len-1);
  190.                 if(reg&0x40) //寫
  191.                 {
  192.                                 for(i=0;i<len;i++)
  193.                                 {
  194.                                                 delay_us(100);               
  195.                                                 ADS1292_SPI(*data);
  196.                                                 data++;                               
  197.                                 }                       
  198.                 }
  199.                 else //讀               
  200.                 {
  201.                                 for(i=0;i<len;i++)
  202.                                 {
  203.                                                 delay_us(100);               
  204.                                                 *data = ADS1292_SPI(0);
  205.                                                 data++;
  206.                                 }
  207.                 }                       
  208.                 delay_us(100);       
  209.                 ADS_CS=1;
  210. }


  211. //寄存器數(shù)組寫入寄存器
  212. u8 ADS1292_WRITE_REGBUFF(void)
  213. {
  214.                 u8 i,res=0;
  215.                 u8 REG_Cache[12];        //存儲寄存器數(shù)據(jù)
  216.                 ADS1292_SET_REGBUFF();//設(shè)置寄存器數(shù)組               
  217.                 ADS1292_WR_REGS(WREG|CONFIG1,11,ADS1292_REG+1);//數(shù)組變量寫入寄存器
  218.                 delay_ms(10);               
  219.                 ADS1292_WR_REGS(RREG|ID,12,REG_Cache);//讀寄存器
  220.                 delay_ms(10);       
  221.                
  222.                 //        #ifdef DEBUG_ADS1292       
  223.                 //                printf("WRITE REG:\r\n");
  224.                 //                for(i=0;i<12;i++        )//要寫的數(shù)據(jù)                                                               
  225.                 //                                printf("%d %x\r\n",i,ADS1292_REG[i]);       
  226.                 //                printf("READ REG:\r\n");
  227.                 //        #endif       
  228.        
  229.        
  230.                 for(i=0;i<12;i++        )        //檢查寄存器       
  231.                 {                                               
  232.                                 if(ADS1292_REG[i] != REG_Cache[i])
  233.                                 {
  234.                                                 if(i!= 0 && i!=8 && i != 11)        //0 8 和11是ID 導(dǎo)聯(lián)脫落和GPIO相關(guān)
  235.                                                                 res=1;
  236.                                                 else
  237.                                                                 continue;
  238.                                 }                                       
  239.                 //                        #ifdef DEBUG_ADS1292
  240.                 //                                printf("%d %x\r\n",i,REG_Cache[i]); //讀到的數(shù)據(jù)                       
  241.                 //                        #endif
  242.                   }       

  243.                 #ifdef DEBUG_ADS1292       
  244.                         if(res == 0)
  245.                                         printf("REG write success\r\n");
  246.                         else               
  247.                                         printf("REG write err\r\n");
  248.                 #endif
  249.                 return res;                               
  250. }


  251. void ADS1292_PowerOnInit(void)
  252. {       
  253.                 u8 i;
  254.                 u8 REG_Cache[12];       
  255.        
  256. //                ADS_CLKSEL=1;//啟用內(nèi)部時鐘
  257. //                ADS_START=0; //停止數(shù)據(jù)輸出       
  258. //                ADS_RESET=0; //復(fù)位
  259. //                delay_ms(1000);
  260. //                ADS_RESET=1;//芯片上電,可以使用       
  261. //                delay_ms(100);        //等待穩(wěn)定
  262.        
  263.                 ADS1292_Send_CMD(SDATAC);//發(fā)送停止連續(xù)讀取數(shù)據(jù)命令
  264.                 delay_ms(100);       
  265.                 ADS1292_Send_CMD(RESET);//復(fù)位
  266.                 delay_s(1);               
  267.                 ADS1292_Send_CMD(SDATAC);//發(fā)送停止連續(xù)讀取數(shù)據(jù)命令
  268.                 delay_ms(100);               
  269.        
  270.                 //#ifdef DEBUG_ADS1292       
  271.                 //                ADS1292_WR_REGS(RREG|ID,12,REG_Cache);
  272.                 //                printf("read default REG:\r\n");
  273.                 //                for(i=0;i<12;i++        )        //讀默認寄存器
  274.                 //                                printf("%d %x\r\n",i,REG_Cache[i]);               
  275.                 //#endif
  276.                 //ADS1292_Send_CMD(STANDBY);//進入待機模式       
  277. }



  278. //設(shè)置通道1內(nèi)部1mV測試信號
  279. u8 ADS1292_Single_Test(void) //注意1292R開了呼吸解調(diào),會對通道一的內(nèi)部測試信號波形造成影響,這里只參考通道2即可,1292不受影響
  280. {
  281.                 u8 res=0;
  282.                 Ads1292_Config2.Int_Test = INT_TEST_ON;//打開內(nèi)部測試信號
  283.                 Ads1292_Ch1set.MUX=MUX_Test_signal;//測試信號輸入       
  284.                 Ads1292_Ch2set.MUX=MUX_Test_signal;//測試信號輸入       
  285.                
  286.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  287.                                 res=1;       
  288.                 delay_ms(10);                       
  289.                 return res;               
  290. }
  291. //設(shè)置內(nèi)部噪聲測試
  292. u8 ADS1292_Noise_Test(void)
  293. {
  294.                 u8 res=0;
  295.                 Ads1292_Config2.Int_Test = INT_TEST_OFF;//關(guān)內(nèi)部測試信號
  296.                 Ads1292_Ch1set.MUX = MUX_input_shorted;//輸入短路       
  297.                 Ads1292_Ch2set.MUX = MUX_input_shorted;//輸入短路       

  298.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  299.                                 res=1;       
  300.                 delay_ms(10);                       
  301.                 return res;                       
  302. }

  303. //正常信號采集模式
  304. u8 ADS1292_Single_Read(void)
  305. {
  306.                 u8 res=0;
  307.                 Ads1292_Config2.Int_Test = INT_TEST_OFF;//關(guān)內(nèi)部測試信號
  308.                 Ads1292_Ch1set.MUX = MUX_Normal_input;//普通電極輸入
  309.                 Ads1292_Ch2set.MUX = MUX_Normal_input;//普通電極輸入
  310.        
  311.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  312.                                 res=1;
  313.                 delay_ms(10);               
  314.                 return res;               
  315. }       

  316. //配置ads1292采集方式
  317. u8 Set_ADS1292_Collect(u8 mode)
  318. {
  319.                 u8 res;
  320.                
  321.                 delay_ms(10);       
  322.                 switch(mode)//設(shè)置采集方式
  323.                 {
  324.                                 case 0:
  325.                                         res =ADS1292_Single_Read();                                                                                               
  326.                                 break;
  327.                                 case 1:
  328.                                         res =ADS1292_Single_Test();                                                                                       
  329.                                 break;
  330.                                 case 2:
  331.                                         res =ADS1292_Noise_Test();                                                                                       
  332.                                 break;
  333.                 }               
  334.                 if(res)return 1;//寄存器設(shè)置失敗               
  335.                 ADS1292_Send_CMD(RDATAC); //啟動連續(xù)模式
  336.                 delay_ms(10);               
  337.                 ADS1292_Send_CMD(START);        //發(fā)送開始數(shù)據(jù)轉(zhuǎn)換(等效于拉高START引腳)       
  338.                 delay_ms(10);               
  339.                 return 0;
  340. }
復(fù)制代碼


  1. #include "sys.h"         //系統(tǒng)配置
  2. #include "delay.h"       //延時
  3. #include "usart.h"       //串口                 
  4. #include "led.h"      
  5. #include "ADS1292.h"
  6. #include "Timer.h"
  7. #include "dma.h"

  8. u8 xinlv;
  9. extern u8 xinlv1;
  10. s32 get_volt(u32 num);
  11. u8 flag;
  12. u16 flag1;
  13. //main
  14. int main(void)
  15. {       
  16.                 u8 res,i,sum;       
  17.                 u8 data_to_send[60];//串口發(fā)送緩存
  18.                 u8 usbstatus=0;       
  19.                 u32 cannle[2];        //存儲兩個通道的數(shù)據(jù)
  20.                 s32        p_Temp[2];        //數(shù)據(jù)緩存
  21.        
  22.                 data_to_send[0]=0xAA;
  23.                 data_to_send[1]=0xAA;
  24.                 data_to_send[2]=0xF1;       
  25.                 data_to_send[3]=8;
  26.                 data_to_send[13] = 0X0D;        //校驗和
  27.                 data_to_send[14] = 0X0A;        //校驗和

  28. //初始化系統(tǒng)時鐘         72M       
  29.                 SystemInit();       
  30.                 delay_init();       
  31.                 delay_ms(100);
  32.                 uart1_init(500000);//串口初始化為115200               
  33.                 DMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)data_to_send);//串口1DMA設(shè)置
  34.                 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //DMA       
  35.                 LED_Init();                       

  36.                 ADS1292_Init();        //初始化ads1292                                       
  37.                 while(Set_ADS1292_Collect(0))
  38.                 {       
  39.                                 printf("1292寄存器設(shè)置失敗\r\n");
  40.                                 delay_s(1);               

  41.                 }       
  42.                 printf("寄存器設(shè)置成功\r\n");
  43.                 delay_s(1);                       
  44.                 TIM2_Init(50,1439);//系統(tǒng)指示
  45.                 TIM4_Init(50,1439);//打印心率
  46.                
  47.                 EXTI->IMR |= EXTI_Line8;//開DRDY中斷                       
  48.                 while(1)//循環(huán)發(fā)送數(shù)據(jù)               
  49.                 {                               
  50.                        
  51.                                 if(ads1292_recive_flag==1)
  52.                                 {               
  53.                                                 flag1++;                               
  54.                                                         cannle[0]=ads1292_Cache[3]<<16 | ads1292_Cache[4]<<8 | ads1292_Cache[5];//獲取原始數(shù)據(jù)
  55.                                        
  56.                                                         cannle[1]=ads1292_Cache[6]<<16 | ads1292_Cache[7]<<8 | ads1292_Cache[8];  //
  57.                                                
  58.                                                         p_Temp[0] = get_volt(cannle[0]);        //把采到的3個字節(jié)轉(zhuǎn)成有符號32位數(shù)
  59.                                        
  60.                                                         p_Temp[1] = get_volt(cannle[1]);        //把采到的3個字節(jié)轉(zhuǎn)成有符號32位數(shù)
  61.                                        
  62.                
  63.                                                         cannle[0] = p_Temp[0];
  64.                                        
  65.                                                         cannle[1]        = p_Temp[1];
  66.                                                         data_to_send[4]=cannle[0]>>24;                //25-32位
  67.                                                         data_to_send[5]=cannle[0]>>16;          //17-24
  68.                                                         data_to_send[6]=cannle[0]>>8;                //9-16
  69.                                                         data_to_send[7]=cannle[0];                         //1-8

  70.                                                         data_to_send[8]=cannle[1]>>24;                //25-32位
  71.                                                         data_to_send[9]=cannle[1]>>16;          //17-24
  72.                                                         data_to_send[10]=cannle[1]>>8;                //9-16
  73.                                                         data_to_send[11]=cannle[1];                         //1-8
  74.                                                        
  75.                                                         for(i=0;i<12;i++)
  76.                                                                         sum += data_to_send[i];       
  77.        //       printf("%d\r\n",sum);                                                                               
  78.                                                         data_to_send[12] = sum;        //校驗和                                                       
  79.                                         //                DMA_Enable(DMA1_Channel4,13);//串口1DMA
  80.                                                                                                                                                                
  81.                                                         ads1292_recive_flag=0;
  82.                                                         sum = 0;       
  83.                                                        
  84.                 if((p_Temp[1]>265000)&&(flag==1))       
  85.                         {
  86.                         xinlv++;               
  87.                                 flag=0;
  88.                         }
  89.                         else if((p_Temp[1]<265000)&&(flag==0))
  90.      flag=1;

  91.                                 }
  92.                                

  93.                 }               
  94. }


  95. /*功能:把采到的3個字節(jié)轉(zhuǎn)成有符號32位數(shù) */
  96. s32 get_volt(u32 num)
  97. {               
  98.                         s32 temp;                       
  99.                         temp = num;
  100.                         temp <<= 8;
  101.                         temp >>= 8;
  102.                         return temp;
  103. }

復(fù)制代碼

Keil代碼下載:
代碼.7z (207.13 KB, 下載次數(shù): 50)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1