SCLK PA5
DIN PA7
DOUT PA6
DRDY PA2
CS PA3
RESET PA4
电源接5v
数字地和模拟地可以用光耦或者0欧姆电阻隔离开
单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "adc.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);
-
-
- int main(void)
- {
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- LED_Init(); //LED端口初始化
-
-
- SPI_ADS1256_Init(); //SPI初始化
- ADS1256_GPIO_init(); //端口初始化
- ADS1256_Init();
- while(1)
- {
- /*
- ADS_sum(a,b):函数功能,测量电压a-b
- 解说:ADS1256_MUXP_AIN(0~7)代表通道0~7,差分正 P:positive
- ADS1256_MUXN_AIN(0~7)代表通道0~7,差分负 N:negative
-
- 例:差分测量通道0和1:ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AIN1); 返回通道0-通道1的电压值
- 单端测量通道0: ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM); 返回通道0对地的电压值
- */
- ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM); //通道0对地的电压值
- // ADS_sum(ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM); //通道1对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM); //通道2对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM); //通道3对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM); //通道4对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM); //通道5对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM); //通道6对地的电压值
- // sendChar(0x0d); sendChar(0x0a);
- // ADS_sum(ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM); //通道7对地的电压值
- //
- delay_ms(500);
- }
- }
- /**********************************************************/
- // 函数名:中值滤波函数
- // 描述 :提取前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****/
复制代码- #include "ads1256.h"
- #include "delay.h"
- #include "usart.h"
- u8 results1,results2,results3;
- /*******************************************************************************
- * Function Name : SPI_FLASH_Init
- * Description : Initializes the peripherals used by the SPI FLASH driver.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SPI_ADS1256_Init(void)
- {
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* Enable SPI1 and GPIO clocks */
- /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
- SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
- and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);
- /*!< SPI_FLASH_SPI Periph clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
- /*!< AFIO Periph clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
-
-
- /*!< Configure SPI_FLASH_SPI pins: RESET */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推免输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*!< Configure SPI_FLASH_SPI pins:SCK | DIN */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; //
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推免输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*!< Configure SPI_FLASH_SPI pins: DOUT */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* Deselect the FLASH: Chip Select high */
- /* SPI1 configuration */
- // 在SCLK下降沿,系统通过DIN向1256发送数据
- // 在SCLK上升沿,系统通过DOUT 读取1256数据
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位模式
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //SCLK空闲时位低电平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SCLK的下降沿采集数据
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //从机选择信号,软件模式,就是用GPIO选择从机
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //APB2或者APB1总线频率的1/2~1/256分频
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
- SPI_Init(SPI1, &SPI_InitStructure);
- /* Enable SPI1 */
- SPI_Cmd(SPI1, ENABLE);
- }
- /*******************************************************************************
- * Function Name : SPI_FLASH_SendByte
- * Description : Sends a byte through the SPI interface and return the byte
- * received from the SPI bus.
- * Input : byte : byte to send.
- * Output : None
- * Return : The value of the received byte.
- *******************************************************************************/
- u8 SPI_SendByte(u8 byte)
- {
- /* Loop while DR register in not emplty */
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
- /* Send byte through the SPI1 peripheral */
- SPI_I2S_SendData(SPI1, byte);
- /* Wait to receive a byte */
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
- /* Return the byte read from the SPI bus */
- return SPI_I2S_ReceiveData(SPI1);
- }
- /*******************************************************************
- 函数名:初始化DAC接口
- 函数原型:void ADC_gpio_init()
- 参数说明:无
- 返回: 无
- ********************************************************************/
- void ADS1256_GPIO_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /////////CS reset 引脚设置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4 | GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //--推免输出模式
- GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; //--GPIO翻转速度为50MHz
- GPIO_Init(GPIOA , &GPIO_InitStructure); //--将配置写入对应的GPIO寄存器中
- // GPIO_InitTypeDef GPIO_InitStructure;
- ///////// DRDY引脚设置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //--浮点输入模式
- GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; //--GPIO翻转速度为50MHz
- GPIO_Init(GPIOA , &GPIO_InitStructure); //--将配置写入对应的GPIO寄存器中
- }
- //-----------------------------------------------------------------//
- // 功 能:ADS1256 写数据
- // 入口参数: /
- // 出口参数: /
- // 全局变量: /
- // 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
- //-----------------------------------------------------------------//
- void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
- {
- ADS_CS_LOW();
- while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
- //向寄存器写入数据地址
- SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF));
- //写入数据的个数n-1
- SPI_SendByte(0);
- //向regaddr地址指向的寄存器写入数据databyte
- delay_us(5);
- SPI_SendByte(databyte);
- ADS_CS_HIGH();
- }
- //-----------------------------------------------------------------//
- // 功 能:ADS1256 读寄存器数据
- // 入口参数: /
- // 出口参数: /
- // 全局变量: /
- // 备 注: 从ADS1256中地址为regaddr的寄存器读出一个字节databyte
- //-----------------------------------------------------------------//
- unsigned char ADS1256RREG(unsigned char regaddr)
- {
- //从ADS1256中地址为regaddr的寄存器读出一个字节
- unsigned char r=0;
- ADS_CS_LOW();
- while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
- //写入地址
- SPI_SendByte(ADS1256_CMD_RREG | (regaddr & 0xF));
- //写入读取数据的个数n-1
- SPI_SendByte(0);
- delay_us(10); //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
- //读出regaddr地址指向的寄存器的数据
- r=SPI_SendByte(0);
- ADS_CS_HIGH();
- return r;//返回数据
- }
- //-----------------------------------------------------------------//
- // 功 能:ADS1256初始化子程序
- // 入口参数: /
- // 出口参数: /
- // 全局变量: /
- // 备 注: /
- //-----------------------------------------------------------------//
- void ADS1256_Init(void)
- {
- ADS_CS_LOW();
- RESET_HIGH();
- delay_us(100);
- SPI_SendByte(ADS1256_CMD_REST);
- delay_ms(10);
- while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
- SPI_SendByte(ADS1256_CMD_SYNC); //同步命令
- SPI_SendByte(ADS1256_CMD_WAKEUP); //同步唤醒
-
- while(ADS_DRDY);
- SPI_SendByte(ADS1256_CMD_WREG | ADS1256_STATUS);//连续写入4个寄存器
- SPI_SendByte(3);
- SPI_SendByte(0x04); //高位在前,使用内部校准,不使用缓存
- SPI_SendByte(ADS1256_MUXP_AIN2 | ADS1256_MUXN_AIN3);//端口输入A2为正,A3位负
- SPI_SendByte(ADS1256_GAIN_1); //放大倍数设置
- SPI_SendByte(ADS1256_DRATE_2_5SPS); //采集速度设置
- delay_us(100);
-
- while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
- SPI_SendByte(ADS1256_CMD_SELFCAL); //偏移和增益自动校准
-
- ADS_CS_HIGH();
- delay_ms(100);
-
- }
- //-----------------------------------------------------------------//
- // 功 能:
- // 入口参数: /
- // 出口参数: /
- // 全局变量: /
- // 备 注:
- //-----------------------------------------------------------------//
- unsigned long ADS1256ReadData(void)
- {
- unsigned char i=0;
- unsigned long sum=0;
- unsigned long r=0;
- ADS_CS_LOW();
- while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
- SPI_SendByte(ADS1256_CMD_SYNC);
- SPI_SendByte(ADS1256_CMD_WAKEUP);
- SPI_SendByte(ADS1256_CMD_RDATA);
- delay_us(10); //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
- for(i=0;i<3;i++)
- {
- sum = sum << 8;
- r = SPI_SendByte(0);
- sum |= r;
- }
- ADS_CS_HIGH();
- return sum;
- }
- //-----------------------------------------------------------------//
- // 功 能:读取ADS1256单路数据
- // 入口参数: /
- // 出口参数: /
- // 全局变量: /
- // 备 注: /
- //-----------------------------------------------------------------//
- void sendChar(unsigned char ch)
- {
- USART_SendData(USART1, (unsigned char) ch);
- while (!(USART1->SR & USART_FLAG_TXE));
- }
- unsigned char i=0;
- long ulResult;
- long double ldVolutage;
- unsigned long ADS_sum(unsigned char road)
- {
- unsigned long results=0;
- unsigned long Result_sum=0;
- unsigned long fVoltage;
- unsigned char buf[10],i,rod;
- ADS1256WREG(ADS1256_MUX,road); //设置通道
- SPI_SendByte(ADS1256_CMD_SELFCAL); //偏移和增益自动校准
-
- rod = (road >> 4) ;
- // printf("第");
- // sendChar(rod);
- // printf("路:");
- Result_sum = ADS1256ReadData();//读取AD值,返回24位数据。
- ulResult= ADS1256ReadData();//读取AD值,返回24位数据。
- // return results;
- if(Result_sum<0x800000) //测得电压值为正的情况
- {
- // fVoltage=Result_sum*985; //954=2*2.5/2^19*100000000 2.5为基准电压 100000000为为了计算的准确性转换为整形计算。理论为954,实际修正为985
- // buf[0]=(unsigned char)(fVoltage/100000000);
- // buf[0]=buf[0]+0x30;
- // buf[1]='.';
- // buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
- // buf[2]=buf[2]+0x30;
- // buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
- // buf[3]=buf[3]+0x30;
- // buf[4]=(unsigned char)(fVoltage%1000000/100000);
- // buf[4]=buf[4]+0x30;
- // buf[5]=(unsigned char)(fVoltage%100000/10000);
- // buf[5]=buf[5]+0x30;
- // buf[6]=(unsigned char)(fVoltage%10000/1000);
- // buf[6]=buf[6]+0x30;
- // buf[7]=(unsigned char)(fVoltage%1000/100);
- // buf[7]=buf[7]+0x30;
- // buf[8]='V'; //V
- // buf[9]=0x20;
-
- if( ulResult & 0x800000 )
- {
- ulResult = ~(unsigned long)ulResult;
- ulResult &= 0x7fffff;
- ulResult += 1;
- ulResult = -ulResult;
- }
-
- ldVolutage = (long double)ulResult*0.59604644775390625;
- printf("第%d通道:",rod);
- printf("%lf",ldVolutage); //double
- printf("uV\r\n");
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
代码可能有错误,请各位大神指导:
24位ADS1256.7z
(291.4 KB, 下载次数: 200)
|