ADC原理与实验
Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
ADC原理与实验
ADC概念与作用
ADC的概念: Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
ADC的作用: 采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
ADC的性能指标
量程: 能测量的电压范围。
分辨率: ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。
转化时间: 模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间。
STM32F4-ADC配置
STM32F40X有3个ADC,每个可配置 12 位、10 位、8 位或 6 位分辨率;
每个ADC 有16个外部通道。另外还有两个内部 ADC 源 和 V BAT 通道挂在 ADC1上;
这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行;
ADC具有独立模式、双重模式和三重模式,对于不同 AD转换要求几乎都有合适的模式可选;
ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
转换顺序
每个ADC 有16个外部通道。另外还有两个内部 ADC 源 和 V BAT 通道挂在 ADC1上。
规则通道组: 顾名思意,规则通道就是很规矩的意思,我们平时一般使用的就是这个通道。相当正常运行的程序。最多16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中。
注入通道组: 注入,可以理解为插入,插队的意思,是一种不安分的通道。相当于中断。最多4个通道。 注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中。
转换时间
ADC 时钟: ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大值是 36MHz,典型值为30MHz。对于 STM32F407我们一般设置PCLK2=HCLK/2=84MHz。所以程序一般使用 4分频或者 6分频。
触发源
软件触发: ADC转换可以由ADC 控制寄存器 2: ADC_CR2的 ADON这个位来控制,写 1的时候开始转换,写 0 的时候停止转换。
外部事件触发: 触发包括内部定时器触发和外部 IO触发。触发源有很多,具体选择哪一种触发源,由 ADC控制寄存器ADC_CR2的 EXTSEL[2:0]和 JEXTSEL[2:0]位来控制。
使用CubeMX配置ADC参数
单通道ADC参数配置

mode:选择独立模式即可;
clock prescaler:选择4分频,前面的时钟部分有介绍ADC的时钟要求,pclk2设置的最大频率为84MHz,经过4分频后变为21MHz,满足要求;
resolution:精度选择最高12bit;
data alignment :对齐方式选择右对齐,即取低位,方便处理;
scan conversion mode:扫描模式不开启,因为是单通道采集,所以不需要扫描模式;
continuous conversion mode:连续转换模式这里可以选择不开启,可自己通过软件控制什么时候开始采集;
DMA continuous requests:这里先不使用DMA,DMA传输数据无需CPU直接控制,可提高CPU效率,使用DMA来传输数据是一个很好的选择,后续再介绍使用DMA;
End of Conversion Selection: EOC是转换结束标志位,可选择单个通道转换结束后置位还是所有通道都转换结束后置位,这里因为是单通道采集所以选择单通道转换结束后置位即可;
Number of conversion:规则通道数为1,因为是单通道采集所以只有一个;
external trigger conversion source:触发源选择软件触发;
rank: 转换序列,表示通道转换顺序,这里只有一个通道,sampling time表示采样时间,采样周期越长结果越准确但耗时也越长。
我的开发板上PA5连接了一个电位器(0v-3.3v可调),所以可使用PA5的ADC通道1采集电位器的电压,ADC精度设置为12bit(0-2^12=4096),转换为对应的电压为:adc_value*3.3/4096。
HAL库程序调用
在循环中每过1秒采集一次,并通过串口发送数据到PC端查看
while (1)
{
/*轮询方式进行ADC采集*/
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
adc_value = HAL_ADC_GetValue(&hadc1);
printf("adc_value = %.2fv\n", adc_value*3.3f/4096.0f);
}
HAL_Delay(1000);
}
while (1)
{
/*中断方式进行ADC采集*/
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(1000);
}
extern float adc_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if(hadc->Instance == ADC1)
{
adc_value = HAL_ADC_GetValue(&hadc1);
printf("adc_value = %.2fv\n", adc_value*3.3f/4096.0f);
}
}

多通道ADC采集参数配置

这里使用ADC1的通道1和通道5双通道采集,参数配置与单通道区别如上图:
scan conversion mode: 扫描模式开启,此时双通道采集若不开启,则采集完第一个通道后就不会继续采集下一个通道了;
Number of conversion: 规则通道数此时设置为2,因为使用了两个通道采集数据;
End of Conversion Selection: 此时选择所有通道采集结束后才置位转换结束标志位EOC;
rank: 里可设置先转换通道5(电位器),再转换通道1,因为我的开发板只接了一个电位器(PA5),为了方便看结果可用杜邦线连接到VCC或GND。
更多推荐



所有评论(0)