I2C总线改变MCP4017阻值和ADC多通道采集电压

目录

MCP4017简介

 通过I2C总线改变数字电位器阻值

 ADC多通道采集分样电压(PB14)


MCP4017简介

MCP4018适合做分压,MCP4017可以做可变电阻,滑到左边是R(AB),滑到中间是R(AB)/2,滑到右边是0Ω。100kΩ的阻值,可以分成127个档。掉电然后重新上电会恢复到中间电阻50kΩ。

7bit ——>0x7f    0~127

I2C总线改变MCP4017阻值和ADC多通道采集电压_第1张图片

MCP4017器件地址:

I2C总线改变MCP4017阻值和ADC多通道采集电压_第2张图片

R/W=0:写 0101 1110     0x5e

R/W=1:读 0101 1111     0x5f

MCP4017电阻网络:R(AB)=R(S) X N。R(S) X 127 = 100k。R(S) = 0.787kΩ。

I2C总线改变MCP4017阻值和ADC多通道采集电压_第3张图片

 通过I2C总线改变数字电位器阻值

I2C总线改变MCP4017阻值和ADC多通道采集电压_第4张图片

//写MCP4017
void MCP4017_Write(u8 val)
{   
	I2CStart();
	I2CSendByte(0x5E);  
	I2CWaitAck();
	
	I2CSendByte(val);  
	I2CWaitAck();
	I2CStop();
}

I2C总线改变MCP4017阻值和ADC多通道采集电压_第5张图片 

//读MCP4017
u8 MCP4017_Read(void)
{   
	u8 val; 
	I2CStart();
	I2CSendByte(0x5F);  
	I2CWaitAck();
	
	val = I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();

	return val;
}

没有对MCP4017进行操作的时候可以先测一下电压,大概在2,75左右就是好的。

3.3 * ( 50 / (50+10))  供电电压不同,也可能是不到3.3V。

写入最大值:MCP4017_Write(0x7f);

测量得:3.262 * ( 100 / (100+10))  = 2.96V

MCP4017_Write(0x08);      100kΩ / 127 X 8 = 6.3kΩ。3.262 * ( 6.3 / (6.3+10)) = 1.26V。 

0x3f ~ 2.72V左右。

I2C总线改变MCP4017阻值和ADC多通道采集电压_第6张图片

 ADC多通道采集分样电压(PB14)

ADC1用到了两个通道,所以number of conversion要改成2。RANK1 2里设置先转换哪个通道再转换哪个通道。有多个采样通道时采样速度不要太快,所以sampling time调到最大周期。

I2C总线改变MCP4017阻值和ADC多通道采集电压_第7张图片

I2C总线改变MCP4017阻值和ADC多通道采集电压_第8张图片 

//ADC执行程序
u16 adc1_val,adc2_val;
float volt_r37,volt_r38,volt_mcp;//定义两个电压变量

void ADC_Process(void)
{
	//RANK1 - CH5
	HAL_ADC_Start(&hadc1);
	volt_mcp = HAL_ADC_GetValue(&hadc1)/4096.0f*3.3f;
	//RANK2 - CH11
	HAL_ADC_Start (&hadc1 );//自动切换RANK
	adc1_val = HAL_ADC_GetValue (&hadc1 );//再获取值
	volt_r38 = adc1_val/4096.0f*3.3f;
	//ADC2的采集
	HAL_ADC_Start (&hadc2 );//先启动
	adc2_val = HAL_ADC_GetValue (&hadc2 );//再获取值得到0~4095的值
	volt_r37 = adc2_val/4096.0f*3.3f;       //除以4096得到实际电压值
}

显示在lcd上:

//LCD执行程序
void LCD_Process(void )
{
	u8 display_buf[20];
	sprintf((char*)display_buf,"%3d",startup_times);
	LCD_DisplayStringLine(Line0,display_buf);
	
	sprintf((char*)display_buf,"MCP:%5.2f",volt_mcp);
	LCD_DisplayStringLine(Line2,display_buf);
	
	sprintf((char*)display_buf,"R37:%5.2f R38:%5.2f",volt_r37,volt_r38);
	LCD_DisplayStringLine(Line3,display_buf);
	
}

你可能感兴趣的:(单片机,蓝桥杯嵌入式,单片机,嵌入式硬件,stm32,学习)