28BYJ-48步进电机驱动程序
28BYJ-48步进电机驱动程序
这两天开始学调 28BYJ-48步进电机,但是淘宝卖家给的资料和网上搜到的都是51的程序,用的驱动板都是ULN2003。
以下是我自己写的STM32的程序。我用的板子是F103ZET6,驱动板是L298N。
电机驱动原理简述:电机内有四组线圈,每给一个电机供电,转子就会转动一个角度,按顺序轮流循环转动给四个线圈供电,就能让转子一直转起来。跟详细的说明网上有很多,这里就不重复了。
接线:红线接5V电源,其余四根按顺序接驱动板上,其余四根的颜色是橙黄蓝粉,不同厂家做的顺序可能不一样,但都是按顺序排的,比如我的顺序就是橙黄蓝粉,或者说粉蓝黄橙也对,反正就是按这个颜色的先后顺序接就对了。
时序说明:电机内部四个线圈的一端都接到5V上,所以我们需要先给线圈的另一端供5V的电,然后按一定的顺序拉低电压,使线圈通电,电机就能动了。我们是通过驱动板控制的,也就是说,IO口默认输出高电平,然后按时序给低电平。
↓↓↓四相八拍时序图↓↓↓
↓↓↓四相单四拍时序图↓↓↓
↓↓↓四相双四拍时序图↓↓↓↓
以下是源码:
首先是IO口的初始化,这里我设PD1为1号,PD4为2号,PD6为3号,PG9为4号。
#include "motor.h"
#include "sys.h"
#include "delay.h"
void my_motor_init(void)
{GPIO_InitTypeDef GPIO_Init_config_d1;GPIO_InitTypeDef GPIO_Init_config_d4; GPIO_InitTypeDef GPIO_Init_config_d6; GPIO_InitTypeDef GPIO_Init_config_g9; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG,ENABLE);GPIO_Init_config_d1.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init_config_d1.GPIO_Pin=GPIO_Pin_1;GPIO_Init_config_d1.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_Init_config_d1);GPIO_Init_config_d4.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init_config_d4.GPIO_Pin=GPIO_Pin_4;GPIO_Init_config_d4.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init_config_d6.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init_config_d6.GPIO_Pin=GPIO_Pin_6;GPIO_Init_config_d6.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_Init_config_d6);GPIO_Init_config_g9.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init_config_g9.GPIO_Pin=GPIO_Pin_9;GPIO_Init_config_g9.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOG,&GPIO_Init_config_g9); PD1=1;PD4=1;PD6=1;PG9=1;
}
然后是头文件
这里用了正点原子的 sys.h头文件进行了一些宏定义
里面声明了四个函数,第一个是上面的初始化,后面三个是三种不同的驱动写法
#include "sys.h"#define PD1 PDout(1)
#define PD4 PDout(4)
#define PD6 PDout(6)
#define PG9 PGout(9)#define IN1 PDout(1)
#define IN2 PDout(4)
#define IN3 PDout(6)
#define IN4 PGout(9)#ifndef my_motor_H
#define my_motor_Hvoid my_motor_init(void);
void my_motor_working_0(int time_us);//low B写法
void my_motor_working_1(u16 arr[],int M_us);
void my_motor_working_2(u16 arr[],int M_us);#endif
第一种
这是最直观的控制方法,直接一步一种情况的控制,每一步中间要有一个延迟,控制我们输出的低电平宽度,这里我用微秒us控制。据电机说明书,脉冲频率不能太高,我这里试了下,似乎至少要大于一点多个毫米ms,就是1000多微妙us,因此我在主函数里设脉冲频率为1100us。这段是四相八拍的程序,这样写的话不够灵活,换成其他方式就很麻烦。
void my_motor_working_0(int time_us)//low B写法
{delay_init();PD1=0;PD4=1;PD6=1;PG9=1;delay_us(time_us);//1PD1=0;PD4=0;PD6=1;PG9=1;delay_us(time_us);//2PD1=1;PD4=0;PD6=1;PG9=1;delay_us(time_us);//3PD1=1;PD4=0;PD6=0;PG9=1;delay_us(time_us);//4PD1=1;PD4=1;PD6=0;PG9=1;delay_us(time_us);//5PD1=1;PD4=1;PD6=0;PG9=0;delay_us(time_us);//6PD1=1;PD4=1;PD6=1;PG9=0;delay_us(time_us);//7PD1=0;PD4=1;PD6=1;PG9=0;delay_us(time_us);//8
}
第二种
将每一步的io口状态都变成一个二进制数某一位,如上面的第一步,按PD1,PD4,PD6,PG9的顺序,就可以得到一个二进制数0111,第二步就是0011,不知道是不是MD5的原因还是什么原因,程序无法识别二进制前缀0b,所以我这里写成16进制,并按顺序写到一个数组中,那么我们就可以得到一个这样的数组(我在主函数里定义)
time_48_0[]={0x7,0x3,0xb,0x9,0xd,0xc,0xe,0x6};
在这段函数里,for进行0~7的循环,四个if分别判断数组元素的一二三四位,符合条件就进行相应的操作。要注意的是,符合条件和不符合条件的操作都要有,保持四根信号线默认是高电平的状态,或者说for每次运算完,四个io口的结果都是要符合上面我给出的时序表。拿这段程序举例,如果我不写else,io口就是上一步的状态,显然这样是有问题的。
void my_motor_working_1(u16 arr[],int M_us)
{ u8 i;u16 c=0;for(i=0;i<8;i++){if(arr[i]&0x8) IN1=1; else IN1=0;if(arr[i]&0x4) IN2=1; else IN2=0;if(arr[i]&0x2) IN3=1; else IN3=0;if(arr[i]&0x1) IN4=1; else IN4=0;delay_us(M_us);}
}
第三种
用数组里的数进行位运算。要注意的是,通过宏定义对io状态进行控制的数值,似乎只能是0和1,如5、7、8之类的数输入,虽然也有电,电机也会转,但转起来很奇怪,这里我统一只用0和1控制。
这段函数拿IN2距离,与0x4(即0100)进行与运算,这样就得到了第二位的结果(位3,位2,位1,位0),不管是0还是1,都右移最低位(位0),这样得出的结果就是前面三位都是0 ,只有最低位的数是有效数据,然后赋给宏定义符。
void my_motor_working_2(u16 arr[],int M_us)
{ u8 i;u16 c=0;for(i=0;i<8;i++){IN1=(c=(arr[i]&0x8)>>3);IN2=(c=(arr[i]&0x4)>>2);IN3=(c=(arr[i]&0x2)>>1);IN4=(c=(arr[i]&0x1)>>0);delay_us(M_us);}
}
然后就没了。最后再贴出我主函数。
#include "sys.h"
#include "motor.h"
#include "delay.h"
int main(void)
{u16 time_48_0[]={0x7,0x3,0xb,0x9,0xd,0xc,0xe,0x6}; //四相八拍 顺转u16 time_48_1[]={0x6,0xe,0xc,0xd,0x9,0xb,0x3,0x7}; //四相八拍 逆转u16 time_414_0[]={0x7,0xb,0xd,0xe}; //四相单四拍 顺转u16 time_414_1[]={0xe,0xd,0xb,0x7}; //四相单四拍 逆转u16 time_424_0[]={0x6,0x3,0x9,0xc}; //四相双拍 顺转u16 time_424_1[]={0xc,0x9,0x3,0x6}; //四相双拍 逆转int us=0;my_motor_init();delay_init();us=1200;while(1){my_motor_working_1(time_424_0,us);
// my_motor_working_2(time_48_0,us);
// my_motor_working_0(1200); }
}
这里的顺转和逆转,跟线序有关,等你开始调的时候你就懂了。
28BYJ-48步进电机驱动程序相关推荐
- STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序
STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...
- uln2003步进电机驱动程序
ULN2003是一种常见的步进电机驱动芯片,可用于驱动4相.5线和6线步进电机.其驱动方式是通过输入高低电平来控制电机旋转的步进角度. 以下是一般的ULN2003步进电机驱动程序框架: 定义引脚:定义 ...
- c语言步进电机驱动程序不正常怎么办,步进电机【C语言驱动程序】
步进电机C语言驱动程序 /*C语言代码:*/ #include #include #define uchar unsigned char #define uint unsigned int uchar ...
- 51单片机 驱动步进电机 C语言 lcd,基于51单片机的步进电机驱动程序
一.步进电机分类 1.按构造分类 ①反应式: 由定子和转子构成,定子上有绕组,转子由软磁材料制成. ②永磁式: 转子由永磁体制成,转子极数与定子极数相等. ③混合式 定子有多相绕组,转子由永磁体构成, ...
- linux步进电机驱动程序,基于Linux的步进电机驱动程序设 - 嵌入式操作系统 - 电子发烧友网...
定义时钟节拍函数time_tick() static void time_tick(unsigned long data) { static int i=0; switch(status) { cas ...
- 步进电机驱动程序,5线
1 设置, 8051 & ULN2003 2. 正反转控制 uchar phasecw[4] ={0x08,0x04,0x02,0x01};正转,电机导通顺序 D-C-B-A uchar ph ...
- 51单片机入门——步进电机
文章目录 1 电机的分类 2 28BYJ-48型步进电机原理 3 让电机动起来 4 转动精度与深入分析 5 编写实用程序的基础 1 电机的分类 电机的分类方式有很多,从用途角度可划分为驱动类电机和控制 ...
- 基于android小区智能管理,基于Android的智能小区停车场设计
原标题:基于Android的智能小区停车场设计 停车场作为智能小区管理的组成部分,业主对其管理的要求也不断提高,都希望管理能够达到方便快捷以及安全的效果.智能停车场是利用高度自动化的机电设备对停车场进 ...
- 用单片机控制步进电机
2006-05-07 17:11:19 学单片机 | 站长的书 | 学C语言 | 教学资料 | 销售中心 | 产品资料 | McuBBS | 下载中心 | 版主原创 | 关于我们 学 单 片 机 从 ...
最新文章
- 澳大利亚悉尼大学徐畅教授招收深度学习方向全奖博士生
- shell 脚本中如何实现自加操作
- springmvc【问题1】跨域
- Jenkins之gitlab配置
- C语言编程题显示日历,C语言日历问题
- Let’s Build the Tiniest Blockchain In Less Than 50 Lines of Python (Part I)
- MVC设计模式学习总结
- 分布式监控系统开发【day38】:监控trigger表结构设计(一)
- Securable 测不准
- c语言10的10万次方,在c语言编程中 10的n次方应该怎么表达
- Maven配置MAVEN_OPTS
- 【CSP】201903-1 小中大
- 混合策略改进鲸鱼优化算法-附代码
- i7-1160G7 怎么样 相当于什么水平
- 当前数据中心运维管理工作中存在的问题
- 四、点对点的传输层【网络全景图分析系列】
- 第四届“图灵杯”NEUQ-ACM程序设计人赛真题重现
- qt show widget_Qt Widget不显示
- 数据库学习(十)— 查询演练
- STC 51单片机46——看门狗测试
热门文章
- 计算FDTD光纤耦合效率!煞费苦心熬了几个通宵!!!
- 网上花店网页代码 html静态花店网页设计制作 dw静态鲜花网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
- J2EE基础之集合框架set
- HTML+CSS+JS商城网站设计——服装商城-功能齐全(40页) HTML+CSS 学生HTML个人网页作业作品下载 个人商城网页设计制作 大学生个人网站作业模板 简单个人网页制作
- 前端开发:JS相关的核心知识点
- halcon系列:高斯混合模型之create_class_gmm 算子
- Tarjan算法学习
- Python爬虫汽车之家全车型!你又钟意的车子吗!
- 平板电脑有没计算机功能,有没有拥有智能手机功能的平板电脑?
- linux的库文件路径,Linux下的库文件搜索路径