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
- //水平有限,可能有些地方写法不标准,欢迎提建议。
- **********************************************************************************/
- #include "stm32f10x.h"
- #include "usart1.h"
- #include "delay.h"
- #include "ads1256.h"
- #define MEDIAN_LEN 5 //中直滤波的总长度,一般选取奇数
- #define MEDIAN 2 //中值在滤波数组中的位置
- unsigned long AD_buffer[MEDIAN_LEN]; //ad采集数组缓存
- //unsigned long MED_buffer[MEDIAN_LEN]; //中值滤波数组缓存
- unsigned char medleng = 0; //存入缓存的数据个数
- unsigned long medina_filter(unsigned long *MED_buffer);
- /**********************************************************/
- // 函数名:main
- // 描述 :主函数
- // 输入 :无
- // 输出 :无
- /*********************************************************/
- 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); //设置通道
- results = ADS1256ReadData(); //读取AD值,返回24位数据
- AD_buffer[i] = results;
- results = medina_filter(AD_buffer); //调用排序函数获得滤波中值
- i ++; //AD采集缓存计数
- if(i > MEDIAN_LEN)
- {
- i = 0;
- }
-
- results1 = (results >> 16) & 0x0000ff; //发送最高位
- results2 = (results >> 8) & 0x0000ff; //发送中间位
- results3 = results & 0x0000ff; //发送低位
- sendChar(results1);
- sendChar(results2);
- sendChar(results3);
- sendChar(0x0a); //换行
- sendChar(0x0d); //换行
- // delay_ms(100);
- }
- }
- /**********************************************************/
- // 函数名:中值滤波函数
- // 描述 :提取前9次采集的数据,去掉高3个,去掉低3个,然后中间的
- // 描述 :3个数据求平均值,该算法可尽可能的滤掉干扰数据,并不影响采集速度。
- // 输入 :9个数据的数组
- // 输出 :中间3个数据的平均值
- /*********************************************************/
- unsigned long medina_filter(unsigned long *MED_buffer) //xad - ADC转换值
- {
-
- 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]) // 轮询到的当前元素>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 三峰电子开发工作室 *****END OF FILE****/
复制代码
ADS1115测量正负10V模块资料单片机源程序如下:
- /********************************************************************
- ADS1115模块
- 功能:ADS1115采集电压,采用中值滤波算法,串口将电压数值返回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);
- }
- }
复制代码- #include "ads1115.h"
- int D_ADS; //转换的数字量
- 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}; //转换的数字量转换成十进制
- ///*******************************************
- //函数名称:Start
- //功 能:完成IIC的起始条件操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void Start(void)
- {
- SCL=1;
- SDA=1;
- DelayNus (15);
- SDA=0;
- DelayNus (15);
- SCL=0;
- DelayNus (15);
- }
- //
- ///*******************************************
- //函数名称:Stop
- //功 能:完成IIC的终止条件操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void Stop(void)
- {
- SDA=0;
- DelayNus (15);
- SCL=1;
- DelayNus (15);
- SDA=1;
- DelayNus (15);
- }
- ///*******************************************
- //函数名称:ACK
- //功 能:完成IIC的主机应答操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void ACK(void)
- {
- SDA=0;
- _nop_(); _nop_();
- SCL=1;
- DelayNus (15);
- SCL=0;
- _nop_(); _nop_();
- SDA=1;
- DelayNus (15);
- }
- //*******************************************
- //函数名称:NACK
- //功 能:完成IIC的主机无应答操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void NACK(void)
- {
- SDA=1;
- _nop_(); _nop_();
- SCL=1;
- DelayNus (15);
- SCL=0;
- _nop_(); _nop_();
- SDA=0;
- DelayNus (15);
- }
- //**********检查应答信号函数******************/
- ///*如果返回值为1则证明有应答信号,反之没有*/
- ///*******************************************
- //函数名称:Check
- //功 能:检查从机的应答操作
- //参 数:无
- //返回值 :从机是否有应答:1--有,0--无
- //********************************************/
- unsigned char Check(void)
- {
- unsigned char slaveack;
-
- SDA=1;
- _nop_(); _nop_();
- SCL=1;
- _nop_(); _nop_();
- _nop_(); _nop_();
- slaveack = SDA; //读入SDA数值
- 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(); //不连续读字节
- else
- ACK(); //连续读字节
- }
- 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个字节
- do
- {
- t=Write_N_Byte(Writebuff,4);
- }while(t==0);
- }
- //***************Read Word***********************/
- void ReadWord(void)
- {
- int t;
- Start(); //写入2个字节
- do
- {
- t=Write_N_Byte(Readbuff,2);
- }while(t==0);
- Start(); //写入2个字节
- do
- {
- t=Write_N_Byte(&Readbuff[2],1);
- }while(t==0);
-
- Read_N_Byte(Result,2); //读出2个字节
- }
- //***************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黑下载附件…………
复制代码
所有资料51hei提供下载:
ADS1256模块资料.rar
(13.69 MB, 下载次数: 139)
ADS1115测量正负10V模块资料.zip
(2.15 MB, 下载次数: 144)
|