0. 参考
电流模架构Bandgap设计与仿真
bandgap的理解(内部带隙电压基准)
虽然看不懂这些公式,但是比较重要的一句应该是这个:因为传统带隙基准的输出值为1.2V
1. 使用
参考示例代码。
40002000是falsh控制器寄存器,40002058应该也是flash相关。
flash控制寄存器到0x40002040就结束了,参考下表的地址规律,在0x40002044应该就是eflash控制寄存器结束地址。跟代码里面的40002058没有啥关系。
可以看到这个也是存在falsh中,手册中没有说明这个地址的作用,应该也是专门用来存储基校准电压的地方。
看到7801的BG输出电压是1.2V,并且出厂自带校准。
温度曲线斜率1.692,单位是mV/℃
25℃时候电压是0.72V
可以看到低5位用来存储BG校准值
高8位用来存储25℃时候的温度值
TsensorCali = *((uint32_t *)0x40002058);
VbandgapRT = (uint8_t)(TsensorCali & 0x1F); // 0 1111 低5位
VtsensorRT = (uint8_t)((TsensorCali >> 8) & 0xFF); // 1111 1111 高8位
最高位第5位不为0 因此可以判断第5位是符号位
最高位第8位不为0 因此可以判断第8位是符号位
经过换算之后1200的ADC值对应的就是1.2V电压值。
温度值720对应0.72V【720mV】,与后面的0.5系数就不太懂了,应该是特殊公式。
/* BG calibration */
if (VbandgapRT >> 4) //最高位第5位不为0 因此可以判断第5位是符号位
{
bgVol = 1200 - (VbandgapRT & 0xF);
}
else
{
bgVol = 1200 + (VbandgapRT & 0xF);
}
/* Vtsensor calibration */
if (VtsensorRT >> 7) //最高位第8位不为0 因此可以判断第8位是符号位
{
vt25Vol = 720 - (VtsensorRT & 0x7F) * 0.5;
}
else
{
vt25Vol = 720 + (VtsensorRT & 0x7F) * 0.5;
}
进行ADC采样
测出来的数据
使用BG的校准值和测出来的BG值对温度ADC值进行校准
ADC值即mV单位的电压值,进行温度曲线斜率换算,得到目前的温度值。