1、开发环境
LPC-2478+IAR+JLINK
2、芯片介绍
AD7171是一款极低功耗、16位模数转换器(ADC),内置一个精密16位Σ-Δ型ADC和一个片内振荡 器。该器件功耗仅为135 µA,因此特别适合要求极低功耗的便携式或电池供电产品。它还具有关断模式,该模式下的器件功耗仅为5 μA,从而可延长产品的电池使用时间。
为便于使用,AD7171的所有特性均由专用引脚控制。每次发生数据读取操作时,8个状态位便会附加到16位转换结果上。这些状态位含有一个码序列,可用来确认串行传输的有效性。
AD7171的输出数据速率为125 Hz,建立时间为24 ms。它具有一路差分输入,增益为1。在用户需用外部放大器来满足系统专用滤波或增益要求的应用中,此特性会很有用。
- 输出数据速率:125 Hz
- 引脚可编程的掉电和复位功能
- 状态功能
- 内部时钟振荡器
- 电流:135 µA
- 电源:2.7 V至5.25 V
- 温度范围:-40°C至+105°C
- 封装:10引脚3 mm x 3 mm LFCSP封装
3、搬运数据手册
3.1、时序
时序图
3.2、引脚说明
3.3、状态位说明
4、与LPC2478的连接
- AIN+、AIN-、REF、VDD、NC、GND、REF-与软件无关
- PDRST:上拉高电平,ADC连续转换
- DOUT/RDY:连接单片机P1[0],单片机输入ad7171输出
- SCLK:连接单片机P0[3],单片机输出ad7171输入
5、代码实现
注意:当获得数据后,必须等待8ms才能开始下一次读取数据
#define CLK_Low (FIO0CLR |= 0x01 << 3)
#define CLK_High (FIO0SET |= 0x01 << 3)
#define AD_DATA_READY (FIO1PIN & (1 << 0))
typedef enum {
No_Err,
Convert_Err,
Id_Err,
Status_Err,
Noknown_Err
}AD7171_STATUS;
void ad7171_init(void);
uint32_t ad7171_read(void);
AD7171_STATUS ErrorCheck(uint8_t Status);
//Delay(12) 1us
void Delay(unsigned int DelayTime)
{
unsigned long time = DelayTime * 12;
while(time>0){
time--;
}
}
void ad7171_init(void)
{
PINSEL0 &= ~(0x03 << 6);
FIO0DIR |= 0x01 << 3;
/* 默认高电平 */
CLK_High;
PINSEL0 &= ~(0x03 << 0);
FIO0DIR &= ~(0x01 << 0);
Delay(1000);
}
/*
默认CLK拉高,
采样时序:
1、时钟拉高,等待DATA拉低,
2、时钟拉低,延时T2,最小100ns
3、时钟拉高,延时T1,最小100ns
4、读取DATA脚的电平
5、循环2-4,得到24位数据
*/
unsigned char StatusBar = 0x00;
unsigned char ReceivedBit = 0;
unsigned short DataReg = 0x0000;
unsigned int ad7171_read(void)
{
int ready = 1;
int TempInput = 0;
int InputRegister[10];
int i = 0,j = 0;
CLK_High;
while(ready){
ready = AD_DATA_READY;
}
Delay(100);
for(i = 0;i < 3;i++){
for(j = 0;j < 8;j++){
TempInput <<= 1;
CLK_Low;
Delay(1);
CLK_High;
Delay(1);
if(0x1==AD_DATA_READY){
TempInput |= 1;
}
}
InputRegister[i] = TempInput;
}
CLK_High;
Delay(10);
DataReg = InputRegister[1];
StatusBar = (InputRegister[2] & 0x0000FF);
Delay(10);
do
{
ready = AD_DATA_READY;
}while(ready != 0x01);
if(ErrorCheck(StatusBar) == No_Err){
return DataReg;
}
return -1;
}
AD7171_STATUS ErrorCheck(uint8_t Status)
{
if (0x0D == Status){
/* 没有错误 */
return No_Err;
}else {
if(0x20 ==(Status & 0x20)){
/* 转换中发生错误 */
return Convert_Err;
}
if (0x05 != (Status & 0x05)){
/* 串行传输未正确执行 */
return Id_Err;
}
if (0x08 != (Status & 0x08)){
/* 状态栏ID不匹配错误 */
return Status_Err;
}
}
return Noknown_Err;
}