[RISC-V MCU 应用开发] 第八十八章、CH32V103应用教程——步进电机驱动

[复制链接]
 楼主| RISCVLAR 发表于 2021-4-28 13:41 | 显示全部楼层 |阅读模式
本帖最后由 RISCVLAR 于 2021-4-28 13:41 编辑

CH32V103应用教程——步进电机驱动

本章主要使用CH32V103进行步进电机的驱动,需要用到ULN2003步进电机驱动板和5V步进电机(四相五线),此处使用GPIO进行步进电机驱动控制。

1、GPIO简介及相关函数介绍
关于GPIO,在前面章节已进行过介绍,在此不再赘述。
关于步进电机,此处所用电机型号为28BYJ-48(步进电机),减速比为1:64,步进脚为5.625/64度,如果需要转动转动一圈,那么需要 360/5.625*64=4096 个脉冲信号。
步进电机是一种将电脉冲转化为角位移的执行设备。步进电机驱动信号为脉冲信号,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。
我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

2、硬件设计
本章教程主要通过GPIO引脚控制ULN2003步进电机驱动板驱动步进电机,CH32V103开发板与ULN2003步进电机驱动板的连接方式如下:
  • PB6连接驱动板的IN1引脚
  • PB7连接驱动板的IN2引脚
  • PB8连接驱动板的IN3引脚
  • PB9连接驱动板的IN4引脚

3软件设计
使用GPIO控制步进电机驱动板具体程序如下:
gpio.h文件
  1. #ifndef __GPIO_H
  2. #define __GPIO_H

  3. #include "ch32v10x_conf.h"

  4. //ULN2003驱动

  5. void Moto_Init(void);      //步进电机初始化

  6. void Motorcw(u8 speed);    //步进电机正转函数
  7. void Motorccw(u8 speed);   //步进电机反转函数

  8. void Motorcw_angle(int angle,int speed);  //步进电机正转角度函数
  9. void Motorccw_angle(int angle,int speed); //步进电机反转角度函数

  10. void MotorStop(void);      //步进电机停止函数

  11. #endif
gpio.h文件主要进行函数声明;
gpio.c文件
  1. #include "gpio.h"
  2. #include "debug.h"

  3. //#define N 4
  4. #define N 8

  5. //步进电机正反转数组  数组的值,即对应GPIO引脚的值
  6. //单四拍
  7. //uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A.(9-8-7-6)
  8. //uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.(6-7-8-9)

  9. ////双四拍
  10. //uint16_t phasecw[4] ={0x0300,0x0180,0x00C0,0x0240};// DC-CB-BA-AD.
  11. //uint16_t phaseccw[4]={0x00C0,0x0180,0x0300,0x0240};// AB-BC-CD-DA.

  12. //四相八拍
  13. uint16_t phasecw[8] ={0x0200,0x0300,0x0100,0x0180,0x0080,0x00C0,0x0040,0x0240};// D-DC-C-CB-B-BA-A-AB.
  14. uint16_t phaseccw[8]={0x0040,0x00C0,0X0080,0x0180,0x0100,0x0300,0x0200,0x0240};// A-AB-B-BC-C-CD-D-DA.

  15. //电机初始化函数
  16. void Moto_Init(void)
  17. {
  18.     //步进电机初始化
  19.     // IN1: PB6   a
  20.     // IN2: PB7   b
  21.     // IN3: PB8   c
  22.     // IN4: PB9   d
  23.     GPIO_InitTypeDef GPIO_InitStructure;
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.     GPIO_Init(GPIOB,&GPIO_InitStructure);

  29.     GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
  30. }

  31. //电机正转函数
  32. //其中,speed的值越大,速度越慢,值越小,速度越快,speed相当于调节脉冲速度
  33. //转动速度和脉冲频率成正比,在此处,延时越小,频率越高
  34. void Motorcw(u8 speed)
  35. {
  36.     uint8_t i=0;

  37.     for(i=0;i<N;i++)
  38.     {
  39.         GPIO_Write(GPIOB,phasecw[i]);
  40.         Delay_Ms(speed);
  41.     }
  42. }

  43. //电机反转函数
  44. void Motorccw(u8 speed)
  45. {
  46.     uint8_t i;
  47.     for(i=0;i<N;i++)
  48.     {
  49.         GPIO_Write(GPIOB,phaseccw[i]);
  50.         Delay_Ms(speed);
  51.     }
  52. }

  53. //电机停止函数
  54. void MotorStop(void)
  55. {
  56.     //GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
  57.     GPIO_Write(GPIOB,0x0000);
  58. }

  59. //电机正转角度
  60. void Motorcw_angle(int angle,int speed)
  61. {
  62.     int i,j;
  63.     j=(int)(angle/0.70312);
  64.     for(i=0;i<j;i++)
  65.     {
  66.         Motorcw(speed);
  67.     }
  68. }

  69. //电机反转角度
  70. void Motorccw_angle(int angle,int speed)
  71. {
  72.     int i,j;
  73.     j=(int)(angle/0.70312);
  74.     for(i=0;i<j;i++)
  75.     {
  76.         Motorccw(speed);
  77.     }
  78. }
gpio.c文件内几个函数主要进行电机的相关控制。关于几个函数的具体介绍,在程序中都有详细注释在此不再赘述。
main.c文件
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2020/04/30
  6. * Description        : Main program body.
  7. *******************************************************************************/

  8. /*
  9. *@Note
  10. 电机驱动
  11. ULN2003步进电机驱动板+5V步进电机(四相五线)
  12. 电机型号为:28BYJ-48(减速步进电机),减速比为1:64,步进脚为5.625/64度,如果需要转动一圈,那么需要 360/5.625*64=4096 个脉冲信号。
  13. 步进电机是一种将电脉冲转化为角位移的执行设备。步进电机驱动信号为脉冲信号
  14. 当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。
  15. 我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
  16. */

  17. #include "debug.h"

  18. #include "gpio.h"


  19. /* Global typedef */

  20. /* Global define */

  21. /* Global Variable */


  22. /*******************************************************************************
  23. * Function Name  : main
  24. * Description    : Main program.
  25. * Input          : None
  26. * Return         : None
  27. *******************************************************************************/
  28. int main(void)
  29. {

  30.     USART_Printf_Init(115200);
  31.     Moto_Init();
  32.     Delay_Init();

  33.     printf("This is Stepper motor driver\r\n");

  34.     Motorcw_angle(360,5);   //步进电机正转角度函数
  35.     MotorStop();
  36.     Delay_Ms(1000);

  37.     Motorccw_angle(360,5);  //步进电机反转角度函数
  38.     MotorStop();
  39.     Delay_Ms(1000);

  40. }
main.c文件主要进行函数初始化以及进行电机控制运行。

4下载验证
将编译好的程序下载到开发版并复位,通过逻辑分析仪对这几个GPIO引脚进行波形采集,具体如下图。将开发板、步进电机驱动板、步进电机连接起来,可看到电机进行正反转。
图片1.png

  

87、步进电机的驱动.rar

470.85 KB, 下载次数: 189

豌豆爹 发表于 2021-5-6 15:55 | 显示全部楼层
很不错的,学习了解一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

44

粉丝
快速回复 在线客服 返回列表 返回顶部