在工业控制中,经常会使用到数字信号或者模拟信号,比如0-5V,0-10mv,或者是4-20ma等等,而主控cpu,在采集这些信号的时候,需要使用单片机内的ADC功能,或者是外扩AD芯片,对外部的信号进行采样、分析,今天就和大家分享一个采集电压信号的方式方法:
首先简答看一下原理图:
PCB的效果图
实物图片:
首先简单看一下这个原理图,这里主要是使用外扩AD芯片的方式,对信号进行采集、处理。这里使用到的芯片一一进行分析。
ADS8341芯片介绍:ADS8341是一款高性能、低功耗的16位、4通道采样模数转换器,适用于多种应用场景。在使用时,应注意电源管理、信号输入、通信接口和工作环境等方面的问题,以确保器件的正常工作和长期稳定性
芯片的主要特性
具有高分辨率的优点:16位的高分辨率,采样值在0-65535 之间变化,根据硬件设计可以支持单通道、双通道的采集方式,芯片能够提供高精度的模拟信号到数字信号的转换。
支持多路信号采集:最大支持4路通道,采用轮询式方式采集,可以独立进行采样和转换。不过在使用过程中为了防止通道之间的串扰,对于没有使用到的压力通道,在硬件设计时候,可以直接接入AGND。
简单的串行接口通讯方式:内置同步串行接口(SPI),方便与cpu或其他数字设备进行通信。
具有低功耗的优点:在典型工作条件下(100kHz速率和+5V电源),功耗仅为8mW。
监测范围广:基准电压(VREF)可以在500mV和VCC之间变化,提供0V至VREF的相应输入电压范围。
AD620:高精低失调电压和低失调漂移、低噪声、低功耗、易于设置增益、宽电源电压范围、低输入偏置电流的特点,该芯片是一款低成本、高精度仪表放大器,其特性和应用广泛。
运放芯片的主要特性:
高精度:AD620具有高精度特性,最大非线性度为40ppm,能够确保信号的准确放大和传输。
低失调电压和低失调漂移:其最大失调电压为50μV,最大失调漂移为0.6μV/°C,有助于保持信号的稳定性和准确性。
低功耗:AD620的功耗较低,最大电源电流仅1.3mA,非常适合电池供电的便携式或远程应用。
宽电源范围:其电源范围宽(±2.3V至±18V),适用于多种供电环境。
差分放大功能:AD620具有差分放大功能,能够抑制共模信号而仅放大差模信号,提高信号的抗干扰能力。
外部电阻设置增益:仅需要一个外部电阻来设置增益,增益范围为1至10000,方便用户根据需求进行调整。
使用时候的注意事项:
供电电源:应确保供电电源的质量稳定,避免在电源不稳定的情况下使用AD620,以免影响其性能。
增益设置:在设置增益时,应根据实际需求选择合适的外部电阻值,并确保增益设置在AD620的允许范围内。
信号输入:输入信号应保持在AD620的输入范围内,避免输入过大的信号导致器件损坏或性能下降。
工作环境:应避免在高温、高湿度或强磁场等恶劣环境下使用AD620,以免影响其性能和寿命。
TLE2072:
低噪声:适合对噪声敏感的应用,如音频放大和信号处理。
高速:具有较高的带宽,能够处理高频信号。
FET输入:采用FET(场效应晶体管)输入,提供高输入阻抗和低输入偏流。
双路运放:内部包含两个独立的运算放大器,可用于多种电路配置。
ADS8341芯片软件采集示例代码:
/** * 函数功能: 往串行ADS8341读取写入一个字节数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ uint8_t ADS8341_WriteReadByte(uint8_t byte) { uint8_t d_read,d_send = byte; if(HAL_SPI_TransmitReceive(&hspi3,&d_send,&d_read,1,1000) != HAL_OK) d_read = 0xFF; return d_read; } /** * 函数功能: 得到ADS8341采样数据 * 输入参数: uCH: 通道号 * 返 回 值: 采样数据 * 说 明: 无 */ int Get_SampleData(uint8_t uCH, uint16_t *ReadSample) { uint16_t uOvertimes; uint8_t iREADH; uint8_t iREADM; uint8_t iREADL; uint16_t iTempData; ADS8341_CS_LOW; switch(uCH) { case 0: ADS8341_WriteReadByte(0x97); break; case 1: ADS8341_WriteReadByte(0xD7); break; case 2: ADS8341_WriteReadByte(0xA7); break; case 3: ADS8341_WriteReadByte(0xE7); break; default: break; } uOvertimes = 0; while(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15) == 0) //这里是为了等待ADS8341转换完成,否则不能读取芯片的通道数据 { uOvertimes++; if(uOvertimes > 100) { ADS8341_CS_HIGH; return 0; } } iREADH = ADS8341_WriteReadByte(0); iREADM = ADS8341_WriteReadByte(0); iREADL = ADS8341_WriteReadByte(0); ADS8341_CS_HIGH; iTempData = iREADH; iTempData = (iTempData<<8) | iREADM; iTempData = (iTempData<<1) | (iREADL>>7); *ReadSample = iTempData; return 1; }