记录一下使用STM32F407的ADC+DMA的操作与编程步骤:
1、STM32CUBEIDE配置
ADC与DMA不再赘述了。
a、引脚配置;
b、功能设置
配置时钟分频和其他,这里同一个ADC需要RANK设置,注意顺序;
c、dma开启
2、代码
main中开启ADC_START_DMA,后面为接收数据区,需要定义一个数组,大小依据自己所需;
回调函数:利用main运行的adc_num_processing(),每次只进行一个adc,每次读取完成关闭。
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1){
ADC1_Flag=1;
HAL_ADC_Stop_DMA(&hadc1);
}
if(hadc->Instance == ADC2){
ADC2_Flag=1;
HAL_ADC_Stop_DMA(&hadc2);
}
}
3、简单滤波
处理完缓冲区数据后,再次开启DMA,往复操作。
这里简单作了平均,可以根据实际需求直接处理;
void ADC1_Num_processing_ts(void)
{
uint16_t P24_2,N18_2;
uint8_t z=0;if(ADC1_Flag==1)
{
ADC1_Flag=0;
P24_2=N18_2=0;
for(z=0;z<40;)
{
P24_2+=ADC1_Value_ts[z++];
N18_2+=ADC1_Value_ts[z++];
}
ADC1_CJnum.P24_Current =P24_2 *3.3/40.95/3*2/2; ///3/5*10
ADC1_CJnum.N18_Current =N18_2 *3.3/40.95/3/2;HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value_ts,40);
}}
4、实际读取
读取成功;