单片机驱动两个步进电机

2020-02-05 08:55发布

单片机驱动两个步进电机,速度单独可以调节的,麻烦哪位给个思路,谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
21条回答
hyc07209
2020-02-07 04:48
下面是我根据楼主  chenyuqiu 陈工 的提示写的伪代码,希望能帮到你,具体也可看这个帖子    STC11F16XE驱动4个步进电机(软件实现16细分)http://www.ourdev.cn/thread-4440711-9-1.html

*
最小细分数=|设定位置和现在位置的绝对值|÷255×速度设定值;
switch(State)
{
        case 空闲:
                时间片计数器=0;
                象限计数器  =0;
                开始细分数初始=16;
                if(有位置差)State=启动;
                break;
        case 启动:
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                        {
                                象限计数器=0;
                                距离差--;
                        }

                        if(现在细分数!=最小细分数)
                        {
                                现在细分数--;
                                if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                        时间片计数器=现在细分数;
                                else 时间片计数器=0;
                        }
                        else
                                State=匀速;        
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        case 匀速:
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                        {
                                象限计数器=0;
                                距离差--;
                                if(距离差剩下不多了)//留一点距离用来减速
                                        State=减速;
                        }

        
                        if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                时间片计数器=现在细分数;
                        else 时间片计数器=0;
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        case 减速;
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                                象限计数器=0;

                        if(现在细分数!=16)
                        {
                                现在细分数++;
                                if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                        时间片计数器=现在细分数;
                                else 时间片计数器=0;
                        }
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        default:
                break;
}//end switch(State)
*/

一周热门 更多>