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

標題: 51單片機控制步進電機的問題 [打印本頁]

作者: Irvingzong    時間: 2020-7-25 20:30
標題: 51單片機控制步進電機的問題
關于用51單片機控制步進電機速度和直線位移的問題,要求用定時器產生脈沖,還要先設置好運動的速度再運行,新手沒用單片機控制過電機,按照以下要求應該怎么去實現呢?

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

電機.PNG

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

步進.PNG

作者: 不要黑    時間: 2020-7-26 01:13
所以是你要讓別人幫你做這個項目么?
作者: Irvingzong    時間: 2020-7-26 07:36
不要黑 發表于 2020-7-26 01:13
所以是你要讓別人幫你做這個項目么?

提供下思路
作者: Irvingzong    時間: 2020-7-26 07:56
不要黑 發表于 2020-7-26 01:13
所以是你要讓別人幫你做這個項目么?

主要是不知道怎么控制電機轉速固定,比如每秒轉2.5圈
作者: Irvingzong    時間: 2020-7-26 09:20
Irvingzong 發表于 2020-7-26 07:36
提供下思路

我寫的這個程序電機轉不起來,大佬們幫我看下哪里出問題了好嗎
#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;}                     //用示波器可看到方波輸出
        }
}
作者: wufeng391    時間: 2020-7-26 10:09
我覺得你的P0可能是步進電機的驅動端口吧,所以P0=tab[i];你是不是少寫了什么?
如果步進電機真的還是不能動,你可以看下步進電機的工作參數,是不是頻率什么的不符合電機的要求。
作者: 不要黑    時間: 2020-7-26 11:32
Irvingzong 發表于 2020-7-26 09:20
我寫的這個程序電機轉不起來,大佬們幫我看下哪里出問題了好嗎
#include //包含頭文件,一般情況不需要 ...

建議先看一下步進電機的驅動方式 接線 原理
作者: gbchang    時間: 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];}                     //用示波器可看到方波輸出

作者: gbchang    時間: 2020-7-27 19:23
網站設計的不夠好,回帖字體無效。試試圖片吧。


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


作者: 樂兒翅    時間: 2020-7-28 09:59
PWN控制,程序里面可以設置speed
作者: lxbhcy    時間: 2020-7-28 10:08
對一下手冊,
作者: Irvingzong    時間: 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;}
        }
}

作者: Irvingzong    時間: 2020-7-28 10:27
圖片如下

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

電機.PNG

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

有的,只是復制不上來,現在電機能轉了,主要是0.9步距角轉的很慢,不能實現每秒2.5圈,但修改定時器時長又導致失步,應該怎么修改呢?
作者: gbchang    時間: 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;
}
作者: 跟愛的感覺走    時間: 2020-9-7 08:26
參考手冊資料
作者: gfshao    時間: 2020-9-15 14:44
電機轉速控制取決于定時器產生的脈沖
作者: sdragon0214    時間: 2020-9-16 11:29
脈沖的頻率控制速度,脈沖的數量控制位移
作者: fbn20050523    時間: 2020-9-16 20:34
51黑論壇_s型加減速.rar (1.97 MB, 下載次數: 6)
附錄資料.pdf (152.63 KB, 下載次數: 7)

希望這些可以幫到你





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1