一、定义
ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
模拟信号,数值上变化很多,数值是连续的
数字信号,以二进制为代表,数值是离散的,不连续
参考:模拟信号和数字信号的区别和特点-与非网 (eefocus.com)
二、模数转换过程
三、ADC
1.精度的理解
精度越高,数据越是准确。
12位精度:3300mv/4096=0.8mv,也就是说只要电压值有±0.8mv的变化,adc就能分辨出来。
10位精度:3300mv/1024=3.22mv,也就是说只要电压值有±3.22mv的变化,adc就能分辨出来。
8位精度:3300mv/256=12mv,也就是说只要电压值有±12mv的变化,adc就能分辨出来。
6位精度:3300mv/64=51.5625mv,也就是说只要电压值有±51.5625mv的变化,adc就能分辨出来。
2.原理图:
3.存储对齐方式:
4.ADC采集时间
最小采样时间0.42us(ADC时钟=36MHz,采样周期为3周期下得到)
5.stm32通道组
STM32F4的ADC的各通道可以单次,连续,扫描或者间断模式执行
6.ADC1的通道5(PA5)进行单次转化
四、test
void ADC1_CH5_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);
}
void ADC3_CH5_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC3, &ADC_InitStructure);
ADC_Cmd(ADC3, ENABLE);
}
uint16_t Get_Adc3(uint8_t ch)
{
ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_480Cycles );
ADC_SoftwareStartConv(ADC3);
while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC3);
}
int main(void)
{
USART1_init(115200);
uint16_t adc_val,adc_vol;
ADC1_CH5_init();
ADC3_CH5_init();
while(1)
{
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
adc_val = ADC_GetConversionValue(ADC1);
adc_vol = adc_val*3300/4095;
printf("adc_val:%d\r\n", adc_val);
printf("adc_vol:%dmv\r\n", adc_vol);
delay_ms(1000);
}
|