微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 问题困扰好久了,步进电机转动问题

问题困扰好久了,步进电机转动问题

时间:10-02 整理:3721RD 点击:
void T0_time() interrupt 1{    TH0=(65536-N)/256;    TL0=(65536-N)%256;    pulse=~pulse;    count++;        if(count>=count_1)    {        SBUF = 0x06;    //当走完那么多脉冲的时候,发送0x06,也就是ACK给电脑        while(!TI);            TI=0;        TR0=0;    }        }void jiaodu(){      uint m,n;    SBUF = 0x66;    TI=0;    TR0=0;    count=0;    m=getcrc(recv,8);    crc[0=m/256;    crc[1=m%256;    if(recv[8==crc[0&&recv[9==crc[1])    {    send[0=0x06;        send[1=0x28;        n=getcrc(send,2);        send[2=n/256;        send[3=n%256;        runjiaodu=1;        qi_d=0;        danbu=0;        //需要发送的脉冲数        count_1=(recv[3*256+recv[4])*65536+recv[5*256+recv[6];        count_1=2*count_1;        count=0;                N=(uint)(((float)jc_t*11059200.0)/(maichong_c*12.0));        pulse=1;        //ES=0;        TR0=1;    }    else    {    send[0=0x15;        send[1=0x28;        n=getcrc(send,2);        send[2=n/256;        send[3=n%256;        for(i=0;i<4;i++)        {            SBUF=send; //串口写信息            while(!TI);            TI=0;        }    }}void seri_run(){    if(flag==1)    {        k=0;       //ES=0;        switch(command)        {            case 0x28: jiaodu(); break;            case 0x30: kaishi(); break;        }        flag=0;        //ES=1;                }}void serial() interrupt 4  //串口读信息{    RI=0;    recv[k]=SBUF;    k++;           if(k==(uint)recv[2+6)   //总字节数,电脑向单片机发送报文,其中recv[2]第三个字节就是存放的这次报文的总字节    {             command=recv[1];  //第一个字节存放命令类别        flag=1;        k=0;        seri_run();    }}void main(){        init();    while(1)    {        for(i=0;i<10000;i++);        i=0;    }}

总体思路就是,电脑向单片机发送转角度的命令,这个时候232中断开始执行,中断执行seri_run();在seri_run()函数中通过command来判断执行哪个命令,这里执行jiaodu();然后在jiaodu()函数里面去计算步进电机需要转的角度,开启TR0定时器。
问题:好像执行第一次有效,第二次步进电机(一圈3200脉冲,步距角1.8度)就不转了,然后执行第3次又转,第四次又不转,真的不明白什么原因,请教各位大侠.

void T0_time() interrupt 1
{
    TH0=(65536-N)/256;
    TL0=(65536-N)%256;
    pulse=~pulse;
    count++;
   
    if(count>=count_1)
    {
        SBUF = 0x06;    //当走完那么多脉冲的时候,发送0x06,也就是ACK给电脑
        while(!TI);
            TI=0;
        TR0=0;
    }        
}

void jiaodu()
{      uint m,n;
    SBUF = 0x66;
    TI=0;
    TR0=0;
    count=0;
    m=getcrc(recv,8);
    crc[0]=m/256;
    crc[1]=m%256;
    if(recv[8]==crc[0]&&recv[9]==crc[1])
    {    send[0]=0x06;
        send[1]=0x28;
        n=getcrc(send,2);
        send[2]=n/256;
        send[3]=n%256;
        runjiaodu=1;
        qi_d=0;
        danbu=0;
        //需要发送的脉冲数
        count_1=(recv[3]*256+recv[4])*65536+recv[5]*256+recv[6];
        count_1=2*count_1;
        count=0;        
        N=(uint)(((float)jc_t*11059200.0)/(maichong_c*12.0));
        pulse=1;
        //ES=0;
        TR0=1;
    }
    else
    {    send[0]=0x15;
        send[1]=0x28;
        n=getcrc(send,2);
        send[2]=n/256;
        send[3]=n%256;
        for(i=0;i<4;i++)
        {
            SBUF=send[i]; //串口写信息
            while(!TI);
            TI=0;
        }
    }
}
void seri_run()
{
    if(flag==1)
    {
        k=0;
       //ES=0;
        switch(command)
        {
            case 0x28: jiaodu(); break;
            case 0x30: kaishi(); break;
        }
        flag=0;
        //ES=1;            
    }
}
void serial() interrupt 4  //串口读信息
{
    RI=0;
    recv[k]=SBUF;
    k++;
      
    if(k==(uint)recv[2]+6)   //总字节数,电脑向单片机发送报文,其中recv[2]第三个字节就是存放的这次报文的总字节
    {   
         command=recv[1];  //第一个字节存放命令类别
        flag=1;
        k=0;
        seri_run();
    }
}

void main()
{   
    init();
    while(1)
    {
        for(i=0;i<10000;i++);
        i=0;
    }
}

链接这里有,CSDN的,好像这里排版没排好

void serial() interrupt 4  //串口读信息
里面的逻辑有点问题。配合着你的代码和功能仔细查一下

能不能给点提示啊,或者帮忙看下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top