• STM32物联网项目-双极性步进电机


    双极性步进电机

    在这里插入图片描述

    双极性的意思是通过线圈的电流有两个方向

    在这里插入图片描述

    电流方向

    A+ 流向 A-或者A- 流向 A+

    B+ 流向 B-或者B- 流向 B+

    驱动方式

    与单极性的步进电机一样,有三种驱动方式,单四拍、双四拍、八拍

    A+表示电流从A+流向A-,A-表示电流从A-流向A+

    在这里插入图片描述

    因为单四拍的步距角是7.5度,也就是说按A+,B+,A-,B-这样线圈通电顺序就可以让步进电机转动7.5度,又因为该步进电机没有减速比,所以360/7.5 = 48,48个这样的单四拍就可以让电机转动一圈,双四拍的同理

    八拍步距角是3.75度,360/3.75 = 96,所以在八拍的驱动方式下,步进电机转一圈要96个这样的八拍脉冲

    程序

    与单极性步进电机的程序差不多,在驱动方式上和转一圈所需的脉冲数不同

    一个四拍或八拍都是让线圈轮流通电,若脉冲是A+,就让A+引脚输出高电平,A-引脚输出低电平,这样电流就从A+流向了A-,驱动转子转动

    A1 = A+,A2 = A-

    /*
    	* @name   Step_One_Pulse
    	* @brief  步进电机步进一个脉冲
    	* @param  Speed_Change -> 速度变化
    	* @retval None      
    */
    static void Step_One_Pulse(void)
    {
    	static uint8_t Position = 0;
    	
    	//单四拍
    	if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Single_4_Beats)
    	{
    		if(Bipolar_Step_Motor.Direction == Forward_State)
    		{
    			//正向步进  A1 - B2 - A2 - B1
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 1: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 3: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				default: System.Error_Handler();
    			}
    		}
    		else
    		{
    			//反向步进  A1 - B1 - A2 - B2
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 1: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 3: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				default: System.Error_Handler();
    			}
    		}
    		
    		//更新位置信息
    		if((++Position) == 4)
    				Position = 0;
    	}
    	
    	//双四拍
    	if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Double_4_Beats)
    	{
    		if(Bipolar_Step_Motor.Direction == Forward_State)
    		{
    			//正向步进  A1B2 - B2A2 - A2B1 - B1A1
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				case 1: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    				case 2: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 3: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				default: System.Error_Handler();
    			}
    		}
    		else
    		{
    			//反向步进  A1B1 - B1A2 - A2B2 - B2A1
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 1: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    				case 3: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				default: System.Error_Handler();
    			}
    		}
    		
    		//更新位置信息
    		if((++Position) == 4)
    				Position = 0;
    	}
    	
    	//单八拍
    	if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_8_Beats)
    	{
    		if(Bipolar_Step_Motor.Direction == Forward_State)
    		{
    			//正向步进  A1 - A1B2 - B2 - B2A2 - A2 - A2B1 - B1 - B1A1
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 1: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				case 2: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				case 3: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    				case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 5: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 6: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 7: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				default:System.Error_Handler();
    			}
    		}
    		else
    		{
    			//反向步进 A1 - A1B1 - B1 - B1A2 - A2 - A2B2 - B2 - B2A1
    			switch(Position)
    			{
    				case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 1: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 2: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    				case 3: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    				case 5: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    				case 6: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				case 7: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    				default:System.Error_Handler();
    			}
    		}
    		
    		//更新位置信息
    		if((++Position) == 8)
    				Position = 0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    电机转一圈的脉冲次数也不同

    如果是四拍,则步进电机转一圈需要这样的四拍48次

    如果是八拍,则转一圈需要这样的八拍96次

    //定义结构体类变量
    Bipolar_Step_Motor_t Bipolar_Step_Motor = 
    {
      Stop_State,
    	Forward_State,
    	Speed_6,
    	0,
    	//Drive_Mode_Single_4_Beats,
    	Drive_Mode_Double_4_Beats,
    	//Drive_Mode_8_Beats,
    	0,
    	(uint8_t)48,  //4拍,一圈转48次
    	//(uint8_t)96,  //8拍,一圈转96次
    	
    	Direction_Adjust,
    	Speed_Adjust,
    	Step_One_Pulse
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    【Python从0到1】第三篇:基础语法(三)
    【PTE-day02 sqlmap操作】
    AT2377-[AGC014E]Blue and Red Tree【启发式合并】
    在微信公众号怎么实现全民经纪人功能
    解决android中 ExifInterface.setAttribute()无效问题
    用户眼中的 tensor、TensorFlow 系统中的 tensor、tensor 高阶用法 DLPack
    IT网络监控系统的主要功能有哪些
    JAVA 中如何实现代码优化(技巧讲解)
    Linux中用嵌套方式打印
    扫雷小游戏(1.0版本)
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126728497