单片机学习小组
直播中

李颜

7年用户 1403经验值
私信 关注

如何利用STM32实现TMC5160步进电机简单转动?

TMC5160具有哪几种工作模式?

如何利用STM32实现TMC5160步进电机简单转动?

回帖(1)

白边赫

2022-2-28 13:46:34
TMC5160有三种模式
模式一:SD_MODE=0,SPI_MODE=1。在该模式下,用户通过SPI接口来设置TMC5160的寄存器配置参数。再设置工作模式:速度模式和位置模式
模式二:SD_MODE=1,SPI_MODE=1。在该模式下,用户通过SPI接口来设TMC5160的寄存器。TMC5160的功能和DRV8825类似,外界通过脉冲和方向引脚来控制步进电机运动
模式三:SD_MODE=1,SPI_MODE=0。在该模式下,SPI接口失能,TMC5160的工作状态由CFG引脚配置。TMC5160可以完全独立工作,不需要接CPU。
为实现电机的简单转动,下面将一下如何实现模式三

程序设计


该模式下不需要通过SPI通讯,配置相关GPIO引脚和发送频率一定的正弦波即可。TMC5160的GPIO和STM32的引脚对应如下表:

①最重要的一点是一定要将SD_MODE接地,SPI_MODE拉高(PB1=1,PB=0),否则无法进入模式三,上述的引脚也无法实现相应功能。其它引脚的参数可以参考TMC5160数据手册根据自己的需求进行设置。初始化程序如下:

void TMC5160_Init3(void)                 //模式三独立模式
{
         GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE();                   //开启GPIOB时钟
        __HAL_RCC_GPIOA_CLK_ENABLE();                   //开启GPIOA时钟
      
    GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8;                                
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;          //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);

        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;                       
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;          //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;    //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
      
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6|GPIO_PIN_5,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);      
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_12|GPIO_PIN_1,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15|GPIO_PIN_2|GPIO_PIN_0,GPIO_PIN_RESET);      
}

②PA8需要输入PWM方波,方波的频率决定电机转动速度,可以用PWM通道的方式搞定,也可以用定时器中断来做,这边采用定时器中断的方法,例如,STM32F103的时钟频率为72M,分频设为72,装载值设为500,每0.5ms中断一次,PA8电平取反,1KHZ的方波就完成了。频率可以改变。程序如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM3_Handler))
    {
                COUNT++;
      A8=~A8;
               
                if(COUNT>=6400)
                {
                //HAL_NVIC_DisableIRQ(TIM3_IRQn);
                                LED=1;                  //转一圈,停2s后继续
                delay_ms(2000);
                        LED=0;
                        COUNT=0;
                }
    }
}

上述例程的功能是让电机转1圈后停2s后继续。
解释:采用四相电机,根据脉冲让电机转动,一个脉冲转1.8°,200个脉冲一圈,采用16细分,那么一圈就需要3200个脉冲。
注意:脉冲值可以自己设定,1KHZ只是个举例,但是也不要过大或者过小。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分