STM32——电子温度计

  • 实验要求
  • 效果图
  • 外设电路
  • STM32的ADC采样
  • 配置ADC的过程
  • 程序实现
    • main
    • tim3配置
    • 实验要求

      这里写图片描述

      效果图

      效果图

      外设电路

      采用热敏电阻,通过分压法测出阻值,然后根据热敏电阻值和温度的曲线逐段线性得到实际温度值.测量电压的时候是用STM32的ADC采样.这里用运放是为了减少漏电流的影响
      这里写图片描述

      STM32的ADC采样

      STM32使用的是一种12位逐次逼近模拟数字转换ADC.可以测量16个外部和2个内部信号源.

      这里写图片描述

      ADC采样的参考电压由给ADC供电的电压决定,开发板上供电部分的电压为3.3V.因此ADC的精度就是3.3/(2^12)=3.3/4096 V

      配置ADC的过程

    • 开启相应的外设时钟(GPIO、ADC、AFIO)
    • 配置ADC采样的IO口为模拟输入模式
    • 配置ADC各项参数(一般用单次采样模式)
    • 配置定时器及响应中断
    • 定时器中断函数中单次采样,以此灵活控制ADC的采样频率
    • void ADC()
      {                                        
          ADC_InitTypeDef ADC_InitStructure;
      
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //设置ADC1和ADC2工作在独立工作模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;             // 设置ADC工作在扫描模式(多通道),如果只需要一个通道,配置为单通道模式 DISABLE
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  //设置ADC工作在单次模式(使能一次,转换一次;也可以配置连续模式,自动周期性采样
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //设置转换由软件触发,不用外部触发
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;                          //设置进行转换的通道数目为5
        ADC_Init(ADC1, &ADC_InitStructure);                              //初始化ADC1
      
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);  //设置ADC1的通道0第一个进行转换,采样时钟周期239.5个
      
        ADC_Cmd(ADC1, ENABLE);                           //使能ADC1
      
        ADC_ResetCalibration(ADC1);                        //重置ADC1的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待ADC1校准重置完成
      
        ADC_StartCalibration(ADC1);                        //开始ADC1校准
        while(ADC_GetCalibrationStatus(ADC1));             //等待ADC1校准完成
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);            //使能ADC1软件开始转换
      }
      
      
      void TIM3_IRQHandler(void)      //TIM3的溢出更新中断响应函数
      {     
                  float Vx;
              TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清空TIM3溢出中断响应函数标志位
                  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始单次模式数据转换
              AD1_Value=ADC_GetConversionValue(ADC1);
            Vx = (AD1_Value * 3.3) / 4095;
            resistence =(10*Vx) / (3.3-Vx);   //计算此时电阻
      }           

      void ADC()
      {                                        
          ADC_InitTypeDef ADC_InitStructure;

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //设置ADC1和ADC2工作在独立工作模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;             // 设置ADC工作在扫描模式(多通道),如果只需要一个通道,配置为单通道模式 DISABLE
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  //设置ADC工作在单次模式(使能一次,转换一次;也可以配置连续模式,自动周期性采样
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //设置转换由软件触发,不用外部触发
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;                          //设置进行转换的通道数目为5
        ADC_Init(ADC1, &ADC_InitStructure);                              //初始化ADC1

        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);  //设置ADC1的通道0第一个进行转换,采样时钟周期239.5个

        ADC_Cmd(ADC1, ENABLE);                           //使能ADC1

        ADC_ResetCalibration(ADC1);                        //重置ADC1的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待ADC1校准重置完成

        ADC_StartCalibration(ADC1);                        //开始ADC1校准
        while(ADC_GetCalibrationStatus(ADC1));             //等待ADC1校准完成
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);            //使能ADC1软件开始转换
      }


      void TIM3_IRQHandler(void)      //TIM3的溢出更新中断响应函数
      {     
                  float Vx;
              TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清空TIM3溢出中断响应函数标志位
                  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始单次模式数据转换
              AD1_Value=ADC_GetConversionValue(ADC1);
            Vx = (AD1_Value * 3.3) / 4095;
            resistence =(10*Vx) / (3.3-Vx);   //计算此时电阻
      }          

    • 程序实现

      main

      int main(void)
      {
          int kk=0;
          RCC_Configuration();                                                                    
          GPIO_Configuration();   
              ADC();
              nvic(); 
              tim3();
      
              Nixie_Configuration();
              delay_nms(500); 
      
          while(1)
          {
                  int ii,jj,ans=0,count=0;
                  float deta,origin;
                  for(ii=0;ii<55;ii++){       
                      count =0;
                      if(resistence <= RESLIST[ii] && resistence >= RESLIST[ii+1])
                          {
                  ans =(ii-10)*10 + 10*(RESLIST[ii] - resistence) /(RESLIST[ii] - RESLIST[ii+1]);
                              break;
                          }
                  }
            for(kk=0;kk<200;kk++){
                NumDisplay(ans);
            } 
        }     
      }   

      int main(void) { int kk=0; RCC_Configuration(); GPIO_Configuration(); ADC(); nvic(); tim3(); Nixie_Configuration(); delay_nms(500); while(1) { int ii,jj,ans=0,count=0; float deta,origin; for(ii=0;ii<55;ii++){ count =0; if(resistence <= RESLIST[ii] && resistence >= RESLIST[ii+1]) { ans =(ii-10)*10 + 10*(RESLIST[ii] - resistence) /(RESLIST[ii] - RESLIST[ii+1]); break; } } for(kk=0;kk<200;kk++){ NumDisplay(ans); } } }

    • tim3配置

      void tim3()                           //配置TIM3为基本定时器模式 ,约100Hz
      {
          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure  
      
          TIM_TimeBaseStructure. TIM_Period =9999;          //配置计数阈值为9999,超过时,自动清零,并触发中断
              TIM_TimeBaseStructure.TIM_Prescaler =71;       //    时钟预分频值,定时器的计数的频率等于主时钟频率除以该预分频值
          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频倍数(用于数字滤波,暂时无用)
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数方式为向上计数
      
          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);      //  初始化tim3
          TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志
          TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //  使能TIM3的溢出更新中断
          TIM_Cmd(TIM3,ENABLE);                     //           使能TIM3
      }
  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值