步进电机驱动A4988,步进电机驱动程序编写

步进电机驱动A4988,步进电机驱动程序编写     今天早上6点10分起床,吃完早饭就来到了实验室。经查询,A4988资料如下:  DIR:控制正反转,=1:正转,=0:反转;STEP:接PWM,每个脉冲转对应一个角度;sleep,reset:通常短接;    (RESET这个端口的配置,必须至高电平,否则脉冲被忽视,至于需不需要供地,这个没看板子的线路图,不过不需要自己去共地。所 以你们电机不动的原因不在于共…

大家好,又见面了,我是你们的朋友全栈君。

 

    今天早上6点10分起床,吃完早饭就来到了实验室。经查询,A4988资料如下:

 

 DIR:控制正反转,=1:正转,=0:反转;

STEP:接PWM,每个脉冲转对应一个角度;

sleep,reset:通常短接;

    (RESET这个端口的配置,必须至高电平,否则脉冲被忽视,至于需不需要供地,这个没看板子的线路图,不过不需要自己去共地。所   以你们电机不动的原因不在于共地上,而在于RESET这个没有接入高电平上,可以直接接3.3V-5V ,也可以接Pin口上)

MS1,MS2,MS3:MS1和MS3引脚具有100kΩ的下拉电阻,MS2引脚具有50kΩ的下拉电阻。

    当改变细分时,直到下一个STEP    上升沿改变才会生效。如果在驱动器没有复位的情况下更改了步进模式,并且必须保持绝对位置时,则必须在两个步进模式共有的步进位置更改步进模式,以避免丢失步数。 当器件掉电或由于TSD或过流事件而复位时,驱动器将被设置为默认(所有步进模式共用的起始位置)

    000:全步 2相 ;100:半步 1-2 phase; 010:四分步 W1-2 phase;

    110:八分步 2W1-2 Phase;111:16分步 4W1-2 Phase

    (8W1-2 phase=1/32步 16W1-2phase=1/64步, 32W1-2 phase=1/128步)

VDD:接3.3V或者5V;

VMOT:电机直流供电:8~35V;

1B 1A 2A 2B:接步进电机 ,通常四相电机红绿为一组,蓝黄为一组,即1A,1B接步进电机的一组线圈,2A,2B接步进电机的一组线圈

A4988步进电机驱动板常见问题总结(侵删)

:http://blog.sina.com.cn/s/blog_49b559340102wus3.html

http://bbs.51testing.com/thread-1173365-1-1.html

二、步进电机(42步进电机两相一般为50齿,步距角1.8,相电流1.3-1.7A)

    启动频率不能太高,要求速度较大时不建议使用步进电机;

步距角越小,电机运动越平滑;

混合式步进电机步距角的计算公式

=180°/PNr

P:步进电机相数      Nr:步进电机转子N级或者S级的齿数

步进电机转速=脉冲频率*60/[(360/T)*X]

X:步进电机驱动器的细分数(电机运行时的真正步距角是固有步距角的几分之一)

T:步进电机固有步距角(每输入一个脉冲信号转子转过的角度)

 

 

细分控制:两相步进电机的基本步距角是1.8°,即一个脉冲走1.8°,如果没有细分,则是200个脉冲走一圈360°,细分是通过驱动器靠精确控制电机的相电流所产生的,与电机无关,如果是16细分,则发一个脉冲电机走0.1125°,即3200个脉冲走一圈360°。

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到-一个脉冲信号,
它就驱动步进电机按设定的方向转动一一个固定的角度,称为“步距角”,
它的旋转是以固定的角度一步- – 步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,  从而达到调速的目的

三、步进电机与直流电机控制小车的差异

 

  1. 定时器配置

    直流电机平衡小车:PWM模式

  步进电机:输出比较模式(输出4路不同频率的PWM波)

 

2、直立控制

 

直流:PD控制

步进:P控制

3、速度反馈与控制

   直流:编码器反馈

 

 

步进:上一个控制周期计算的频率值代替编码器反馈

 

 

/                                                                        2018 7/9 更新                                                                                              /

 

 

 

四,步进电机驱动程序

    

驱动程序原理都差不多,但可能太菜了,都运行不了,在网上看到了一篇A988驱动步进电机的程序:

 

 

https://blog.csdn.net/ff_tt/article/details/79904658

但是这个没有用到PWM ,而且电机初始化用的是寄存器不是库函数,,真心看不懂,但博主的这个程序可以运行

//参数
//  dir:FALSE 正转TRUE反转
//  period 周期
//  step   脉冲
void Step_Control(u8 dir,u16 period,u32 steps)
{
    u32 i;
  for(i=0; i <= steps;i++)
  {
    DIR = dir;
    STEP = 1;
    delay_us(1);
    STEP = 0;
    delay_us(period);//period??D?£?×a?ù???ì£?2?òaD?óú1000
  }
}
int main(void)
{
    int i=0;
  delay_init();
	LED_Init();
  MOTOR_Init();
	Step_Micr(1);//1/2/4/8/16 
while(1)
{	
for(i=0;i<10;i++)
 {
	Step_Control(TRUE,1600,100);//正转
    delay_ms(1000);

	Step_Control(FALSE,1600,100);//反转
    delay_ms(1000);
 }
    Step_Enable();//抱死
}
}

但不知道为什么要把周期设置为1600,当改变成其他数值的时候,电机运转就会出现异常

void MOTOR_Init(void)
{
  RCC->APB2ENR|=1<<3;
  GPIOB->CRH&=0xff000000;
  GPIOB->CRH|=0x00333333;
}

这个不知道怎么改成库函数版本。。

                            2019年1月24日更新(经测试可用)

关于上面的寄存器版本改为库函数版本其实挺简单的,看一下STM32中文参考手册相关寄存器的配置就知道了。。。

如RCC那个就是把第三位置1,它的第三位对应的就是IO端口B

GPIOX_CRH是端口高配置寄存器,&是按位与,|是按位或,和0Xff000000与,就是把0-27位清零,3的16进制是0011,即MODE=11,输出模式,最大50HZ,通用推挽输出模式

main.c:

#include "delay.h"
#include "sys.h"
#include "motor.h" 
//***************T:1400速度最快,噪声较大
//               T: 1600较1400慢,噪声也很大
//               T: 3200速度适中,噪声较小
//               速度越大,扭矩越小,
//动作所需时间:t=steps*period  steps=角度 *细分(x)/1.8
//A4988针对42步以下步进电机,电压12V即可,A4988驱动器处于大电压下的工作时间不宜太长
#define FALSE 0  // 电机正转
#define TRUE  1  // 电机反转
int main(void)
{
    delay_init();
    MOTOR_Init();
	  Step_Micr(16);//1/2/4/8/16 细分选择
   while(1)
   {
	   Step_Control(FALSE,3200,3200);//正转
     delay_ms(1000);
//	   Step_Control(TRUE,3200,1600);//反转
//     delay_ms(1000);
		 Step_Enable();//抱死
   }
}

moto.c

#include "motor.h"
#include "delay.h"

//IO初始化
void MOTOR_Init(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	

    //PB10控制电机方向
   GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13);
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
   GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB
	
	 GPIO_SetBits(GPIOB,GPIO_Pin_9);		 //PB.10 输出高(正转)
	 GPIO_SetBits(GPIOB,GPIO_Pin_13);		 //PB.11 输出高 (不使能)
	 GPIO_ResetBits(GPIOB,GPIO_Pin_10);	 //MS3
	 GPIO_ResetBits(GPIOB,GPIO_Pin_11);  //MS2
	 GPIO_ResetBits(GPIOB,GPIO_Pin_12);  //MS1  整步
	 //printf("\r\n电机初始化成功!\r\n");
}

//细分
//  x==1 全步
//  x==2 半步 
//  x==4 1/4步
//  x==8 1/8步
//  x==16 1/16步
void Step_Micr(u16 x)
{
    switch(x)
    {
        case 1: Full_step;     break;
        case 2: Half_step;     break;
        case 4: Quarter_step;  break;
        case 8: Eighth_step;   break;
        case 16:Sixteenth_step;break;
        default:               break;
    }   
}
//参数
//  dir:FALSE正转    TRUE反转
//  period 周期
//  step   脉冲
void Step_Control(u8 dir,u16 period,u32 steps)
{
    u32 i;
  for(i=0;i<=steps;i++)
  {
    DIR = dir;
    STEP = 1;
    delay_us(1);
    STEP = 0;
    delay_us(period);
  }
}
//此函数可抱死
//  0 抱死
//  1 正常
void Step_Enable()
{
    ENA=0;
}

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148963.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 字节跳动 java面经_字节跳动Java面经(已offer)[通俗易懂]

    5.15一面(3点开始,80分钟)1.自我介绍,聊了聊学校近况2.Java集合框架,看了哪些源码,arraylist、linkedlist原理,让你实现一个hashmap机会如何设计(没让手写????)3.线程池的执行过程、核心参数以及常用的几个线程池(感觉每次面试都会问????)4.JVM的相关知识,OOM如何定位,说几个虚拟机指令以及虚拟机栈可能会发生什么错误,四种引用类型5.Java并发,…

  • 真正解决Jenkins安装插件总是报错的问题(二)

    真正解决Jenkins安装插件总是报错的问题(二)

  • Makefile missing separator. Stop.怎么解决「建议收藏」

    Makefile missing separator. Stop.怎么解决「建议收藏」现象:在makefile中写入:all:cleancompclean:./clean.cshcomp:./run_tc命令行的背景显示为红色。运行ma

  • win7显示器亮度怎么调_虚拟机外接显示器

    win7显示器亮度怎么调_虚拟机外接显示器很久没有继续研究wddmhook了,最后一次研究还在3年前,不得不说虽然应用的少,但是wddmhook却是很有技术含量的一项技术,而且实用性很高,我们除了做虚拟显示器还能做很多的东西,比如高效的截屏(因为直接从驱动层面截屏,所以效率和实现效果秒杀mirrordriver和DXGI)、视频重定向(视频硬件加速的时候可以直接获取原始码流)、修改原始的显示器厂商信息、修改显示器支持分辨率,等等骚操作wddmhook都可以实现。去年,深圳某硬件公司找到我,他们正在做usb转HDMI或者USB转VGA的硬件

  • mac ll命令_linux终端命令

    mac ll命令_linux终端命令首先,cd到home下:cd~再编辑.bash_profile文件vim.bash_profile添加如下内容aliasll=’ls-l’#aliasl=’ls-alhF’#aliasla=’ls-AFh’#aliasll=’ls-lhAF’执行source.bash_profile命令,使内容生效source.bash_profi…

  • 几种常用的矩阵范数表示_向量范数怎么求

    几种常用的矩阵范数表示_向量范数怎么求按道理讲,这些东西应该熟记于心的。但是自己真心不喜欢记这种东西,看到一个总结不错的博客,转载过来以便于自己查看把!原文1.几种范数矩阵X∈Rm×nX∈Rm×n,σi(X)σi(X)表示XX的第ii大奇异值(即XX′XX′的第ii大特征值的均方根){citerecht2010guaranteed}。rr表示矩阵XX的秩(R

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号