STM8L使用ADC内部参考电压通道测量VDD电压

    STM8L内部含有一个12位的ADC,拥有25个输入通道,包括一个内部温度传感器,一个内部参考电压


    由上图可知,STM8L内部还有一个内部参考电压,这个内部参考电压的电压值是可知的,且是精确的。由数据手册可知,内部参考电压为1.225V。


    ADC选择内部参考电压作为测量通道,可以测量到内部电压的转化值Nadc。此时,已经VDD的转化值4096,VREFINT电压值1.225V及对应的转化值Nadc。这些值满足比例关系:
    VDD/4096=VREFINT/Nadc
    VDD/4096 =1.225/Nadc
    VDD=1.225*4096/Nadc


    STM8L15x系列单片机的相关库函数配置过程如下:
    This section provides functions allowing to enable/ disable the internal connections between the ADC and the Temperature Sensor and the Vrefint source.
    A typical configuration to get the Temperature sensor or/and Vrefint channels voltages is done following these steps :
    1. Enable the internal connection of Temperature sensor or/and Vrefint sources with the ADC channels:
      - for the Temperature sensor usingADC_TempSensorCmd() function.
      - for the Internal Voltage reference usingADC_VrefintCmd() function.
   2. Enable the ADC_Channel_TempSensor and/orADC_Channel_Vrefint channels usingADC_ChannelCmd()function.
   3. Get the voltage values, usingADC_GetConversionValue().


   (1)使能或失能内部参考电压ADC_VrefintCmd()

           * @brief  Enables or disables the Internal Voltage reference.

           * @param  NewState : new state of the Internal Voltage reference.

           *         This parameter can be: ENABLE or DISABLE.

           * @retval None

           void ADC_VrefintCmd(FunctionalState NewState);

           参数:ENABLE(使能)或DISABLE(失能)

   (2)选择内部参考电压通道ADC_ChannelCmd()

          * @brief  Enables or disables the selected ADC channel(s).
          * @param  ADCx where x can be 1 to select the specified ADC peripheral.
          * @param  ADC_Channels: specifies the ADC channels to be initialized
              This parameter can be one of the following values:

               @arg ADC_Channel_0: Channel 0
               @arg ADC_Channel_1: Channel 1
               @arg ADC_Channel_2: Channel 2
               @arg ADC_Channel_3: Channel 3
               @arg ADC_Channel_4: Channel 4
               @arg ADC_Channel_5: Channel 5
               @arg ADC_Channel_6: Channel 6
               @arg ADC_Channel_7: Channel 7
               @arg ADC_Channel_8: Channel 8
               @arg ADC_Channel_9: Channel 9
               @arg ADC_Channel_10: Channel 10
               @arg ADC_Channel_11: Channel 11
               @arg ADC_Channel_12: Channel 12
               @arg ADC_Channel_13: Channel 13
               @arg ADC_Channel_14: Channel 14
               @arg ADC_Channel_15: Channel 15
               @arg ADC_Channel_16: Channel 16
               @arg ADC_Channel_17: Channel 17
               @arg ADC_Channel_18: Channel 18
               @arg ADC_Channel_19: Channel 19
               @arg ADC_Channel_20: Channel 20
               @arg ADC_Channel_21: Channel 21
               @arg ADC_Channel_22: Channel 22

               @arg ADC_Channel_23: Channel 23
               @arg ADC_Channel_24: Channel 24
               @arg ADC_Channel_25: Channel 25
               @arg ADC_Channel_26: Channel 26
               @arg ADC_Channel_27: Channel 27
               @arg ADC_Channel_Vrefint: Vrefint Channel
               @arg ADC_Channel_TempSensor: Temperature sensor Channel
               @arg ADC_Channel_00To07: select from channel00 to channel07
               @arg ADC_Channel_08To15: select from channel08 to channel15
               @arg ADC_Channel_16To23: select from channel16 to channel23
               @arg ADC_Channel_24To27: select from channel24 to channel27
          @param  NewState : new state of the specified ADC channel(s).
               This parameter can be: ENABLE or DISABLE.   

           void ADC_ChannelCmd(ADC_TypeDef* ADCx, ADC_Channel_TypeDef ADC_Channels, FunctionalState NewState);

  (3)获得转换数值ADC_GetConversionValue()
         u16 u16_adc1_value;
         u16_adc1_value = ADC1_GetConversionValue();

    程序:

adc.h头文件:
#ifndef _adc_H
#define _adc_H
#include "stm8l15x.h"
void Adc_Init(void);
#endif 


adc.c源文件:
#include "adc.h"
void Adc_Init(void)
{
   CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);//开启ADC1时钟
   
   ADC_VrefintCmd(ENABLE); //使能内部参考电压
   ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_1);//连续转换,12位,转换时钟1分频
   
   ADC_ChannelCmd(ADC1,ADC_Channel_Vrefint,ENABLE);//使能内部参考电压通道
   ADC_Cmd(ADC1,ENABLE);//ADC使能
}

主函数:

#include "stm8l15x.h"
#include "adc.h"
int main( void )

{
    u16 adc1_value=0;
    float value=0;
    Adc_Init(); 

    while(1)
    {
         ADC_SoftwareStartConv(ADC1); //开启软件转换
         while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
         ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
         adc1_value=ADC_GetConversionValue(ADC1); //获取转换值
         value=1.225*4096/adc1_value; //获得VDD电压,单位V
         if(value<2.8)
         {
              GPIO_ResetBits(GPIOD,GPIO_Pin_4);
              GPIO_ToggleBits(GPIOD,GPIO_Pin_5);
         }   
    }
}   
 

对上述IAR工程进行编译,并下载到STM8L15x板子中,分别右击变量adc1_value和变量value选择“Add to watch”出现如下窗口(查看相关变量的值):


在程序中设置相关断点,以便查看变量值

   

运行程序可得:



 故测得STM32L15x板子的VDD=3.32291388V 
   
  

    



  
  


 


/*************** 深圳市赛亿科技开发有限公司 ******************** * 文件名 : adc * 描述 :多通道AD采集(源文件) * 实验平台 :STM8S105开发板 * 库版本 :V1.0 * 作者 :hcr * QQ :630054913 * 修改时间 :2014-9-20 *******************************************************************************/ #include "adc.h" u16 AdcData_Buff[10]; //AD采集缓存 u16 AdcValue_Channel1; //通道1值 u16 AdcValue_Channel2; //通道2值 u16 AdcValue_Channel3; //通道3值 float Adc_V1; //通道1值电压值 float Adc_V2; //通道2值电压值 float Adc_V3; //通道3值电压值 /************************************************************************** * 函数名:Adc_Task(void) * 描述 :AD不通通道选择 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :10ms调用 *************************************************************************/ void Adc_Task(void) { static u8 Adc_Channel = 1; static u8 Adc_Timer = 0; static u16 Adc_GetValue; switch(Adc_Channel)//通道选择 { case 1: //通道1 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel1=AdcData_Buff[5]; //取中间值 Adc_V1 = (3.28*AdcValue_Channel1)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 2; //另一通道 AdcChannel_Start(ADC1_CHANNEL_2); //ADC,通道2启动 } break; case 2: //通道2 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel2=AdcData_Buff[5]; //取中间值 Adc_V2 = (3.28*AdcValue_Channel2)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 3; //另一通道 AdcChannel_Start(ADC1_CHANNEL_3); //ADC,通道3启动 } break; case 3: //通道3 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel3=AdcData_Buff[5]; //取中间值 Adc_V3 = (3.28*AdcValue_Channel3)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 1; //另一通道 AdcChannel_Start(ADC1_CHANNEL_1); //ADC,通道1启动 } break; default: break; } } /************************************************************************** * 函数名:ADC_Init(void) * 描述 :ADC1初始化 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :系统初始化调用 *************************************************************************/ void ADC_Init(void) { ADC1_DeInit(); //恢复ADC1寄存器为默认值 ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2); //预分频2 ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE); //使能中断 ADC1_Cmd(ENABLE); //启动ADC AdcChannel_Start(ADC1_CHANNEL_1); /* //恢复ADC1寄存器为默认值 ADC1->CSR = 0x00; ADC1->CR1 = 0x00; ADC1->CR2 = 0x00; ADC1->CR3 = 0x00; ADC1->TDRH = 0x00; ADC1->TDRL = 0x00; ADC1->HTRH = 0x03; ADC1->HTRL = 0xFF; ADC1->LTRH = 0x00; ADC1->LTRL = 0x00; ADC1->AWCRH = 0x00; ADC1->AWCRL = 0x00; ADC1->CR1 |= ADC1_PRESSEL_FCPU_D2; //选择2分频 ADC1->CR2 |= ADC1_ALIGN_RIGHT; //右对齐 ADC1->CR1 |= ADC1_CR1_CONT; //连续转换模式 ADC1->CSR |= ADC1_IT_EOCIE; //使能中断 ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC */ } /************************************************************************** * 函数名:AdcChannel_Start(void) * 描述 :选择通道启动 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void AdcChannel_Start(ADC1_Channel_TypeDef ADC1_Channel) { ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_Channel,ADC1_ALIGN_RIGHT);/*配置通道的转换功能,连续右对齐*/ ADC1_StartConversion();//启动转换 /* ADC1->CSR &= (uint8_t)(~0x0F); // Clear the ADC1 channels ADC1->CSR |= ADC1_Channel; // Select the ADC1 channel ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC */ } /************************************************************************** * 函数名:AdcData_Clean(void) * 描述 :清除缓存数据 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void AdcData_Clean(void) { u8 j; for(j=0;j<10;j++) AdcData_Buff[j]=0; } /************************************************************************** * 函数名:Temp_Choose(void) * 描述 :冒泡法取中间值 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void Temp_Choose(void)//冒泡法求中间值 { u8 i_Adc = 0; u8 j_Adc = 0; u16 Data_Buf; for(j_Adc=0;j_Adc<9;j_Adc++) { for(i_Adc=0;i_AdcAdcData_Buff[i_Adc+1]) { Data_Buf=AdcData_Buff[i_Adc]; AdcData_Buff[i_Adc]=AdcData_Buff[i_Adc+1]; AdcData_Buff[i_Adc+1]=Data_Buf; } } } }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值