找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2589|回复: 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 单片机教程网

快速回复 返回顶部 返回列表