LoRa终端设备ASR6505之ADC采样

时间:2022-07-25
本文章向大家介绍LoRa终端设备ASR6505之ADC采样,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言:对低功耗设备来说,采集上报电池电压非常重要,通过电池电压可以辅助判断设备的使用寿命。ASR6505提供了丰富的外设接口,本篇文章主要聊一聊ADC接口的使用。

1、ADC通道说明

只有1个ADC外设,预留了3个通道供使用,开发板中H3针脚正是引出的ADC通道。

与STM8L的对应关系如下:

ASR6505 STM8L

IN0 PC2(ADC1_IN6)

IN1 PC3(ADC1_IN5)

IN2 PC7(ADC1_IN3)

2、ADC参考电压

VREFP引脚:是ADC参考电压的输入引脚,即就是开发板上的P4跳线帽,插上P4跳线帽就表示用VCC当做参考电压。

芯片内部参考电压:

可以看出,典型值为1.224V,因此我们采样的时候就以这个为参考来校准其他通道的采样值。

3、实验设计

间隔5s读取ASR6505的ADC的内部参考电压通道以及通道0的值,并转化成电压值通过串口打印。分别把VCC和GND输入到通道0。

4、代码实现

periph_adc.h/c部分代码:

#define ASR6505_CH_IN0   ADC_Channel_6
#define ASR6505_CH_IN1   ADC_Channel_5
#define ASR6505_CH_IN2   ADC_Channel_3

#define ASR6505_PIN_IN0      PC_2
#define ASR6505_PIN_IN1      PC_3
#define ASR6505_PIN_IN2      PC

Gpio_t AdcIn0;
void ADC_PeriphInit(void)
{  
   GpioInit( &AdcIn0, ASR6505_PIN_IN0, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0);
    //初始化通道对应的io口
}
void ADC_ReadSensor(void)
{      
  uint16_t adc_ref = 0,adc_data=0;
  float value=0;
  
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//使能时钟
  //初始化ADC
  ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);
  ADC_Cmd(ADC1, ENABLE);
  //ADC通道设置
  ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_192Cycles);
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_192Cycles);

  ADC_VrefintCmd(ENABLE); //使能内部参考电压
  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);//使能通道

  ADC_SoftwareStartConv(ADC1); //开始转化
  while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转化完成  
  ADC_ClearFlag(ADC1 , ADC_FLAG_EOC);    //清除标志位
  adc_ref = ADC_GetConversionValue(ADC1);//读取转化结果
  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, DISABLE);//失能通道
  ADC_ChannelCmd(ADC1, ASR6505_CH_IN0, ENABLE);
  ADC_SoftwareStartConv(ADC1);
  while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
  ADC_ClearFlag(ADC1 , ADC_FLAG_EOC);
  adc_data = ADC_GetConversionValue(ADC1);
  ADC_DeInit(ADC1);
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);
  value=(1.224*4096.0/adc_ref)*(adc_data/4096.0);
  printf("adc_ref=%d,adc_data=%d,value=%frn",adc_ref,adc_data,value);
}

主函数部分代码:

int main( void )
{   
    BoardInitMcu( );
    BoardInitPeriph( );
    printf("ASR6505 ADC test!rn");
    ADC_PeriphInit();   
    while(1)
    {
      ADC_ReadSensor();
      printf("-------------------------------------------------- rnrn");
      Delay(5);
    }
}

5、实验现象

《从0到1搭建LoRa物联网》系列文章推荐:

LoRa物联网的架构

LoRaWAN终端开发

LoRa终端设备之国产ASR6505软硬件

LoRa终端设备ASR6505普通GPIO操作

LoRa终端设备ASR6505驱动DHT11