在用单片机做电源控制时不得不提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).
其他就是常规配置。那个触发选择就是上面说的,你看需要选择。
如果要用那个触发,这里就要选这两个触发源了。
启动!!!
初始化文章来源:https://www.toymoban.com/news/detail-789603.html
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);调占空比用这个也行。本质都是操作寄存器。
中断函数文章来源地址https://www.toymoban.com/news/detail-789603.html
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
}
}
到了这里,关于【STM32】定时器1触发ADC多(规则)通道采样+DMA(CUBEMX配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!