STM32定时器1触发ADC多通道采样DMA(CUBEMX配置)【教程】

在用单片机做电源控制时不得不提ADC采集,离散系统是有固定的执行周期的,所以我们采样也是要固定时间去采样。然后就是我希望pwm波(定时器1产出)的频率与采样频率一致。
我下面演示的是G431CBU6,当然其他芯片也大差不差了。
说一下大致流程,TIM1触发ADC采样,然后DMA把数据搬出来,在ADC中断里处理DMA搬出来的数据。

ADC配置


首先口都是这个signal的。


这里记得用循环。不然你第一次数据才出来DMA搬完你还要再次使能DMA,太麻烦了。

Scan Conversion Mode:就是多通道模式。这里你要先完成下面的选择转换口数量才能enable。
一定不要使能连续转换。我们的目的就是定时器触发,确定采样周期,你用连续的话就是定时器触发一次然后他就搁那一直转了。
DMA肯定是要连续请求的。

这个转换通道数目设定了你上面的scan(扫描模式)就是enable了。
触发的话我这里选了捕获,上升沿触发。也就是tim1的通道1它输出PWM波,它就会在pwm波的每个上升沿触发ADC转换。

就像上面这样,我们是上升沿触发,也就是前面的地方触发,每个周期触发一次。
然后就是下面的通道选择了,它是默认都是channl1的,我经常忘了选,导致我其他通道采不出来,检查半天才发现,其他通道没配。

这里说一下其他的触发。像上面的定时器1的三个捕获就是分别对应tim1的三个通道。
tim3 trigger out event是下面的选择。

update就是定时器计数满后溢出产生触发信号。

定时器配置


这里选输出也行,不过记得是PWM,如果用输出比较也行,但不好配置(为了方便直接PWM).

其他就是常规配置。那个触发选择就是上面说的,你看需要选择。

如果要用那个触发,这里就要选这两个触发源了。

启动!!!

初始化

unsigned short AD_Value[3];				//存储ad原始数据
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 3);
TIM1->CCR1=1000;										//50%
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);				//用来触发adc采样 

__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,600);调占空比用这个也行。本质都是操作寄存器。
中断函数

void  HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	
	if(hadc->Instance==ADC1)
	{		
		
	}
}
物联沃分享整理
物联沃-IOTWORD物联网 » STM32定时器1触发ADC多通道采样DMA(CUBEMX配置)【教程】

发表评论