欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4083|回復: 18
打印 上一主題 下一主題
收起左側

51單片機控制步進電機的問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:797796 發表于 2020-7-25 20:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
150黑幣
關于用51單片機控制步進電機速度和直線位移的問題,要求用定時器產生脈沖,還要先設置好運動的速度再運行,新手沒用單片機控制過電機,按照以下要求應該怎么去實現呢?

電機.PNG (101.95 KB, 下載次數: 55)

電機.PNG

步進.PNG (80.72 KB, 下載次數: 66)

步進.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:789121 發表于 2020-7-26 01:13 | 只看該作者
所以是你要讓別人幫你做這個項目么?
回復

使用道具 舉報

板凳
ID:797796 發表于 2020-7-26 07:36 | 只看該作者
不要黑 發表于 2020-7-26 01:13
所以是你要讓別人幫你做這個項目么?

提供下思路
回復

使用道具 舉報

地板
ID:797796 發表于 2020-7-26 07:56 | 只看該作者
不要黑 發表于 2020-7-26 01:13
所以是你要讓別人幫你做這個項目么?

主要是不知道怎么控制電機轉速固定,比如每秒轉2.5圈
回復

使用道具 舉報

5#
ID:797796 發表于 2020-7-26 09:20 | 只看該作者

我寫的這個程序電機轉不起來,大佬們幫我看下哪里出問題了好嗎
#include <reg51.h>//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define uint unsigned int
#define uchar unsigned char
uchar tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
sbit OUT=P2^2;    //定義OUT輸出端口
unsigned char count,i;
void Init_Timer0(void)
{
        TMOD |= 0x01;                      //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
        TH0=(65535-12000)/256;                 
        TL0=(65535-12000)*256;
        EA=1;                         //總中斷打開
        ET0=1;                        //定時器中斷打開
        TR0=1;                        //定時器開關打開
}
main()
{
        Init_Timer0();
        OUT=0;
        while(1)
        {
                ;
        }
}

void Timer0_isr(void) interrupt 1
{

        TH0=(65535-20000)/256;                  //重新賦值 12M晶振計算,指令周期1uS,
        TL0=(65535-20000)*256;         
        count++;
        if(count==20)
        {
        count=0;
        OUT=~OUT;
                {i++;if(i>7)i=0;P0=tab;}                     //用示波器可看到方波輸出
        }
}
回復

使用道具 舉報

6#
ID:782419 發表于 2020-7-26 10:09 | 只看該作者
我覺得你的P0可能是步進電機的驅動端口吧,所以P0=tab[i];你是不是少寫了什么?
如果步進電機真的還是不能動,你可以看下步進電機的工作參數,是不是頻率什么的不符合電機的要求。
回復

使用道具 舉報

7#
ID:789121 發表于 2020-7-26 11:32 | 只看該作者
Irvingzong 發表于 2020-7-26 09:20
我寫的這個程序電機轉不起來,大佬們幫我看下哪里出問題了好嗎
#include //包含頭文件,一般情況不需要 ...

建議先看一下步進電機的驅動方式 接線 原理
回復

使用道具 舉報

8#
ID:808485 發表于 2020-7-27 18:33 | 只看該作者
我看不見你上傳的圖片,但根據程序可以推斷一二:
1。單片機P0^0到P0^3對應步進電機的4根線(中間經過功率放大)
2。單片機P2^2應該是接了個LED之類的東西,用來指示電機運轉狀態,閃爍表示在轉


程序分析:
你仔細看這個 tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
共8個數,把數據用二進制表示:
0001
0011
0010
0110
0100
1100
1000
1001
這4位二進制數,從P0^0到P0^3送出到電機的4根線:我們假設是 A B C D 四根線。




先講解一下二相四線步進電機工作原理:
我畫一個示意圖,@@@@表示線圈,AB是一伙,CD是一伙,NNN+SSS是磁鐵:


DBCA=0001,電流從A流向B,磁鐵N極指向1號線圈方向
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |       N       | |
      | |       N       | |
      @ |       +       | @
      2 |       S       | 4
      @ |       S       | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0011,電流從A流向B,但同時C到D也有電流,這時磁鐵N極同時被1號2號線圈吸引,只好處于中間位置
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |   N           | |
      | |     N         | |
      @ |       +       | @
      2 |         S     | 4
      @ |           S   | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0010,電流從C流向D,磁鐵N極指向2號線圈
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |               | |
      | |               | |
      @ |               | @
      2 | NNNN  +  SSSS | 4
      @ |               | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0110,電流從C流向D,同時B流向A,磁鐵N極同時被2號3號線圈吸引
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |           S   | |
      | |         S     | |
      @ |       +       | @
      2 |     N         | 4
      @ |   N           | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+




DBCA=0100,電流從B流向A,磁鐵N極指向3號線圈
D-------------------------+
A------------@@@1@@@----+ |
B-------+               | |
C-----+ |       S       | |
      | |       S       | |
      @ |       +       | @
      2 |       N       | 4
      @ |       N       | @
      | |               | |
      | +----@@@3@@@----+ |
      +-------------------+


看出規律了吧?就這樣繼續轉下去,轉一圈,剛好共8個方向,剛好對應 tab[]里面8個數。
如果上面的示意圖明白了,那讓電機反轉,只要從最后一張圖往上看起就好了,在程序中更爽,++變--搞定。


你的程序該有的都有了,看得出來,是從別處搬來的,只是tab抄漏了個[ i]呵呵,別生氣。[ i]
程序只有一處錯誤:
{i++;if(i>7)i=0;P0=tab[ i];}                     //用示波器可看到方波輸出
回復

使用道具 舉報

9#
ID:808485 發表于 2020-7-27 19:23 | 只看該作者
網站設計的不夠好,回帖字體無效。試試圖片吧。


另外來個附加題,如果P2^2不是接LED,那可能是做什么的?
答:真要那樣的話,那這方案設計者,是個合格的電子工程師。
1。眾所周知,步進電機走的時候,電能轉換為機械能出去了,但停的時候呢?上面那個tab[]表,只有8個數,沒有0000的存在,就是說,電機會停到其中一個位置,線圈一直通著電,沒有機械能輸出,那電能就全部轉化為熱能了,電機變燒雞。
2。解決上述問題,有幾個技術層次:
1).停機時,輸出全0000或者全1111,就沒電流消耗了
2).以上考慮不周,有時電機停車時需要有一個保持力矩,不能斷電,但這時仍有兩種選擇,停車在兩相線圈都通電狀態,力大發熱也大,停在一相線圈通電狀態發熱小,可以看需要選擇。
3).進階的,當電機再次啟動時,由靜止到運動,需要克服一個額外的靜摩擦力,這時需要更大的力,也就是雙相驅動,所以程序設計中,就需要在上次停車時,讓電機停在單相通電狀態。因為電機轉動是一二一二一二的順序,這樣就可以實現用二啟動了。
4).繼續進階,如果程序員不懂電子,不懂電機,是個新手,做為硬件工程師怎么做?有辦法,加個單穩電路,像看門狗一樣,看著電機,讓程序員在電機程序里面喂狗,一旦程序死機了,跑飛了,進斷點了,刷固件了的時候,硬件看門狗切斷電機電源,防止電機燒毀。單穩電路沒多復雜,一個“通交隔直”的電容接個三極管就OK了。
這也就是P2^2的另一種用途猜想。

回復

使用道具 舉報

10#
ID:801878 發表于 2020-7-28 09:59 | 只看該作者
PWN控制,程序里面可以設置speed
回復

使用道具 舉報

11#
ID:808700 發表于 2020-7-28 10:08 | 只看該作者
對一下手冊,
回復

使用道具 舉報

12#
ID:797796 發表于 2020-7-28 10:25 | 只看該作者
gbchang 發表于 2020-7-27 19:23
網站設計的不夠好,回帖字體無效。試試圖片吧。

非常感謝大佬的耐心解答!我能夠理解了基本原理,只是還有一個問題是我只需要簡單實現這個二相電機以10mm/s的線速度運行,也就是每秒轉2.5圈,而電機的步距角是0.9度,所以我的想法是每400ms定時一次轉一圈,可我仿真時把電機設為0.9度之后發現電機只在小幅度范圍轉動,幾乎不動,不知道是不是定時的方式不對呢?程序如下,希望大佬能幫忙看下,十分感謝!
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar tab[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};   
unsigned char count,i;
void Init_Timer0(void)
{
        TMOD |= 0x01;                                         
        TH0=(65535-20000)/256;         
        TL0=(65535-20000)%256;
        EA=1;                         //總中斷打開
        ET0=1;                        //定時器中斷打開
        TR0=1;                        //定時器開關打開
}
main()
{
        Init_Timer0();
        while(1)
        {
                ;
        }
}

void Timer0_isr(void) interrupt 1
{

        TH0=(65535-20000)/256;                 
        TL0=(65535-20000)%256;            
        count++;
        if(count==20)
        {
        count=0;
                {i++;if(i>7)i=0;P0=tab;}
        }
}
回復

使用道具 舉報

13#
ID:797796 發表于 2020-7-28 10:27 | 只看該作者
圖片如下

電機.PNG (63.89 KB, 下載次數: 64)

電機.PNG
回復

使用道具 舉報

14#
ID:797796 發表于 2020-7-28 15:16 | 只看該作者
Irvingzong 發表于 2020-7-28 10:25
非常感謝大佬的耐心解答!我能夠理解了基本原理,只是還有一個問題是我只需要簡單實現這個二相電機以10mm ...

有的,只是復制不上來,現在電機能轉了,主要是0.9步距角轉的很慢,不能實現每秒2.5圈,但修改定時器時長又導致失步,應該怎么修改呢?
回復

使用道具 舉報

15#
ID:808485 發表于 2020-7-28 16:31 | 只看該作者
Irvingzong 發表于 2020-7-28 10:25
非常感謝大佬的耐心解答!我能夠理解了基本原理,只是還有一個問題是我只需要簡單實現這個二相電機以10mm ...

。。。,也就是每秒轉2.5圈,而電機的步距角是0.9度,所以我的想法是每400ms定時一次轉一圈,。。。

進一次中斷只轉一步,轉一步是0.9度。

如果要每秒轉2.5圈,就是 2.5圈*360度=900度,
900度/0.9度每步 = 1000步,
所以,你需要每秒中斷1000次,剛好是 1ms 一次中斷

另外你的源碼可能由于字體等原因,在網站顯示不正常,我重新抄一遍給你:
count++;
if(count == 20)
{
    count = 0;
    P0 = tab[i++];
    i &= 0x07;
}
回復

使用道具 舉報

16#
ID:750684 發表于 2020-9-7 08:26 | 只看該作者
參考手冊資料
回復

使用道具 舉報

17#
ID:106821 發表于 2020-9-15 14:44 | 只看該作者
電機轉速控制取決于定時器產生的脈沖
回復

使用道具 舉報

18#
ID:737842 發表于 2020-9-16 11:29 | 只看該作者
脈沖的頻率控制速度,脈沖的數量控制位移
回復

使用道具 舉報

19#
ID:276685 發表于 2020-9-16 20:34 | 只看該作者
51黑論壇_s型加減速.rar (1.97 MB, 下載次數: 6)
附錄資料.pdf (152.63 KB, 下載次數: 7)

希望這些可以幫到你
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表