//MCP4017与EEPROM挂在同一条IIC总线上,通过iic通信写入数据,可以通过iic通信获取数据,也可以通过ADC(ADC1的通道5)采集电压值
注意:复位读取的数值不变,重新上电会恢复默认值
void MCP4017_Write(uint8_t data)
{
I2CStart();
I2CSendByte(0x5e);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
//IIC读取
uint32_t MCP4017_Read()
{
uint32_t data;
I2CStart();
I2CSendByte(0x5f);
I2CWaitAck();
data = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return data;
}
//ADC采集(通道5与通道11优先级在CubeMx的Rank设置,谁排在前面谁就高,先采集谁)
void ADC_Process(void)
{
HAL_ADC_Start(&hadc1);
volt_mcp=HAL_ADC_GetValue(&hadc1)/4096.0f*3.3f;
HAL_ADC_Start(&hadc1);
adc1_val=HAL_ADC_GetValue(&hadc1);
volt_r38=adc1_val/4096.0f*3.3f;
}
//转换===》先计算R的阻值,再计算在在3.3V中的占比
temp = (MCP4017_Read()/127.0f)*100.0f;
iic_mcp_value = temp *3.3f /(temp + 10.0f);
实列:
float temp ;
uint32_t get_time=0;
void Get_Proc()
{
if(uwTick-get_time<200) return;
get_time = uwTick;
//理论值
temp = (MCP4017_Read()/127.0f)*100.0f;
iic_mcp_value = temp *3.3f /(temp + 10.0f);
//实际值
HAL_ADC_Start(&hadc1);
adc_mcp_value = HAL_ADC_GetValue(&hadc1)/4096.0f*3.3f;
//R38电压值
HAL_ADC_Start(&hadc1);
adc_r38_value = HAL_ADC_GetValue(&hadc1)/4096.0f*3.3f;
}
将采集周期调大,千万不要加这个函数(两个通道采集互换):HAL_ADC_PollForConversion(&hadc1,5);
注意:使用IIC读取,经过换算是理论值,只有ADC采集的才是实际值