久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3229|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲图片一区二区三区 | 日韩欧美中文在线 | 久久这里只有精品首页 | 国产精品日韩欧美一区二区三区 | 日韩三级在线 | 亚洲精品久久久 | 亚洲成人免费av | www.日韩欧美 | 成人午夜在线 | 国产精品视频二区三区 | 久久av影院 | 精精国产xxxx视频在线播放 | 欧美精品成人影院 | 日韩免费视频 | 18av在线播放 | 国产免费一区二区三区最新6 | 国产精品揄拍一区二区 | 久久一区二区视频 | 亚洲国产成人av好男人在线观看 | 亚洲精品av在线 | 亚洲国产专区 | 九色在线视频 | 成人欧美一区二区三区在线播放 | 亚洲成人在线免费 | 国产在线精品一区二区 | 国产精品欧美日韩 | 青青草网站在线观看 | 国内自拍偷拍视频 | 久久久久一区二区三区 | 国产精品久久久久久久一区探花 | 欧美国产日韩在线 | 国产欧美一区二区精品久导航 | 最新av在线播放 | 欧美激情久久久久久 | 中文字幕一区二区三区乱码在线 | 亚洲欧洲精品在线 | 一级黄色播放 | 欧美亚洲另类在线 | 亚洲欧美日韩精品久久亚洲区 | 青青久草| www.日本在线 |