温度控制步进电机的问题

2019-07-15 13:52发布

本帖最后由 Poolecy 于 2016-5-22 20:02 编辑

这是设计的一个仿真图,想要实现的功能是:在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;
}
        }        
}




360反馈意见截图162303159811697.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。