新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32開發板入門教程 - 內部溫度傳感器

        STM32開發板入門教程 - 內部溫度傳感器

        作者: 時間:2016-11-09 來源:網絡 收藏

        廢話少說 先看看他的參數
        1.STM32內部溫度傳感器與ADC的通道16相連,與ADC配合使用實現溫度測量;
        2.測量范圍–40~125℃,精度±1.5℃。
        3.溫度傳感器產生一個隨溫度線性變化的電壓,轉換范圍在2V < VDDA < 3.6V之間。

        轉換公式如下圖所示:

        本文引用地址:http://www.104case.com/article/201611/317725.htm

        呵呵 其實 寫代碼的時候 公式直接簡化就得啦如果測量要求不怎么高的話 呵呵(其實高也高不了 呵呵)
        我們都喜歡簡單 簡單明了嘿嘿
        簡化的公式:vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25;

        呵呵重新說一下 過程:
        1. 初始化ADC初始化DMA (大家可以參考馬七的ADC教程點擊這里)
        2.ADC_TempSensorVrefintCmd(ENABLE); 這個要開啟哦使能溫度傳感器和內部參考電壓通道
        3. 簡單的數字濾波一下檢測到的ADC的值
        4. 按照剛才列出的公式計算就OK啦 呵呵


        第二步是做什么的呢?看這個圖就曉得啦
        貼一下初始化的函數

        /*******************************************************************************
        * Function Name: ADC_Configuration
        * Description : ADC_Configuration
        * Input : None
        * Output : None
        * Return : None
        *******************************************************************************/
        void ADC_Configuration(void)
        {
        /* DMA1 channel1 configuration ----------------------------------------------*/
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 1;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

        /* Enable DMA1 channel1 */
        DMA_Cmd(DMA1_Channel1, ENABLE);

        /* ADC1 configuration ------------------------------------------------------*/
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        ADC_Init(ADC1, &ADC_InitStructure);
        /* ADC1 regular channel14 configuration */
        ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);
        /* Enable the temperature sensor and vref internal channel */
        ADC_TempSensorVrefintCmd(ENABLE);
        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);

        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);
        /* Enable ADC1 reset calibaration register */
        ADC_ResetCalibration(ADC1);
        /* Check the end of ADC1 reset calibration register */
        while(ADC_GetResetCalibrationStatus(ADC1));
        /* Start ADC1 calibaration */
        ADC_StartCalibration(ADC1);
        /* Check the end of ADC1 calibration */
        while(ADC_GetCalibrationStatus(ADC1));

        /* Start ADC1 Software Conversion */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        }



        這個是抄襲馬七的均值數字濾波函數 呵呵

        /*******************************************************************************
        * Function Name: ADC_Filter
        * Description : ADC_Filter
        * Input : None
        * Output : None
        * Return : ADC Converted Value
        *******************************************************************************/
        u16 ADC_Filter(void)
        {
        u16 result=0;
        u8 i;
        for(i=16;i>0;i--)
        {
        Delay_Ms(1);
        result += ADCConvertedValue;
        }
        return result/16;
        }



        轉換結果 往串口發送顯示 (寫的很爛哈)

        ADC_Value = ADC_filter();

        vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25;
        ADC_Value = Temperature;

        a = ADC_Value/1000;
        b = (ADC_Value - a*1000)/100;
        c = (ADC_Value - a*1000 - b*100)/10;
        d = ADC_Value - a*1000 - b*100 - c*10;

        Uart1_PutString("STM32 Chip Temperature = ",strlen("STM32 Chip Temperature = "));
        Uart1_PutChar(a+0);
        Uart1_PutChar(b+0);
        Uart1_PutChar(c+0);
        Uart1_PutChar(d+0);
        Uart1_PutString(" C/n",strlen(" C/n"));



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沾化县| 海门市| 大方县| 建阳市| 宜兴市| 丹寨县| 武宁县| 璧山县| 武川县| 灌南县| 临海市| 漳平市| 永兴县| 武冈市| 大竹县| 株洲县| 海口市| 安福县| 齐河县| 阜新市| 清原| 神农架林区| 南澳县| 蚌埠市| 台北县| 施秉县| 洪泽县| 汝城县| 九台市| 会宁县| 邛崃市| 鄯善县| 吕梁市| 东安县| 日土县| 临泽县| 丹凤县| 景洪市| 镇安县| 马龙县| 佛冈县|