我是靠谱客的博主 玩命金毛,最近开发中收集的这篇文章主要介绍STM32控制步进电机脉冲定位,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概述

在成功启动步进电机之后,可通过运行数个脉冲后停止定时器做到控制步进电机转动特定角度,实现脉冲定位。

前言

STM32控制启动步进电机

原理

步进电机是将电脉冲转化为角位移的执行机构,也就是当步进驱动器接收到一个脉冲信号后,就会驱动电机按设定方向转动一个固定的角度。所以可以通过精准控制输出脉冲的个数来控制角位移量,而脉冲频率用来控制转动角速度(详见前言)
定时器产生脉冲:利用STM32c8t6定时器输出PWM脉冲,定时器计数溢出之后则代表产生了一个脉冲,并请求一次中断,可在中断函数中记录已输出脉冲个数,就知道当前电机转动了多少角度。
细分: 常见的步进电机固有步距角为1.5°、1.8°等,步距角就是一个脉冲对应转动的角度,若是需要更小的步距角,就要用到步进驱动器的细分功能:

细分步距角转一圈需要脉冲数
01.8°200
160.1125°3200

如图,驱动器设置16细分后,固有步距角就被分成了16分,此时一个脉冲就对应转动0.1125°,定位角度就更加精确。

实现结果

这里用串口输入目标角度的方式控制电机转动,结果如下:

可见,除了9°刚好是0.1125°的80倍才能精确地转动,其他度数都会存在一点误差。

PS:在此过程中,在初始化定时器之后,并没有启动定时器,但程序自动进入了一次中断,解决的办法就是在初始化函数中的修改预分频器psc前加入TIM4->CR1 |= TIM_CR1_URS;
详情见:探究STM32F103定时器初始化或程序运行中重配后会立即进入一次中断的原因和解决办法

代码

编写流程:
TIM4CH1脉冲通道配置(前言) -> DIR方向IO口配置(前言)->编写定时中断函数->main函数

static int target_angle = 0;        //目标角度
static int pulse = 0;               //脉冲个数
static double actual_angle = 0;     //实际角度
int main(void)
{		
    int len = 0;
    delay_init();
    DIR_Init();
    uart_init(9600);
    LED_Init();
    TIM4_PWM_Init(200,450);     //配置定时器PWM输出通道,以及脉冲输出频率(对应电机转动速度:15r/min)但不使能定时器
    TIM_SetCompare2(TIM4,100);  //设置占空比arr/2=50%
    while(1)
    {
        delay_ms(500);
        LED1 = !LED1;
        if(USART_RX_STA&0x8000)
        {		
            len=USART_RX_STA&0x3fff;        //得到此次接收到的数据长度
            USART_RX_BUF[len]=0;         //得到字符串
            if(len==1){
                target_angle =  USART_RX_BUF[0] - 0x30;       //字符转为数值
            }
            else if(len == 2){
                target_angle =  (USART_RX_BUF[0] - 0x30)*10 + USART_RX_BUF[1] - 0x30;
            }
            else if(len == 3){
                target_angle =  (USART_RX_BUF[0] - 0x30)*100 + (USART_RX_BUF[1] - 0x30)*10+USART_RX_BUF[2] - 0x30;
            }
            printf("************************************rn");
            printf("目标角度:%d度rn",target_angle);
            USART_RX_STA=0;     //结束,清除标志位
            TIM_Cmd(TIM4, ENABLE);  //开启定时器
        }
    }
}

//定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM4中断
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
        TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

        pulse++;    //中断一次,累计脉冲加一
        actual_angle = pulse * 9.0 /80.0;   //每个脉冲对应9/80 = 0.1125°
        if(actual_angle >= target_angle)
        {
            printf("累计脉冲个数:%d",pulse);
            pulse = 0;
            TIM_Cmd(TIM4, DISABLE);  //关闭定时器
            printf("实际转动角度:%.2lfrn",actual_angle);
        }
	}
}

对应工程文件:

CSDN:STM32c8t6控制步进电机脉冲定位
GitHub: Angle-positioning-of-step-motor

最后

以上就是玩命金毛为你收集整理的STM32控制步进电机脉冲定位的全部内容,希望文章能够帮你解决STM32控制步进电机脉冲定位所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部