• STM32实战总结:HAL之电机


    电机基础知识参考:

    51单片机外设篇:电机_路溪非溪的博客-CSDN博客

    无刷电机和有刷电机

    先详细了解有刷电机:

    带你了解(有刷)电机工作原理_哔哩哔哩_bilibili

    再详细了解无刷电机:

    无刷直流电机工作原理_哔哩哔哩_bilibili

    二者有何异同?

    无刷电机和有刷电机都是一种直流电机。

    有另外一种说法:很多人在知识上一直有这么个误区,以为无刷电机是直流电机,其实不然,无刷电机属于交流电机,是三相交流永磁电机的一种,输入模型无刷电机3根导线的电流是交流电,只不过这种交流电不是50HZ的市电正弦波,而是从无刷电机控制器(俗称无刷电调)调制出来的三相交变矩形波,频率比50HZ高很多,且随电机转速变化而变化。

    输入的都是直流,只是无刷电机通过内部的控制器后,形成了一个交流电。了解即可,不必纠结。

    有刷电机是所有电机中最基础的,不仅具有启动快速、制动及时、调速平稳、控制简单等优点,并且结构简单,价格便宜。比如我们小时候玩得四驱车里面就有一个小的装置(马达)这就是有刷电机。

    但是电刷也是让有刷电机寿命短的主要原因。由于电刷持续的相互滑动和摩擦,电刷会不断磨损消耗,有刷电机必须经常进行维护更换电刷。

    带刷的电机是磁极固定、线圈转动;而无刷马达则为线圈固定、磁极旋转。在无刷电机中,通过霍尔传感器,感知永磁体磁极的位置,然后根据这种感知,利用电子线路,在保证产生正确方向磁力的线圈中适时切换电流的方向来驱动电机。将有刷电机的不足消除。

    没有电刷的摩擦,电机里的火花跟电机都没有;无刷电机没有摩擦力、转速快且省电;无刷电机在没有电刷摩擦的情况下,几乎不需要额外保养。
    无刷电机比有刷电机在很多性能方面都要高一些,在价格方面也是。无论是控制电路还是电机本身,其成本和价格都比同级别的有刷电机高很多。

    再谈步进电机

    电机分为直流电机和交流电机,直流电机分为有刷直流电机和无刷直流电机

    那么,步进电机是什么呢?它是直流电机还是交流电机?

    步进电机没有分交流与直流,如果是单极性控制方式,步进电机流过的电流是单方向,双极性控制时,步进电机流过电流是交流电。但控制步进电机的驱动器的供电电源分直流版和交流版,不同厂家的产品是有些差异,如EZM872是直流版,工作电压是18~80VDC;EZM872H是交流版,工作电压是18~80VAC。一般情况下,建议用直流版本,交流版本易出现电机急刹车时导致驱动器损坏。

    先了解大概原理:

    【动画演示】步进电机的原理,学了这么多年电工,终于搞明白了_哔哩哔哩_bilibili

    步进电机相对于无刷电机来说,可以精准控制。

    更多参考:

    什么是步进电机?步进电机的特点,分类与原理!-电子发烧友网

    单极性和双极性步进电机:

    15.2-步进电机实验--步进电机极性区分_哔哩哔哩_bilibili

    电机相数:

    所谓“相数”,就是线圈组数(不要认为是定子数)。二、三、四、五相步进电机分别对应有2、3、4、5组线圈。这 N 个绕组要均匀地镶嵌在定子上,因此定子的磁极数必定是 N 的整数倍,因此,转子转一圈的步数应该是 N 的整数倍。步进电机外部的接线和定子相数没有必然的联系。是根据实际运用的需要来决定的。

    看这个:

    会不会认为是8相的?因为有8个定子;会不会认为是4相的?因为可能两个定子绕一组线圈;其实,相数和定子数并没有必然联系。

    上面的是2相的,因为有2组线圈,引出来4根线。

    所以该图是两项四线步进电机。

    线圈有各种各样的绕法,也有不同的引线方式,所以,相数和线数等并不是固定的,需要针对特定的电机进行具体分析。无特定规律。不必纠结。

    四大驱动方式:

    步进电机4大驱动方式:单拍、双拍、半步、细分_哔哩哔哩_bilibili

    伺服电机

    简单来说,步进电机加上反馈电路,就构成了伺服电机。

    对比直流电机、步进电机和伺服电机:

    3种电机介绍(直交流、步进、伺服)_哔哩哔哩_bilibili

    有刷直流电机的功能实现

    选择有刷直流电机时通常需要考虑:

    尺寸

    扭力

    驱动电压

    驱动电流

    等等

    要求:实现有刷直流电机的启停、正反转和加减速。

    驱动方式1:

    只能打开和关闭,不能变速与换向,用继电器、BJT或MOS开关控制通断即可。

    驱动方式2:

    可以打开和关闭,可以变速但不能换向,此时用PWM波来控制电子开关即可。其实,改变驱动电压也是可以的,但是频繁改变驱动电压比较麻烦。通过改变PWM波地占空比可以灵活地调整电机速度,改变PWM占空比实际上就是改变其有效电流。

    驱动方式3:

    可以打开和关闭,可以变速,也可以换向,就需要用PWM控制桥路。通常使用集成IC,比如LV8548MC

    注意:单片机本身的电压不足以驱动电机,所以通常会通过单片机的高低电平来控制某些开关的通断,以此来接通电路,实现更高电压的接入。

    MX初始化

    因为是使用PWM波,所以,按照之前的定时器来初始化即可。

    这里使用TIM3的其中一个空闲通道即可。

    具体参考:

    STM32实战总结:HAL之PWM蜂鸣器_路溪非溪的博客-CSDN博客

    关键代码实现

    1. /* Includes ------------------------------------------------------------------*/
    2. #include "MyApplication.h"
    3. /* Private define-------------------------------------------------------------*/
    4. /* Private variables----------------------------------------------------------*/
    5. /* Private function prototypes------------------------------------------------*/
    6. static void Start(void); //直流电机启动
    7. static void Stop(void); //直流电机停止
    8. static void Direction_Adjust(void); //直流电机方向调整
    9. static void Speed_Adjust(Speed_Change_t); //直流电机速度调整
    10. /* Public variables-----------------------------------------------------------*/
    11. //定义结构体类变量
    12. DC_Motor_t DC_Motor =
    13. {
    14. Stop_State,
    15. Forward_State,
    16. Speed_50,
    17. Start,
    18. Stop,
    19. Direction_Adjust,
    20. Speed_Adjust
    21. };
    22. /*
    23. * @name Start
    24. * @brief 直流电机启动
    25. * @param None
    26. * @retval None
    27. */
    28. static void Start(void)
    29. {
    30. //启动电机
    31. if(DC_Motor.Direction == Forward_State)
    32. {
    33. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
    34. }
    35. else
    36. {
    37. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    38. }
    39. //更新电机状态
    40. DC_Motor.Status = Start_State;
    41. }
    42. /*
    43. * @name Stop
    44. * @brief 直流电机停止
    45. * @param None
    46. * @retval None
    47. */
    48. static void Stop(void)
    49. {
    50. //停止电机
    51. HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);
    52. HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);
    53. //更新电机状态
    54. DC_Motor.Status = Stop_State;
    55. }
    56. /*
    57. * @name Direction_Adjust
    58. * @brief 直流电机方向调整
    59. * @param None
    60. * @retval None
    61. */
    62. static void Direction_Adjust(void)
    63. {
    64. if(DC_Motor.Status == Start_State)
    65. {
    66. if(DC_Motor.Direction == Reverse_State)
    67. {
    68. //停止转动电机
    69. HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);
    70. //延时100ms,待电机停止
    71. HAL_Delay(100);
    72. //正向转动电机
    73. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
    74. //更新电机方向标识
    75. DC_Motor.Direction = Forward_State;
    76. }
    77. else
    78. {
    79. //停止转动电机
    80. HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);
    81. //延时100ms,待电机停止
    82. HAL_Delay(100);
    83. //反向转动电机
    84. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    85. //更新电机方向标识
    86. DC_Motor.Direction = Reverse_State;
    87. }
    88. }
    89. }
    90. /*
    91. * @name Speed_Adjust
    92. * @brief 直流电机速度调整
    93. * @param Speed_Change -> 速度变化
    94. * @retval None
    95. */
    96. static void Speed_Adjust(Speed_Change_t Speed_Change)
    97. {
    98. if(DC_Motor.Status == Start_State)
    99. {
    100. if(Speed_Change == Speed_up)
    101. {
    102. //增大电机速度
    103. switch(DC_Motor.Speed)
    104. {
    105. case Speed_50: DC_Motor.Speed = Speed_60; break;
    106. case Speed_60: DC_Motor.Speed = Speed_70; break;
    107. case Speed_70: DC_Motor.Speed = Speed_80; break;
    108. case Speed_80: DC_Motor.Speed = Speed_90; break;
    109. case Speed_90: DC_Motor.Speed = Speed_100; break;
    110. case Speed_100: DC_Motor.Speed = Speed_100; break;
    111. default: DC_Motor.Speed = Speed_50;
    112. }
    113. }
    114. else
    115. {
    116. //减小电机速度
    117. switch(DC_Motor.Speed)
    118. {
    119. case Speed_50: DC_Motor.Speed = Speed_50; break;
    120. case Speed_60: DC_Motor.Speed = Speed_50; break;
    121. case Speed_70: DC_Motor.Speed = Speed_60; break;
    122. case Speed_80: DC_Motor.Speed = Speed_70; break;
    123. case Speed_90: DC_Motor.Speed = Speed_80; break;
    124. case Speed_100: DC_Motor.Speed = Speed_90; break;
    125. default: DC_Motor.Speed = Speed_90;
    126. }
    127. }
    128. //更新PWM占空比
    129. TIM3->CCR3 = DC_Motor.Speed;
    130. TIM3->CCR4 = DC_Motor.Speed;
    131. }
    132. }
    133. /********************************************************
    134. End Of File
    135. ********************************************************/

    单极性步进电机的功能实现

    注意:

    在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。

    具体驱动的拍数参考:

    51单片机外设篇:电机_路溪非溪的博客-CSDN博客

    步进电机的转速通常不会太快。有的最大为500HZ,即2ms走一步。

    MX中初始化相关的GPIO即可。

    另外,可初始化一个定时器,用来实现各节拍之间的延时。

    关键代码:

    1. /* Includes ------------------------------------------------------------------*/
    2. #include "MyApplication.h"
    3. /* Private define-------------------------------------------------------------*/
    4. /* Private variables----------------------------------------------------------*/
    5. /* Private function prototypes------------------------------------------------*/
    6. static void Direction_Adjust(void); //步进电机方向调整
    7. static void Speed_Adjust(Speed_Change_t); //步进电机速度调整
    8. static void Step_One_Pulse(void); //步进电机步进一个脉冲
    9. /* Public variables-----------------------------------------------------------*/
    10. //定义结构体类变量
    11. Unipolar_Step_Motor_t Unipolar_Step_Motor =
    12. {
    13. Stop_State,
    14. Forward_State,
    15. Speed_6,
    16. 0,
    17. Drive_Mode_8_Beats,
    18. 0,
    19. (uint16_t)4096,
    20. Direction_Adjust,
    21. Speed_Adjust,
    22. Step_One_Pulse
    23. };
    24. /*
    25. * @name Direction_Adjust
    26. * @brief 直流电机方向调整
    27. * @param None
    28. * @retval None
    29. */
    30. static void Direction_Adjust(void)
    31. {
    32. if(Unipolar_Step_Motor.Status == Start_State)
    33. {
    34. //调整电机运行方向
    35. if(Unipolar_Step_Motor.Direction == Reverse_State)
    36. {
    37. Unipolar_Step_Motor.Direction = Forward_State;
    38. }
    39. else
    40. {
    41. Unipolar_Step_Motor.Direction = Reverse_State;
    42. }
    43. Unipolar_Step_Motor.Circle = Circle_Set_Value;
    44. Unipolar_Step_Motor.Pulse_Cnt = 0;
    45. Display.Disp_HEX(Disp_NUM_6,Unipolar_Step_Motor.Circle,Disp_DP_OFF);
    46. }
    47. }
    48. /*
    49. * @name Speed_Adjust
    50. * @brief 直流电机速度调整
    51. * @param Speed_Change -> 速度变化
    52. * @retval None
    53. */
    54. static void Speed_Adjust(Speed_Change_t Speed_Change)
    55. {
    56. uint8_t temp;
    57. if(Unipolar_Step_Motor.Status == Start_State)
    58. {
    59. if(Speed_Change == Speed_up)
    60. {
    61. //增大电机速度
    62. switch(Unipolar_Step_Motor.Speed)
    63. {
    64. case Speed_1: Unipolar_Step_Motor.Speed = Speed_2; temp = 2; break;
    65. case Speed_2: Unipolar_Step_Motor.Speed = Speed_3; temp = 3; break;
    66. case Speed_3: Unipolar_Step_Motor.Speed = Speed_4; temp = 4; break;
    67. case Speed_4: Unipolar_Step_Motor.Speed = Speed_5; temp = 5; break;
    68. case Speed_5: Unipolar_Step_Motor.Speed = Speed_6; temp = 6; break;
    69. case Speed_6: Unipolar_Step_Motor.Speed = Speed_7; temp = 7; break;
    70. case Speed_7: Unipolar_Step_Motor.Speed = Speed_8; temp = 8; break;
    71. case Speed_8: Unipolar_Step_Motor.Speed = Speed_9; temp = 9; break;
    72. case Speed_9: Unipolar_Step_Motor.Speed = Speed_9; temp = 9; break;
    73. default:Unipolar_Step_Motor.Speed = Speed_6; temp = 6;
    74. }
    75. }
    76. else
    77. {
    78. //减小电机速度
    79. switch(Unipolar_Step_Motor.Speed)
    80. {
    81. case Speed_1: Unipolar_Step_Motor.Speed = Speed_1; temp = 1; break;
    82. case Speed_2: Unipolar_Step_Motor.Speed = Speed_1; temp = 1; break;
    83. case Speed_3: Unipolar_Step_Motor.Speed = Speed_2; temp = 2; break;
    84. case Speed_4: Unipolar_Step_Motor.Speed = Speed_3; temp = 3; break;
    85. case Speed_5: Unipolar_Step_Motor.Speed = Speed_4; temp = 4; break;
    86. case Speed_6: Unipolar_Step_Motor.Speed = Speed_5; temp = 5; break;
    87. case Speed_7: Unipolar_Step_Motor.Speed = Speed_6; temp = 6; break;
    88. case Speed_8: Unipolar_Step_Motor.Speed = Speed_7; temp = 7; break;
    89. case Speed_9: Unipolar_Step_Motor.Speed = Speed_8; temp = 8; break;
    90. default:Unipolar_Step_Motor.Speed = Speed_6; temp = 6;
    91. }
    92. }
    93. //更新定时器7的计时重装载寄存器
    94. TIM7 ->ARR = Unipolar_Step_Motor.Speed;
    95. //更新数码管速度显示
    96. Display.Disp_HEX(Disp_NUM_1,temp,Disp_DP_OFF);
    97. }
    98. }
    99. /*
    100. * @name Step_One_Pulse
    101. * @brief 步进电机步进一个脉冲
    102. * @param Speed_Change -> 速度变化
    103. * @retval None
    104. */
    105. static void Step_One_Pulse(void)
    106. {
    107. static uint8_t Position = 0;
    108. //单四拍
    109. if(Unipolar_Step_Motor.Drive_Mode == Drive_Mode_Single_4_Beats)
    110. {
    111. if(Unipolar_Step_Motor.Direction == Forward_State)
    112. {
    113. //正向步进 A - D - C - B
    114. switch(Position)
    115. {
    116. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    117. case 1: CLR_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    118. case 2: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    119. case 3: CLR_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    120. default: System.Error_Handler();
    121. }
    122. }
    123. else
    124. {
    125. //反向步进 A - B - C - D
    126. switch(Position)
    127. {
    128. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    129. case 1: CLR_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    130. case 2: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    131. case 3: CLR_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    132. default: System.Error_Handler();
    133. }
    134. }
    135. //更新位置信息
    136. if((++Position) == 4)
    137. Position = 0;
    138. }
    139. //双四拍
    140. if(Unipolar_Step_Motor.Drive_Mode == Drive_Mode_Double_4_Beats)
    141. {
    142. if(Unipolar_Step_Motor.Direction == Forward_State)
    143. {
    144. //正向步进 DA - CD - BC - AB
    145. switch(Position)
    146. {
    147. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    148. case 1: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; SET_Motor_D; break;
    149. case 2: CLR_Motor_A; SET_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    150. case 3: SET_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    151. default: System.Error_Handler();
    152. }
    153. }
    154. else
    155. {
    156. //反向步进 DA - AB - BC - CD
    157. switch(Position)
    158. {
    159. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    160. case 1: SET_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    161. case 2: CLR_Motor_A; SET_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    162. case 3: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; SET_Motor_D; break;
    163. default: System.Error_Handler();
    164. }
    165. }
    166. //更新位置信息
    167. if((++Position) == 4)
    168. Position = 0;
    169. }
    170. //单八拍
    171. if(Unipolar_Step_Motor.Drive_Mode == Drive_Mode_8_Beats)
    172. {
    173. if(Unipolar_Step_Motor.Direction == Forward_State)
    174. {
    175. //正向步进 A - DA - D - CD - C - BC - B - AB
    176. switch(Position)
    177. {
    178. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    179. case 1: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    180. case 2: CLR_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    181. case 3: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; SET_Motor_D; break;
    182. case 4: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    183. case 5: CLR_Motor_A; SET_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    184. case 6: CLR_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    185. case 7: SET_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    186. default:System.Error_Handler();
    187. }
    188. }
    189. else
    190. {
    191. //反向步进 A - AB - B - BC - C -CD - D - DA
    192. switch(Position)
    193. {
    194. case 0: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    195. case 1: SET_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    196. case 2: CLR_Motor_A; SET_Motor_B; CLR_Motor_C; CLR_Motor_D; break;
    197. case 3: CLR_Motor_A; SET_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    198. case 4: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; CLR_Motor_D; break;
    199. case 5: CLR_Motor_A; CLR_Motor_B; SET_Motor_C; SET_Motor_D; break;
    200. case 6: CLR_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    201. case 7: SET_Motor_A; CLR_Motor_B; CLR_Motor_C; SET_Motor_D; break;
    202. default: System.Error_Handler();
    203. }
    204. }
    205. //更新位置信息
    206. if((++Position) == 8)
    207. Position = 0;
    208. }
    209. }
    210. /********************************************************
    211. End Of File
    212. ********************************************************/

    双极性步进电机的功能实现

    双极性成本高(因为有两个电流方向,所以需要2个H桥共8个MOS管),但是结构简单。

    驱动方式:

    关键代码如下:

    1. /* Includes ------------------------------------------------------------------*/
    2. #include "MyApplication.h"
    3. /* Private define-------------------------------------------------------------*/
    4. /* Private variables----------------------------------------------------------*/
    5. /* Private function prototypes------------------------------------------------*/
    6. static void Direction_Adjust(void); //步进电机方向调整
    7. static void Speed_Adjust(Speed_Change_t); //步进电机速度调整
    8. static void Step_One_Pulse(void); //步进电机步进一个脉冲
    9. /* Public variables-----------------------------------------------------------*/
    10. //定义结构体类变量
    11. Bipolar_Step_Motor_t Bipolar_Step_Motor =
    12. {
    13. Stop_State,
    14. Forward_State,
    15. Speed_6,
    16. 0,
    17. //Drive_Mode_Single_4_Beats,
    18. Drive_Mode_Double_4_Beats,
    19. //Drive_Mode_8_Beats,
    20. 0,
    21. (uint8_t)48, //4拍,一圈转48
    22. //(uint8_t)96, //8拍,一圈转96
    23. Direction_Adjust,
    24. Speed_Adjust,
    25. Step_One_Pulse
    26. };
    27. /*
    28. * @name Direction_Adjust
    29. * @brief 直流电机方向调整
    30. * @param None
    31. * @retval None
    32. */
    33. static void Direction_Adjust(void)
    34. {
    35. if(Bipolar_Step_Motor.Status == Start_State)
    36. {
    37. //调整电机运行方向
    38. if(Bipolar_Step_Motor.Direction == Reverse_State)
    39. {
    40. Bipolar_Step_Motor.Direction = Forward_State;
    41. }
    42. else
    43. {
    44. Bipolar_Step_Motor.Direction = Reverse_State;
    45. }
    46. Bipolar_Step_Motor.Circle = Circle_Set_Value;
    47. Bipolar_Step_Motor.Pulse_Cnt = 0;
    48. Display.Disp_HEX(Disp_NUM_6,Bipolar_Step_Motor.Circle/10,Disp_DP_OFF);
    49. Display.Disp_HEX(Disp_NUM_5,Bipolar_Step_Motor.Circle%10,Disp_DP_OFF);
    50. }
    51. }
    52. /*
    53. * @name Speed_Adjust
    54. * @brief 直流电机速度调整
    55. * @param Speed_Change -> 速度变化
    56. * @retval None
    57. */
    58. static void Speed_Adjust(Speed_Change_t Speed_Change)
    59. {
    60. uint8_t temp;
    61. if(Bipolar_Step_Motor.Status == Start_State)
    62. {
    63. if(Speed_Change == Speed_up)
    64. {
    65. //增大电机速度
    66. switch(Bipolar_Step_Motor.Speed)
    67. {
    68. case Speed_1: Bipolar_Step_Motor.Speed = Speed_2; temp = 2; break;
    69. case Speed_2: Bipolar_Step_Motor.Speed = Speed_3; temp = 3; break;
    70. case Speed_3: Bipolar_Step_Motor.Speed = Speed_4; temp = 4; break;
    71. case Speed_4: Bipolar_Step_Motor.Speed = Speed_5; temp = 5; break;
    72. case Speed_5: Bipolar_Step_Motor.Speed = Speed_6; temp = 6; break;
    73. case Speed_6: Bipolar_Step_Motor.Speed = Speed_7; temp = 7; break;
    74. case Speed_7: Bipolar_Step_Motor.Speed = Speed_8; temp = 8; break;
    75. case Speed_8: Bipolar_Step_Motor.Speed = Speed_9; temp = 9; break;
    76. case Speed_9: Bipolar_Step_Motor.Speed = Speed_9; temp = 9; break;
    77. default:Bipolar_Step_Motor.Speed = Speed_6; temp = 6;
    78. }
    79. }
    80. else
    81. {
    82. //减小电机速度
    83. switch(Bipolar_Step_Motor.Speed)
    84. {
    85. case Speed_1: Bipolar_Step_Motor.Speed = Speed_1; temp = 1; break;
    86. case Speed_2: Bipolar_Step_Motor.Speed = Speed_1; temp = 1; break;
    87. case Speed_3: Bipolar_Step_Motor.Speed = Speed_2; temp = 2; break;
    88. case Speed_4: Bipolar_Step_Motor.Speed = Speed_3; temp = 3; break;
    89. case Speed_5: Bipolar_Step_Motor.Speed = Speed_4; temp = 4; break;
    90. case Speed_6: Bipolar_Step_Motor.Speed = Speed_5; temp = 5; break;
    91. case Speed_7: Bipolar_Step_Motor.Speed = Speed_6; temp = 6; break;
    92. case Speed_8: Bipolar_Step_Motor.Speed = Speed_7; temp = 7; break;
    93. case Speed_9: Bipolar_Step_Motor.Speed = Speed_8; temp = 8; break;
    94. default:Bipolar_Step_Motor.Speed = Speed_6; temp = 6;
    95. }
    96. }
    97. //更新定时器7的计时重装载寄存器
    98. TIM7 ->ARR = Bipolar_Step_Motor.Speed;
    99. //更新数码管速度显示
    100. Display.Disp_HEX(Disp_NUM_1,temp,Disp_DP_OFF);
    101. }
    102. }
    103. /*
    104. * @name Step_One_Pulse
    105. * @brief 步进电机步进一个脉冲
    106. * @param Speed_Change -> 速度变化
    107. * @retval None
    108. */
    109. static void Step_One_Pulse(void)
    110. {
    111. static uint8_t Position = 0;
    112. //单四拍
    113. if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Single_4_Beats)
    114. {
    115. if(Bipolar_Step_Motor.Direction == Forward_State)
    116. {
    117. //正向步进 A1 - B2 - A2 - B1
    118. switch(Position)
    119. {
    120. case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    121. case 1: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    122. case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    123. case 3: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    124. default: System.Error_Handler();
    125. }
    126. }
    127. else
    128. {
    129. //反向步进 A1 - B1 - A2 - B2
    130. switch(Position)
    131. {
    132. case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    133. case 1: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    134. case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    135. case 3: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    136. default: System.Error_Handler();
    137. }
    138. }
    139. //更新位置信息
    140. if((++Position) == 4)
    141. Position = 0;
    142. }
    143. //双四拍
    144. if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Double_4_Beats)
    145. {
    146. if(Bipolar_Step_Motor.Direction == Forward_State)
    147. {
    148. //正向步进 A1B2 - B2A2 - A2B1 - B1A1
    149. switch(Position)
    150. {
    151. case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    152. case 1: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    153. case 2: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    154. case 3: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    155. default: System.Error_Handler();
    156. }
    157. }
    158. else
    159. {
    160. //反向步进 A1B1 - B1A2 - A2B2 - B2A1
    161. switch(Position)
    162. {
    163. case 0: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    164. case 1: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    165. case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    166. case 3: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    167. default: System.Error_Handler();
    168. }
    169. }
    170. //更新位置信息
    171. if((++Position) == 4)
    172. Position = 0;
    173. }
    174. //单八拍
    175. if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_8_Beats)
    176. {
    177. if(Bipolar_Step_Motor.Direction == Forward_State)
    178. {
    179. //正向步进 A1 - A1B2 - B2 - B2A2 - A2 - A2B1 - B1 - B1A1
    180. switch(Position)
    181. {
    182. case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    183. case 1: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    184. case 2: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    185. case 3: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    186. case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    187. case 5: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    188. case 6: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    189. case 7: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    190. default:System.Error_Handler();
    191. }
    192. }
    193. else
    194. {
    195. //反向步进 A1 - A1B1 - B1 - B1A2 - A2 - A2B2 - B2 - B2A1
    196. switch(Position)
    197. {
    198. case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    199. case 1: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    200. case 2: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
    201. case 3: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    202. case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
    203. case 5: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
    204. case 6: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    205. case 7: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
    206. default:System.Error_Handler();
    207. }
    208. }
    209. //更新位置信息
    210. if((++Position) == 8)
    211. Position = 0;
    212. }
    213. }
    214. /********************************************************
    215. End Of File
    216. ********************************************************/

     

  • 相关阅读:
    我从自动化测试转为测试开发,资深测试总结测试开发技术栈,提升之路......
    Element Plus 组件库相关技术:7. 组件实现的基本流程及 Icon 组件的实现
    docker安装minio
    python代码反编译
    经典算法之希尔排序(Shell‘s Sort)
    Spring(三)
    实现一个支持多线程的Web服务器,能够处理多个客户端请求
    mediasoup udp端口分配策略
    极智AI | 大模型优化技术PagedAttention
    【Kubernetes】Pod——k8s中最重要的对象之一
  • 原文地址:https://blog.csdn.net/qq_28576837/article/details/127962740