电机控制程序如何编写

电机控制程序如何编写,第1张

学PLC吧,很简单。如果对角度定位速度和精度要求不是很高,就用传感器配合普通电机(机械结构可能要用到减速器)。如果要求比较高,就要用到步进或伺服电机,配合PLC做定位控制。你买一本学习PLC编程,再看下步进和伺服系统的说明书就好。

1、实验目的和要求。了解步进电机的工作原理,学习用单片机的步进电机控制系统的硬件设计方法,掌握定时器和中断系统的应用,熟悉单片机应用系统的设计与调试方法。

2、实验设备。单片机测控实验、系统步进电机控制实验模块、Keil开发环境、STC-ISP程序下载工具。

3、实验内容。编制MCS-51程序使步进电机按照规定的转速和方向进行旋转,并将已转动的步数显示在数码管上。步进电机的转速分为两档,当按下S1开关时,加速旋转,速度从10转/分加速到60转/分。当松开开关时,减速旋转,速度恢复为10转/分。当按下S2开关时,按照逆时针旋转;当松开时,按照顺时针旋转。本程序要求使用定时器中断来实现,不准使用程序延时的方式。

4、实验步骤。预习:参考辅助材料,学习C51编程语言使用和步进电机原理。简单程序录入和调试:关于C51的中断,本程序需要使用定时器定时,并使用中断来同步。中断程序的典型例子如下:格式:void函数名()interrupt中断号using工作组{中断服务程序内容}注意:中断不能返回任何值,所以前面是void后面是函数名,名字可以自己起,但不要与c语言的关键字相同;中断函数不带任何参数,所以函数名后面的()内是空的,中断号是指单片机的几个中断源的序号。这个序号是单片机识别不同中断的唯一标志。所以一定要写正确。后面的using工作组是指这个这个中断使用单片机内存中4个工作寄存器的哪一组,c51编译后会自动分配工作组,因此最后这句话我们通常省略不写。c51中断写法实例:void T1-time()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%6;}上面的意思是定时器1的中断服务程序,定时器1的中断服务序号是,因此我们要写成 interrupt3,服务程序的内容是给两个初值寄存器装入新值。

5、实验原理。使用的单片机系统的频率是12M;步进电机转动一周需要24步。本步进电机实验板,使用FAN8200作为驱动芯片。CPU通过引脚与FAN8200相连。

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit KEY1 = P3^2; //步进电机逆时针方向转

sbit KEY2 = P3^3; //步进电机顺时针方向转

sbit KEY3 = P3^4; //步进电机调速

uchar step = 0;

bit AB_flag = 0;

unsigned char code A_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //顺时针转表格

unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆时针转表格

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay(uint i)

{

uchar x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

void KEY(void)

{

if(KEY1 == 0) //按P32,实现步进电机的逆时针转动

{

Delay(15);

if(KEY1 == 0)

{

while(1)

{

if(KEY1 == 1)

{

Delay(15);

if(KEY1 == 1)

{

AB_flag = 0;

break;

}

}

}

}

}

if(KEY2 == 0) //按P33,实现步进电机的顺时针转动

{

Delay(15);

if(KEY2 == 0)

{

while(1)

{

if(KEY2 == 1)

{

Delay(15);

if(KEY2 == 1)

{

AB_flag = 1;

break;

}

}

}

}

}

if(KEY3 == 0) //按P34,实现步进电机的调速

{

Delay(15);

if(KEY3 == 0)

{

while(1)

{

if(KEY3 == 1)

{

Delay(15);

if(KEY3 == 1)

{

step++;

if(step == 3)

{

step = 0;

}

break;

}

}

}

}

}

}

main()

{

uchar i;

while(1)

{

KEY(); //按键处理函数

for(i=0;i<8;i++) //因为有8路的控制时序

{

if(AB_flag == 0)

{

P1 = A_Rotation[i]; //逆时针转动

}

else

{

P1 = B_Rotation[i]; //顺时针转动

}

Delay(2+step); //改变这个参数可以调整电机转速

}

}

}

控制正反转已通过测试

没分啊!!!唔唔!

#include<reg51h>

#define uchar unsigned char

#define TURE 1

uchar code MOTO[4]={0x33,0xa6,0xcc,0x59};

uchar status=0;

void delay(void)

{unsigned int i;

for (i=0;i<=450;i++);

}

/

void fanzhuan(void)

{

status--;

if (status==255)

{ status=3;}

status%=4;

P0=MOTO[status];

delay();

}

/

void zhengzhuan(void)

{status++;

status%=4;

P0=MOTO[status];

delay();

}

void main(void)

{uchar dp1;

P0=MOTO[status];

while(1){

dp1=P1;

dp1=dp1&0x03;

zhengzhuan();

} }

四相步进电机,老大拜托你下次问题说明白点

#include <reg51h> //51芯片管脚定义头文件

#include <intrinsh>//内部包含延时函数 _nop_();

#define uchar unsigned char

#define uint unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};

uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

//

/

/ 延时t毫秒

/ 110592MHz时钟,延时约1ms

/

//

void delay(uint t)

{

uint k;

while(t--)

{

for(k=0; k<125; k++)

{ }

}

}

//

/

/步进电机正转

/

//

void motor_ffw(uint n)

{

uchar i;

uint j;

for (j=0; j<12n; j++) //转1×n圈

{

for (i=0; i<8; i++) //一个周期转30度

{

P1 = FFW[i]; //取数据

delay(15); //调节转速

}

}

}

//

/

/步进电机反转

/

//

void motor_rev(uint n)

{

uchar i;

uint j;

for (j=0; j<12n; j++) //转1×n圈

{

for (i=0; i<8; i++) //一个周期转30度

{

P1 = REV[i]; //取数据

delay(15); //调节转速

}

}

}

/

主程序

/

main()

{

while(1)

{

motor_ffw(5); //电机正转

delay(5000); //换向延时

//motor_rev(5); //电机反转

//delay(1000); //换向延时

}

}

//

以上就是关于电机控制程序如何编写全部的内容,包括:电机控制程序如何编写、单片机步进电机控制实验 单片机步进电机控制实验报告、求单片机控制步进电机的C语言程序,急啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9519165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存