STM32 CubeMX ADC采集(HAL库)
STM32 CubeMX
- STM32 CubeMX ADC采集(HAL库)
- ADC介绍
- ADC主要特征
- Vref+的电压(2.4~3.6)就是ADC参考电压2.4V(相当于秤砣)
- 最小识别电压值:2.4/4096≈0.6mv(不考虑误差)
- 一、STM32 CubeMX设置
- 二、代码部分
- 三,单通道轮询采样速度
- 四、内部温度传感器
- 多通道轮询方式
- 设置 CubeMX
- 修改代码部分
- 实验现象
- PA0接地;PA1接VCC;PA2接地;PA3浮空;PA4浮空
- 总结
ADC介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部
信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右
对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
ADC主要特征
● 12位分辨率(最小识别电压)
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间:
─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs)
─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs
─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求:2.4V到3.6V
● ADC输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有DMA请求产生。
Vref+的电压(2.4~3.6)就是ADC参考电压2.4V(相当于秤砣)
最小识别电压值:2.4/4096≈0.6mv(不考虑误差)
一、STM32 CubeMX设置
开启连续扫描使能,1.5采样周期
我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是 12M,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us,
二、代码部分
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
HAL_ADCEx_Calibration_Start(&hadc1); //AD校准HAL_ADC_Start_IT(&hadc1); //开启ADC中断转换ADC_Value =HAL_ADC_GetValue(&hadc1);
三,单通道轮询采样速度
测试方法:
{(adc转换时间+io反转时间)-io反转时间} =adc转换速度
IO口直接反转
测得实际转换时间:3us-0.3us=2.7.us
理论值:上面我们设置ADC时钟12Mhz,采样一次最短时间位1.17us
注释:
可编程的通道采样时间:TCONV = 采样时间+ 12.5个周期
**例如**:
当ADCCLK=14MHz,采样时间为1.5周期TCONV = 1.5 + 12.5 = 14周期 = **1μs**我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是 12M,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us,
四、内部温度传感器
HAL_ADC_Start(&hadc1); //启动ADC转换HAL_ADC_PollForConversion(&hadc1,10); //等待转换完成,10ms表示超时时间AD_Value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据(12位数据)// HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);Vol_Value = AD_Value*(3.3/4096); //AD值乘以分辨率即为电压值printf("ADC1_IN16 VOL value: %.2fV\r\n",Vol_Value);Temperature = (1.43 - Vol_Value)/0.0043 + 25; //根据公式算出温度值printf("MCU Internal Temperature: %.2f\r\n",Temperature);
多通道轮询方式
设置 CubeMX
修改代码部分
int main(void)
{/* USER CODE BEGIN 1 */
int aa=0;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_ADCEx_Calibration_Start(&hadc1); //AD校准// printf("Test int: i = %d\r\n", aa); // printf输出int型数据int ADC_value[5];char i=0;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */for(i=0;i<5;i++){HAL_ADC_Start(&hadc1); //启动ADC转换HAL_ADC_PollForConversion(&hadc1, 50); //等待转换完成,50为最大等待时间,单位为msADC_value[i]=HAL_ADC_GetValue(&hadc1);}printf("ADC value 0 PA0: %d \r\n",ADC_value[0]);printf("ADC value 1 PA1: %d \r\n",ADC_value[1]);printf("ADC value 2 PA2: %d \r\n",ADC_value[2]);printf("ADC value 3 PA3: %d \r\n",ADC_value[3]);printf("ADC value 4 PA4: %d \r\n",ADC_value[4]);HAL_Delay(1000);
// AD_Value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据(12位数据)
//
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
// Vol_Value = AD_Value*(3.3/4096); //AD值乘以分辨率即为电压值
// aa
// Temperature = (1.43 - Vol_Value)/0.0043 + 25; //根据公式算出温度值
// printf("MCU Internal Temperature: %.2f\r\n",Temperature);}/* USER CODE END 3 */
}
实验现象
PA0接地;PA1接VCC;PA2接地;PA3浮空;PA4浮空
总结
以上就是今天要讲的内容,本文仅仅简单介绍了ADC的使用,而ADC提供了大量能使我们快速便捷地处理数据的函数和方法。