找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9116|回复: 6
打印 上一主题 下一主题
收起左侧

小弟想通过调节电位器的阻值配合51单片机来控制步进电机转动角度

[复制链接]
跳转到指定楼层
楼主
ID:29221 发表于 2011-11-11 07:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

如题,想通过调节电位器的阻值配合ad0804芯片和单片机来空控制步进电机旋转的角度。电路部分如下

左边只用到电位器了2和4接上。
然后单片机的P1.0----P1.3口接步进电机驱动板,驱动板使用的是uln2003芯片,ad数据送到P2口。

通过别人指点和自己理解写了下面的程序。不知道正确否,希望大家帮帮忙。我也知道应该尽力自己发现并解决问题,这次真不会。

 //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}; //反转 A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)       
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转


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,步进电机走一拍
         l=value%3;//肯定小于3不用考虑
         n=k/8;//可以转几个八拍
         s=k%8;
         t=s/3;
  
         a=P2;//此行和下面两行是用来判断电位器变大还是变小
         delay50us(5);//延时
         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 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:29221 发表于 2011-11-11 19:24 | 只看该作者

大家提提意见吧

回复

使用道具 举报

板凳
ID:20559 发表于 2011-11-12 16:39 | 只看该作者
1,AD0804 是需要驱动程序的,你先写好驱动程序,控制AD采集电阻值,这是一个uchar型的。每次读取这个值就是你程序中的C值 2,需要修正你的采集值精度 3,学会封装函数 4,你要控制转的角度应该是一个相对角度吧。这个你要做一个比例。例如电阻是是10K,对应AD采样为256,调节到1K,就是256/10,AD采样值这个取实际采样值AD_NUM2.然后用之前的测试AD值和当前的AD_NUM2比较,然后按照你的程序中的意图实现你的功能。 5,AD0804精度太低了,这个出来效果应该不太好。不过可以实现简单的功能。
回复

使用道具 举报

地板
ID:29221 发表于 2011-11-12 17:20 | 只看该作者

非常感谢你 ,我自己难以发现不足,按照您说的,我好好研究研究。

回复

使用道具 举报

5#
ID:192615 发表于 2017-5-7 15:12 | 只看该作者

可惜没有电路图!
回复

使用道具 举报

6#
ID:197750 发表于 2017-5-7 15:22 | 只看该作者
这个貌似不太懂
回复

使用道具 举报

7#
ID:326699 发表于 2018-5-16 10:37 | 只看该作者
楼主方便发一下完整的,电路吗,我也真在做电机的角度控制,可以交流下吗,等你留言
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表