步进电机角度控制
- 格式:doc
- 大小:81.00 KB
- 文档页数:12
步进电机角度控制
1.编程控制步进电机顺时针行走,180度(角度显示在七段LED上),3秒后行走45度(显示角度),3秒后行走90度(显示角度),3秒后行走180度,依次循环。
#include
#define uchar unsigned char
#define uint unsigned int
#define PA 0x60
#define PB 0x61
#define PC 0x62
#define CTRL 0x63
uchar pai[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar teble[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint m=0;
uchar a3,a2,a1,a0=0;
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);}
}
void display()
{
outp(PA,teble[a0]);
outp(PB,0x07);
delay(10);
outp(PA,teble[a1]);
outp(PB,0x0b);
delay(10);
outp(PA,teble[a2]);
outp(PB,0x0d);
delay(10);
outp(PA,teble[a3]);
outp(PB,0x0e);
delay(10);
}
void zhuan(uint zz)
{
uint temp,i,j;
a3=zz/1000
a2=(zz%1000)/100;
a1=(zz%100)/10;
a0=(zz%10);
temp=(uint)(zz/15*4);
for(i=temp;i>0;i--)
{
for(j=3;j>0;j--)
display();
outp(PC,pai[m]);
m++;
if(m>7)
m=0;
}
}
void main()
{
int i;
outp(CTRL,0x88);
while(1)
{
zhuan(180);
for(i=75;i>0;i--)
display();
zhuan(45);
for(i=75;i>0;i--)
display();
zhuan(90);
for(i=75;i>0;i--)
display();
}
}
2.完成A/D转换实验并把转换结果在七段LED上显示出来。
#include
#define uchar unsigned char
#define uint unsigned int
#define PA 0x60
#define PB 0x61
#define PC 0x62
#define CTRL 0x63
#define AD 0x00
uchar pai[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; uchar teble[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uint m=0;
uchar a3,a2,a1,a0;
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);}
}
void display()
{
outp(PA,teble[a0]);
outp(PB,0x07);
delay(10);
outp(PA,teble[a1]);
outp(PB,0x0b);
delay(10);
outp(PA,teble[a2]);
outp(PB,0x0d);
delay(10);
outp(PA,teble[a3]);
outp(PB,0x0e);
delay(10);
}
void main()
{
int temp=0;
outp(CTRL,0x88);
while(1)
{
temp=inp(AD);
a3=0;
a2=0;
a1=temp/16;
a0=(temp%16);
display();
}
}
3.如实验指导书(3)。
#include
#define uchar unsigned char
#define uint unsigned int
#define PA 0x60
#define PB 0x61
#define PC 0x62
#define CTRL 0x63
#define AD 0x00
uchar pai[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转电机时序
uchar pai_fan[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转电机时序
uchar teble[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //数码管段选
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint jiao[]={0,0,0}; //贮存三次设置的电机角度
uint m=0; //记录电机相序
uint disp; //数码管显示的数值
uint set_flag,jiao_max,jiao_now,change_flag=1,zhuan_flag;
uint qian,bai,shi,ge;
void delay(uint xms) //延时函数,约一毫秒
{
uint i,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);}
}
void display() //显示子程序
{
uchar a3,a2,a1,a0;
uint temp1,temp;
if(change_flag==0) //如果change_flag=0;显示实时AD转换后对应的角度
{ //否则显示disp