STM32CubeIDE开发笔记5:ADC+DMA
本文链接:https://blog.csdn.net/qq_42038029/article/details/103846439
版权声明:本文为CSDN博主「遥望1415984987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
stm32CubeIDE所用版本:1.1.0
固件库包:f1 1.8.0
测试平台stm32f103c8t6
基本配置
ADC的配置很简单,如下图:
当然,你配置好后要注意ADC的采集时钟频率的配置,这样导入时才不会报错。
这样就配置好了,导入工程。
HAL关于ADC的库函数的使用
ADC轮询
在个人变量里添加
/* USER CODE BEGIN PV */
uint16_t AD_Value = 0;
在while里添加如下程序:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
AD_Value = HAL_ADC_GetValue(&hadc1);
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
其中
HAL_ADC_Start(&hadc1); 为启动ADC转换。
HAL_ADC_PollForConversion(&hadc1, 50); 表示等待转换完成,第二个参数表示超时时间,单位ms。这个我用的时候感觉影响不大,可有可无。
HAL_ADC_GetValue(&hadc1); 读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0 ~4095。
还有其他的函数可用,如:
HAL_ADC_GetState(&hadc1); 为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。
配合使用
HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC); 就是判断转换完成标志位是否设置。
下载到单片机上验证,我用20KR电位器接PA1,电源接单片机电源,接使用外部的电源记得一定要共地,且测量电压不能超过单片机电源电压,即不超过3.3V。
用在线调试可查看ADC的值。
用这个值除以4096乘以3.3即为实际电压值。
ADC_DMA
使用DMA来进行ADC采集更方便,配置如下:
配置好后先注意初始化的顺序是不是先DMA再ADC,下图是正确的:
具体原因上节讲过了,感兴趣的可以去上节(https://blog.csdn.net/qq_42038029/article/details/103835984)DMA串口通信的注意里看。
然后先在变量处添加变量。
/* USER CODE BEGIN PV */
uint16_t ADC_Value[100];
uint8_t i;
uint32_t ad1;
再在主函数内添加启动函数
第一个参数是ADC句柄
第二个参数是存储采集回来的ADC值的地址
第三个参数是一次ADC采集的值的个数
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1, &ADC_Value, 100);
/* USER CODE END 2 */
最后在while里添加下面代码:
/* USER CODE BEGIN 3 */
for(i = 0,ad1 =0; i < 100;)
{
ad1 += ADC_Value[i++];
}
ad1 /= 100;
将所有的值相加求均值,可是结果更准确。
下载到单片机上验证,在现场表达式里查看ad1的值:
创作不易,点个赞吧!