如題,想通過調節電位器的阻值配合ad0804芯片和單片機來空控制步進電機旋轉的角度。電路部分如下
aa.png (110.23 KB, 下載次數: 165)
下載附件
2011-11-11 07:34 上傳
左邊只用到電位器了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;
}
}
}
}
|