wenbo2005.online

学习记录 / STM32

MCP4017

STM322025-04-10
//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采集的才是实际值