EFM32 ADC使用例程

/************************************************************
** 函数名称: ADCConfig
** 功能描述: ADC配置
** 输入参数: NULL
** 输出参数: NULL
** 返回值: NULL
** 作者: Donny
** 日期: 2018.5.21
**************************************************************/
static void ADCConfig(void)
{
CMU_ClockEnable(cmuClock_HFPER, true);
CMU_ClockEnable(cmuClock_ADC0, true);
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 = adcSingleInpCh3;
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_Switch_Channel
** 功能描述: ADC通道切换
** 输入参数: NULL
** 输出参数: NULL
** 返回值: NULL
** 作者: Donny
** 日期: 2018.5.21
**************************************************************/
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;
}

/************************************************************
** 函数名称: ADC_Get
** 功能描述: ADC值获取
** 输入参数: NULL
** 输出参数: NULL
** 返回值: NULL
** 作者: Donny
** 日期: 2018.5.21
**************************************************************/
double AverageVoltage;
double ADC_Get()
{
uint32_t sample;
double voltage;
double SumVoltage;
// double AverageVoltage;
int i = 0;
/* Enable clocks required */

ADCConfig();
// ADC_Switch_Channel(adcSingleInpCh3);

ADC_Start(ADC0, adcStartSingle);

/* Wait while conversion is active */
while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;

/* Get ADC result */
SumVoltage = 0;
for(i=0;i<3;i++)
{
sample = ADC_DataSingleGet(ADC0);
/* Calculate supply voltage */
voltage = (sample * 3.7) / 4096; //Vdd=3.7V
SumVoltage += voltage;
}
AverageVoltage = SumVoltage / 3;
// EMU_EnterEM2(true);
return AverageVoltage;
}

main()

{

  ADC_Get();
{

}

原文地址:https://www.cnblogs.com/-Donny/p/9069597.html

时间: 2024-11-03 10:31:12

EFM32 ADC使用例程的相关文章

DSP基础学习-ADC采样

彭会锋 2015-04-27 22:30:03 在查看ADC采样例程的时候我发现了下面的代码挺有意思的 EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 3; // 通过GPIO端口A多路器将GPIO18配置为外部时钟输出 XCLOCKOUT SysCtrlRegs.XCLK.bit.XCLKOUTDIV = 0; // 外部输出时钟,XCLOCKOUT = SYSCLK EDIS; 先贴出来,随后完善内容,主要是关于XCLOCKOUT的!

uCOS-II 常用函数参考手册

任务管理 1 OSTaskCreate() 建立一个新任务.任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立.中断处理程序中不能建立任务.一个任务可以为无限循环的结构. 函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); 参数说明:task 是指向任务代码首地址的指针. pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数. ptos is a

智能车学习(三)&mdash;&mdash; ADC学习

一.代码分享: 1.ADC头文件 #ifndef ADC_H_ #define ADC_H_ #include "common.h" typedef enum { // ---------------------------------ADC0------------------------- ADC0_DP0 = 0, // PTE20 ADC0_SE0 = 0, ADC0_DP1 = 1, // PTE16 ADC0_SE1 = 1, ADC0_DP2 = 2, // PTE18

1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解

本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 中级教程-OSAL操作系统(OSAL系统解基本套路) 中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~ 中级教程-OSAL操作系统(ADC-光敏电阻) OSAL操作系统-实验16 串口波特率扩展 OSAL操作系统-实验1

CC2541蓝牙学习——ADC

CC2541的ADC支持多达14位的模拟数字转换与高达12位的有效位数.它包括一个模拟多路转换器,具有多达8个各自可独立配置的通道,一个参考电压发生器.转换结果通过DMA写入存储器.还具有若干运行模式. ADC主要特性如下: 可选的抽取率,设置了7~12位的分辨率: 8个独立输入通道,可接受单端或差分信号: 参考电压可选为内部,外部单端,外部差分,或AVDD5: 产生中断请求: 转换结束时的DMA触发: 温度传感器输入: 电池测量功能. 图1 P0引脚上的信号可以作为ADC输入来使用.在下面,这

9、ADC

1.12位ADC是一种逐次逼近型模拟数字转换器. 它有多达18个通道,可测量16个外部和2个内部信号源. 各通道的A/D转换可以单次.连续.扫描或间断模式执行. ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中. 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值. ADC 的输入时钟不得超过14MHz,它是由PCLK2经分频产生. 2.ADC主要特征 ●  12位分辨率 ●  转换结束.注入转换结束和发生模拟看门狗事件时产生中断 ●  单次和连续转换模式 ●  从通道

STM32之DMA+ADC

借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不漏的听的.哈.好了..学习到了STM32的DMA模块..琢磨了一下中文参考手册,官方是这样描述的: 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 是的,无需CPU干预,可以想

EFM32 硬件I2C操作

有关的例程,请参考如下: #include "efm32.h" #include "em_chip.h" #include "em_cmu.h" #include "em_emu.h" #include "em_gpio.h" #include "em_i2c.h" #include "I2C_hw.h" unsigned long i2c_error = 0; vo

C8051F850 ADC Polling Example

有项目需要用到Silabs 的C8051F850. 其实最主要是看中了价格,以及其工作温度.因此需要开始学习这颗片子.如下是最简单的ADC例程: 对系统时钟进行初始化,对IO进行初始化等.P1.0为LED输出,P1.2为ADC输入.ADC采用VDD和GND为参考源.并使用Polling的方式,而不是中断的方式. void C8051F850_IO_Initial(void) { //Disable Watchdog with key sequence WDTCN = 0xDE; WDTCN =