打印

基于自由摆的平板控制系统,求指教

[复制链接]
2726|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bylxy000|  楼主 | 2012-7-13 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了一个自由摆平板控制,程序没调出来求高手帮忙,
原理:用100K滑动变阻器做自由摆的转轴;用AD0804采集滑动变阻器电压变化,控制28byj48电机转动(电压变化的值存入数组ku【2】中;每次刷新ku[1];ku[0]-ku[1]判断电机是否转动),使自由摆摆动时平板总是与地面平行;
单片机;51,;电锯驱动:uln2003a; 电压:5V;滑动变阻器:100K,可转300°;步进脚:5.625°;
问题:数据采集之后电压有0.02的上下浮动,电机不驱动。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define S0 P0
#define S1 P1
#define S3 P3
uchar code table[]="dian ya wei";
uchar code table1[]=" :   ";
uint code ku[2]={0,0};    //存放2次电压变化数据
sbit lcdrs=P2^3;
sbit lcdrw=P2^4;
sbit lcde=P2^5;
sbit cs=P2^0;
sbit rd=P2^1;
sbit wr=P2^2;
sbit int0=P2^6;
sbit A1=P3^3; //定义步进电机连接端口
sbit B1=P3^4;
sbit C1=P3^5;
sbit D1=P3^6;

#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
uchar flag=1,max,i;
uint num,shuju,qian,bai,shi,ge,bj,bj1,bj2;
unsigned char Speed;
void write_1602(uint);
/************************************************/
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
     for(y=225;y>0;y--);
}
/************************************************/
/*------------------------------------------------
                    驱动电机
------------------------------------------------*/
void djqd1()
{
unsigned int i=1;//旋转一周时间
  Speed=8;
Coil_OFF
  while(i--)  //正向
   {         
      Coil_A1                //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
      DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                             //数字越小,转速越大,力矩越小
      Coil_B1
      DelayMs(Speed);
      Coil_C1
      DelayMs(Speed);
      Coil_D1
      DelayMs(Speed);
   }
while(1);
}
void djqd2()
{
unsigned int i=1;      //滑动变阻变化5°  电机旋转一次 为5.625°,
  Speed=8;
Coil_OFF
   i=1;
   while(i--)//反向
    {
     Coil_D1                //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
      DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                          //数字越小,转速越大,力矩越小
     Coil_C1
      DelayMs(Speed);
      Coil_B1
      DelayMs(Speed);
      Coil_A1
      DelayMs(Speed);
}
while(1);
}
void zhuanhuan()
{ uint *q=ku;
bj=qian*10000+bai*1000+shi*100+ge*10;  //电压转换为整数
if(flag==1)
{
  *q=bj;
  *(q++)=bj;
  flag=0;
}
else
  *(q++)=bj;
q=ku;
bj1=*q;
bj2=*(q++);
max=(bj1>bj2)?0:1;
if(max==0)
{         //比较2次电压变化差值
  if(bj1-bj2>=835)   //滑动变阻转1°电压变换 0.0167;5°=0.0835
  {
   *q=*(q++);
   djqd1();    //电机驱动
  }
}
if(max==1)
{
  if(bj2-bj1>=835)
  {
    *q=*(q++);
   djqd2();    //电机驱动
  }
}   
}
/*************************************************/
/*------------------------------------------------
                    LCD1602初始化
------------------------------------------------*/
void write_com(uchar com)
{
  lcdrw=0;
  lcdrs=0;
  lcde=0;
  S1=com;
  delay(5);
  lcde=1;
  delay(5);
  lcde=0;
}
void write_date(uchar date)
{
  lcdrw=0;
  lcdrs=1;
  S1=date;
  delay(5);
  lcde=1;
  delay(5);
  lcde=0;
}
void init()
{
   lcde=0;
   lcdrw=0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
   write_com(0x80+3);
   for(num=0;num<11;num++)
{
  write_date(table[num]);
  delay(30);
}  
write_com(0x80+0x40+4);
for(num=0;num<9;num++)
{
  write_date(table1[num]);
  delay(30);
}   
}
void write_1602(uint date)
{
  
qian=date/51;
        write_com(0xc6);
        write_date(0x30+qian);
        write_com(0xc7);
        write_date('.');
bai=date%51*10/51;
        write_com(0xc8);
        write_date(0x30+bai);
        shi=date%51*10%51*10/51;
write_com(0xc9);
        write_date(0x30+shi);
        ge=date%51*10%51*10%51*10/51;
write_com(0xca);
        write_date(0x30+ge);
write_com(0xcb);
        write_date('V');
zhuanhuan();      
}
/************************************************/
/*------------------------------------------------
                    数据采集
------------------------------------------------*/
void start_ad(void)
{
uint ad_date;
S0=0xff;
cs=0;
wr=0;
wr=1;
cs=1;
while(int0==1);
int0=0;
cs=0;rd=0;
delay(1);
ad_date=S0;
rd=1;cs=1;
write_1602(ad_date);     //数据送1602显示
}
/************************************************/
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main()
{   
  init();
  while(1)
  {
start_ad();   
delay(500);                     
  }      
}

相关帖子

沙发
bylxy000|  楼主 | 2012-7-13 11:43 | 只看该作者
测试过了 应该就是zhuanhuan()函数有问题了

使用特权

评论回复
板凳
bylxy000|  楼主 | 2012-7-13 15:30 | 只看该作者
自己搞定了
void zhuanhuan()
{        uint ku[2],*q=ku;
        bj=qian*10000+bai*1000+shi*100+ge*10;  //电压转换为整数
        if(flag==1)
        {
                *q=bj;
                *(q+1)=bj;
                flag=0;
        }
        else
                *(q+1)=bj;
        q=ku;
        bj1=*q;
        bj2=*(q+1);
        max=(bj1>bj2)?0:1;
        if(max==0)
        {                                                                              //比较2次电压变化差值
                if(bj1-bj2>=835)                                  //滑动变阻转1°电压变换 0.0167;5°=0.0835
                {
                        *q=*(q+1);
                        djqd1();                                              //电机驱动
                }
        }
        if(max==1)
        {       
                if(bj2-bj1>=835)
                {
                         *q=*(q+1);
                        djqd2();                                              //电机驱动
                        }
        }               
} 不能q++;数组要在函数里定义

使用特权

评论回复
地板
xbuner| | 2012-7-13 18:36 | 只看该作者
总是与地面平行是不行的。

使用特权

评论回复
5
bylxy000|  楼主 | 2012-7-14 09:03 | 只看该作者
5# xbuner
。。。倾斜一定角度? 我这个现在电压采集出来的数据总是 0.0几的波动,有的时候正好会影响电机

使用特权

评论回复
6
colin111111| | 2012-7-26 21:05 | 只看该作者
这个题,好难调的,lz调好,可否借小弟看看,我邮箱是460334310@qq.com

使用特权

评论回复
7
哎呦喂啊| | 2013-3-28 16:00 | 只看该作者
LZ,我现在也准备学习做这个,可否将资料发给我看看哈。。。灰常感谢啊!

使用特权

评论回复
8
wupian19910108| | 2013-10-27 11:15 | 只看该作者
楼主  那个硬币模块做出来没 你怎么控制步进电机的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

83

帖子

1

粉丝