概述
一、背景
步进电机在每个PWM信号的上升沿时转动一步,同时要求在每移动一步之前的一段时间或者之后的一段时间进行ADC采样,这里用的是内部ADC,如下图1洋红色的上升沿触发步进电机转动,黄色的上升沿触发AD采样,这里注意STM32的AD的外部触发只能是上升沿,在《STM32中文参考手册》中,有关于这部分的内容如图2,写本文时用的是STM32VET6。
图1
图2
另外ADC的外设框图如下图3所示:
图3
本文采用的是ADC1的通道13(PC3)采集外部模拟信号。TIM4为主模式控制PWM的频率,其通道2输出PWM,即配置为PWM Generation CH2(PD13);通道4触发ADC,也配置成PWM模式,即PWM Generation CH4,其实在我的项目中通道4的引脚有其他用途,本想配置成PWM Generation CH4 No Output,但是这样配置以后没法触发ADC进行采样,猜测是这种模式不只是不从外部引脚输出,而且内部也没有输出,我最后的做法是将该IO(PD15)的复用模式只能强制配置成了普通推挽输出。TIM5为从模式接收TIM4的ITR2触发源,用于控制PWM的个数。
二、引脚设置
AD的引脚配置如下图4所示,只选择了IN13。
图4
定时器的引脚选择如下,注意这里TIM5的Salve MOde及Trigger Source的选择:
图5
三、AD参数设置
AD的参数设置如下,注意要正确选择外部触发源,这里选择的是Timer 4 Capture Compare 4 event
AD的DMA设置如下,这里尝试了Mode不管是Normal还是Circular都可以,暂不知本文的应用中设置不同是否有影响:
四、TIM4参数设置
TIM4的参数设置如下:
五、TIM5参数设置
TIM5配置如下,TIM5需要使能全局中断:
六、代码
启动AD开始转换:HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adcData,1000);
启动定时器输出PWM同时触发AD转换:
htim5.Instance->ARR = 1000; //演示直接这样改PWM的个数
HAL_TIM_Base_Start_IT(&htim5);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
在定时器5的中断回调里关闭PWM及AD的触发
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
HAL_TIM_Base_Stop(&htim5);
在AD传输完成中断里处理数据:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc == &hadc1)
{
//AD传输完成,可以开始处理数据了
}
}
注意调用HAL_ADC_Start_DMA时传入的传输个数不能比PWM的个数多,否则一次启动将填不满想要的个数也不好触发中断,可以用宏定义把它们设置成一致。
最后
以上就是要减肥百合为你收集整理的cubexMx配置STM32产生特定数目的PWM波驱动步进电机同时触发DMA传输的ADC同步采样一、背景二、引脚设置三、AD参数设置四、TIM4参数设置五、TIM5参数设置六、代码的全部内容,希望文章能够帮你解决cubexMx配置STM32产生特定数目的PWM波驱动步进电机同时触发DMA传输的ADC同步采样一、背景二、引脚设置三、AD参数设置四、TIM4参数设置五、TIM5参数设置六、代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复