温度控制步进电机的问题
时间:10-02
整理:3721RD
点击:
这是设计的一个仿真图,想要实现的功能是:在DS18B20温度传感器上的示数为20时,步进电机不动或保持一定角度。 大于20时:每提高一度,步进电机转过一定角度。(线性关系)
小于20时:与上方向相反。
下面的程序现在能在示数20上下一定范围内实现,不过:
1.刚开始示数为20时,步进电机转过一个角度,增加或减少后,再回到20,角度数就不一样了。囧。
2.步进电机只能在-135~45间。为什么不能转动一圈。(难道是步进电机图有误?)
我看其他有些成功的仿真图也有画这么简单的,这个仿真图。应该。是可以实现这个功能的,求各位老师指导!
PS:这个程序中,温度传感器的程序是从其他地方直接拷过来用的,应该可以用。
以下是我觉得可能有问题的电机转动程序。
unsigned int wendu=0; //定义
unsigned int cankao=20; //设定参考温度值
unsigned char Speed;
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;#define Coil_A1 {A1=0;B1=1;C1=1;D1=1;}//A相通电,其他相断电
#define Coil_B1 {A1=1;B1=0;C1=1;D1=1;}//B相通电,其他相断电
#define Coil_C1 {A1=1;B1=1;C1=0;D1=1;}//C相通电,其他相断电
#define Coil_D1 {A1=1;B1=1;C1=1;D1=0;}//D相通电,其他相断电
#define Coil_OFF {A1=1;B1=1;C1=1;D1=1;}
uchar direct; //转动方向标志
uchar sign;
.
/**********电机转动函数************/
void roll()
{
static unsigned char i;
Speed=8;
if(direct==1) //检测方向标志,使电机顺时针转动
{
for(i=(cankao-wendu);i>0;i--)
{
Coil_A1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替
Coil_B1
Coil_C1
Coil_D1
}
}
if(direct==2)
{
for(i=(wendu-cankao);i>0;i--)
{
Coil_D1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替
Coil_C1
Coil_B1
Coil_A1
}
}
}
void fangxiang_Scan()
{
if(wendu<cankao)
{
sign=0;
}
if(wendu>cankao)
{
sign=1;
}
if(wendu==cankao)
{
sign=2;
}
}
void main()
{
uchar fangxiang=0;
float temp;
while(1)
{
while(key==0)
{
temp=ReadTemperature();
wendu=(float)temp*0.0625;
fangxiang_Scan(); //检测按键键值
if(sign==0)
{
direct=1; //转动方向标志为1,顺时针转动
roll();
}
if(sign==1)
{
direct=2; //转动方向标志为2,逆时针转动
roll();
}
if(sign==2)
{
Coil_OFF;
}
cankao=wendu;
}
}
}
是不是应该给稳定设定一个范围,而不是等于某个值,小于,大于某个值呢