找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)按鍵控制步進(jìn)電機(jī)不能準(zhǔn)確實(shí)現(xiàn),求高人指點(diǎn)

[復(fù)制鏈接]
ID:610895 發(fā)表于 2019-9-25 11:35 | 顯示全部樓層 |閱讀模式
STC89C52,以下程序可以仿真運(yùn)行,就是用按鍵改變頻率和脈沖數(shù)量不能準(zhǔn)確實(shí)現(xiàn),頻率加可以循環(huán),頻率減也可以,而且不準(zhǔn)確。角度加按到最后就直接成單一電平,不再變化,角度減按下就直接成單一電平,不能再變化。本人初學(xué)C語(yǔ)言,求高人指點(diǎn)問(wèn)題出在哪里?是參數(shù)設(shè)置和單片機(jī)不匹配還是程序不完善?
#include reg52.h //這是一個(gè)按鍵驅(qū)動(dòng)步進(jìn)電機(jī)的程序
sbit k1=P1^2;//k1按下執(zhí)行void Manual();
sbit k9=P3^1; //頻率減
sbit k10=P3^0;  //頻率加
sbit k11=P2^7;//角度加
sbit k12=P2^6;//角度減

sbit PWM=P2^3;//pwm輸出
sbit DIR=P2^4;//換向電平輸出
sbit EN=P2^5;//電機(jī)使能

unsigned int i,tt=1500,step=50;定義變量,tt用來(lái)確定頻率,step用來(lái)確定脈沖數(shù)量
void keyscan();//按鍵k1檢測(cè)
void keyscan1();//按鍵k9~k12檢測(cè)

void Manual();步進(jìn)電機(jī)手動(dòng)控制程序
void shoudong();//手動(dòng)程序調(diào)用開(kāi)中斷程序
void main(void)//主程序,主要是按鍵k1檢測(cè)
{
        while(1)
{
        keyscan();
}
}

void keyscan()
{
while(1)
{
        if(k1==0)        Manual();
}

}
void keyscan1()//按鍵k9~12檢測(cè)程序及改變tt、step的值
{
while(1)
{        
        if(k9==0)
                {
                tt < 1500;
                tt=tt+100;//tt初始值設(shè)置為1500,這是減速語(yǔ)句,變化范圍1500~500
          }
        else if(k10==0)
        {        
                tt > 500;//這是加速語(yǔ)句
                tt=tt-100;
        }
        else if(k11==0)
        {
                step < 200;//step初始設(shè)置50,范圍50~200,實(shí)際測(cè)試50時(shí)25個(gè)脈沖
                step=step+50;
        }
        else if(k12==0)
        {
                step > 50;
                step=step-50;
        }
}
}

void Manual()
        {
                  while(1)
                        {
                        shoudong();
                        keyscan1();
                        keyscan();
      }                                
        }

void shoudong()
{
  TMOD=0x01;
  TH0=(65536-tt)/256;
  TL0=(65536-tt)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
void zhongduan( ) interrupt 1
{   
    TH0=(65536-tt)/256;
    TL0=(65536-tt)%256;
    PWM=~PWM;
          i++;
          if(i==step)
                {
     i=0;
                 DIR=~DIR;
    }
}

回復(fù)

使用道具 舉報(bào)

ID:235200 發(fā)表于 2019-9-25 12:13 | 顯示全部樓層
程序設(shè)計(jì)的按鍵進(jìn)行步進(jìn)增和減,首先要保證每一次按鍵只改變一次數(shù)據(jù),另外tt增減后建議進(jìn)行一次判斷,如果超過(guò)上限或下限值,要修改上限或下限值為初始值
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2019-9-25 12:41 | 顯示全部樓層
你的程序結(jié)構(gòu)很亂呀,KEYSCAN()調(diào)用了自己
回復(fù)

使用道具 舉報(bào)

ID:610895 發(fā)表于 2019-9-25 13:58 來(lái)自手機(jī) | 顯示全部樓層
tyrl800 發(fā)表于 2019-9-25 12:41
你的程序結(jié)構(gòu)很亂呀,KEYSCAN()調(diào)用了自己

單循環(huán)應(yīng)該沒(méi)影響
回復(fù)

使用道具 舉報(bào)

ID:610895 發(fā)表于 2019-9-25 13:59 來(lái)自手機(jī) | 顯示全部樓層
csmyldl 發(fā)表于 2019-9-25 12:13
程序設(shè)計(jì)的按鍵進(jìn)行步進(jìn)增和減,首先要保證每一次按鍵只改變一次數(shù)據(jù),另外tt增減后建議進(jìn)行一次判斷,如果超 ...

修改為上下限可以嗎?
回復(fù)

使用道具 舉報(bào)

ID:142699 發(fā)表于 2019-9-25 15:01 | 顯示全部樓層
建議去看一下PID算法控制相關(guān)的內(nèi)容,還有你這個(gè)按鍵沒(méi)防抖是肯定不行的- -
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-9-25 17:54 | 顯示全部樓層
樓主這個(gè)程序連正常運(yùn)行的最基本的條件都不具備,甚至離譜在子程序中調(diào)用自己,并且用了許多死循環(huán),竟然聲稱(chēng)可以仿真運(yùn)行。建議樓主找點(diǎn)相對(duì)成熟點(diǎn)的例程參考,基本讀懂別人的程序再自己寫(xiě)。
回復(fù)

使用道具 舉報(bào)

ID:610895 發(fā)表于 2019-9-25 23:04 來(lái)自手機(jī) | 顯示全部樓層
wulin 發(fā)表于 2019-9-25 17:54
樓主這個(gè)程序連正常運(yùn)行的最基本的條件都不具備,甚至離譜在子程序中調(diào)用自己,并且用了許多死循環(huán),竟然聲 ...

確實(shí)錯(cuò)了,復(fù)制粘貼時(shí)犯錯(cuò)了,那個(gè)按鍵檢測(cè)應(yīng)該是一個(gè)STOP函數(shù)
回復(fù)

使用道具 舉報(bào)

ID:610895 發(fā)表于 2019-9-26 14:13 來(lái)自手機(jī) | 顯示全部樓層
csmyldl 發(fā)表于 2019-9-25 12:13
程序設(shè)計(jì)的按鍵進(jìn)行步進(jìn)增和減,首先要保證每一次按鍵只改變一次數(shù)據(jù),另外tt增減后建議進(jìn)行一次判斷,如果超 ...

感謝指導(dǎo),現(xiàn)在加入延時(shí)和按鍵釋放判斷,程序完全正常!
回復(fù)

使用道具 舉報(bào)

ID:610895 發(fā)表于 2019-9-29 23:21 來(lái)自手機(jī) | 顯示全部樓層
已經(jīng)全部完成,感謝回復(fù)的各位!問(wèn)題處在程序沒(méi)有延時(shí)和檢測(cè)按鍵松開(kāi)的問(wèn)題上
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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