做了一个自由摆平板控制,程序没调出来求高手帮忙,
原理:用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);
}
} |