基于STM32的ADS1115程序

 

#include "./bsp/bsp.h"

uint8_t Channel_Value;
uint8_t ShowChannel[] = "No.- Channel:";

uint16_t D_ADS=0; 		//ת»»µÄÊý×ÖÁ¿
uint16_t Config=0;
uint8_t Writebuff[4]={0},Readbuff[3]={0};
uint32_t Result[2]={0}; 
uint16_t Format[5]={0};  //ת»»µÄÊý×ÖÁ¿×ª»»³ÉÊ®½øÖÆ

/***************¹¦ÄÜ:ADS1115¶Ë¿Ú³õʼ»¯****************/
void ADS1115_GPIO_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //¸´ÓÃIO¿ÚʱÖÓ
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//ʹÄÜPB¶Ë¿ÚʱÖÓ
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2;	//SCL-->PA.3, SDA-->PA.2 ¶Ë¿ÚÅäÖÃ
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 	//ÍÆÍìÊä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 	//IO¿ÚËÙ¶ÈΪ50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 			//¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB
	PBout(4)=1;	PBout(3)=1;                               //PA.2, PA.3 Êä³ö¸ß
}

void ADS1115_GPIO_IN(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//ʹÄÜPA¶Ë¿ÚʱÖÓ
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 			//SDA-->PB.9 ¶Ë¿ÚÅäÖÃ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 		//ÉÏÀ­ÊäÈë
	GPIO_Init(GPIOA, &GPIO_InitStructure);					 			//¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.9
}

void ADS1115_GPIO_OUT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//ʹÄÜPA¶Ë¿ÚʱÖÓ
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 			//SDA-->PB.9 ¶Ë¿ÚÅäÖÃ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 	//ÍÆÍìÊä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 	//IO¿ÚËÙ¶ÈΪ50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);					 			//¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.9
}

/*******************************************
º¯ÊýÃû³Æ£ºStart
¹¦    ÄÜ£ºÍê³ÉIICµÄÆðʼÌõ¼þ²Ù×÷
²Î    Êý£ºÎÞ
·µ»ØÖµ  £ºÎÞ
********************************************/
void Start(void)
{
	SCL=1;
	SDA=1;
	Delay_us(15);
	SDA=0;
	Delay_us(15);
	SCL=0;
	Delay_us(15);
}

/*******************************************
º¯ÊýÃû³Æ£ºStop
¹¦    ÄÜ£ºÍê³ÉIICµÄÖÕÖ¹Ìõ¼þ²Ù×÷
²Î    Êý£ºÎÞ
·µ»ØÖµ  £ºÎÞ
********************************************/
void Stop(void)
{ 
    SDA=0;
    Delay_us(15);
    SCL=1;
    Delay_us(15);
		SDA=1;
    Delay_us(15);
}
/*******************************************
º¯ÊýÃû³Æ£ºACK
¹¦    ÄÜ£ºÍê³ÉIICµÄÖ÷»úÓ¦´ð²Ù×÷
²Î    Êý£ºÎÞ
·µ»ØÖµ  £ºÎÞ
********************************************/
void ACK(void)
{
    SDA=0;
		Delay_us(1);
    SCL=1;
    Delay_us(15);
    SCL=0;
		Delay_us(15);
		SDA=1;
    Delay_us(15);
}
/*******************************************
º¯ÊýÃû³Æ£ºNACK
¹¦    ÄÜ£ºÍê³ÉIICµÄÖ÷»úÎÞÓ¦´ð²Ù×÷
²Î    Êý£ºÎÞ
·µ»ØÖµ  £ºÎÞ
********************************************/
void NACK(void)
{
	SDA=1;
	Delay_us(1);
	SCL=1;
	Delay_us(15);
	SCL=0;
	Delay_us(1);
	SDA=0;   
	Delay_us(15);
}
/**********¼ì²éÓ¦´ðÐźź¯Êý******************
Èç¹û·µ»ØֵΪ1ÔòÖ¤Ã÷ÓÐÓ¦´ðÐźţ¬·´Ö®Ã»ÓÐ
*******************************************
º¯ÊýÃû³Æ£ºCheck
¹¦    ÄÜ£º¼ì²é´Ó»úµÄÓ¦´ð²Ù×÷
²Î    Êý£ºÎÞ
·µ»ØÖµ  £º´Ó»úÊÇ·ñÓÐÓ¦´ð£º1--ÓУ¬0--ÎÞ
********************************************/
uint8_t Check(void)
{
    uint8_t slaveack;
    SDA=1;
    Delay_us(1);
    SCL=1;
//		ADS1115_GPIO_IN();	// SDAÉèÖÃΪÊäÈë
    Delay_us(15);
    slaveack = SDA_IN;   		//¶ÁÈëSDAÊýÖµ
    SCL=0;
    Delay_us(15);
//		ADS1115_GPIO_OUT();	// SDAÉèÖÃΪÊä³ö
	
    if(slaveack)    return FALSE;
    else            return TRUE;
}

/***************дÈëÒ»¸ö×Ö½Ú****************/
void Write_1_Byte(uint8_t DataByte)
{
	uint8_t i;

	for(i=0;i<8;i++)
	{
		if(DataByte&0x80)  //if((DataByte<<i)&0x80)
		  SDA=1;
		else
			SDA=0;
			Delay_us(15);
			SCL=1;
			Delay_us(15);
			SCL=0;
			Delay_us(15);
			DataByte <<= 1;
	}
    SDA=1;
    Delay_us(5);
}
/***************дÈëN¸ö×Ö½Ú****************/
uint8_t Write_N_Byte(uint8_t *writebuffer,uint8_t n)
{
	uint8_t i;
	for(i=0;i<n;i++)
	{
		Write_1_Byte(*writebuffer);
		if(Check())
		{
			writebuffer ++;
		}
		else
		{
			Stop();
		    return FALSE;
		}
	}
	Stop();
	return TRUE;
}

/***************¶ÁÈ¡Ò»¸ö×Ö½Ú****************/
uint8_t Read_1_Byte(void)
{
    uint8_t data_Value = 0, FLAG, i;	
    for(i=0;i<8;i++)
    {    
			SDA=1;
			Delay_us(15);
			SCL=1;
			ADS1115_GPIO_IN();	// SDAÉèÖÃΪÊäÈë
			Delay_us(15);
			FLAG=SDA_IN;
			data_Value <<= 1;
	  if( FLAG ) 
			 data_Value |= 0x01;
			 SCL=0;
			 Delay_us(15);
			 ADS1115_GPIO_OUT();	// SDAÉèÖÃΪÊä³ö
    }
    return data_Value;
}

/***************¶ÁÈ¡N¸ö×Ö½Ú****************/
void Read_N_Byte(uint32_t *readbuff, uint8_t n)
{
	uint8_t i;
	for(i=0;i<n;i++)
	{
		readbuff[i]=Read_1_Byte();
		if(i==n-1)
			NACK();  //²»Á¬Ðø¶Á×Ö½Ú
		else 
			ACK();  //Á¬Ðø¶Á×Ö½Ú
	}
	Stop();
}
/*****************³õʼ»¯ADS1115******************/
void InitADS1115(uint8_t S_MUX_0, uint8_t S_MUX_1, uint8_t S_MUX_2)
{
	     if (S_MUX_0 == 0 && S_MUX_1 == 0 && S_MUX_2 == 0) Config = OS_1+MUX_A0+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 0 && S_MUX_1 == 0 && S_MUX_2 == 1) Config = OS_1+MUX_A1+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 0 && S_MUX_1 == 1 && S_MUX_2 == 0) Config = OS_1+MUX_A2+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 0 && S_MUX_1 == 1 && S_MUX_2 == 1) Config = OS_1+MUX_A3+PGA+DRX+COMP_QUE+MODE;
	else if (S_MUX_0 == 1 && S_MUX_1 == 0 && S_MUX_2 == 0) Config = OS_1+MUX_A4+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 1 && S_MUX_1 == 0 && S_MUX_2 == 1) Config = OS_1+MUX_A5+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 1 && S_MUX_1 == 1 && S_MUX_2 == 0) Config = OS_1+MUX_A6+PGA+DRX+COMP_QUE+MODE;	
	else if (S_MUX_0 == 1 && S_MUX_1 == 1 && S_MUX_2 == 1) Config = OS_1+MUX_A7+PGA+DRX+COMP_QUE+MODE;  
    
    Writebuff[0]=ADDRESS_W;
    Writebuff[1]=Pointer_1; 
    Writebuff[2]=Config/256;
    Writebuff[3]=Config%256;
        
    Readbuff[0]=ADDRESS_W;
    Readbuff[1]=Pointer_0;    
    Readbuff[2]=ADDRESS_R;
}

/***************дÈë×Ö½Ú***********************/
void WriteWord(void)
{
     int t=0;
     Start();   //дÈë4¸ö×Ö½Ú
     do
     {
        t=Write_N_Byte(Writebuff,4);
     }while(t==0);
}
/***************¶ÁÈ¡×Ö½Ú***********************/
void ReadWord(void)
{
    int t=0;
    Start();  //дÈë2¸ö×Ö½Ú
    do
    {
      t=Write_N_Byte(Readbuff,2);
    }while(t==0);
    Start();  //дÈë2¸ö×Ö½Ú
    do
    {
      t=Write_N_Byte(&Readbuff[2],1);
    }while(t==0);  
    Read_N_Byte(Result,2);  //¶Á³ö2¸ö×Ö½Ú

}

/***************¶ÁÈ¡ADS1115¸÷ͨµÀÖµ********************/
unsigned int ADS1115(uint8_t Channel)
{
	uint8_t S_MUX_0, S_MUX_1, S_MUX_2;
	switch(Channel)
	{	
		case 0: S_MUX_0 = 1;S_MUX_1 = 0;S_MUX_2 = 0;break;									
		case 1: S_MUX_0 = 1;S_MUX_1 = 0;S_MUX_2 = 1;break;			
		case 2: S_MUX_0 = 1;S_MUX_1 = 1;S_MUX_2 = 0;break;			
		case 3: S_MUX_0 = 1;S_MUX_1 = 1;S_MUX_2 = 1;break;		
		default:                                                           
			break;
//		Channel_Value = Channel + '0';
	}
    InitADS1115(S_MUX_0, S_MUX_1, S_MUX_2);
    WriteWord();
    Delay_ms(1);
    ReadWord();	
    D_ADS=Result[0]*256+Result[1];  //ת»»µÄÊý×ÖÁ¿

  	return D_ADS;
}





 

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32F103和ADS1115的驱动程序示例: ```c #include "stm32f10x.h" #include "delay.h" #include "ads1115.h" #define ADS1115_ADDRESS 0x90 // ADS1115的地址为0x90 void ADS1115_Init(void) { I2C1_Init(); // 初始化I2C总线 I2C1_Start(); // 启动I2C总线 I2C1_SendByte(ADS1115_ADDRESS); // 发送从设备地址 I2C1_SendByte(0x01); // 发送配置寄存器的地址 I2C1_SendByte(0xC5); // 发送配置字节MSB I2C1_SendByte(0x83); // 发送配置字节LSB I2C1_Stop(); // 停止I2C总线 } int16_t ADS1115_GetValue(uint8_t channel) { uint8_t data[2]; int16_t value; I2C1_Start(); // 启动I2C总线 I2C1_SendByte(ADS1115_ADDRESS); // 发送从设备地址 I2C1_SendByte(0x00); // 发送转换寄存器地址 I2C1_Stop(); // 停止I2C总线 delay_ms(1); // 延时等待转换完成 I2C1_Start(); // 启动I2C总线 I2C1_SendByte(ADS1115_ADDRESS | 0x01); // 发送读取命令 data[0] = I2C1_ReadByte(1); // 读取数据字节MSB并发送NACK data[1] = I2C1_ReadByte(0); // 读取数据字节LSB并发送ACK I2C1_Stop(); // 停止I2C总线 value = (int16_t)(data[0] << 8) | data[1]; // 合并数据字节 if (value < 0) // 如果是负数 { value = ~value + 1; // 取反加一 } switch (channel) // 根据通道号计算转换后的值 { case 0: value *= 6.144 / 32768; break; case 1: value *= 4.096 / 32768; break; case 2: value *= 2.048 / 32768; break; case 3: value *= 1.024 / 32768; break; } return value; } ``` 在上面的示例代码中,我们使用了ADS1115的单次转换模式,配置字节为0xC583,通道0-3的增益分别为6.144、4.096、2.048和1.024。函数`ADS1115_Init()`用于初始化ADS1115,函数`ADS1115_GetValue()`用于获取指定通道的转换值。在读取转换值之前需要延时一段时间等待转换完成。转换完成后,读取数据字节MSB和LSB,并根据通道号计算转换后的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值