查看: 1263|回复: 2
收起左侧

第八十八章:CH32V103应用教程——步进电机驱动

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-5-1 16:48:27 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 18:24 编辑

    本章主要使用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引脚进行波形采集,具体如下图。将开发板、步进电机驱动板、步进电机连接起来,可看到电机进行正反转。

    CH32V CH573单片机芯片-第八十八章:CH32V103应用教程——步进电机驱动risc-v单片机中文社区(1)
    87、步进电机的驱动.rar
    CH32V CH573单片机芯片-第八十八章:CH32V103应用教程——步进电机驱动risc-v单片机中文社区(2) 87、步进电机的驱动.rar (470.85 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1ZU5ysRXfBBLeuLFM2DypAg
    提取码:ru7f
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第八十七章:CH32V103应用教程——硬件SPI驱动OLED
    下一篇:第八十九章:CH32V103应用教程——FLASH编程
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

      离线 

  • TA的每日心情
    奋斗
    2022-2-18 00:56
  • 签到天数: 16 天

    [LV.4]

    发表于 2021-12-21 23:57:57 | 显示全部楼层
    步进这种角位移执行机构挺有意思,单极性整步驱动力小,单极性半步驱动力大;双极性整步驱90动力大很多,双极性半步驱动45精度高,双极性细分驱动任意力量和精度更加。
    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    奋斗
    2022-2-18 00:56
  • 签到天数: 16 天

    [LV.4]

    发表于 2021-12-21 23:58:04 | 显示全部楼层
    步进这种角位移执行机构挺有意思,单极性整步驱动力小,单极性半步驱动力大;双极性整步驱90动力大很多,双极性半步驱动45精度高,双极性细分驱动任意力量和精度更佳。
    全球首家只专注于RISC-V单片机行业应用的中文网站
    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-18 21:23 , Processed in 0.811646 second(s), 54 queries .

    快速回复 返回顶部 返回列表