EFM32片内外设--ADC Single 通道切换例程

EFM32目前ADC的工作方式有两种,一种是single模式,一种是Scan模式。

Single模式是单通道转换模式,Scan是多通道转换模式。

在Single模式中,由于是单通道应用,因此就会遇到如何切换ADC通道的问题。

以下是一个在ADC Single 模式下切换ADC通道的例程。

硬件准备:TG STK, 会将ADC转换的值显示在LCD段码屏上。

软件例程:

#include <stdio.h>
#include "efm32.h"
#include "em_chip.h"
#include "em_emu.h"
#include "em_cmu.h"
#include "em_adc.h"
#include "em_lcd.h"
#include "segmentlcd.h"
#include "rtc.h"

/***************************************************************************//**
* @brief
*   Configure ADC usage for this application.
*******************************************************************************/
static void ADCConfig(void)
{
  ADC_Init_TypeDef       init       = ADC_INIT_DEFAULT;
  ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT;

  /* Init common settings for both single conversion and scan mode */
  init.timebase = ADC_TimebaseCalc(0);
  /* Might as well finish conversion as quickly as possibly since polling */
  /* for completion. */
  /* Set ADC clock to 7 MHz, use default HFPERCLK */
  init.prescale = ADC_PrescaleCalc(200000, 0);

  /* WARMUPMODE must be set to Normal according to ref manual before */
  /* entering EM2. In this example, the warmup time is not a big problem */
  /* due to relatively infrequent polling. Leave at default NORMAL, */

  ADC_Init(ADC0, &init);

  /* Init for single conversion use, measure VDD/3 with 1.25 reference. */
  singleInit.reference  = adcRefVDD;
  singleInit.input      = adcSingleInpVDDDiv3;
  singleInit.resolution = adcRes12Bit;

  /* The datasheet specifies a minimum aquisition time when sampling vdd/3 */
  /* 32 cycles should be safe for all ADC clock frequencies */
  singleInit.acqTime = adcAcqTime32;
 
  ADC_InitSingle(ADC0, &singleInit);
}

//ADC通道切换函数

void ADC_Switch_Channel(ADC_SingleInput_TypeDef input)
{
    /* Make sure single conversion is not in progress */
    ADC0->CMD = ADC_CMD_SINGLESTOP;
    /* Clear the input channel */
    ADC0->SINGLECTRL &= ~_ADC_SINGLECTRL_INPUTSEL_MASK;
    /* Update the input channel */
    ADC0->SINGLECTRL |= input << _ADC_SINGLECTRL_INPUTSEL_SHIFT;
}

/******************************************************************************
 * @brief  Main function
 * The ADC is set up in single conversion mode and samples VDD/3 10 times each
 * second, it sleeps in em2 between samples. The supply voltage (VDD) is then
 * calculated.
 *****************************************************************************/
int main(void)
{
  /* Initialize chip */
  CHIP_Init();
  SegmentLCD_Init(false);

  uint32_t sample;
  double   voltage;

  /* Enable clocks required */
  CMU_ClockEnable(cmuClock_HFPER, true);
  CMU_ClockEnable(cmuClock_ADC0, true);

  ADCConfig();

  /* Stay in this loop forever at end of program */
  while (1)
  {
      ADC_Switch_Channel(adcSingleInpVDDDiv3);
     
      ADC_Start(ADC0, adcStartSingle);
     
      /* Wait while conversion is active */
      while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;
     
      /* Get ADC result */
      sample = ADC_DataSingleGet(ADC0);
     
      /* Calculate supply voltage */
      voltage = (sample * 3.2) / 4096; //假设Vdd=3.2V
      
      /* Write to LCD */
      char buffer[10];
      sprintf(buffer, "%1.4f", voltage);
      SegmentLCD_Write(buffer);
     
      /* wait 100ms in EM2 before next conversion */
      RTC_Trigger(1000, NULL);
      EMU_EnterEM2(true);
     
      ADC_Switch_Channel(adcSingleInpVDD);
     
      ADC_Start(ADC0, adcStartSingle);
     
      /* Wait while conversion is active */
      while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;
     
      /* Get ADC result */
      sample = ADC_DataSingleGet(ADC0);
     
      /* Calculate supply voltage */
      voltage = (sample * 3.2) / 4096; //假设Vdd=3.2V
      
      /* Write to LCD */
      buffer[10];
      sprintf(buffer, "%1.4f", voltage);
      SegmentLCD_Write(buffer);
     
      /* wait 100ms in EM2 before next conversion */
      RTC_Trigger(1000, NULL);
      EMU_EnterEM2(true);
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EFM32开发套件(Energy Micro Family 32-bit)是一款由索菲亚半导体(Silicon Labs)推出的集成化开发工具,旨在帮助开发者更轻松地设计和开发低功耗嵌入式系统。 其例程是一系列编写好的示例代码,旨在展示EFM32开发套件的各种功能和特性,可以帮助开发者快速入门和学习如何在EFM32芯片上开发代码。这些例程涵盖了许多常见的应用领域,如无线通信、传感器数据采集、电源管理等。 通过使用EFM32开发套件例程,开发者可以快速了解和学习EFM32芯片的特性和功能,避免从零开始编写代码。这些例程包含了完整的源代码和详细的文档,使得开发者能够快速上手并进行自己的应用开发。 除了提供例程代码,EFM32开发套件还提供了一套完整的开发环境,包括集成开发环境(IDE)、调试器等工具。开发者可以使用这些工具来编写、调试和测试他们的应用程序,并且与EFM32开发套件实现无缝的集成。 总之,EFM32开发套件例程提供了一种简便的学习和开发方式,通过使用它们,开发者可以更快地上手和掌握EFM32芯片,从而加速低功耗嵌入式系统的开发过程。 ### 回答2: EFM32开发套件例程是用来演示和说明EFM32微控制器的各种功能和特性的代码示例集合。它们被设计用作新用户学习和评估EFM32系列微控制器的工具。 EFM32开发套件例程提供了丰富的代码实现,包括了各种外设,如GPIO、USART、SPI、I2C等。这些例程覆盖了从基本的IO控制到高级的通信和数据处理功能的各个方面。 通过运行这些例程,用户可以学习如何初始化和配置各个外设,并使用它们完成各种任务。这些例程还包含了详细的代码注释和使用说明,使用户能够轻松理解和修改代码以适应自己的需求。 除了提供例程代码外,EFM32开发套件还提供了开发工具和文档,以帮助用户更好地使用例程。用户可以使用官方的开发工具和配套的IDE进行代码编译、调试和下载,同时,官方的技术文档也提供了对开发套件和例程的详细介绍和解释。 总之,EFM32开发套件例程是一套非常有价值的资源,可帮助用户快速上手和了解EFM32系列微控制器的各种功能和特性。无论是初学者还是有经验的开发人员,都可以通过使用这些例程来加快自己的开发速度并提高自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值