A/D转换芯片ads1118驱动程序

A/D转换芯片ADS1118的C51驱动程序

最近学习了ADS1118的驱动程序,请多指导!

头文件

#ifndef ADS1118_H_
#define ADS1118_H_

#include <stdio.h>
#include <intrins.h>

typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;

#define CONFIG_VALUE 0X428B //AIN0-AIN1 4.096 128sps pull on DOUT

sbit SCLK = P2^1; //ads1118时钟引脚
sbit MOSI = P2^2; //ads1118 DIN引脚
sbit MISO = P2^3; //ads1118 DOUT引脚
sbit CS = P2^0; //ads1118 CS引脚

#define SCLK_H SCLK=1
#define SCLK_L SCLK=0

/单片机为主机/
#define MOSI_H MOSI=1 //主机出从机入
#define MOSI_L MOSI=0

#define MISO_H MISO=1 //主机入从机出
#define MISO_L MISO=0

#define CS_H CS=1
#define CS_L CS=0

#define READ_MISO P2 & 0X8

void ADS1118_Init(void);
uint Write_ADS1118(uint dat,uchar mode);
void delay_ms(uint z);
int ADS_SEL_Read(uchar road,uchar Ref);

void delay_ms(uint z)
{
uint x;
for(;z>0;z–)
for(x=110;x>0;x–);
}
void ADS1118_Init(void) //ADS1118初始化
{
CS_H;
SCLK_H;
MOSI_L;
}
uint Write_ADS1118(uint dat,uchar mode) //单片机往ADS中写指令
{
uint temp1,temp2,rece1,rece2;

uchar i;		
if(mode == 1) dat |= 0x8000;	// dat=dat|0x8000;
temp1 = dat;
temp2 = dat;

SCLK_L;
CS_L;
delay_ms(1);
for(i=0;i<16;i++)
{
	if(temp1 & 0x8000) MOSI_H;	 //从左边(高位)依次读取数据
	else MOSI_L;
	temp1 <<= 1;
	delay_ms(1);//		_nop_();
	SCLK_H;
	delay_ms(1);//	_nop_();
	SCLK_L;
	delay_ms(1);//	_nop_();		
	rece1 <<= 1;
	if(MISO==1) rece1 |= 0x01;
	delay_ms(1);//		_nop_();
}
for(i=0;i<16;i++)
{
	if(temp2 & 0x8000) MOSI_H;	 //从左边(高位)依次读取数据
	else MOSI_L;
	temp1 <<= 1;
	delay_ms(1);//		_nop_();
	SCLK_H;
	delay_ms(1);//	_nop_();
	SCLK_L;
	delay_ms(1);//	_nop_();		
	rece2 <<= 1;
	if(MISO==1) rece2 |= 0x01;
	delay_ms(1);//		_nop_();
}
CS_H;
SCLK_L;
MOSI_L;
MISO_L;
return rece1;

}

/*******************************************************************************
//函数名称:ADS_SEL_Read()
//函数功能:读取各路电压,通过两个switch选择读取不同的通道
//输 入:road:增益放大器两端的电压选择,并选择测几路电压
// Ref: 选择参考电压,有6种选择
//输 出:dat:16位ad转换数据
//备 注:这一次读出的转换数据是上一次的转换数据,不要混淆.这里选择的是单次
转换电压值,当然,也可以选择多次转换,通过寄存器的第8位可以设置
//日 期:2013.6.8
*******************************************************************************/
int ADS_SEL_Read(uchar road,uchar Ref) //测几路电压
{
int dat = 0;
uint Config_Value = 0x008b; //默认低8位,DOUT带上拉电阻
switch(road) //选择有效转换的路数
{
case 0: Config_Value += 0x0000;break; //AINP = AIN0 and AINN = AIN1 (default)
case 1: Config_Value += 0x1000;break; //AINP = AIN0 and AINN = AIN3
case 2: Config_Value += 0x2000;break; //AINP = AIN1 and AINN = AIN3
case 3: Config_Value += 0x3000;break; //AINP = AIN2 and AINN = AIN3
case 4: Config_Value += 0x4000;break; //AINP = AIN0 and AINN = GND
case 5: Config_Value += 0x5000;break; //AINP = AIN1 and AINN = GND
case 6: Config_Value += 0x6000;break; //AINP = AIN2 and AINN = GND
case 7: Config_Value += 0x7000;break; //AINP = AIN3 and AINN = GND
default : break;
}
switch(Ref)
{
case 0: Config_Value += 0x0000;break; //000 : FS = ±6.144V(1)
case 1: Config_Value += 0x0200;break; //001 : FS = ±4.096V(1)
case 2: Config_Value += 0x0400;break; //002 : FS = ±2.048V(1)
case 3: Config_Value += 0x0600;break; //003 : FS = ±1.024V(1)
case 4: Config_Value += 0x0800;break; //004 : FS = ±0.512V(1)
case 5: case 6: case 7: Config_Value += 0x0a00;break; //005 : FS = ±0.256V(1)
default : break;
}
CS_L;
dat = Write_ADS1118(Config_Value,1);
delay_ms(2);//nop();
CS_H;
return dat;
}

#endif

C程序

#include<reg51.h>
#include<ADS1118.h>

float Volt_Value;

void main(void)
{
uint value;
EA = 1;
ADS1118_Init();
Write_ADS1118(CONFIG_VALUE,1);
while(1)
{
delay_ms(20);
value = ADS_SEL_Read(4,1); //AIN0单端输入,参考电压4.096V
MISO=1;
CS_L;
delay_ms(20);
if(MISO==0)
{
value = Write_ADS1118(0x428b,1); //4.096

	 }
	Volt_Value = value*4.096/32768;   //第二次转换时读出的是前一次的电压

}
}

请多指教!

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ADS1118是一款高精度、低功耗的16位模数转换器(ADC),用于测量电压信号。它通常用于温度传感器、压力传感器、光敏传感器等各种传感器的数据采集。 要编写ADS1118驱动程序,您需要了解该芯片的通信协议和寄存器配置。ADS1118使用SPI(串行外设接口)进行通信,需要通过SPI总线发送指令和读取数据。 以下是一个示例的ADS1118驱动程序(以C语言为例): ```c #include <stdio.h> #include <stdlib.h> #include <wiringPiSPI.h> // ADS1118寄存器定义 #define ADS1118_REG_CONVERSION 0x00 #define ADS1118_REG_CONFIG 0x01 // ADS1118配置寄存器位定义 #define ADS1118_CFG_OS_SINGLE 0x8000 #define ADS1118_CFG_MUX_AIN0_AIN1 0x0000 #define ADS1118_CFG_PGA_4V096 0x0200 #define ADS1118_CFG_MODE_SINGLE 0x0100 #define ADS1118_CFG_DR_128SPS 0x0000 // 初始化SPI通信 void ads1118_init() { wiringPiSPISetup(0, 500000); // 设置SPI通信速率为500000(500kHz) } // 向ADS1118写入配置寄存器 void ads1118_write_config(uint16_t config) { uint8_t txData[2]; txData[0] = config >> 8; txData[1] = config & 0xFF; wiringPiSPIDataRW(0, txData, 2); // 发送配置数据 } // 读取ADS1118转换结果 int16_t ads1118_read_conversion() { uint8_t txData[2] = {ADS1118_REG_CONVERSION, 0x00}; uint8_t rxData[2]; wiringPiSPIDataRW(0, txData, 2); // 发送读取转换结果的指令 return (rxData[0] << 8) | rxData[1]; // 将接收到的数据合并为16位结果 } int main() { ads1118_init(); // 初始化ADS1118 // 配置ADS1118 uint16_t config = ADS1118_CFG_OS_SINGLE | ADS1118_CFG_MUX_AIN0_AIN1 | ADS1118_CFG_PGA_4V096 | ADS1118_CFG_MODE_SINGLE | ADS1118_CFG_DR_128SPS; ads1118_write_config(config); // 循环读取转换结果 while (1) { int16_t result = ads1118_read_conversion(); printf("Conversion result: %d\n", result); delay(1000); // 延时1秒 } return 0; } ``` 这是一个简单的ADS1118驱动程序示例,可以初始化ADS1118,配置寄存器,并循环读取转换结果。请注意,此示例使用了WiringPi库来实现SPI通信,您可能需要根据您的硬件平台和开发环境进行相应的修改和适配。 希望这个示例对您有所帮助!如果您有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值