基于STM32单片机的控制步进电机实验

工业控制

1092人已加入

描述

一、实验原理(以28BYJ48步进电机为例)和51控制步进电机原理一致

1、五线四相步进电机,不同线圈得电会让步进电机的转子转动一个角度,按一定规律给不同的线圈通电,就可以让步进电机连续转动,下表就是步进电机和拆解后的图片,以及四根线通电的顺序。

STM32单片机

注:总共五条线,一个是VCC,剩下四条分别接上ABCD相。

STM32单片机

2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转、异常震动。

3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行,转向用了一个枚举类型,控制转向。

4、单片机IO口和电机四条线连接时,一定不能错误,要按照顺序相连接。

5、调换得电的顺序,就可以控制电机的转向。

二、关键实验代码

//实验用到的引脚要先进行初始化
void ULN2003_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  GPIO_WriteBit(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}
//控制转向和速度    enum dir{Pos, Neg};   //Pos = 0, Neg = 1
void stepper(unsigned int dir, unsigned int speed)
{
  if(dir == Pos)
  {
    //step1:
    IN1_HIGH;
    IN2_LOW;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);


    //step2:  
    IN1_HIGH;
    IN2_HIGH;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);


    //step3:    
    IN1_LOW;
    IN2_HIGH;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);


    //step4:
    IN1_LOW;
    IN2_HIGH;
    IN3_HIGH;
    IN4_LOW;
    Delay_us(speed);


    //step5:
    IN1_LOW;
    IN2_LOW;
    IN3_HIGH;
    IN4_LOW;
    Delay_us(speed);


    //step6:
    IN1_LOW;
    IN2_LOW;
    IN3_HIGH;
    IN4_HIGH;
    Delay_us(speed);


    //step7:
    IN1_LOW;
    IN2_LOW;
    IN3_LOW;
    IN4_HIGH;
    Delay_us(speed);


    //step8:
    IN1_HIGH;
    IN2_LOW;
    IN3_LOW;
    IN4_HIGH;
    Delay_us(speed);
  }
  else
  {
    //step1:
    IN1_HIGH;
    IN2_LOW;
    IN3_LOW;
    IN4_HIGH;
    Delay_us(speed);


    //step2:    
    IN1_LOW;
    IN2_LOW;
    IN3_LOW;
    IN4_HIGH;
    Delay_us(speed);


    //step3:    
    IN1_LOW;
    IN2_LOW;
    IN3_HIGH;
    IN4_HIGH;
    Delay_us(speed);


    //step4:
    IN1_LOW;
    IN2_LOW;
    IN3_HIGH;
    IN4_LOW;
    Delay_us(speed);


    //step5:
    IN1_LOW;
    IN2_HIGH;
    IN3_HIGH;
    IN4_LOW;
    Delay_us(speed);


    //step6:
    IN1_LOW;
    IN2_HIGH;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);


    //step7:
    IN1_HIGH;
    IN2_HIGH;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);


    //step8:
    IN1_HIGH;
    IN2_LOW;
    IN3_LOW;
    IN4_LOW;
    Delay_us(speed);
  }
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分