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

標題: 51單片機+ULN2003為什么電機轉動不明顯 [打印本頁]

作者: 上好佳kkk    時間: 2025-9-13 14:55
標題: 51單片機+ULN2003為什么電機轉動不明顯
這是我的程序,電機會轉動,但是最快轉一圈用了10s,怎么讓它更快呢?定時器的時間也該過了,但是還是不快#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit jiasu = P3^2;    //加速
sbit jiansu = P3^3;   //減速
sbit begin = P3^0;    //開始
sbit fangxiang = P3^7; //方向鍵
sbit MOTOR_A=P1^0;
sbit MOTOR_B=P1^1;
sbit MOTOR_C=P1^2;
sbit MOTOR_D=P1^3;

                  
uchar code PHASE_CW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};   //四相八拍電平表
uchar code PHASE_CCW[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};
uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff };

bit fx_flag = 0;      // 方向標志位
uchar phase = 0;      // 當前相位
uint cycle_cnt = 0;   // 計數器
uint timelong =10; // 固定每個相位
uchar sudu = 0;       // 默認速度檔位
uchar sudu_num;       // 數碼管顯示
void motor_speed();         
volatile uchar phaseIndex = 0;  // 相序索引(全局變量,需加volatile)
volatile bit   direction  = 0;  // 轉向(全局變量)


         
void Timer0_Init(void)
{
    TMOD &= 0xF0;   // 清除T0模式
    TMOD |= 0x01;   // 設置T0為模式1(16位自動重裝)
    TH0 = 0xFC;     // 定時初值(1ms@12MHz)
    TL0 = 0x18;     // 65536 - 1000 = 64536 = 0xFC18
    ET0 = 1;       // 使能T0中斷
    TR0 = 1;       // 啟動T0
    EA  = 1;       // 使能總中斷
}

       
         
void Timer0_ISR(void) interrupt 1
{
    static uint cnt=0;
        TH0 = 0xFC;  // 重裝初值(1ms)
    TL0 = 0x18;
        cnt++;
        if(cnt>=timelong)
        {
                cnt=0;
    // 輸出當前相序電平
                if (direction == 0)
                {  // 正轉
                        switch (PHASE_CW[phaseIndex])
                        {
                                case 0x01: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=0; break;
                                case 0x03: MOTOR_A=1; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
                                case 0x02: MOTOR_A=0; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
                                case 0x06: MOTOR_A=0; MOTOR_B=1; MOTOR_C=1; MOTOR_D=0; break;
                                case 0x04: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=0; break;
                                case 0x0C: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=1; break;
                                case 0x08: MOTOR_A=0; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
                                case 0x09: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
                        }
                }
                        else
                        {  // 反轉
                                switch (PHASE_CCW[phaseIndex])
                                {
                                case 0x01: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=0; break;
                                case 0x09: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
                                case 0x08: MOTOR_A=0; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
                                case 0x0C: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=1; break;
                                case 0x04: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=0; break;
                                case 0x06: MOTOR_A=0; MOTOR_B=1; MOTOR_C=1; MOTOR_D=0; break;
                                case 0x02: MOTOR_A=0; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
                                case 0x03: MOTOR_A=1; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
                                }
                        }

                // 相序索引遞增(循環0~7)
                phaseIndex++;
                if (phaseIndex >= 8) phaseIndex = 0;
        }
}         
         
                  


void Delays(uint Xms)
{
    unsigned int i,j;
    for(i=Xms;i>0;i--)
        for(j=110;j>0;j--);
}


void keyscan()
{
    if(jiasu == 0)
    {
        Delays(5);
        if(jiasu == 0)
        {
            sudu++;
            if(sudu >= 5)  
                sudu = 4;
            motor_speed();  
            while(jiasu == 0);
        }            
    }
   
    if(jiansu == 0)
    {
        Delays(5);
        if(jiansu == 0)
        {   
            if(sudu > 0)
                sudu--;
            motor_speed();
            while(jiansu == 0);
        }        
    }
   
    if(begin == 0)
    {
        Delays(5);
        if(begin == 0)
        {   
            sudu = 2;  
            motor_speed();  
            while(begin == 0);  
        }
    }
   
    if(fangxiang == 0)
    {
        Delays(5);
        if(fangxiang == 0)
        {   
            fx_flag = ~fx_flag;
                        direction = fx_flag;  // 同步方向標志
            while(fangxiang == 0);
        }        
    }
}


void motor_speed()
{
    switch(sudu)
    {
        case 0:
            sudu_num = 1;
                        timelong = 20;  //最慢
            break;
        case 1:
            sudu_num = 2;  
                        timelong = 10;
            break;
        case 2:
            sudu_num = 3;  
                        timelong = 5;
            break;
        case 3:
            sudu_num = 4;
                        timelong = 3;
            break;
        case 4:
            sudu_num = 5;  
                        timelong = 1;  //最快
            break;        
    }
}

void main()
{
    motor_speed();
    Timer0_Init();  // 初始化定時器
    while(1)
    {
        keyscan();  // 循環掃描按鍵
    }
}



作者: 上好佳kkk    時間: 2025-9-13 17:15
補充:是步進電機
作者: rundstedt    時間: 2025-9-13 17:58
ULN2003只能接電壓控制的玩具級步進電機,本來就轉不快。
作者: keemee    時間: 2025-9-13 19:13
減速電機,要考慮減速比
作者: lei848200    時間: 2025-9-13 22:52
上好佳kkk 發表于 2025-9-13 17:15
補充:是步進電機

驅動電壓、電流是否足夠。不足的話容易失步。另步進電機好像有啟動頻率,啟動的時候頻率要低,后面逐步加速。


作者: a399288395    時間: 2025-9-14 07:50
電機是多少V, 供電電壓又是多少V?  如果是5V 是不是接的USB 5V, 功率不足;
作者: chchking    時間: 2025-9-14 15:18
脈沖數 驅動具力
作者: suncat0504    時間: 2025-9-14 15:45
步進電機轉動快慢,由兩個因素決定:
1、步進脈沖時序變化速度
2、步進電機自身的參數




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