|
24位采集芯片資料,含STM32與其他各平臺的單片機源程序,需要的請查收
ADS1256的源程序:
- /*********************************************************************************
- * 文件名 :main.c
- * 描述 :ADS1256模塊測試程序
- * 實驗平臺:
- * 庫版本 :ST3.0.0
- * 連線 :
- ADS_DRDY PA2
- ADS_RESET PA4
- ADS_CS PA3
- ADS_CLK PA5
- ADS_DIN PA7
- ADS_DOUT PA6
- //水平有限,可能有些地方寫法不標(biāo)準(zhǔn),歡迎提建議。
- **********************************************************************************/
- #include "stm32f10x.h"
- #include "usart1.h"
- #include "delay.h"
- #include "ads1256.h"
- #define MEDIAN_LEN 5 //中直濾波的總長度,一般選取奇數(shù)
- #define MEDIAN 2 //中值在濾波數(shù)組中的位置
- unsigned long AD_buffer[MEDIAN_LEN]; //ad采集數(shù)組緩存
- //unsigned long MED_buffer[MEDIAN_LEN]; //中值濾波數(shù)組緩存
- unsigned char medleng = 0; //存入緩存的數(shù)據(jù)個數(shù)
- unsigned long medina_filter(unsigned long *MED_buffer);
- /**********************************************************/
- // 函數(shù)名:main
- // 描述 :主函數(shù)
- // 輸入 :無
- // 輸出 :無
- /*********************************************************/
- int main(void)
- {
- unsigned long results = 0;
- unsigned char i = 0;
- SystemInit(); //主頻時鐘初始化
- delay_init(72); //延時時鐘初始化
- USART1_Config(); //串口初始化
- SPI_ADS1256_Init(); //SPI初始化
- ADS1256_GPIO_init(); //端口初始化
- ADS1256_Init();
-
- while(1)
- {
- // ADS1256WREG(ADS1256_MUX,ADS1256_MUXP_AIN2 | ADS1256_MUXN_AIN3); //設(shè)置通道
- results = ADS1256ReadData(); //讀取AD值,返回24位數(shù)據(jù)
- AD_buffer[i] = results;
- results = medina_filter(AD_buffer); //調(diào)用排序函數(shù)獲得濾波中值
- i ++; //AD采集緩存計數(shù)
- if(i > MEDIAN_LEN)
- {
- i = 0;
- }
-
- results1 = (results >> 16) & 0x0000ff; //發(fā)送最高位
- results2 = (results >> 8) & 0x0000ff; //發(fā)送中間位
- results3 = results & 0x0000ff; //發(fā)送低位
- sendChar(results1);
- sendChar(results2);
- sendChar(results3);
- sendChar(0x0a); //換行
- sendChar(0x0d); //換行
- // delay_ms(100);
- }
- }
- /**********************************************************/
- // 函數(shù)名:中值濾波函數(shù)
- // 描述 :提取前9次采集的數(shù)據(jù),去掉高3個,去掉低3個,然后中間的
- // 描述 :3個數(shù)據(jù)求平均值,該算法可盡可能的濾掉干擾數(shù)據(jù),并不影響采集速度。
- // 輸入 :9個數(shù)據(jù)的數(shù)組
- // 輸出 :中間3個數(shù)據(jù)的平均值
- /*********************************************************/
- unsigned long medina_filter(unsigned long *MED_buffer) //xad - ADC轉(zhuǎn)換值
- {
-
- unsigned char i,j;
- unsigned long xd;
- u32 xxd;
-
- for(i = 0; i < MEDIAN_LEN; i ++)
- {
- for(j = 0; j < MEDIAN_LEN - i; j ++)
- {
-
- if( MED_buffer[i] > MED_buffer[i + 1]) // 輪詢到的當(dāng)前元素>AD值,則交換它們的值
- { xd = MED_buffer[i]; MED_buffer[i] = MED_buffer[i + 1]; MED_buffer[i + 1] = xd;}
- }
- }
- xxd = MED_buffer[MEDIAN - 1] + MED_buffer[MEDIAN] + MED_buffer[MEDIAN + 1];
- xd = xxd/3;
- return xd; //中值
- }
- /******************* (C) COPYRIGHT 2014 三峰電子開發(fā)工作室 *****END OF FILE****/
復(fù)制代碼
ADS1115測量正負10V模塊資料單片機源程序如下:
- /********************************************************************
- ADS1115模塊
- 功能:ADS1115采集電壓,采用中值濾波算法,串口將電壓數(shù)值返回PC
- 單片機測試: 89C52
- 使用軟件:串口助手
- 修改日期:2014.4.26
- 作者:夢想電子工作室
- **********************************************************************/
- #include "main.h"
- void main()
- {
- unsigned long ADS1115_Value;
- Com_Init(); //串口初始化
- while(1)
- {
- ADS1115_Value = ADS1115(0); //0 1 2 3:分別代表通道0、1、2、3
- medina_filter(ADS1115_Value); //中值濾波算法, 串口顯示包含在其中
- DelayNms(20);
- }
- }
復(fù)制代碼- #include "ads1115.h"
- int D_ADS; //轉(zhuǎn)換的數(shù)字量
- float VIN_DAS; //輸入的電壓值
- unsigned char t_DAS;
- unsigned int Config;
- unsigned char Writebuff[4],Readbuff[3];
- unsigned int Result[2];
- uchar Channel_Value;
- int Format[5]={0}; //轉(zhuǎn)換的數(shù)字量轉(zhuǎn)換成十進制
- ///*******************************************
- //函數(shù)名稱:Start
- //功 能:完成IIC的起始條件操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void Start(void)
- {
- SCL=1;
- SDA=1;
- DelayNus (15);
- SDA=0;
- DelayNus (15);
- SCL=0;
- DelayNus (15);
- }
- //
- ///*******************************************
- //函數(shù)名稱:Stop
- //功 能:完成IIC的終止條件操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void Stop(void)
- {
- SDA=0;
- DelayNus (15);
- SCL=1;
- DelayNus (15);
- SDA=1;
- DelayNus (15);
- }
- ///*******************************************
- //函數(shù)名稱:ACK
- //功 能:完成IIC的主機應(yīng)答操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void ACK(void)
- {
- SDA=0;
- _nop_(); _nop_();
- SCL=1;
- DelayNus (15);
- SCL=0;
- _nop_(); _nop_();
- SDA=1;
- DelayNus (15);
- }
- //*******************************************
- //函數(shù)名稱:NACK
- //功 能:完成IIC的主機無應(yīng)答操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void NACK(void)
- {
- SDA=1;
- _nop_(); _nop_();
- SCL=1;
- DelayNus (15);
- SCL=0;
- _nop_(); _nop_();
- SDA=0;
- DelayNus (15);
- }
- //**********檢查應(yīng)答信號函數(shù)******************/
- ///*如果返回值為1則證明有應(yīng)答信號,反之沒有*/
- ///*******************************************
- //函數(shù)名稱:Check
- //功 能:檢查從機的應(yīng)答操作
- //參 數(shù):無
- //返回值 :從機是否有應(yīng)答:1--有,0--無
- //********************************************/
- unsigned char Check(void)
- {
- unsigned char slaveack;
-
- SDA=1;
- _nop_(); _nop_();
- SCL=1;
- _nop_(); _nop_();
- _nop_(); _nop_();
- slaveack = SDA; //讀入SDA數(shù)值
- SCL=0;
- DelayNus (15);
-
- if(slaveack) return FALSE;
- else return TRUE;
- }
- /***************Write a Byte****************/
- void Write_1_Byte(unsigned char DataByte)
- {
- int i;
- for(i=0;i<8;i++)
- {
- if(DataByte&0x80) //if((DataByte<<i)&0x80)
- SDA=1;
- else
- SDA=0;
- DelayNus (15);
- SCL=1;
- DelayNus (15);
- SCL=0;
- DelayNus (15);
- DataByte <<= 1;
- }
- SDA=1;
- _nop_();
- }
- /***************Write N Byte****************/
- unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
- {
- int i;
- for(i=0;i<n;i++)
- {
- Write_1_Byte(*writebuffer);
- if(Check())
- {
- writebuffer ++;
- }
- else
- {
- Stop();
- return FALSE;
- }
- }
- Stop();
- return TRUE;
- }
- //***************Read a Byte****************/
- unsigned char Read_1_Byte(void)
- {
- unsigned char data_Value = 0, FLAG, i;
-
- for(i=0;i<8;i++)
- {
-
- SDA=1;
- DelayNus (15);
- SCL=1;
- DelayNus (15);
- FLAG=SDA;
- data_Value <<= 1;
- if( FLAG)
- data_Value |= 0x01;
- SCL=0;
- DelayNus (15);
- }
- return data_Value;
- }
- //***************Read N Byte****************/
- void Read_N_Byte(unsigned int*readbuff, unsigned char n)
- {
- unsigned char i;
-
- for(i=0;i<n;i++)
- {
- readbuff[i]=Read_1_Byte();
- if(i==n-1)
- NACK(); //不連續(xù)讀字節(jié)
- else
- ACK(); //連續(xù)讀字節(jié)
- }
- Stop();
- }
- //*****************初始化******************/
- void InitADS1115(bit S_MUX_0, bit S_MUX_1)
- {
- if (S_MUX_0 == 0 && S_MUX_1 == 0)
- Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 0 && S_MUX_1 == 1)
- Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 1 && S_MUX_1 == 0)
- Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 1 && S_MUX_1 == 1)
- Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
-
- Writebuff[0]=ADDRESS_W;
- Writebuff[1]=Pointer_1;
- Writebuff[2]=Config/256;
- Writebuff[3]=Config%256;
-
- Readbuff[0]=ADDRESS_W;
- Readbuff[1]=Pointer_0;
-
- Readbuff[2]=ADDRESS_R;
- }
- //***************Write a Word***********************/
- void WriteWord(void)
- {
- int t;
- Start(); //寫入4個字節(jié)
- do
- {
- t=Write_N_Byte(Writebuff,4);
- }while(t==0);
- }
- //***************Read Word***********************/
- void ReadWord(void)
- {
- int t;
- Start(); //寫入2個字節(jié)
- do
- {
- t=Write_N_Byte(Readbuff,2);
- }while(t==0);
- Start(); //寫入2個字節(jié)
- do
- {
- t=Write_N_Byte(&Readbuff[2],1);
- }while(t==0);
-
- Read_N_Byte(Result,2); //讀出2個字節(jié)
- }
- //***************ADS1115********************/
- unsigned int ADS1115(int Channel)
- {
- bit S_MUX_0, S_MUX_1;
- switch(Channel)
- {
- case 0:
- S_MUX_0 = 0;
- S_MUX_1 = 0;
- Channel_Value = Channel + '0';
- break;
- case 1:
- S_MUX_0 = 0;
- S_MUX_1 = 1;
- Channel_Value = Channel + '0';
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
ADS1256模塊資料.rar
(13.69 MB, 下載次數(shù): 139)
2018-7-17 03:14 上傳
點擊文件名下載附件
源碼
ADS1115測量正負10V模塊資料.zip
(2.15 MB, 下載次數(shù): 144)
2018-7-16 18:18 上傳
點擊文件名下載附件
源碼
|
評分
-
查看全部評分
|