学习下ADC电压采集测试。
测试硬件,使用开发板底板上的电位器来采集电源的电压值,通过串口打印出来。
一、ADC特性
主要特性
• 12 位精度
• 可编程转换速度,最高达 1M SPS
• 16 路输入转换通道
- 13 路外部引脚输入
- 内置温度传感器
- 内置 BGR 1.2V 基准
- 1/3 VDDA 电源电压
• 4 路参考电压源(Vref)
- VDDA 电源电压
- ExRef(PB00)引脚电压
- 内置 1.5V 参考电压
- 内置 2.5V 参考电压
• 采样电压输入范围:0 ~ Vref
• 多种转换模式,全部支持转换累加功能
- 单次转换
- 多次转换
- 连续转换
- 序列扫描转换
- 序列断续转换
• 支持单通道、序列通道两种通道选择,最大同时支持 4 个序列
• 支持输入通道电压阈值监测
• 内置信号跟随器,可转换高阻抗输入信号
二、硬件电路
ADC部分电路图
电位器分压后,送到MCU的PB0端口上。
三、测试程序
3.1、adc.c
#include "main.h"
void init_adc(void)
{
ADC_SingleChTypeDef ADC_SingleInitStruct;
__RCC_ADC_CLK_ENABLE();
__RCC_GPIOB_CLK_ENABLE();
PB00_ANALOG_ENABLE();
ADC_SingleInitStruct.ADC_Chmux = ADC_ExInputCH8;
ADC_SingleInitStruct.ADC_DiscardEn = ADC_DiscardNull;
ADC_SingleInitStruct.ADC_InitStruct.ADC_AccEn = ADC_AccDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_Align = ADC_AlignRight;
ADC_SingleInitStruct.ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div16;
ADC_SingleInitStruct.ADC_InitStruct.ADC_DMAEn = ADC_DmaDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_InBufEn = ADC_BufEnable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode;
ADC_SingleInitStruct.ADC_InitStruct.ADC_SampleTime = ADC_SampTime5Clk;
ADC_SingleInitStruct.ADC_InitStruct.ADC_TsEn = ADC_TsDisable;
ADC_SingleInitStruct.ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA;
ADC_SingleInitStruct.ADC_WdtStruct.ADC_WdtAll = ADC_WdtDisable;
ADC_SingleChOneModeCfg(&ADC_SingleInitStruct);
ADC_Enable();
ADC_SoftwareStartConvCmd(ENABLE);
}
uint16_t read_adc_val(void)
{
uint16_t adc_val=0;
ADC_SoftwareStartConvCmd(ENABLE);
while(ADC_GetITStatus(ADC_IT_EOC))
{
ADC_ClearITPendingBit(ADC_IT_EOC);
adc_val=ADC_GetConversionValue();
return adc_val;
}
}
void adc_test(void)
{
uint16_t adv=0;
adv=read_adc_val();
printf("adc电压值=%0.1f V\r\n",(float)adv*(3.3/4096));
}
3.2、main.c
int32_t main(void)
{
rcc_config();
delay_init();
uart_init(115200);
init_led();
init_adc();
while (1)
{
led1_tog();
adc_test();
delay_ms(100);
}
}
四、程序运行
程序运行后,串口输出内容:
|