找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2589|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STM32F103VET6單片AD轉(zhuǎn)換和PT100溫度傳感器的程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:753514 發(fā)表于 2022-3-4 17:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題是: 我是想著用PT100溫度傳感器測溫度,然后通過AD轉(zhuǎn)換變成電壓值后,再乘個51.2變成溫度值,將溫度值顯示到LCD12864上。但是無論整,LCD上一直顯示168就不變了。AD轉(zhuǎn)換后的數(shù)值一直是4095,就這樣子一直不變。求解,這是為什么?我確定了我硬件接線都沒接錯。

程序如下:

pt100.c如下:

#include "pt100.h"

__IO uint16_t ADC_ConvertedValue;



static void ADCx_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
      
        // 打開 ADC IO端口時鐘
        ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );
      
        // 配置 ADC IO 引腳模式
        // 必須為模擬輸入
        GPIO_InitStructure.GPIO_Pin = ADC_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
      
        // 初始化 ADC IO
        GPIO_Init(ADC_PORT, &GPIO_InitStructure);                              
}


static void ADCx_Mode_Config(void)
{
        ADC_InitTypeDef ADC_InitStructure;      

        // 打開ADC時鐘
        ADC_APBxClock_FUN ( ADC_CLK, ENABLE );
      
        // ADC 模式配置
        // 只使用一個ADC,屬于獨立模式
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
      
        // 禁止掃描模式,多通道才要,單通道不需要
        ADC_InitStructure.ADC_ScanConvMode = DISABLE ;

        // 連續(xù)轉(zhuǎn)換模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

        // 不用外部觸發(fā)轉(zhuǎn)換,軟件開啟即可
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

        // 轉(zhuǎn)換結(jié)果右對齊
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
      
        // 轉(zhuǎn)換通道1個
        ADC_InitStructure.ADC_NbrOfChannel = 1;      
               
        // 初始化ADC
        ADC_Init(ADCx, &ADC_InitStructure);
      
        // 配置ADC時鐘為PCLK2的8分頻,即9MHz
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
      
        // 配置 ADC 通道轉(zhuǎn)換順序和采樣時間
        ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1,
                                 ADC_SampleTime_55Cycles5);
      
        // ADC 轉(zhuǎn)換結(jié)束產(chǎn)生中斷,在中斷服務(wù)程序中讀取轉(zhuǎn)換值
        ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
      
        // 開啟ADC ,并開始轉(zhuǎn)換
        ADC_Cmd(ADCx, ENABLE);
      
      
        // 初始化ADC 校準寄存器  
        ADC_ResetCalibration(ADCx);
        // 等待校準寄存器初始化完成
        while(ADC_GetResetCalibrationStatus(ADCx));
      
        // ADC開始校準
        ADC_StartCalibration(ADCx);
        // 等待校準完成
        while(ADC_GetCalibrationStatus(ADCx));
      
        // 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換
        ADC_SoftwareStartConvCmd(ADCx, ENABLE);
}

static void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
        // 優(yōu)先級分組
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // 配置中斷優(yōu)先級
  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}



void ADCx_Init(void)
{
        ADCx_GPIO_Config();
        ADCx_Mode_Config();
        ADC_NVIC_Config();
}
/*********************************************END OF FILE**********************/

pt100.h如下:

#ifndef _PT100_H
#define        _PT100_H




#include "stm32f10x.h"

// ADC 編號選擇
// 可以是 ADC1/2,如果使用ADC3,中斷相關(guān)的要改成ADC3的
#define    ADC_APBxClock_FUN             RCC_APB2PeriphClockCmd
#define    ADCx                          ADC2
#define    ADC_CLK                       RCC_APB2Periph_ADC2

// ADC GPIO宏定義
// 注意:用作ADC采集的IO必須沒有復(fù)用,否則采集電壓會有影響
#define    ADC_GPIO_APBxClock_FUN        RCC_APB2PeriphClockCmd
#define    ADC_GPIO_CLK                  RCC_APB2Periph_GPIOB  
#define    ADC_PORT                      GPIOB
#define    ADC_PIN                       GPIO_Pin_0
// ADC 通道宏定義
#define    ADC_CHANNEL                   ADC_Channel_8

// ADC 中斷相關(guān)宏定義
#define    ADC_IRQ                       ADC1_2_IRQn
#define    ADC_IRQHandler                ADC1_2_IRQHandler

//#define    ADC_IRQ                       ADC3_IRQn
//#define    ADC_IRQHandler                ADC3_IRQHandler


void ADCx_Init(void);


#endif /* _PT100_H */

it.c中有加以下內(nèi)容:

#include "pt100.h"

extern __IO uint16_t ADC_ConvertedValue;

void ADC_IRQHandler(void)
{      
        if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET)
        {
                // 讀取ADC的轉(zhuǎn)換值
                ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
        }
        ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}

最后是main.c:

#include "stm32f10x.h"
#include "lcd12864.h"
#include "key.h"
#include "pt100.h"


#include <stm32f10x_conf.h>


LCD_InitTypeDef LCD_InitStructure;

u8 i,k;

extern __IO uint16_t ADC_ConvertedValue;

// 局部變量,用于保存轉(zhuǎn)換計算后的電壓值         
float ADC_ConvertedValueLocal;

u16 wendu;






int main(void)
{
  delay_init(72);  //72/8=9 * 1000 = 9000
        LCD12864_UserConfig();
  LCD12864_Write_Init();
  KEY_UserConfig();
        ADCx_Init();
      
        i=60;
      
  //LCD12864_Opne();

   while(1)
                 
         {
            LCD_InitStructure.c = 0X80;
            LCD_InitStructure.num = 16;
            LCD_InitStructure.dat = (u8*)&"輸入設(shè)定溫度為:";
            LCD_12864_Write_Word(LCD_InitStructure);
            LCD12864_Write_Number(0x90,i);
                 
            LCD_InitStructure.c = 0X88;
            LCD_InitStructure.num = 16;
            LCD_InitStructure.dat = (u8*)&"當(dāng)前環(huán)境溫度為:";
            LCD_12864_Write_Word(LCD_InitStructure);
            LCD12864_Write_Number(0x98,wendu);
                 
                 
            ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
            wendu = (u16)(ADC_ConvertedValueLocal * 51.2);
                 
                 

//                  KEY_Config1();
//                  KEY_Config2();
//                  KEY_Config4();
                 
                  //下面的是k等1的話,跳出循環(huán),清屏,關(guān)閉
//                  if(k == 1)
//                        {
//                                LCD12864_Write_Cmd_Data(CMD12,0x01);  //清屏
//                                k=0;
//                                break;
//                        }
                 
         }
         
         //while(1);
               
      
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:753514 發(fā)表于 2022-3-4 17:39 | 只看該作者
先不說 電壓值,溫度值,就AD轉(zhuǎn)換后的值 就一直是4095不變,換ADC通道也沒用,到底是為啥?
回復(fù)

使用道具 舉報

板凳
ID:883242 發(fā)表于 2022-3-4 22:41 | 只看該作者
AD轉(zhuǎn)換一直是4095是怎么造成的,只有你自己知道,我們都不是算命的。
回復(fù)

使用道具 舉報

地板
ID:700967 發(fā)表于 2022-3-5 01:18 來自手機 | 只看該作者
查看PT100溫度傳感器電壓信號接入那個通道要和AD程序設(shè)置通道一致
回復(fù)

使用道具 舉報

5#
ID:753514 發(fā)表于 2022-3-5 09:00 | 只看該作者
Hephaestus 發(fā)表于 2022-3-4 22:41
AD轉(zhuǎn)換一直是4095是怎么造成的,只有你自己知道,我們都不是算命的。

。。。我要是知道就不會來發(fā)帖子了啊
回復(fù)

使用道具 舉報

6#
ID:753514 發(fā)表于 2022-3-6 09:33 | 只看該作者
use123 發(fā)表于 2022-3-5 01:18
查看PT100溫度傳感器電壓信號接入那個通道要和AD程序設(shè)置通道一致

是一致的
回復(fù)

使用道具 舉報

7#
ID:883242 發(fā)表于 2022-3-6 11:15 | 只看該作者
huiyuan316 發(fā)表于 2022-3-5 09:00
。。。我要是知道就不會來發(fā)帖子了啊

那你也應(yīng)該先貼電路圖,量電壓才對啊,這個問題里面你的硬件什么都不說,貼軟件毫無意義。
回復(fù)

使用道具 舉報

8#
ID:824490 發(fā)表于 2022-3-6 22:21 | 只看該作者
"AD轉(zhuǎn)換后的值 就一直是4095不變"
說明AD的輸入電壓溢出了。
你要查一下AD分壓的電阻上、下拉是否正常,特別是下拉,是否開路了?
回復(fù)

使用道具 舉報

9#
ID:59819 發(fā)表于 2022-3-6 22:31 | 只看該作者
先用萬用表量一下你的ADC輸入電壓多少,是不是超過3.3V啥的,先排除硬件問題再說。
回復(fù)

使用道具 舉報

10#
ID:753514 發(fā)表于 2022-3-7 18:35 | 只看該作者
已解決。是單片機上的V+ V-基準電壓沒接。(尷尬)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表