找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3103|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機兩相步進(jìn)電機角度控制求教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:891876 發(fā)表于 2021-4-11 16:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
80黑幣
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實現(xiàn),謝謝大家

如何讓兩相步進(jìn)電機,短按一次按鍵松開后正轉(zhuǎn)一定角度,長按連續(xù)轉(zhuǎn)動,(角度值由4位開關(guān)設(shè)置),停下后等待下一次按鍵(使用STC89C51)
希望有程序參考學(xué)習(xí)。

最佳答案

查看完整內(nèi)容

//我用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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:844772 發(fā)表于 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;  //控制轉(zhuǎn)速,越小越快,但力量小
int i;
    i=25; //步進(jìn)電機10度
if (Cangle)
    i=key1*1000+key2*100+key3*10+key4;//步進(jìn)電機根據(jù)key轉(zhuǎn),隨意定的
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--)
   {
  //反轉(zhuǎn)
     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; //給步進(jìn)電機斷電
    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 轉(zhuǎn)10度
      {stepper_motor(1,0) ;
       DelayS++;
      }else
        { stepper_motor(1,1); //大于1s 正轉(zhuǎn)170度
          DelayS=0;
        }
    Record = ReadData;
}
void main()
{
  while(1)
  {
    key_scan();
    delayms(100);
   }
}

回復(fù)

使用道具 舉報

板凳
ID:332214 發(fā)表于 2021-4-12 16:50 | 只看該作者
1.前提你要能驅(qū)動起電機轉(zhuǎn)動
2.短按轉(zhuǎn)到一定角度(角度由開關(guān)確定,開關(guān)在單片機上可以表示為標(biāo)志位,用標(biāo)志位來確定電機轉(zhuǎn)的時長“也就是角度”)
3.長按就是長時間轉(zhuǎn)動。
這里面有個邏輯就是短按和長按都可以執(zhí)行驅(qū)動電機的代碼,方法一把檢測按鈕放在中斷上,假設(shè)按下引腳是低電平,不按是高電平,中斷就可以設(shè)置為下降沿觸發(fā)。觸發(fā)中斷里面要有防抖延遲,和一個按鈕按下的標(biāo)志位。主程序main中,執(zhí)行驅(qū)動電機程序,當(dāng)標(biāo)志位為真、按鈕引腳為高電平則執(zhí)行短按一次,轉(zhuǎn)到一定角度,當(dāng)標(biāo)志位為真、按鈕引腳為低電平則執(zhí)行長按程序,電機一直轉(zhuǎn),當(dāng)松開按鈕時,則長按按鈕條件不滿足則執(zhí)行停止電機按鈕。方法二在定時器中一直去執(zhí)行檢測按鈕狀態(tài),邏輯跟方法一差不多。
回復(fù)

使用道具 舉報

地板
ID:476215 發(fā)表于 2021-4-12 23:33 | 只看該作者
這個跟我當(dāng)年做過的一個題目很相似,其實關(guān)鍵的問題不是電機驅(qū)動的問題,關(guān)鍵的問題在于你如何判斷你轉(zhuǎn)了多少角度(電機轉(zhuǎn)動是有慣性的,不是說你給了多少驅(qū)動數(shù)據(jù)電機就會轉(zhuǎn)多少);相關(guān)問題你可以研究下電機原理;如果真要做到轉(zhuǎn)過的角度精確的話你可以找一個數(shù)字編碼器,然后將角度進(jìn)行編碼,然后加上算法就可以精確的控制了?刂频乃惴ㄌ嗔,你隨便網(wǎng)上一搜一大把
回復(fù)

使用道具 舉報

5#
ID:207421 發(fā)表于 2021-4-12 23:42 | 只看該作者
角度的脈沖數(shù) = 一圈總脈沖數(shù) x (設(shè)置的角度/360)
回復(fù)

使用道具 舉報

6#
ID:889094 發(fā)表于 2021-4-28 21:09 | 只看該作者
感覺應(yīng)該是主程序里
while(1)
{
  if短按標(biāo)志:轉(zhuǎn)一個角度;清標(biāo)志
if長按標(biāo)志:一直轉(zhuǎn)
}
按鍵中斷,短按設(shè)置標(biāo)志
          長按設(shè)置標(biāo)志,放開清標(biāo)志
此處可能是要中斷上升下降沿都要產(chǎn)生,中斷函數(shù)處理要短,長按也要按下就退出,不能阻斷程序整體運行
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表