目标:循环接收一路0-3.3V电压信号,使用独立模式,使用DMA搬运至寄存器,采集触发使用TIM3定时器。
材料:STM32F103C8
STM32 ADC简介:
STM32的 ADC是 12位模拟数字转换器。STM32的 ADC最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期为 1.5个 ADC
时钟下得到),不要让 ADC的时钟超过 14M,否则将导致结果准确度下降。STM32将 ADC的转换分为 2个通道组:规则通道组和注入通道组。规则通道相
当于正常运行的程序,而注入通道相当于中断。在程序正常执行的时候,中断是可以打断正常程序进行执行。同这个类似,注入通道的转换可以打断规则通
道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
1、时钟配置:
3、配置ADC
对应上图配置如下:
Parameter Settings
一、 ADCs_Common_Settings
Mode: 设置ADC 工作模式(独立模式或多重模式)
独立模式
<1> Independent mode ADC1 和ADC2 工作在独立模式
双重模式
<2> Dual regular simultaneous + injected simultaneous mode ADC1 和ADC2 工作在同步规则模式和同步注入模式
<3> regular regular simultaneous + alternate trigger mode ADC1 和ADC2 工作在同步规则模式和交替触发模式
<4> Dual injected simultaneous mode only ADC1 和ADC2 工作在同步注入模式
<5> Dual regular simultaneous mode only ADC1 和ADC2 工作在同步规则模式
<6> Dual interleaved mode only ADC1 和ADC2 工作在交叉模式
<7> Dual alternate trigger mode only ADC1 和ADC2 工作在交替触发模式
三重模式
<8> Triple combined regular simultaneous + injected simultaneous mode 工作在同步规则模式和同步注入模式
<9> Triple combined regular simultaneous + alternate trigger mode 工作在同步规则模式和交替触发模式
<10> Triple injected simultaneous mode only ADC1 和ADC2 工作在同步注入模式
<11> Triple regular simultaneous mode only ADC1 和ADC2 工作在同步规则模式
<12> Triple interleaved mode only ADC1 和ADC2 工作在交叉模式
<13> Triple alternate trigger mode only ADC1 和ADC2 工作在交替触发模式
DMA Access Mode :(DMA) 直接存储器存取访问模式(在多重模式下才有此项)
Delay between 2 sampling phases: 2个抽样阶段的延迟(在多重模式下才有此项)
二、 ADCs _Settings
<1> Clock Prescaler ADC的时钟分频数
<2> Resolution 分辨率(意思是AD位数)
<3> Data Alignment ADC 数据向左边对齐还是向右边对齐
<4> Scan Conversion Mode ADC工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE 或者DISABLE。
<5> Continuous Conversion Mode ADC模数转换工作在连续模式。可以设置这个参数为 ENABLE或者DISABLE 。
<6> Discontinuous Conversion Mode ADC模数转换工作在不连续模式(单次模式)。可以设置这个参数为 ENABLE或者DISABLE 。
<7> DMA Continuous Requests DMA连续请求
<8> End of Conversion Selection 转换选择结束
三、 ADCs_Regular_ConversionMode (规则通道转换模式)
<1> Enable Regular Conversions 启用定期转换 ENABLE或者DISABLE
<2> Number of Conversion ADC转换的通道数量 1
<3> External Trigger Conversion Source ADC外部触发转换源 TIM3 更新事件
<4> External Trigger Conversion Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
四、 Rank
<1> Channel ADC转换通道 1
<2> Sampling Time ADC转换时间 1.5cyces
五、 ADC_Injected_ConversionMode (注入通道转换模式)
<1> Number of Conversion ADC转换的注入通道数
注入通道数不为0时,才有下面的配置项
<2> External Trigger Source ADC外部触发转换源
<3> External Trigger Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
<4> Injected Conversion Mode ADC注入转换通道模式
六、 Rank(ADC_Injected_ConversionMode的(Number of Conversion ) ADC转换的注入通道数不为0时,才能配置注入通道的其他参数)
<1> Channel ADC转换通道
<2> Sampling Time ADC转换时间
<3> Injected Offset ADC注入通道的偏值
七、 WatchDog
<1> Enable Analog WatchDog Mode
以上蓝字为默认配置,红色在STM32 CuebeMX选择相关选项。
3.1 ACD的DMA配置
选择循环采集,地址不偏移,寄存器移位偏移。一个字节大小。
4、配置TIM3 ADC触发转换定时器
配置好ADC后还需要给ADC一个触发事件信号,这里通过定时器的上升沿触发转换,配置开启更新事件,相关分频设置转换速度为10KHZ,配置如下。
至此ADC的单通道独立默认就配置好了,生成工程代码。
5、使用
创建一个数组用于存储ADC数据
/* USER CODE BEGIN 0 */ #define NPT 256 //样本数量 uint32_t adc_buf[NPT]={0}; //用于存储ADC转换结果的数组 /* USER CODE END 0 */
使能定时器触发转换,并用串口打印
/* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1, adc_buf, NPT); /*启动ADC的DMA传输,配合定时器触发ADC转换 12位的ADC对应0-4095 */ HAL_TIM_Base_Start(&htim3); /*开启定时器,用溢出时间来触发ADC*/ //HAL_ADC_Stop_DMA(&hadc1); /*停止ADC的DMA传输*/ //HAL_TIM_Base_Stop(&htim3); /*停止定时器*/ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printSwo("",adc_buf[0],LINE_FEED_EN); HAL_Delay(500); } /* USER CODE END 3 */
增加一个DMA的回调函数用于转换完成后处理一些其它操作。
/** 函数名称:void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) * 功能描述:ADC的DMA回调函数 * 参数:hadc --- adc结构体指针 * 返回值:无 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { uint16_t flag; // HAL_ADC_Stop_DMA(&hadc1); //停止ADC的DMA传输 flag = 1; //标记ADC_DMA传输完成 }
参考链接:https://blog.csdn.net/qq_43225938/article/details/84098810
https://blog.csdn.net/mc_li/article/details/81364766?spm=1001.2014.3001.5506