找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10258|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

小弟想通過調(diào)節(jié)電位器的阻值配合51單片機(jī)來控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)角度

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:29221 發(fā)表于 2011-11-11 07:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

如題,想通過調(diào)節(jié)電位器的阻值配合ad0804芯片和單片機(jī)來空控制步進(jìn)電機(jī)旋轉(zhuǎn)的角度。電路部分如下

左邊只用到電位器了2和4接上。
然后單片機(jī)的P1.0----P1.3口接步進(jìn)電機(jī)驅(qū)動(dòng)板,驅(qū)動(dòng)板使用的是uln2003芯片,ad數(shù)據(jù)送到P2口。

通過別人指點(diǎn)和自己理解寫了下面的程序。不知道正確否,希望大家?guī)蛶兔。我也知道?yīng)該盡力自己發(fā)現(xiàn)并解決問題,這次真不會(huì)。

 //use adc0804 and cs51 to control the motor 
*************************
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit adcs=P3^5;
sbit adrd=P3^0;
sbit adwr=P3^3;
     
/*sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;*/
unsigned char code tab[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反轉(zhuǎn) A-AB-B-BC-C-CD-D-DA (即一個(gè)脈沖,轉(zhuǎn) 3.75 度)       
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正轉(zhuǎn)


void delay50us(uint i)
{
      uchar j;
 for(i=0;i>0;i--)
           for(j=6245;j>0;j--);
} 

 


void main()
{


   
   
  while(1)  
    {   
       
         uchar value,a,k,l,m,n,s,t,w,o,b,c;
         adcs=0;
         adwr=0;
         delay50us(2);
         adwr=1;
         adcs=1;
         delay50us(10);
         adcs=0;
         adrd=0;
         delay50us(1);
         value=P2;//000--255八位ad范圍0000 0000~~1111 1111
         adrd=1;
         adcs=1;
      
         k=value/3;//每增加3,步進(jìn)電機(jī)走一拍
         l=value%3;//肯定小于3不用考慮
         n=k/8;//可以轉(zhuǎn)幾個(gè)八拍
         s=k%8;
         t=s/3;
  
         a=P2;//此行和下面兩行是用來判斷電位器變大還是變小
         delay50us(5);//延時(shí)
         b=P2;
        if((c-b)<0)  //如果電位器阻值變大
         {


             if(k>8)//不夠八拍或者超過八拍兩種情況
             a=1;
             else
             a=0;
             switch(a)
            {
                       case 0:
                      for(m=0;m<k-1;m++) 
                          {
                                   P1=tab[m];
                                   delay50us(50);
    
                          }  
                          break;

                       case 1:
        
                         while(n--)
                              {
                                   for(o=0;m<8;o++) 
                                       {
                                            P1=tab[o];
                                           delay50us(5);
                                       }
                                }
                      for(w=0;w<t-1;w++) 
                          {
                                 P1=tab[w];
                                 delay50us(50);
    
                          } 
        
                          break;

             }
   

          

        }

        else if((c-b)>0) //如果電位器阻值變小
       
          { 
                if(k>8)
                a=1;
                else
                a=0;
                  switch(a)
                      {
                           case 0:
                           for(m=0;m<k-1;m++) 
                               {
                                     P1=ffz[m];
                                     delay50us(50);
    
                                 }  
                                  break;

                           case 1:
        
                            while(n--)
                                  {
                                          for(o=0;m<8;o++) 
                                             {
                                                  P1=ffz[o];
                                                  delay50us(5);
                                  }
                       }
                        for(w=0;w<t-1;w++) 
                             {
                                    P1=ffz[w];
                                     delay50us(50);
    
                               } 
        
                               break;

                      }
   

             }         

      }

 

 }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:29221 發(fā)表于 2011-11-11 19:24 | 只看該作者

大家提提意見吧

回復(fù)

使用道具 舉報(bào)

板凳
ID:20559 發(fā)表于 2011-11-12 16:39 | 只看該作者
1,AD0804 是需要驅(qū)動(dòng)程序的,你先寫好驅(qū)動(dòng)程序,控制AD采集電阻值,這是一個(gè)uchar型的。每次讀取這個(gè)值就是你程序中的C值 2,需要修正你的采集值精度 3,學(xué)會(huì)封裝函數(shù) 4,你要控制轉(zhuǎn)的角度應(yīng)該是一個(gè)相對角度吧。這個(gè)你要做一個(gè)比例。例如電阻是是10K,對應(yīng)AD采樣為256,調(diào)節(jié)到1K,就是256/10,AD采樣值這個(gè)取實(shí)際采樣值A(chǔ)D_NUM2.然后用之前的測試AD值和當(dāng)前的AD_NUM2比較,然后按照你的程序中的意圖實(shí)現(xiàn)你的功能。 5,AD0804精度太低了,這個(gè)出來效果應(yīng)該不太好。不過可以實(shí)現(xiàn)簡單的功能。
回復(fù)

使用道具 舉報(bào)

地板
ID:29221 發(fā)表于 2011-11-12 17:20 | 只看該作者

非常感謝你 ,我自己難以發(fā)現(xiàn)不足,按照您說的,我好好研究研究。

回復(fù)

使用道具 舉報(bào)

5#
ID:192615 發(fā)表于 2017-5-7 15:12 | 只看該作者

可惜沒有電路圖!
回復(fù)

使用道具 舉報(bào)

6#
ID:197750 發(fā)表于 2017-5-7 15:22 | 只看該作者
這個(gè)貌似不太懂
回復(fù)

使用道具 舉報(bào)

7#
ID:326699 發(fā)表于 2018-5-16 10:37 | 只看該作者
樓主方便發(fā)一下完整的,電路嗎,我也真在做電機(jī)的角度控制,可以交流下嗎,等你留言
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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