灵动微MM32F003硬件最小系统 --- 单路ADC DMA中断读取芯片内部温度传感器例程解析【7】

MM32F003内置温度传感器,可以ADC通道读取温度传感器的电压值,根据官方提供的计算公式,算出当前芯片的温度。
由于芯片的个体差异,读取的温度虽是线性的,但是并不准确。不能将这个温度结果用于温度测量,可以用来衡量温度的变化程度。
因为温度读取是通过一路ADC通道实现的,所以基本配置代码与普通ADC配置一致,只需要修改到温度传感器的读取通道即可。

1 配置ADC通道

int main(void)
{
    u16 chan, averagenumber = 0;
      Uart_ConfigInit(9600);
    //  SystemInit();
    //  InitSystick();
    //Initialize DMA
    DMAInit();

    ADCSingleChannelInit(ADCchTemp);

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                      //Start Conversion

    while(1) {
        if(ADCFilterflag) {                                                 //Determine whether the second-order filter is over
            ADCFilterflag = 0;                                              //Clear the filter end flag
            Get_Temperature();                                                  //Convert the filtered value to voltage
            ADC_SoftwareStartConvCmd(ADC1, ENABLE);                          //Start Conversion
        }
    }
}

2 将ADC值转换成温度值

#define M8(adr)  (*((vu8  *) (adr)))
#define M16(adr) (*((vu16 *) (adr)))
#define M32(adr) (*((vu32 *) (adr)))
void Get_Temperature(void)
{
    float slTemp, slTempsave;
    if((ADCFilterValue < 1024) || (ADCFilterValue > 2048)) {
        ADCFilterValue = 1237;
    }
    slTemp = ADCFilterValue;
    slTempsave = (int32_t)(0x0fff & (M16(0x1FFFF7F6)));
    ADCTempValue = (slTemp - slTempsave ) * 0.0143 + 27;
    UartSendGroup((u8*)printBuf, sprintf(printBuf, "adc value = 0x%4X \r\n",ADCFilterValue));
    UartSendGroup((u8*)printBuf, sprintf(printBuf, "temperature = %f \r\n",ADCTempValue));
}

计算方法详情参考用户手册和规格书。


用户手册
规格书

你可能感兴趣的:(灵动微MM32F003硬件最小系统 --- 单路ADC DMA中断读取芯片内部温度传感器例程解析【7】)