找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1537|回復(fù): 7
收起左側(cè)

單片機(jī)萬年歷和42步進(jìn)電機(jī)驅(qū)動問題

[復(fù)制鏈接]
ID:1051434 發(fā)表于 2023-4-3 21:33 | 顯示全部樓層 |閱讀模式
請各位大佬幫我看下這個程序怎么柔和,謝謝!
本人新學(xué)的單片機(jī),想著一邊實(shí)踐一邊學(xué)習(xí),我找了一個萬年歷的程序,可以正常使用了,又找了一個42步進(jìn)電機(jī)的驅(qū)動也可以正常使用的。
現(xiàn)在我想把這兩個程序弄在一起,就是萬年歷顯示的同時讓步進(jìn)電機(jī)也轉(zhuǎn)起來。
因?yàn)樵瓉硎莾蓚程序所以有兩個MIAN函數(shù),我現(xiàn)在弄在一起之后像下面這樣:
#include "public.h"
#include "calendar.h"
#include "motor.h"

  void delay(unsigned int x) // 延時函數(shù)
{
    unsigned int i,j;
    for(i=x;i>0;i--)
    {
        for(j=110;j>0;j--);
    }
}


void main()
{        
                 calendar_test();
        
        while(1)
        {



        }

}         

int motor()

{
while(1)
    {
        Z = 1; // 階段1:開啟A相
        delay(50); // 延時
        Z = 0; // 階段2:關(guān)閉A相
        M = 1; // 階段3:開啟B相
        delay(50); // 延時
        M = 0; // 階段4:關(guān)閉B相
        N = 1; // 階段5:開啟C相
        delay(50); // 延時
        N = 0; // 階段6:關(guān)閉C相
        L = 1; // 階段7:開啟D相
        delay(50); // 延時
        L = 0; // 階段8:關(guān)閉D相
}
return 0;
          }
編譯是沒有錯的,但是它只顯示萬年歷,步進(jìn)電機(jī)不轉(zhuǎn),我把int motor改為intmain上面的viod main隨便改個字母實(shí)現(xiàn)唯一main函數(shù)時它又是只有步進(jìn)電機(jī)轉(zhuǎn)而不顯示萬年歷了,請大神幫我看下問題出在哪里,怎么可以弄好,謝謝。


程序.7z

34.87 KB, 下載次數(shù): 6

回復(fù)

使用道具 舉報

ID:857072 發(fā)表于 2023-4-4 00:18 來自觸屏版 | 顯示全部樓層
兩個while(1)   前面一個進(jìn)去就出不來了后面都不會執(zhí)行了
回復(fù)

使用道具 舉報

ID:1033342 發(fā)表于 2023-4-4 06:37 | 顯示全部樓層
步進(jìn)電機(jī)是將電脈沖控制信號轉(zhuǎn)變?yōu)榻俏灰苹蚓位移的一種常用的數(shù)字控制執(zhí)行元件,又稱為脈沖電機(jī)。在驅(qū)動電源的作用下,步進(jìn)電機(jī)受到脈沖的控制,其轉(zhuǎn)子的角位移量和速度嚴(yán)格地與輸入脈沖的數(shù)量和脈沖頻率成正比。步進(jìn)電機(jī)每接收一個電脈沖,轉(zhuǎn)子就轉(zhuǎn)過一個相應(yīng)的角度(步距角)。改變通電順序可改變步進(jìn)電動機(jī)的旋轉(zhuǎn)方向;改變通電頻率可改變步進(jìn)電動機(jī)的轉(zhuǎn)速。因此,通過控制輸入電脈沖的數(shù)目、頻率及電動機(jī)繞組的通電順序就可以獲得所需要的轉(zhuǎn)角、轉(zhuǎn)速及轉(zhuǎn)向,利用單片機(jī)就可以很容易實(shí)現(xiàn)步進(jìn)電機(jī)的開環(huán)數(shù)字控制。
傳統(tǒng)的步進(jìn)電機(jī)控制方法是由觸發(fā)器產(chǎn)生控制脈沖來進(jìn)行控制的,但此種控制方法工作方式單一而且難于實(shí)現(xiàn)人機(jī)交互,當(dāng)步進(jìn)電機(jī)的參數(shù)發(fā)生變化時,需要重新進(jìn)行控制器的設(shè)計(jì)。因此適合于單片機(jī)控制,單片機(jī)通過向步進(jìn)電機(jī)驅(qū)動電路發(fā)送控制信號就能實(shí)現(xiàn)對步進(jìn)電機(jī)的控制。
步進(jìn)電機(jī)內(nèi)部實(shí)際產(chǎn)生了一個可以旋轉(zhuǎn)的磁場,如圖所示,當(dāng)旋轉(zhuǎn)磁場依次切換時,轉(zhuǎn)子(rotor)就會隨之轉(zhuǎn)動相應(yīng)的角度。當(dāng)磁場旋轉(zhuǎn)過快或者轉(zhuǎn)子上所帶負(fù)載的轉(zhuǎn)動慣量太大時,轉(zhuǎn)子無法跟上步伐,就會造成失步。
————————————————
回復(fù)

使用道具 舉報

ID:584814 發(fā)表于 2023-4-4 08:24 | 顯示全部樓層
while(1)這東東像黑洞,進(jìn)去了沒可能出來。
所以將所有你想while(1)的放在一起,while(1)只留一個。
回復(fù)

使用道具 舉報

ID:1051434 發(fā)表于 2023-4-4 20:49 | 顯示全部樓層
a185980800 發(fā)表于 2023-4-4 00:18
兩個while(1)   前面一個進(jìn)去就出不來了后面都不會執(zhí)行了

謝謝,可是改了一個weil還是只能運(yùn)行一個
回復(fù)

使用道具 舉報

ID:1051434 發(fā)表于 2023-4-4 20:49 | 顯示全部樓層
man1234567 發(fā)表于 2023-4-4 08:24
while(1)這東東像黑洞,進(jìn)去了沒可能出來。
所以將所有你想while(1)的放在一起,while(1)只留一個。

謝謝,改了試過了,還是一樣
回復(fù)

使用道具 舉報

ID:69038 發(fā)表于 2023-4-8 15:26 | 顯示全部樓層
。。。。
單步執(zhí)行一下,卡在這里了:

void calendar_test(void)
{
        u8 key_temp=0;

        lcd1602_init();
        ds1302_init();
        ds18b20_init();
        time0_init();//定時器10ms       
        while(1)   //<<<<<<<<<<<<<<<
        {
。。。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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