硬件:EFM32GG230512
工具:keil5
ADC实验
简单测量电压
初始化
/*********************************************************************************************************
** Function name: adc_ch2_init
** Descriptions: ADC初始化
** input parameters: none
** output parameters: none
** Returned value: none
*********************************************************************************************************/
void adc_init(void){
// CMU_ClockEnable(cmuClock_HFPER, true);
CMU_ClockEnable(cmuClock_ADC0, true); /* 使能ADC模块时钟 */
ADC_Init_TypeDef tAdcInit = {
.ovsRateSel = adcOvsRateSel2, /* ADC过采样配置 */
.lpfMode = adcLPFilterBypass, /* 旁路输入滤波RC电路 */
.warmUpMode = adcWarmupNormal, /* 正常预热模式 */
.timebase = ADC_TimebaseCalc(0), /* 基时间配置 */
.prescale = ADC_PrescaleCalc(7000000, 0), /* ADC时钟分频配置 */
.tailgate = false /* 不使能Tailgate */
};
ADC_InitSingle_TypeDef tSingleInit = {
.prsSel = adcPRSSELCh0, /* 选择PRS通道0 */
.acqTime = adcAcqTime16, /* 配置采集时间为16周期 */
.reference = adcRefVDD, /* 使用VDD参考电压 */
.resolution = adcRes12Bit, /* 使用12位分辨率 */
.input = adcSingleInpCh2, /* 输入选择通道2 */
.diff = false, /* 不采用差分采集模式 */
.prsEnable = false, /* 禁能PRS输入 */
.leftAdjust = false, /* 使用右对准 */
.rep = false /* 不使用连续转换 */
};
ADC_Init(ADC0, &tAdcInit);
ADC_InitSingle(ADC0, &tSingleInit); /* 初始化ADC单次转换 */
}
/*********************************************************************************************************
** Function name: get_ch2_value
** Descriptions: 获取ch2通道电压值
** input parameters: none
** output parameters: none
** Returned value: 电压值
*********************************************************************************************************/
uint32_t get_value(void){
uint32_t ulVoltage;
CMU_ClockEnable(cmuClock_ADC0, true);
ADC_Start(ADC0, adcStartSingle); /* 启动单次转换 */
while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;
ulVoltage = ADC_DataSingleGet(ADC0) * 330 / 4095; /* 计算采集到的电压值 */
CMU_ClockEnable(cmuClock_ADC0, false);
return (ulVoltage);
}
main
/*********************************************Copyright (c)***********************************************
** File name: main.c
** Created by: Gui
** Version: V1.0.0
** Descriptions: ADC测试,使用PD2作为输入,检测电压值
*********************************************************************************************************/
#include "system.h"
#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "delay.h"
#include "adc.h"
int main()
{
CMU_ClockEnable(cmuClock_HFPER, true); //前置芯片设置
CMU_ClockEnable(cmuClock_GPIO, true);
if(SysTick_Config(SystemCoreClockGet()/1000))while(1);//1ms的systick中断
adc_init();
while(1){
get_value();
}
}