ADC与DMA
1.ADC驱动函数方法(占用ARM内核时间)
CUBEMX
VSSA 和VDDA是ADC功能的电源输入
将Rank中的Sampling Time设置为55.5Cycles[采样时间55.5个时钟周期]
int main(void){后
uint16_t a1, a2; //用于ADC数据读取的暂时变量
初始化函数后
/* USER CODE BEGIN 2 */
写代码
/* USER CODE END 2 */
HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
while(1)
a1 = ADC_IN_1(); //读取ADC1的数值,电位器
a2 = ADC_IN_2(); //读取ADC2的数值,光敏电阻
printf("ADC1=%04d ADC2=%04d \r\n",a1,a2);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
HAL_Delay(500);
adc.c
#include "adc.h"
uint16_t ADC_IN_1(void) //ADC采集程序
{
HAL_ADC_Start(&hadc1);//开始ADC采集
HAL_ADC_PollForConversion(&hadc1,500);//等待采集结束
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
{
return HAL_ADC_GetValue(&hadc1);//读出ADC数值
}
return 0;
}
uint16_t ADC_IN_2(void) //ADC采集程序
{
HAL_ADC_Start(&hadc2);//开始ADC采集
HAL_ADC_PollForConversion(&hadc2,500);//等待采集结束
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
{
return HAL_ADC_GetValue(&hadc2);//读出ADC数值
}
return 0;
}
adc.h
#ifndef ADC_ADC_H_
#define ADC_ADC_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
extern ADC_HandleTypeDef hadc1;
extern ADC_HandleTypeDef hadc2;
uint16_t ADC_IN_1(void);
uint16_t ADC_IN_2(void);
#endif /* ADC_ADC_H_ */
2.DMA(数据自动传递)
单路ADC
Continuous Conversion Mode [Enable]开启连续转换模式
在DMA中,添加ADC1,
priority [High]高优先级,Mode [Circular]循环模式,[勾选]Memory寄存器Date Width[Half Word]数据宽度半字
ADC传递的数值将传递到16位宽度的寄存器中
NVIC中勾选DMA1
ADC1不勾选(如果要在ADC中断回调函数中处理ADC相关工作,则勾选)
MX_DMA_Init();初始化函数应在MX_ADC1_Init();之前
初始化函数后
HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&a1,1);//启动DMA,采集数据存入的变量地址,长度1
while(1)
/*a1 = ADC_IN_1(); //读取ADC1的数值,电位器*/
a2 = ADC_IN_2(); //读取ADC2的数值,光敏电阻
printf("ADC1=%04d ADC2=%04d \r\n",a1,a2);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
HAL_Delay(500);
多路ADC
Number Of Conversion [2]通道数量为2
Rank下设置第二个通道
uint16_t dmaadc[2];//用于多路ADC数据读取的暂时数组
HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&dmaadc,2);//启动DMA,采集数据存入的变量地址,长度2
while(1)
printf("ADC1=%04d ADC2=%04d \r\n",dmaadc[0],dmaadc[1]);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
HAL_Delay(500);
加粗样式