热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Protues的步进电机仿真与控制技术研究

本文基于Proteus平台,对步进电机的仿真与控制技术进行了深入研究。通过修改代码,实现了步进电机精确转动1圈的控制。实验结果验证了该方法的有效性和可靠性,为步进电机在精密控制领域的应用提供了有力支持。

步进电机圈数测试

在这里插入图片描述
下面代码已经修改过,圈数改为1圈

/*************** writer:shopping.w ******************/
#include
#define uint unsigned int
#define uchar unsigned char
uchar code FFW[]=
{0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};uchar code REV[]=
{0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
};sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;void DelayMS(uint ms)
{uchar i;while(ms--){for(i&#61;0;i<120;i&#43;&#43;);}
}void SETP_MOTOR_FFW(uchar n)
{uchar i,j;for(i&#61;0;i<1*n;i&#43;&#43;) //n控制圈数&#xff0c;运行1次&#xff0c;正转144°&#xff0c;转够5次&#xff0c;电机才能回到0°{for(j&#61;0;j<8;j&#43;&#43;){if(K3 &#61;&#61; 0) break;P1 &#61; FFW[j];DelayMS(100);}}
}void SETP_MOTOR_REV(uchar n)
{uchar i,j;for(i&#61;0;i<5*n;i&#43;&#43;){for(j&#61;0;j<8;j&#43;&#43;){if(K3 &#61;&#61; 0) break;P1 &#61; REV[j];DelayMS(25);}}
}void main()
{uchar N &#61; 1;while(1){if(K1 &#61;&#61; 0)//正转{P0 &#61; 0xfe;SETP_MOTOR_FFW(N);if(K3 &#61;&#61; 0) break;}else if(K2 &#61;&#61; 0)//反转{P0 &#61; 0xfd;SETP_MOTOR_REV(N);if(K3 &#61;&#61; 0) break;}else//停止{P0 &#61; 0xfb;P1 &#61; 0x03;}}
}

步进电机速度测试&#xff08;用延迟进行调速&#xff09;&#43;按键控制&#43;数码管显示延迟时间

在这里插入图片描述
上图有点杂乱&#xff0c;下面代码只用到&#xff1a;数码管&#xff0c;AT89c51芯片&#xff0c;步进电机&#xff0c;ULN2003A驱动&#xff0c;按键

#include "main.h"
#include
#include "Stepper motor.h"unsigned int Sec_5&#61;0,Sec_4&#61;0,Sec_3&#61;0 ,Sec_2 &#61; 0,Sec_1 &#61; 0,Sec_0&#61;0;//千百十个位数字
code unsigned char table[] &#61; { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
code unsigned char chage[] &#61; { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf };//2-7位//显示位{}
//主函数 0 1 2 3 4 5 unsigned int c &#61; 0;//位数刷新
unsigned int cnt &#61; 0;//数码管刷新时间
unsigned long int time &#61; 1;//电机转动延迟时间
unsigned int num ;
unsigned int Sec &#61; 0;//时间单位&#xff0c;秒
unsigned int mode &#61; 1;//按键模式&#xff08;正转&#xff09;//**********************************************************
//主函数
//**********************************************************
void main()
{Init_Timer0();while(1){scan_key();//按键扫描if(mode&#61;&#61;0)Phase_B();if(mode&#61;&#61;1)Phase_A();if(mode&#61;&#61;2)move&#61;0x03;//复位delay_10um(time);}
}//****************************************************
//初始化定时器1
//****************************************************
void Init_Timer0()
{TMOD &#61; 0X01; //T0, 工作模式1TH0 &#61; (65536 - 10000)/256;TL0 &#61; (65536 - 10000)%256;TR0 &#61; 1; //开启定时器ET0 &#61; 1; //开启定时器中断EA &#61; 1; //开启总中断
}//*****************************************************
//中断函数
//****************************************************
void Timer0() interrupt 1
{TH0 &#61; (65536 - 1000)/256;//1ms 定时 模式1非自动重装需要手动重装再次定时TL0 &#61; (65536 - 1000)%256;//刷新显示 c个位Sec&#43;&#43;;cnt&#43;&#43;;num&#61;time;
//数据处理Sec_0 &#61; num%10;Sec_1 &#61; num/10%10;Sec_2 &#61; num/100%10;Sec_3 &#61; num/1000%10;Sec_4 &#61; num/10000%10;Sec_5 &#61; num/100000;
//每1000us*10&#61;10ms刷新一次if(cnt&#61;&#61;10){cnt&#61;0;SEG_DATA&#61;0x00;delay_10um(10);COM0&#61;chage[c]; switch(c){case 5:SEG_DATA&#61;table[Sec_0];break;//显示万位case 4:SEG_DATA&#61;table[Sec_1];break;//显示千位case 3:SEG_DATA&#61;table[Sec_2];break;//显示百位case 2:SEG_DATA&#61;table[Sec_3];break;//显示十位case 1:SEG_DATA&#61;table[Sec_4];break;//显示个位case 0:SEG_DATA&#61;table[Sec_5];break;//显示单位default:break;}c&#43;&#43;;if(c&#61;&#61;6)c&#61;0;}//1000*1ms&#61;1s刷新一次
if(Sec&#61;&#61;1000)//这个判断必须有&#xff0c;也不能在其他地方&#xff0c;不然不能刷新显示&#xff01;&#xff01;&#xff01;我也不清楚&#xff0c;调试了好久{Sec&#61;0; //num&#43;&#43;; 测试数码管显示&#xff0c;每1s数字加1}
}
//*******************************************************************************
//按键扫描
//*******************************************************************************
void scan_key()
{//-------------------------------------------------//电机正转if(key1&#61;&#61;0)//正转{mode&#61;1;}
// while(key1&#61;&#61;0);//-------------------------------------------------//电机反转if(key2&#61;&#61;0)//反转{mode&#61;0;}
// while(key2&#61;&#61;0);//-------------------------------------------------//电机停止if(key3&#61;&#61;0){mode&#61;2;}while(key3&#61;&#61;0);//-------------------------------------------------//转速调控if(key4&#61;&#61;0){time-&#61;1;delay_10um(10);if(time&#61;&#61;-1)time&#61;100;
// num&#43;&#43;;
// if(num&#61;&#61;3)
// num&#61;0;
// switch(num)
// {
// case 0:time&#61;100;break;
// case 1:time&#61;300;break;
// case 2:time&#61;50;break;
// }}
// while(key4&#61;&#61;0);//-------------------------------------------------}//延时n毫秒
void Delay_ms(unsigned int n)
{unsigned int i&#61;0,j&#61;0;for(i&#61;0;i<n;i&#43;&#43;)for(j&#61;0;j<123;j&#43;&#43;);
}//延时10*n微秒
void delay_10um(unsigned int n)
{while(n--);
}

main.c头文件

#ifndef __MAIN__H__
#define __MAIN__H__#include
#define COM0 P0
#define SEG_DATA P2sbit key1&#61;P3^0;
sbit key2&#61;P3^1;
sbit key3&#61;P3^2;
sbit key4&#61;P3^3;//函数声明
extern void Delay_ms( unsigned int m);
extern void delay_10um( unsigned int n);
extern void Init_Timer0();
extern void scan_key();
extern void forward();//extern void Phase_B();
//extern void Phase_C();
//extern void Phase_D();
extern unsigned long int time;#endif

下面是步进电机控制程序&#xff0c;每执行一次&#xff0c;转一个指定的角度

#include "Stepper motor.h"unsigned int a&#61; 0;
unsigned char code right[8]&#61;{0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01,}; //顺时针A-AB-B-BC-C-CD-D-DA 方法四使用void Phase_A()//正转
{
//方法一
// switch(cnt)
// {
// case 0: move&#61;0x01;break;
// case 1: move&#61;0x03;break;
// case 2: move&#61;0x02;break;
// case 3: move&#61;0x06;break;
// case 4: move&#61;0x04;break;
// case 5: move&#61;0x0c;break;
// case 6: move&#61;0x08;break;
// case 7: move&#61;0x09;break;
// default:break;
// }
// cnt&#43;&#43;;
// if(cnt&#61;&#61;8)
// cnt&#61;0;
//方法二
// for(;a<8;a&#43;&#43;)//方法三
// move&#61;0x01<
// if(a&#61;&#61;4)a&#61;0;
//
//方法四move&#61;right[a&#43;&#43;];if(a&#61;&#61;8)a&#61;0;
}void Phase_B()//反转
{move&#61;right[a--];if(a&#61;&#61;-1)a&#61;7;
}

Stepper motor.h头文件

#ifndef __STEPPER MOTOR__H__
#define __STEPPER MOTOR__H__#include #define move P1
extern void Phase_A();
extern void Phase_B();//extern void delay_ms( unsigned int m);#endif

推荐阅读
  • PHP中元素的计量单位是什么? ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 织梦系统多条件联动筛选功能详细教程及删除操作指南
    多条件联动筛选功能广泛应用于图片展示、装修设计、机械设备和在线商城等场景,通常筛选条件应聚焦于用户最关心的要素,而非涵盖所有可能的选项。在DedeCMS中,多条件筛选的PHP开发并未内置删除已选条件的功能,但通过理解PHP筛选与JS筛选的不同机制,实现这一功能相对简单且易于操作。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文探讨了如何在C#中实现USB条形码扫描仪的数据读取,并自动过滤掉键盘输入,即使不知道设备的供应商ID(VID)和产品ID(PID)。通过详细的技术指导和代码示例,展示了如何高效地处理条形码数据,确保系统能够准确识别并忽略来自键盘的干扰信号。该方法适用于多种USB条形码扫描仪,无需额外配置设备信息。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 为了有效保护U盘免受病毒侵扰,我决定为一位经常受到学校电脑病毒困扰的专业课老师的U盘提供全面的安全防护。本文将详细介绍几种有效的防病毒措施,包括使用右键菜单安全打开U盘、安装可靠的杀毒软件以及定期更新系统和驱动程序,确保数据安全无忧。 ... [详细]
author-avatar
到几百元_309
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有