网站建设应注意的问题有哪些,wordpress 万能表单,网站后缀意思,重庆网站建设帝维科技CubeMX配置ADC前言一、什么是ADC#xff1f;二、实验过程1.单通道ADC采集STM32CubeMX配置代码实现2.多通道ADC采样(非DMA)STM32CubeMX配置代码实现3.多通道ADC采样#xff08;DMA#xff09;STM32CubeMX配置代码实现总结前言
本章介绍使用STM32CubeMX对ADC进行配置的方法二、实验过程1.单通道ADC采集STM32CubeMX配置代码实现2.多通道ADC采样(非DMA)STM32CubeMX配置代码实现3.多通道ADC采样DMASTM32CubeMX配置代码实现总结前言
本章介绍使用STM32CubeMX对ADC进行配置的方法ADC的原理、概念和特点配置各个步骤的功能并通过单通道多通道DMA三种方式实现采集。
一、什么是ADC
ADC 即模拟数字转换器英文详称 Analog-to-digital converter可以将外部的模拟信号转换为数字信号。
以下是datasheet当中的内容我就做个搬运工简单翻一下大家可以配合datasheet学习这样理解会更加深刻。 STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器它有 18 个通道可测量 16 个外部和 2 个内部信号源其中 ADC3 根据 CPU 引脚的不同其通道数也不同一般有 8 个外部通道。 ADC 中的各个通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以以左对齐或者右对齐存储在 16 位数据寄存器中。
STM32F103 的 ADC 主要特性如下 1、 12 位分辨率 2、转换结束、注入转换结束和发生模拟看门狗事件时产生中断 3、单次和连续转换模式 4、自校准 5、带内嵌数据一致性的数据对齐 6、采样间隔可以按通道分别编程 7、规则转换和注入转换均有外部触发选项 8、间断模式 9、双重模式带 2 个或以上 ADC 的器件 10、 ADC 转换时间时钟为 72MHz 为 1.17us 11、 ADC 供电要求 2.4V 到 3.6V 12、 ADC 输入范围 VREF–≤VIN≤VREF 13、规则通道转换期间有 DMA 请求产生
我们按照 ADC 的配置流程标记了七处位置分别如下理解不同的步骤请参考图和下列的介绍进行。
① ADC模块的输入电压 ② 输入通道电压输入后外部输入的电压会通过通道输入到 ADC 转换器中下面各个是ADC通道的列表 ③ 转换顺序ADC 多个通道以任意顺序输入则需要进行顺序转换转换的方式有两种一种是规则组即按照顺序进行另一种是注入组即打破原有顺序有点类似中断的形式进行顺序转换、 ④ 转换触发源从图中可以看到顺序转换是需要触发源的这里就是对触发源的配置 ⑤ 转换时间即输入电压通过ADC的时间 计算公式T 采样时间 12.5 个周期 ⑥数据寄存器ADC 转换完成后的数据输出寄存器 ⑦ 中断ADC 中断可分为三种规则组转换结束中断、注入组转换结束中断、设置了模拟看门狗状态位中断 ⑧ 单次转换模式和连续转换模式 ⑨ 扫描模式
二、实验过程
1.单通道ADC采集
STM32CubeMX配置
选择芯片stm32f103c6t6新建工程 设置时钟源最小系统外部晶振8Mhz作为外部高速HSE时钟源。由于没有外接外部低速晶振这里低速时钟源选择旁路时钟源。 配置时钟树这里使用官方推荐的配置 为了展示内部温度的变化我们配置USART1打印获取温度的结果 USART1的参数配置如下波特率115200传输数据长度为8 Bit奇偶检验无停止位1.其他参数默认 使用ADC 通道0参数中设置采样时间
Code Generator中设置只拷贝使用到的库分离.c和.h文件
设置好项目名称和路径点击GENERATE CODE即可生成后使用keil5 IDE打开。 代码实现
在usart.c文件后面添加如下代码代码中添加了#ifdef宏定义进行条件编译如果使用GUNC编译则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数否则定义为int fputc(int ch, FILE *f)函数。
/* USER CODE BEGIN 0 */
#include stdio.h
#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker-Libraries-Small printfset to Yes) calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/*** brief Retargets the C library printf function to the USART.* param None* retval None*/
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 0 */main函数如下
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */uint32_t ADC_Value;/* 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_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1,10); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_IS_BIT_SET(HAL_ADC_GetState(hadc1), HAL_ADC_STATE_REG_EOC)){ADC_Value HAL_ADC_GetValue(hadc1);}printf( ADC channel0 value %1.3fV \r\n, ADC_Value*3.3f/4096);}}/* USER CODE END 3 */
}2.多通道ADC采样(非DMA)
STM32CubeMX配置
为了避免冗余这里省略掉CubeMX新建工程配置时钟等步骤直接展示ADC的配置
代码实现
为了避免冗余这里省略掉printf重载直接展示main函数如下
int main(void)
{/* USER CODE BEGIN 1 */uint32_t ADC_Value[2];uint8_t i;/* 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_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1,10); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(500);for(i0;i2;i){if(HAL_IS_BIT_SET(HAL_ADC_GetState(hadc1), HAL_ADC_STATE_REG_EOC)){ADC_Value[i] HAL_ADC_GetValue(hadc1);}HAL_ADC_Stop (hadc1);//打开ADCprintf( ADC channel0 value %1.3fV \r\n, ADC_Value[0]*3.3f/4096);printf( ADC channel1 value %1.3fV \r\n, ADC_Value[1]*3.3f/4096);}/* USER CODE END 3 */
}3.多通道ADC采样DMA
STM32CubeMX配置
为了避免冗余这里省略掉CubeMX新建工程配置时钟等步骤直接展示DMA和ADC的配置
DMA配置如下主要配置了通道模式字宽等信息 ADC配置如下
代码实现
为了避免冗余这里省略掉printf重载直接展示main函数如下
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */uint32_t ADC_Value[100];uint8_t i;uint32_t ad1,ad2;/* 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_ADC_Start_DMA(hadc1, (uint32_t*)ADC_Value, 50);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(500);for(i 0,ad1 0,ad20; i 100;){ad1 ADC_Value[i];ad2 ADC_Value[i];}ad1 / 50;ad2 / 50;printf(\r\n******** ADC DMA Example ********\r\n\r\n);//串口打印printf( AD1 value %1.3fV \r\n, ad1*3.3f/4096);printf( AD2 value %1.3fV \r\n, ad2*3.3f/4096);}总结
本章介绍使用STM32CubeMX对ADC进行配置的方法ADC的原理、概念和特点配置各个步骤的功能并通过单通道多通道DMA三种方式实现采集对于配置的细节可以参照ADC实现原理图一点点梳理这样易于理解。