久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2536|回復: 9
打印 上一主題 下一主題
收起左側

關于STM32F103VET6單片AD轉換和PT100溫度傳感器的程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:753514 發表于 2022-3-4 17:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題是: 我是想著用PT100溫度傳感器測溫度,然后通過AD轉換變成電壓值后,再乘個51.2變成溫度值,將溫度值顯示到LCD12864上。但是無論整,LCD上一直顯示168就不變了。AD轉換后的數值一直是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 ;

        // 連續轉換模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

        // 不用外部觸發轉換,軟件開啟即可
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

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

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

  // 配置中斷優先級
  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,中斷相關的要改成ADC3的
#define    ADC_APBxClock_FUN             RCC_APB2PeriphClockCmd
#define    ADCx                          ADC2
#define    ADC_CLK                       RCC_APB2Periph_ADC2

// ADC GPIO宏定義
// 注意:用作ADC采集的IO必須沒有復用,否則采集電壓會有影響
#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 中斷相關宏定義
#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中有加以下內容:

#include "pt100.h"

extern __IO uint16_t ADC_ConvertedValue;

void ADC_IRQHandler(void)
{      
        if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET)
        {
                // 讀取ADC的轉換值
                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;

// 局部變量,用于保存轉換計算后的電壓值         
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*)&"輸入設定溫度為:";
            LCD_12864_Write_Word(LCD_InitStructure);
            LCD12864_Write_Number(0x90,i);
                 
            LCD_InitStructure.c = 0X88;
            LCD_InitStructure.num = 16;
            LCD_InitStructure.dat = (u8*)&"當前環境溫度為:";
            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的話,跳出循環,清屏,關閉
//                  if(k == 1)
//                        {
//                                LCD12864_Write_Cmd_Data(CMD12,0x01);  //清屏
//                                k=0;
//                                break;
//                        }
                 
         }
         
         //while(1);
               
      
}

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

。。。我要是知道就不會來發帖子了啊
回復

使用道具 舉報

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

是一致的
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区久久精品 | 粉嫩一区二区三区性色av | 91久久久久久久久久久 | 91国内精品久久 | 精品国产一级片 | 国产精品一区二 | 日韩av第一页 | 99re视频在线| 色综合天天天天做夜夜夜夜做 | 中文天堂在线一区 | 久久久91精品国产一区二区三区 | 国产精品视频一二三区 | 久久婷婷国产香蕉 | 7799精品视频天天看 | 精品国产91亚洲一区二区三区www | 91免费版在线 | 欧美久久不卡 | 亚洲韩国精品 | 欧美激情亚洲 | 国产精品美女在线观看 | 免费日韩av网站 | 日韩精品免费视频 | 精品视频在线观看 | 中文字幕一区二区三区在线观看 | 日韩第一夜 | 福利视频一区二区三区 | 日韩av免费在线观看 | 一本色道精品久久一区二区三区 | 一级a性色生活片久久毛片 一级特黄a大片 | 在线播放中文字幕 | 伊人网站 | 日韩在线一区视频 | 日韩在线免费视频 | 91电影在线 | 日韩av一二三区 | 日本黄色大片免费 | 欧美日韩高清在线一区 | 欧美一区二区三区在线播放 | 久久综合久久久 | 毛片.com| 亚洲区一区二区 |