目录
MCP4017简介
MCP4018适合做分压,MCP4017可以做可变电阻,滑到左边是R(AB),滑到中间是R(AB)/2,滑到右边是0Ω。100kΩ的阻值,可以分成127个档。掉电然后重新上电会恢复到中间电阻50kΩ。
7bit ——>0x7f 0~127
MCP4017器件地址:
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
void MCP4017_Write(u8 val)
{
I2CStart();
I2CSendByte(0x5E);
I2CWaitAck();
I2CSendByte(val);
I2CWaitAck();
I2CStop();
}
//读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左右。
ADC多通道采集分样电压(PB14)
ADC1用到了两个通道,所以number of conversion要改成2。RANK1 2里设置先转换哪个通道再转换哪个通道。有多个采样通道时采样速度不要太快,所以sampling time调到最大周期。
//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);
}