找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 5
打印 上一主题 下一主题
收起左侧

单片机两相步进电机角度控制求教

[复制链接]
跳转到指定楼层
楼主
ID:891876 发表于 2021-4-11 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
80黑币
由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

如何让两相步进电机,短按一次按键松开后正转一定角度,长按连续转动,(角度值由4位开关设置),停下后等待下一次按键(使用STC89C51)
希望有程序参考学习。

最佳答案

查看完整内容

//我用Word写的,就是个意思,没有运行啊! #include sbit key=P3^0; sbit key1=P3^1; sbit key2=P3^2; sbit key3=P3^3; sbit key4=P3^4; sbit PIN1=p2^0; sbit PIN2=p2^1; sbit PIN3=p2^2; sbit PIN4=p2^3; unsigned char Temp; unsigned char Record; void delayms(unsigned int i) { unsigned int j,k; for(k=0;k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 2021-4-11 16:30 | 只看该作者
//我用Word写的,就是个意思,没有运行啊!
#include<reg51.h>
sbit key=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit key4=P3^4;
sbit PIN1=p2^0;
sbit PIN2=p2^1;
sbit PIN3=p2^2;
sbit PIN4=p2^3;
unsigned char Temp;
unsigned char Record;
void delayms(unsigned int i)
{ unsigned int j,k;
  for(k=0;k<i;k++)
   for(j=0;j<123;j++);
}
void stepper_motor(bool val,bool Cangle)
{ char Cdelay=4;  //控制转速,越小越快,但力量小
int i;
    i=25; //步进电机10度
if (Cangle)
    i=key1*1000+key2*100+key3*10+key4;//步进电机根据key转,随意定的
if (val)
  { while(i--)
    {
     PIN1=0;
     PIN2=1;
     delayms(Cdelay);        
     PIN2=0;
     PIN3=1;
     delayms(Cdelay);        
     PIN3=0;
     PIN4=1;
     delayms(Cdelay);               
     PIN4=0;
     PIN1=1;
     delayms(Cdelay);        
      }
    }
  else
  {
  while(i--)
   {
  //反转
     PIN4=0;
     PIN3=1;
     delayms(Cdelay);
     PIN3=0;
     PIN2=1;
     delayms(Cdelay);
     PIN2=0;
     PIN1=1;
     delayms(Cdelay);
     PIN1=0;
     PIN4=1;
     delayms(Cdelay);        
     }  
  }
    PIN1=0; //给步进电机断电
    PIN2=0;
    PIN3=0;
    PIN4=1;
}

void key_scan()
{  unsigned char ReadData = key ^ 0x01;
   static char DelayS=0;
   Temp = ReadData & (ReadData ^ Record);
   if(Temp)
     if (DelayS<10) //小于1s 转10度
      {stepper_motor(1,0) ;
       DelayS++;
      }else
        { stepper_motor(1,1); //大于1s 正转170度
          DelayS=0;
        }
    Record = ReadData;
}
void main()
{
  while(1)
  {
    key_scan();
    delayms(100);
   }
}

回复

使用道具 举报

板凳
ID:332214 发表于 2021-4-12 16:50 | 只看该作者
1.前提你要能驱动起电机转动
2.短按转到一定角度(角度由开关确定,开关在单片机上可以表示为标志位,用标志位来确定电机转的时长“也就是角度”)
3.长按就是长时间转动。
这里面有个逻辑就是短按和长按都可以执行驱动电机的代码,方法一把检测按钮放在中断上,假设按下引脚是低电平,不按是高电平,中断就可以设置为下降沿触发。触发中断里面要有防抖延迟,和一个按钮按下的标志位。主程序main中,执行驱动电机程序,当标志位为真、按钮引脚为高电平则执行短按一次,转到一定角度,当标志位为真、按钮引脚为低电平则执行长按程序,电机一直转,当松开按钮时,则长按按钮条件不满足则执行停止电机按钮。方法二在定时器中一直去执行检测按钮状态,逻辑跟方法一差不多。
回复

使用道具 举报

地板
ID:476215 发表于 2021-4-12 23:33 | 只看该作者
这个跟我当年做过的一个题目很相似,其实关键的问题不是电机驱动的问题,关键的问题在于你如何判断你转了多少角度(电机转动是有惯性的,不是说你给了多少驱动数据电机就会转多少);相关问题你可以研究下电机原理;如果真要做到转过的角度精确的话你可以找一个数字编码器,然后将角度进行编码,然后加上算法就可以精确的控制了。控制的算法太多了,你随便网上一搜一大把
回复

使用道具 举报

5#
ID:207421 发表于 2021-4-12 23:42 | 只看该作者
角度的脉冲数 = 一圈总脉冲数 x (设置的角度/360)
回复

使用道具 举报

6#
ID:889094 发表于 2021-4-28 21:09 | 只看该作者
感觉应该是主程序里
while(1)
{
  if短按标志:转一个角度;清标志
if长按标志:一直转
}
按键中断,短按设置标志
          长按设置标志,放开清标志
此处可能是要中断上升下降沿都要产生,中断函数处理要短,长按也要按下就退出,不能阻断程序整体运行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表