草帽王子 发表于 2021-5-1 16:48:27

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

本帖最后由 草帽王子 于 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文件
#ifndef __GPIO_H
#define __GPIO_H

#include "ch32v10x_conf.h"

//ULN2003驱动

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

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

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

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

#endifgpio.h文件主要进行函数声明;
gpio.c文件
#include "gpio.h"
#include "debug.h"

//#define N 4
#define N 8

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

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

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

//电机初始化函数
void Moto_Init(void)
{
    //步进电机初始化
    // IN1: PB6   a
    // IN2: PB7   b
    // IN3: PB8   c
    // IN4: PB9   d
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

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

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

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

    for(i=0;i<N;i++)
    {
      GPIO_Write(GPIOB,phasecw);
      Delay_Ms(speed);
    }
}

//电机反转函数
void Motorccw(u8 speed)
{
    uint8_t i;
    for(i=0;i<N;i++)
    {
      GPIO_Write(GPIOB,phaseccw);
      Delay_Ms(speed);
    }
}

//电机停止函数
void MotorStop(void)
{
    //GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
    GPIO_Write(GPIOB,0x0000);
}

//电机正转角度
void Motorcw_angle(int angle,int speed)
{
    int i,j;
    j=(int)(angle/0.70312);
    for(i=0;i<j;i++)
    {
      Motorcw(speed);
    }
}

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

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

#include "debug.h"

#include "gpio.h"


/* Global typedef */

/* Global define */

/* Global Variable */


/*******************************************************************************
* Function Name: main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{

    USART_Printf_Init(115200);
    Moto_Init();
    Delay_Init();

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

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

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

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


4、下载验证

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

87、步进电机的驱动.rar

链接:https://pan.baidu.com/s/1ZU5ysRXfBBLeuLFM2DypAg
提取码:ru7f
复制这段内容后打开百度网盘手机App,操作更方便哦



孔明 发表于 2021-12-21 23:57:57

步进这种角位移执行机构挺有意思,单极性整步驱动力小,单极性半步驱动力大;双极性整步驱90动力大很多,双极性半步驱动45精度高,双极性细分驱动任意力量和精度更加。

孔明 发表于 2021-12-21 23:58:04

步进这种角位移执行机构挺有意思,单极性整步驱动力小,单极性半步驱动力大;双极性整步驱90动力大很多,双极性半步驱动45精度高,双极性细分驱动任意力量和精度更佳。
页: [1]
查看完整版本: 第八十八章:CH32V103应用教程——步进电机驱动