凌乱的DSP笔记(6)-直流电机&步进电机

时间:2024-03-13 20:03:38

1. 直流电机介绍

直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。

2. 硬件设计

imageimage

image

TC1508S:

image

image

Hi-Z(高阻态):数字电路常见术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,相当于没接。

3. 软件设计

3.1 dc_motor

/*
 * dc_motor.c
 *
 *  Created on: 2020-4-8
 *      Author: Administrator
 */


#include "dc_motor.h"


void DC_Motor_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
    //DC_MOTOR 第1路端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
    GpioCtrlRegs.GPADIR.bit.GPIO2=1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
    GpioCtrlRegs.GPADIR.bit.GPIO3=1;

    //DC_MOTOR 第2路端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
    GpioCtrlRegs.GPADIR.bit.GPIO4=1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
    GpioCtrlRegs.GPADIR.bit.GPIO5=1;

    EDIS;

    GpioDataRegs.GPACLEAR.bit.GPIO2=1;
    GpioDataRegs.GPACLEAR.bit.GPIO3=1;
    GpioDataRegs.GPACLEAR.bit.GPIO4=1;
    GpioDataRegs.GPACLEAR.bit.GPIO5=1;
}
/*
 * dc_motor.h
 *
 *  Created on: 2020-4-8
 *      Author: Administrator
 */

#ifndef DC_MOTOR_H_
#define DC_MOTOR_H_


#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


#define DC_MOTOR_INA_SETH            (GpioDataRegs.GPASET.bit.GPIO2=1)
#define DC_MOTOR_INA_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO2=1)
#define DC_MOTOR_INB_SETH            (GpioDataRegs.GPASET.bit.GPIO3=1)
#define DC_MOTOR_INB_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO3=1)

#define DC_MOTOR_INC_SETH            (GpioDataRegs.GPASET.bit.GPIO4=1)
#define DC_MOTOR_INC_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO4=1)
#define DC_MOTOR_IND_SETH            (GpioDataRegs.GPASET.bit.GPIO5=1)
#define DC_MOTOR_IND_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO5=1)

void DC_Motor_Init(void);

#endif /* DC_MOTOR_H_ */

3.2 main.c

/*
 * main.c
 *
 *  Created on: 2020年4月8日
 *      Author: lenovo
 */

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "leds.h"
#include "key.h"
#include "dc_motor.h"

/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
    int i=0;
    char key=0;

    InitSysCtrl();

    LED_Init();
    KEY_Init();
    DC_Motor_Init();

    while(1)
    {
        key=KEY_Scan(0);
        switch(key)
        {
            case KEY1_PRESS: DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;break;
            case KEY2_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETH;break;
            case KEY3_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETL;break;
        }

        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}

如果驱动电流不足,可使用50%占空比方波驱动:

void main()
{
    int i=0;
    char key=0;
    char flag=0;
    InitSysCtrl();

    LED_Init();
    KEY_Init();
    DC_Motor_Init();

    while(1)
    {
        key=KEY_Scan(0);
        switch(key)
        {
            case KEY1_PRESS: flag=1;break;
            case KEY2_PRESS: flag=2;break;
            case KEY3_PRESS: flag=0;break;
        }
        if(flag==1)
        {
            DC_MOTOR_INB_SETL;
            if(i%2==0)
                DC_MOTOR_INA_SETH;
            else
                DC_MOTOR_INA_SETL;
        }
        else if(flag==2)
        {
            DC_MOTOR_INA_SETL;
            if(i%2==0)
                DC_MOTOR_INB_SETH;
            else
                DC_MOTOR_INB_SETL;
        }
        else if(flag==0)
        {
            DC_MOTOR_INA_SETL;
            DC_MOTOR_INB_SETL;
        }

        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}

4. 效果

因为启动时电流不足,还需要手动拨一下Crying face

 

5. 步进电机介绍

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。

步进电机主要分为以下几类:

  1. 永磁式(PM)
  2. 反应式(VR)
  3. 混合式(HB)

步进电机主要技术指标如下:

  1. 相数
  2. 步距角
  3. 拍数
  4. 保持转矩

工作原理:

步进电机有三线式、四线式、五线式和六线式,但其控制方式均相同,都要以脉冲信号电流来驱动。假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8°。其旋转角度与脉冲的个数成正比。步进电动机的正、反转由励磁脉冲产生的顺序来控制。

步进电机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。

  • 一相励磁:在每一瞬间,步进电机只有一个线圈导通.每送一个励磁信号,步进电机旋转 1.8°,这是三种励磁方式中最简单的一种。其特点是:精确度好、消耗电力小,但输出转矩最小,振动较大。

image

  • 二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号,步进电机旋转 1.8°。其特点是:输出转矩大,振动小,因而成为目前使用最多的励磁方式。

image

  • 一二相励磁:为一相励磁与二相励磁交替导通的方式。每送一个励磁信号,步进电机旋转 0.9°。其特点是:分辨率高,运转平滑,故应用也很广泛。

image

6. 软件设计

按键1:正转两周;按键2:反转两周;按键3:正转一下;按键4:反转一下。

/*
 * main.c
 *
 *  Created on: 2020年4月8日
 *      Author: lenovo
 */

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "leds.h"
#include "key.h"
#include "step_motor.h"

//4(GPIO3),6(GPIO5),3(GPIO2),5(GPIO4)
unsigned char Step_table_ZTurn[]={0xfff7,0xffdf,0xfffb,0xffef};//正转
unsigned char Step_table_FTurn[]={0xffef,0xfffb,0xffdf,0xfff7};//反转

/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
    int i=0;
    char key=0;
    short cnt=0;
    char j=0;

    InitSysCtrl();

    LED_Init();
    KEY_Init();
    Step_Motor_Init();

    while(1)
    {
        key=KEY_Scan(0);

        if(key==KEY1_PRESS)
        {
            cnt=10;
            while(cnt--)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
                    DELAY_US(5000);
                }
            }
        }
        else if(key==KEY2_PRESS)
        {
            cnt=10;
            while(cnt--)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
                    DELAY_US(5000);
                }
            }
        }
        else if(key==KEY3_PRESS)
        {
            for(j=0;j<4;j++)
            {
                GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
                DELAY_US(5000);
            }
        }
        else if(key==KEY4_PRESS)
        {
            for(j=0;j<4;j++)
            {
                GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
                DELAY_US(5000);
            }
        }
        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}

7. 效果

为了观察明显,在转轴上绑了两条线绳……