cubexMx配置STM32产生特定数目的PWM波驱动步进电机同时触发DMA传输的ADC同步采样

一、背景

 步进电机在每个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的个数多,否则一次启动将填不满想要的个数也不好触发中断,可以用宏定义把它们设置成一致。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章