手机端网站加盟,做效果图的方便的网站,wordpress页面响应慢前后端,青岛商媒做网站怎么样有些时候我们需要对高精度的ADC来处理一些要求较高的模拟量采集。在处理温控器的过程中我们就使用到了LTC2400这款ADC。接下来我们就来设计并实现LTC2400的驱动。
1、功能概述
LTC2400是一个供电电压2.7V到5.5V的微功率24位转换器#xff0c;集成了振荡器、4ppm INL和0.3ppm…有些时候我们需要对高精度的ADC来处理一些要求较高的模拟量采集。在处理温控器的过程中我们就使用到了LTC2400这款ADC。接下来我们就来设计并实现LTC2400的驱动。
1、功能概述
LTC2400是一个供电电压2.7V到5.5V的微功率24位转换器集成了振荡器、4ppm INL和0.3ppm RMS噪声。所需外接基准电压源的电压范围为0.1VVCC;模拟信号输入VIN的输入电压范围为-0.125VREF1.125VREF。
1.1、硬件结构
LTC2400模数转换器采用与SPI接口兼容的3线数字接口可应用于高分辨率和低频应用场合如称重、温度测量、气体分析、应变仪数据采集工业控制等方面。它采用8脚SO-8封装其引脚排列如图所示。 LTC2400内部已集成了高精度的振荡器因此采用片内振荡器时不需要外接任何元件。通过一个引脚LTC2400可以配置为在50Hz或60Hz±2%时优于110dB的抑制也可以由外部振荡器驱动用户定义的抑制频率在1Hz到120Hz之间。当芯片的F0脚接VCC时使用内部振荡器可对输入信号中的50Hz干扰进行大于110dB的抑制其AD转换时间为160ms;F0脚接GND时使用内部振荡器可对输入信号中的60Hz干扰进行大于110dB的抑制AD转换时间为133ms;当F0脚接外部振荡器fEOSC时其抑制的频率为fEOSC/2560AD转换时间为2048/fEOSC。
LTC2400转换器接受任何外部参考电压从0.1V到VCC。LTC2400以其扩展的输入转换范围-12.5% VREF到112.5% VREF平稳地解决了先前传感器或信号调理电路的偏移和超量程问题。
1.2、通讯接口
通过对CS和SCK的控制LTC2400可以提供几种灵活的接口模式(内部或外部的SCK模式)。不同转换模式的选择无需对LTC2400的寄存器进行设置并且不影响数据转换周期。使用时钟信号SCK(PIN7)控制转换数据的输出时转换结果将在时钟CLK的下降沿由SDO脚输出。在内部时钟模式SCK信号由LTC2400产生输出在外部SCK模式SCK为LTC2400外部输入的时钟信号。下面详细介绍外部串行时钟的三线接口方法。
当LTC2400上电时如果SCK为低电平转换进入外部串行模式;在CS信号的下降沿SCK信号必须为低电平。
当CS为高电平时SDO为高阻态此时SDO连接的接口线可以作为其它应用。如果LTC2400在转换和睡眠时CS为低电平那么SDO的输出状态将用于指示EOC。在AD转换阶段SDO的输出状态EOC将变为高电平而一旦转换完成EOC又变为低电平。在LTC2400处于睡眠状态时如果CS为低电平系统会在SCK的上升沿将其唤醒。LTC2400的外部串行时钟接口时序图如下 CS信号除用来检测LTC2400的状态和输出AD转换数据外还可用来控制全部串行数据输出之前进行的新一次AD转换。在LTC2400处于数据输出状态时CS由低变高以停止串行输出同时开始新的AD转换。
由于在CS为高电平时数据输出端SDO为高阻态因此在LTC2400的转换过程中可通过将CS变为低电平来检测转换状态。当CS为低电平时SDO脚输出的EOC信号为1表示转换正在进行;EOC为0表示转换完成系统处于睡眠状态。当LTC2400处于睡眠状态时其转换结果将保存在内部移位寄存器中。CS为低可在SCK的上升沿唤醒LTC2400此时转换数据将在SCK的下降沿串行输出。EOC通常在SCK的第一个上升沿被锁存直到第32个上升沿锁存结束同时系统将在第32个下降沿开始的新一轮转换。
一般情况下在数据输出过程中如果CS为低电平那么系统将在SCK的第一个上升沿和第32个下降沿中间将CS变高以停止数据输出。
1.3、工作过程
LTC2400是一种低功耗、采用Δ-Σ技术且具有3线串行接口的AD转换器而且在AD转换完成后将直接进入睡眠状态。LTC2400的三线接口线分别是数据输出(SDO)、时钟(SCK)和片选(CS)。其工作流程如图所示 LTC2400完成转换就进入睡眠状态。睡眠状态的供电电流仅为20μA。若CS一直为高电平芯片将保持睡眠状态。进入睡眠状态时数据最后的转换结果将保存在芯片内部的静态移位寄存器中。
当CS变为低电平时LTC2400开始输出转换结果此时数据转换没有等待时间输出数据即为刚进行的转换结果。该转换结果是在串行时钟SCK的控制下由SDO输出的并在SCK的下降沿更新而在SCK的上升沿可靠读取。当32位数据从LTC2400读出或当CS被拉高时数据输出结束。此后LTC2400将自动开始新的数据转换和重复周期。
2、驱动设计与实现
我们已经了解了LTC2400模数转换器的基本情况接下来我们将设计并实现LTC2400模数转换器的驱动程序。
2.1、对象定义
首先我们需要抽象出LTC2400模数转换器的对象类型。作为一个对象最起码包括量方面的内容属性和操作。关于LTC2400模数转换器的属性我们简单分析一下。LTC2400模数转换器是一个主动发送数据的器件并没有需要配置的地方仅有一个时钟通过外部引脚设置所以为了应用更清楚我们将其时钟引脚的配置作为其属性记录下来。另一个其返回的数据带有状态标识我们将其作为另一个属性以记录当前的状态。
至于操作也很简单首先我们要从LTC2400接收数据而这个与具体的平台联系紧密所以我们将从LTC2400接收数据作为对象的一个操作。LTC2400模数转换器采用SPI通讯接口有时需要在软件中对片选信号进行操作所以我们将片选型号的操作作为对象的另一个操作。在一些情况下有些针对对象的活动需要延时进行而在不同的平台中采取的延时方式不尽相同为了操作方便我们将延时操作作为对象的一个操作。于是我们可抽象的LTC2400的对象类型如下
/* 定义LTC2400对象类型 */
typedef struct Ltc2400Object {LTC2400ClockType clock; //使用的时钟uint32_t dataCode; //数据编码void (*Receive)(uint8_t *rData); //接收数据void (*ChipSelect)(LTC2400CSType cs); //实现片选void (*Delayms)(volatile uint32_t nTime); //实现ms延时操作
}Ltc2400ObjectType;
定义了LTC2400模数转换器的对象类型我们还需要设计对象的初始化函数因为对象必须初始化后才能使用。初始化函数至少包含有2方面内容一是为对象变量赋必要的初值二是检查这些初值是否是有效的。特别是一些操作指针错误的话可能产生严重的后果。基于这一原则我们设计LTC2400模数转换器的对象初始化函数如下
/* LTC2400对象初始化函数 */
void LTC2400Initialization(Ltc2400ObjectType *ltcLTC2400ClockType clockLTC2400Receive receiveLTC2400ChipSelect csLTC2400Delay msDelay)
{if((ltcNULL)||(receiveNULL)||(msDelayNULL)){return;}ltc-dataCode0;ltc-clockclock;if(csNULL) //硬件电路实现片选{ltc-ChipSelectDefaultChipSelect;}else{ltc-ChipSelectcs;}ltc-Receivereceive;ltc-DelaymsmsDelay;
}
至此关于LTC2400模数转换器的对象定义才算完成。在使用初始化函数时需要注意片选操作函数如果是采用硬件电路选中则可使用NULL作为参数。
2.2、对象操作
我们获取对象的目的就是希望通过对象来得到我们想要的数据。对于LTC2400模数转器来说就是从其接收ADC转换数据。所以我们封装LTC2400的操作函数如下
/* 获取LTC2400转换数据返回量程数据的比例值 */
float GetLtc2400Data(Ltc2400ObjectType *ltc)
{uint8_t rData[4];ltc-ChipSelect(LTC2400CS_Enable);ltc-Delayms(1);ltc-Receive(rData);ltc-Delayms(1);ltc-ChipSelect(LTC2400CS_Disable);return CompoundLTC2400Data(ltcrData);
}
函数的返回值是转换结果的比例值是一个浮点数使用这一返回结果结合具体浮点数的量成范围就可以得到物理量值。
3、驱动的使用
我们已经开发了LTC2400模数转换器的驱动程序接下来我们用一个简单的实例验证这一驱动。
3.1、声明并初始化对象
使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的LTC2400模数转换器对象类型声明一个LTC2400模数转换器对象变量具体操作格式如下
Ltc2400ObjectType ltc2400;
声明了这个对象变量并不能立即使用我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下
Ltc2400ObjectType *ltc所要初始化的对象
LTC2400ClockType clock采用时钟方式
LTC2400Receive receive接收数据函数指针
LTC2400ChipSelect cs片选操作函数指针
LTC2400Delay msDelay延时函数指针
对于这些参数对象变量我们已经定义了。所使用的时钟方式为枚举根据实际情况选择就好了。主要的是我们需要定义几个函数并将函数指针作为参数。这几个函数的类型如下
/*定义接收数据函数指针类型*/
typedef void (*LTC2400Receive)(uint8_t *rData);
/*定义片选信号函数指针类型*/
typedef void (*LTC2400ChipSelect)(LTC2400CSType cs);
/*定义延时操作函数指针类型*/
typedef void (*LTC2400Delay)(volatile uint32_t nTime);
对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的硬件平台有关系。片选操作函数用于多设备需要软件操作时如采用硬件片选可以传入NULL即可。具体函数定义如下
/*定义读写操作函数指针类型*/
void LTC2400Recieve(uint8_t *rData)
{HAL_SPI_Receive(ltc2400hspirData41000);
}/*实现片选*/
void LTC2400ChipSelected(LTC2400CSType cs)
{if(LTC2400CS_Enablecs){HAL_GPIO_WritePin(GPIOF GPIO_PIN_4 GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOF GPIO_PIN_4 GPIO_PIN_SET);}
}
对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下
LTC2400Initialization(ltc2400INTERNAL_CLOCK50HzLTC2400RecieveLTC2400ChipSelectedHAL_Delay);
这里我们将其初始化为使用改了内部时钟采用软件控制片选信号。
3.2、基于对象进行操作
我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。
/* 获取LTC2400测量的物理量值 */
void GetLTC2400Value(void)
{float ratio;float phyValue;float range100.0;float zero0.0;ratioGetLtc2400Data(ltc2400);phyValue(range-zero)*ratiozero;
}
在这一例中我们计算了一个量程范围为0到100的物理量的值如果检测的物理量不同我们根据实际修改即可。
4、应用总结
这一篇中我们设计并实现了LTC2400模数转换器的驱动程序并使用这一驱动开发了获取一个量程范围为0到100的温度信号的简单应用得到的结果与我们预期一致因此我们的驱动符合要求。
在使用驱动时需注意采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。
完整的源代码可在GitHub下载https://github.com/foxclever/ExPeriphDriver
欢迎关注