单片机只输出信号,经过隔离电路,再经过功率开关电路驱动电机。
控制普通的三项异步电机可以单片机输出信号经三极管后驱动一个小功率继电器,由继电器来驱动交流接触器,进而控制电机,也可以单片机信号经三极管放大后直接驱动功率继电器。 方法有很多很多。至于驱动伺服,单片机端口的信号经过光耦隔离后可以直接驱动,伺服驱动器本身需要的驱动信号都是弱电信号。
单片机注意事项
一般在单片机的数据手册(Datasheet)中都会提到该单片机需要的复位信号的要求。一般复位信号的宽度应为。复位电平的宽度和幅度都应满足芯片的要求,并且要求保持稳定。还有特别重要的一点就是复位电平应与电源上电在同一时刻发生,即芯片一上电,复位信号就已产生。
不然,由于没有经过复位,单片机中的寄存器的值为随机值,上电时就会按PC寄存器中的随机内容开始运行程序,这样很容易进行误 *** 作或进入死机状态。
C语言程序如下:
#include<reg 51h>
#define uint unsigned int
Sbit k1=p34;//启动开关
Sbit k2=p35;//换向开关
Sbit s2=p32;//加速按钮
Sbit s3=p33;//减速按钮
Void idr_int0(void);//外部中断0中断服务函数声明
Void idr_int1(void);
Void zd_t0ist(void);
Uint speed,count,r1,I,t,k;
Main()
{k=0;
T=0;
r1=0x11;
speed=0;
count=1;
tmod=0x01;
et0=1;
ea=1;
ex0=1;
ex1=1;
if(k2==0)
p0=0xbf;
else p0=0xf9;
if (speed==0)
{p2=0xc0;
Tr0=0;
}
Else tr0=1;
}
}
}
Void isr_int0(void)interrupt();
{
If(speed<7)
Speed=speed+1;
While(s2==0)
{For(i=0;i<10;i++);}
}
Void isr_int0(void)interrupt2;
Th0=0xcf;
Tl0=0x2c;
For(;;)
{
If (k1==0)
{p0=0xff;
P2=0xff;
Speed=0;
Tr0=0}
Else
{
If(k2==0)
P0=0xbf;
Else p0=0xf9;
If(speed==0)
{p2=0xc0;
Tr0=0;
}
Else tr0=1;
}
}
}
Void isr_int0(void)interrupt()
{
If(speed<7)
Speed=speed+1;
While(s2==0)
{for(i=0;i<10;i++);}
}
Void isr_int1(void)interrupt2
{
If(speed>0)
Speed=speed-1;
While(s3==0)
{for(i=0;;i<10;i++);}
}
Void zd_t0ist(void)interrupt 1
{
Th0=0xd8;
Tl0=0xf0;
Switch(speed)
{
Case0;p2=0xc0;count=0;break;
Case1;p2=0xf9;count=60;break;
Case2;p2=0xa4;count=40;break;
Case3;p2=0xb0;count=35break;
Case4;p2=0x99;count=30;break;
Case5;p2=0x92;count=28;break;
Case6;p2=0x82;count=25;break;
Case7;p2=0xf8;count=21;break;
Default:break;
}
If(t==0)
T=count;
If(t>0)
T=t-1;
If(k2==0)
{
If(t==0)
{
Switch(k)
{
Case0;p1=0x01;break;
Case1;p1=0x02;break;
Case2;p1=0x04;break;
Case3;p1=0x08;break;
Default:break;
}
k=k+1;
if(k==4)
k=0;
}
}
Else
{
If(t==0)
{
Switch(k)
{
Case0;p1=0x08;break;
Case1;p1=0x04;break;
Case2;p1=0x02;break;
Case3;p1=0x01;break;
Default:break;
}
K=k+1;
If(==4)
K=0;
}
}
}
这个是控制伺服或步进电机的吧~~!步进电机的话~你如果是用18°的步进距的话,你通过细分调节比较难调到一个步距角的角度哦,但你可以通过减速齿轮比化为你要的一个脉冲对应1个角度~!如果用伺服电机的话~你只需要设置电子齿轮比就可以了~使伺服一圈对应360个脉冲然后你就能控制一个脉冲对应1°~!!至于用什么指令有几个~你要根据你现场的工作要求~!要不用脉冲输出指令也可以~PLSR~!然后至于方向信号你只要有一个输出点给方向的信号~方向就反转了~!就这么简单~~~~如果你觉得不懂的话建议你去多看书,了解步进电机的知识先。
电机的直接启动是由接触器控制的,接触器接三相电源,接触器有控制线圈,线圈的通电与断电可以控制接触器的吸合,从而控制电机的启动和停止,接触器线圈的电压一般是220v或者380v。plc的输出电压一般是24v,可以去控制中间继电器,中间继电器有的线圈就是24v,中间继电器有自己的常开常闭触点,这些触点去控制接触器的线圈,这样就可以控制了,于是就plc输出控制24v的中间继电器,中间继电器的触点控制220v的接触器,接触器控制电机。
#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程序、急求PLC通过电机控制器控制电机转动的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)