IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机:步进电机的使用 -> 正文阅读

[嵌入式]单片机:步进电机的使用

一、设计目的

分析步进电机的驱动原理,将单片机应用于步进电机的控制接口设计;利用中断定时方法,实现步进电机的位置控制、方向控制和速度控制。利用ZLG7290键盘/显示电路,设置给定信号,并显示实际信息。

二、设计内容和步骤

本实验要对步进电机进行控制。步进电机的内部结构图如图5.9所示,步进电机及其驱动电路如图5.10所示,J42为步进电机连接接口(出场时已经连好),J41为控制信号输入端,JP6为电源控制(使用前先短接,做完实验再断开)。驱动电路中所需的ULN2003A原理图如图5.11所示。

图5.9 ?步进电机内部结构图

图5.10 步进电机及其驱动电路

?

图5.11??ULN2003A原理图

(原理图来源于教学pdf资源,侵权删)

步骤:

1、步进电机的驱动控制方式有:

  1. 双四拍:AB→BC→CD→DA→AB
  2. 单四拍:A→B→C→D→A
  3. 单双八拍:A→AB→B→BC→C→CD→D→DA→A

本设计采用双四拍控制方式

2、设计单片机控制步进电机的接口电路。

实现步进电机的正转、反转;并且转动速度能改变。

3、设计拨位开关‘启动/停止’,‘正转/反转’和独立式按键‘加速’、‘减速’,与单片机的接口电路,实现步进电机的控制,包括启、停控制,方向控制和速度控制;【:运动方向改变时,应先降低速度,停止后,再反向。】

4、设计单片机与ZLG7290的接口,测试7290的显示和按键功能。

5、编制步进电机(角度)位置控制函数,实现步进电机任意位置的控制。

(如正转90度、反转360度,角度为参变量);并用数码管显示当前角度。

6、用按键输入需要转动的角度,实现步进电机的位置控制,并能将当前转过的角度显示在数码管上。

需要定义按键0~9、R(右转)、L(左转)、ENTER(回车)。用以设定角度。

#include  "reg52.h"
#include  "VIIC_C51.H"
#include  "zlg7290.h"
sbit power=P1^0;    //启动
sbit change=P1^1;   //改变方向
sbit acc=P1^2;      //加速
sbit dec=P1^3;      //减速
sbit BA=P1^4;       //步进电机四接口
sbit BB=P1^5;
sbit BC=P1^6;
sbit BD=P1^7;
//SDAP23,SCLP22
sbit RST=P2^1;
sbit KEY_INT=P2^0;

sbit yi=P0^0;       //各数值对应按键,0~9
sbit er=P0^1;
sbit san=P0^2;
sbit si=P0^3;
sbit wu=P0^4;
sbit liu=P0^5;
sbit qi=P0^6;
sbit ba=P0^7;
sbit jiu=P2^4;
sbit ling=P2^5;
sbit enter=P2^6; 
//控制左右方向的按键用改变方向的按键替代,正向和反向
int a=0,count=0,rad;//a用来修正定时器数值,增速减速,count用来记录转动次数
unsigned long int y;//y用来存储数据
unsigned char bcd[]={0,0,0},abc[]={0,0,0},yy[]={0,0,0};//分别用来存放enter键输送的确定设定角度,待修改的设定角度(可以随时动态更替),实际转动角度
void delay()//延时函数,用于延时令步进电机转动信号
{
  int i;
  for(i=0;i<2000;i++);
}
void AB()
{
  BA=1;BB=1;BC=0;BD=0;
  delay();
}
void BC_()
{
  BA=0;BB=1;BC=1;BD=0;
  delay();
}
void CD()
{
  BA=0;BB=0;BC=1;BD=1;
  delay();
}
void DA()
{
  BA=1;BB=0;BC=0;BD=1;
  delay();
}
void forward()//正向转动,向前转
{
  AB();
  BC_();
  CD();
  DA();
}
void reverse()//反向转动,向后转
{
  DA();
  CD();
  BC_();
  AB();
}
void stop()//暂停
{
  BA=0;BB=0;BC=0;BD=0;
  delay();
}
void direction()//控制方向函数,控制前转或后转
{
  if(change==1)
  {
    stop();
    forward();
  }
  else
  {
    stop();
	reverse();
  }
}
void velocity()//控制速度函数,如果按下加速acc,a将增大,TH0定时时间减少,频率加快,转动速度加快,dec同理减小a数值达到减速效果
{
  TH0=(23869+a)/256;
  TL0=(23869+a)%256;
   if(acc==0)
  {
    delay();
	if(acc==0)
	{
	  a++;
	}
  }
  else if(dec==0)
  {
	delay();
	if(dec==0)
	{
	  a--;
	}
  }
}
void conv()     //此函数较为冗杂,因为我真的想不明白了
{
	unsigned char i,j=0;//定义无符号整型变量
if(ling==0)//0按键,若按下零按键向数组中存入数值
{
  abc[j]=0;
  j++;
  if(j=3)//如果j大于数组容量,从0重新装入,达到动态改变效果,下述各if语句同理
  {
    j=0;
  }
}
if(yi==0)
{
  abc[j]=1;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(er==0)
{
  abc[j]=2;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(san==0)
{
  abc[j]=3;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(si==0)
{
  abc[j]=4;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(wu==0)
{
  abc[j]=5;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(liu==0)
{
  abc[j]=6;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(qi==0)
{
  abc[j]=7;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(ba==0)
{
  abc[j]=8;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(jiu==0)
{
  abc[j]=9;
  j++;
  if(j=3)
  {
    j=0;
  }
}
if(enter==0)//若按键enter按下,将设定数值送给bcd作为最终的设定数值
{
for(i=0;i<3;i++)
{
  bcd[i]=abc[i];
}
}
y=100*bcd[2]+10*bcd[1]+bcd[0];//转化为十进制求出y数值
y=y/18;//整除18再乘以18得到18的倍数,用于显示实际转动角度
rad=y;//rad为脉冲次数
y=y*18;
yy[0]=y%10;//用yy数组存储实际转动角度
yy[1]=(y/10)%10;
yy[2]=(y/100)%10;
}
void Time() interrupt 1
{
  if(power==1)//如果未启动,关掉定时器
  {
    TR0=0;
  }
  direction();//控制方向函数,每次中断都重新设定
  velocity();//控制速度函数
  count++;//记录已经得到的脉冲次数
  if(count==rad)//达到设定角度,关闭定时器,停止转动
  {
    EA=0;
  }
}
void main()
{
  unsigned char i;
  TMOD=0x10;
  TH0=23869/256;
  TL0=23869%256; 
  EA=1; 				  	   
  ET0=1;
  RST=0;
  delayMS(1);
  RST=1;
  delayMS(10);
  while(1)
  {
       if(power==0)
       {
          TR0=1;
       }
       conv();
       for(i=0;i<3;i++)
        {
			ZLG7290_SendCmd(0x60+i,bcd[i]);//显示设定数值于右侧led	
         	delayMS(1);
        }
		for(i=0;i<3;i++)
        {
			ZLG7290_SendCmd(0x60+i+4,yy[i]);//显示实际转动角度于左侧led
         	delayMS(1);
        }
}}

除上述代码,还需有两头文件及其对应代码?,基于一些考虑在此不再上传。

本代码片段仅用于学习和参考,不一定符合对应单片机的实验箱或者仿真要求,请勿照搬照抄,谢谢配合。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:23:50  更:2021-07-27 16:25:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 7:33:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码