单片机:步进电机(内含硬件原理及解析,软件编程及注释)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 单片机:步进电机(内含硬件原理及解析,软件编程及注释)

6a12bf0695354f07b120527f2da32dd6.png

f40e7d5ef207415cb956501c011c1d53.png

03abe2801d3644d39e0ff89b35f1b63a.png

改变绕组方向,改变电机转动方向

7488ee27a7e54cfc9f3ff981b63d4ba9.png

图左,公共线处连接VCC,3和4,1和2为同一方向,电流单向

图右,1和2处都可以做VCC和GND,电流方向可更改,是双向

双极性步进电机工作原理:

(改变电流方向,从而改变磁场方向)

图左为单向激励,图右为双向激励:

e6b1960acc184b429acd8b020f4517ac.png

图左(步进角为90°):


1-2-3-4(注:1为高电平,0为低电平)


1图中A+为1,A-为0,B+,B-不工作


2图中B+为1,B-为0,A+,A-不工作,转子旋转90°


3图中A-为1,A+为0,B-,A+不工作,转子旋转90°


4图中B-为1,B+为0,A-,A+不工作,转子旋转90°


图左(步进角为45°):


1-2-3-4


1图中A+为1,B+为1,A-为0,B-为0


2图中A+为0,B+为1,A-为1,B-为0,转子旋转45°


3图中A+为0,B+为0,A-为1,B-为1,转子旋转45°


4图中A+为1,B+为0,A-为0,B-为1,转子旋转45°


单双向激励结合起来为

46052e850c1c4be3b568c06e9d194b0c.png



1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°


2图中A+为1,B+为1,A-为0,B-为0,转子旋转45°


3图中A+为0,B+为1,A-为0,B-为0,转子旋转45°


4图中A+为0,B+为1,A-为1,B-为0,转子旋转45°


5图中A+为0,B+为0,A-为1,B-为0,转子旋转45°


6图中A+为0,B+为0,A-为1,B-为1,转子旋转45°


7图中A+为0,B+为0,A-为0,B-为1,转子旋转45°


8图中A+为1,B+为0,A-为0,B-为1,转子旋转45°


PS:可将A+,B+等的电流大小进行优化,如A+=1,B+=2,偏转角度就不是45°


单极性步进电机工作原理:


(不能改变电流方向改变磁场方向,问问电流方向固定)


图左为单向激励,图右为双向激励:


c73ba43d2c1f437f8131b451b8fa7d5d.png


图左(步进角为90°):


1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°


2图中A+为0,B+为1,A-为0,B-为0,转子旋转90°


3图中A+为0,B+为0,A-为1,B-为0,转子旋转90°


4图中A+为0,B+为0,A-为0,B-为1,转子旋转90°


图右(步进角为45°):


1图中A+为1,B+为1,A-为0,B-为0,转子旋转45°


2图中A+为0,B+为1,A-为1,B-为0,转子旋转90°


3图中A+为0,B+为0,A-为1,B-为1,转子旋转90°


4图中A+为1,B+为0,A-为0,B-为1,转子旋转90°


单双向激励结合起来为:


762dd8933c7c4eb290060e54ff76b31b.png


1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°


2图中A+为1,B+为1,A-为0,B-为0,转子旋转45°


3图中A+为0,B+为1,A-为0,B-为0,转子旋转45°


4图中A+为0,B+为1,A-为1,B-为0,转子旋转45°


5图中A+为0,B+为0,A-为1,B-为0,转子旋转45°


6图中A+为0,B+为0,A-为1,B-为1,转子旋转45°


7图中A+为0,B+为0,A-为0,B-为1,转子旋转45°


8图中A+为1,B+为0,A-为0,B-为1,转子旋转45°


PS:转动角度越小,流畅度越高


7d87681cde9b4367b6c8bdbb1acf5d64.png


45670f8059a44c6590100ffe39d4fa66.png

第1步时,VCC为高电平,D为低电平,右图电流应在VCC-D(水平方向)

第2步时,VCC为高电平,D,C为低电平,右图电流应在VCC--C/D(可解读为逆时针旋转45°)

若让步进电机反向旋转,则从第8步-->第1步

注:VCC连接红色的线

f14aa410d1664f39b5d9dc9cd4aabcf6.png


图左:A2-A4 图右:A5-A7


99885c81ba194aa08234e3f11fd619bb.png


注:VCC连接红色的线


8177622a6f374ed19797c3ce55ead102.png

#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//定义ULN2003控制步进电机管脚
sbit IN1_A=P1^0;
sbit IN2_B=P1^1;
sbit IN3_C=P1^2;
sbit IN4_D=P1^3;
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
//使用宏定义独立按键按下的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
// 定义步进电机速度,值越小,速度越快
// 最小不能小于1
#define STEPMOTOR_MAXSPEED 1 //最大速度
#define STEPMOTOR_MINSPEED 5 //最小速度
void delay_time(u16 time_delay)
{
u16 i,j;
{
for(i=time_delay;i>0;i--)
for(j=110;j>0;j--)
;
}
}
//独立按键扫描---mode确定是单扫0还是连续扫描1
//按下返回对应键值
//KEY1_PRESS:K1按下
//KEY2_PRESS:K2按下
//KEY3_PRESS:K3按下
//KEY4_PRESS:K4按下
//KEY_UNPRESS:未有按键按下
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;//连续扫描按键
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
{
delay_time(1000);//消抖
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
{
key=1;
}
return KEY_UNPRESS;
}
//输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
//完成方向(dir)和步数(step)控制
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0) //如果为逆时针旋转
temp=7-step;//调换节拍信号.使反向,0-7变为7-0
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
}
}
void main()
{
u8 key=0;//接收按键返回值
u8 dir=0;//默认逆时针方向
u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转---定义宏,方便每次修改
u8 step=0;
while(1)
{
key=key_scan(0);
if(key==KEY1_PRESS)//判断KEY1按下,就换向
{
dir=!dir;
}
else if(key==KEY2_PRESS)//判断KEY2按下,状态1,加速
{
if(speed>STEPMOTOR_MAXSPEED)
speed-=1;
}
else if(key==KEY3_PRESS)//判断KEY2按下,状态1,减速
{
if(speed<STEPMOTOR_MINSPEED)
speed+=1;
}
step_motor_28BYJ48_send_pulse(step++,dir);//循环一次,step+1
if(step==8)step=0;//判断如果超过7,就重新从0开始循环
delay_time(speed);
}
}


相关文章
|
13天前
|
安全 程序员 API
|
10天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
9天前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
21天前
|
Java 开发者 UED
Java编程中的异常处理机制解析
在Java的世界里,异常处理是确保程序稳定性和可靠性的关键。本文将深入探讨Java的异常处理机制,包括异常的类型、如何捕获和处理异常以及自定义异常的创建和使用。通过理解这些概念,开发者可以编写更加健壮和易于维护的代码。
|
29天前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
120 1
|
1月前
|
网络协议 数据格式
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
|
1月前
|
IDE 开发工具
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
|
17天前
|
设计模式 SQL 安全
Java编程中的单例模式深入解析
【10月更文挑战第24天】在软件工程中,单例模式是设计模式的一种,它确保一个类只有一个实例,并提供一个全局访问点。本文将探讨如何在Java中使用单例模式,并分析其优缺点以及适用场景。
10 0
|
29天前
|
设计模式 SQL 安全
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
本文深入解析了Java单例模式中的饿汉式和懒汉式实现方法,包括它们的特点、实现代码和适用场景。通过静态常量、枚举类、静态代码块等方式实现饿汉式,通过非线程安全、同步方法、同步代码块、双重检查锁定和静态内部类等方式实现懒汉式。文章还对比了各种实现方式的优缺点,帮助读者在实际项目中做出更好的设计决策。
35 0
|
6月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
56 1

推荐镜像

更多