单片机控制步进电机,是怎么控制的
答案:3 悬赏:10 手机版
解决时间 2021-10-04 02:26
- 提问者网友:溺爱和你
- 2021-10-03 05:14
单片机控制步进电机,是怎么控制的
最佳答案
- 五星知识达人网友:青尢
- 2021-10-03 05:47
ULN2003D是驱动步进电机的驱动芯片,主要是匹配电机所需的电流。
由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数;
一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。
由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数;
一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。
全部回答
- 1楼网友:逐風
- 2021-10-03 08:28
您好,单片机步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,控制换相顺序,即通电控制脉冲必须严格按照一定顺序分别控制各相的通断。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的。控制步进电机的转向,即给定工作方式正序换相通电,步进电机正转,若按反序通电换相,则电机就反转。控制步进电机的速度,即给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步,两个脉冲的间隔越短,步进电机就转得越快。同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
希望回答能让您满意
希望回答能让您满意
- 2楼网友:低音帝王
- 2021-10-03 07:03
我们采用P1口来采集ADC0832的8位数据,用P0.0口控制步进电机动作,利用T0的时间中断来采集P1口的ADC0832数据并做出比较后设置步进电机启动标志位start=1;并设置他的运行频率,当然,楼主没说怎么比较,我这就只是写了个简单的例子,一通百通,希望对你有帮助
下面是程序:
#include//选用晶振11.0592MHz
unsignedintm=0,n=0;//设置循环的周期
unsignedcharstart=0,t0temp=0;
sbitY0=P0^0;//控制步进电机的管脚
delay()
{
unsignedchari,j;
for(i=m;i>0;i--)
for(j=n;i>0;j--);
} main()
{ //自检测T0时间设置
ET0=1;
TMOD|=0x01;
TH0=0xFC;//1ms中断扫描
TL0=0x66;
IT0=1;//下降沿触发
TR0=0;//关闭扫描
//****************I/O口程序
while(1)
{
while(start)
{
delay();
Y0=~Y0;
}
}
}
voidcounter1(void)interrupt1//T0计时器中断
{
if(t0temp%4)t0temp++;//4ms时间才采集一次P0口的数据
else
{
t0temp++;
//这里就写你怎么做对比的程序,我举个例子
if(P1>150)
{start=1;n=1000;m=0;}//入错采用12M晶振,那这时候控制步进电机的输出周期就是1ms一次,也就是1000HZ
else{start=0;n=0;m=0;}
}
}
//PS:我在输出频率中用了两个全局变量m,n可以延迟很长时间,楼主可以根据需要选用,一般16位的,选用一个就可以了,另一个放弃
OK,至于电路图,我软件没有ADC0832的封装,不然就发给你了,但想来楼主完全就没必要担心,ADC0832的8位数据接到P1口,P0.0控制步进电机启动的三极管,电路图就那么简单!
下面是程序:
#include//选用晶振11.0592MHz
unsignedintm=0,n=0;//设置循环的周期
unsignedcharstart=0,t0temp=0;
sbitY0=P0^0;//控制步进电机的管脚
delay()
{
unsignedchari,j;
for(i=m;i>0;i--)
for(j=n;i>0;j--);
} main()
{ //自检测T0时间设置
ET0=1;
TMOD|=0x01;
TH0=0xFC;//1ms中断扫描
TL0=0x66;
IT0=1;//下降沿触发
TR0=0;//关闭扫描
//****************I/O口程序
while(1)
{
while(start)
{
delay();
Y0=~Y0;
}
}
}
voidcounter1(void)interrupt1//T0计时器中断
{
if(t0temp%4)t0temp++;//4ms时间才采集一次P0口的数据
else
{
t0temp++;
//这里就写你怎么做对比的程序,我举个例子
if(P1>150)
{start=1;n=1000;m=0;}//入错采用12M晶振,那这时候控制步进电机的输出周期就是1ms一次,也就是1000HZ
else{start=0;n=0;m=0;}
}
}
//PS:我在输出频率中用了两个全局变量m,n可以延迟很长时间,楼主可以根据需要选用,一般16位的,选用一个就可以了,另一个放弃
OK,至于电路图,我软件没有ADC0832的封装,不然就发给你了,但想来楼主完全就没必要担心,ADC0832的8位数据接到P1口,P0.0控制步进电机启动的三极管,电路图就那么简单!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯