
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
#include
unsigned
char
code
f_rotation[4]={0x08,0x10,0x20,0x40};//正转表格
unsigned
char
code
b_rotation[4]={0x40,0x20,0x10,0x08};//反转表格
void
delay(unsigned
int
i)//延时
{
while(--i);
}
main()
{
unsigned
char
i;
while(1)
{
for(i=0;i<4;i++)
//4相
{
p1=f_rotation[i];
//输出对应的相
可以自行换成反转表格
delay(500);
//改变这个参数可以调整电机转速
}
}
}
我给你一段作为参考,最近正在研究这个玩意。让步进电机转动很简单,最简单的方式就是依次给它的每一项一个脉冲(脉冲时间适具体情况而定)。首先这个程序是针对4项步进电机的,采用单4拍转动的方式。步进电机还有其他参数,比如转速等等,都要考虑在内。步进电机子程序放在定时器中断里面。不是特别精确。能用。里面设立了几个标志,你应该能看懂
void StepMotor(void) //步进电机子函数
{
//正转//
if (MOTORCONTROL==2)
{
if(motortime<3) //转的圈数。
{
motorABCD++;
switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式
{
case 2MS:
m1=0;
m2=1;
m3=1;
m4=1;
break;
case 3MS:
m1=1;
m2=0;
m3=1;
m4=1;
break;
case 4MS:
m1=1;
m2=1;
m3=0;
m4=1;
break;
case 5MS:
m1=1;
m2=1;
m3=1;
m4=0;
motortime++;
motorABCD=1MS;
break;
}
}
}
//反转//
if (MOTORCONTROL==1)
{
if(motortime<3) //转的圈数。
{
motorABCD++;
switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式
{
case 2MS:
m1=0;
m2=1;
m3=1;
m4=1;
break;
case 3MS:
m1=1;
m2=1;
m3=1;
m4=0;
break;
case 4MS:
m1=1;
m2=1;
m3=0;
m4=1;
break;
case 5MS:
m1=1;
m2=0;
m3=1;
m4=1;
motortime++;
motorABCD=1MS;
break;
}
}
}
if(motortime==3)
{
motortime=0;
MOTORCONTROL=0;
}
}//子函数结尾
void MOTOR() interrupt 3 //定时器1 中断程序
{
TH1=(65536-990)/256; /恢复计数初值/
TL1=(65536-990)%256;
StepMotor();
}
#include <AT89X51h>
static unsigned int count; //计数
static int step_index; //步进索引数,值为0-7
static bit turn; //步进电机转动方向
static bit stop_flag; //步进电机停止标志
static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快
static int spcount; //步进电机转速参数计数
void delay(unsigned int endcount); //延时函数,延时为endcount05毫秒
void gorun(); //步进电机控制步进函数
void main(void)
{
count = 0;
step_index = 0;
spcount = 0;
stop_flag = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFE;
TL0 = 0x0C; //设定时每隔05ms中断一次
TR0 = 1; //开始计数
turn = 0;
speedlevel = 2;
delay(10000);
speedlevel = 1;
do{
speedlevel = 2;
delay(10000);
speedlevel = 1;
delay(10000);
stop_flag=1;
delay(10000);
stop_flag=0;
}while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //设定时每隔05ms中断一次
count++;
spcount--;
if(spcount<=0)
{
spcount = speedlevel;
gorun();
}
}
void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}
void gorun()
{
if (stop_flag==1)
{
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
return;
}
switch(step_index)
{
case 0: //0
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 1: //0、1
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 2: //1
P1_0 = 0;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 3: //1、2
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 4: //2
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 0;
break;
case 5: //2、3
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 6: //3
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 7: //3、0
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
}
if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}
}
自己再稍微改动一下
sbit K1=P1^0;
sbit K2=P1^1;
char y=0;
while(1)
{
pangduan();
for(i=0;i<4;i++) //4相
{
/P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速
Delay(5000);/
P1=B_Rotation[i];
Delay(265+y);
P1=F_Rotation[i];
Delay(265+y);
}
}
void pangduan()
{
if(K1==0)
{ y++; //加
while(~k1)
}
if(K2==0)
{ y--;
while(~k2); //减
}
}
}
没有下上限 要是调的话 需要判断显示延时时间
我之前做过一个,步进电机模拟电梯运行的控制程序,是那种发一个信号走一步的那种,步进角比较大,好像是15度左右,我当时的做法就是加入系统延时,让程序给步进电机发送信号,通过控制延时来决定单位时间内步进电机转动的次数
我用的是永磁式步进电机,不知道你用的是什么样的,我使用的这种,步进角比较大,步进电机都是一步步转的,转快了就看不出步进电机是一步步转了
而当是步进电机正转是按这样的顺序发送信号,abcd,反转是dcba
转多少圈,就是循环给步进电机发送信号,使用程序控制发送信号的次数,至于怎么控制只要知道接口函数什么的还是不难的。
如果还是不大明白,我倒是可以帮你看看程序
中断2,启动-停止切换(通过切换flag_status),显示状态。do-while是延时。
中断1,计数器count增1,如果达到预设的数值tab[sp],计数器归零,标志flag置1。这个好像与速度有关。通过调整延时时间来调整速度。
中断0,读键盘。没有scan_key()的源代码,不知道里面有些什么 *** 作。
while(1){}循环是电机运转,flag_status是状态,1转动,0停止。
没有看到与正转反转有关的代码。也许在motor_cw_ccw();函数里面,这个就是电机动一下的函数。
原程序不完整,没有相应函数、变量的定义及意义说明。难以确切理解。
我有程序,电路图可以在程序中看出,
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^5;
uchar kz,i=200;
uchar zhengzhuan[]={0xf3,0xf9,0xfc,0xf6};
uchar fanzhuan[]={0xf3,0xf6,0xfc,0xf9};
void delay1ms(uint ms)
{
uchar i;
while(ms--)
{
for(i = 0; i<10; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void key()
{
if(key2==0)
{
delay1ms(10);
if(key2==0)
kz=1;
while(!key2)
{}
}
if(key3==0)
{
delay1ms(10);
if(key3==0)
kz=2;
while(!key3)
{}
}
}
void zz()//正转
{
uchar a=0,b=20;
while(kz==1)
{
P1=zhengzhuan[a];
a++;
if(a>3)
a=0;
i--;if(i==0)kz=0;
if(key1==0)
{
delay1ms(10);
if(key1==0)
{
kz=0;
P1=0xff;
while(!key1);
}
}
if(key2==0)
{
b=b+5;
if(b>=240)
b=240;
while(!key2)
{
}
}
if(key3==0)
{
b=b-5;
if(b<=20)
b=20;
while(!key3)
{
}
}
delay1ms(b);
}i=200;
}
void fz()//反转
{
uchar a=0,b=20;
while(kz==2)
{
P1=fanzhuan[a];
a++;
if(a>3)
a=0;
if(key1==0)
{
delay1ms(10);
if(key1==0)
{
kz=0;
P1=0xff;
}
}
if(key2==0)
{
b+=5;
if(b>=240)
b=240;
while(!key2)
{
}
}
if(key3==0)
{
b-=5;
if(b<=20)
b=20;
while(!key3)
{
}
}
delay1ms(b);
}
}
void main()
{
while(1)
{
key();
if(kz==0);
else if(kz==1)
zz();
else
fz();
}
}
这个要看你的电机驱动是什么了,不同的驱动电路或者驱动器的编程是不一样的#include#defineunitunsignedint#defineucharunsignedcharsbitkey=P1^1;//定义键盘接线口unsignedcharcodeF_Rotation[4]={0x01,0x02,0x04,0x08};//正转表uchara;voidDelay(unsignedinti)//延时{while(--i);}voidrun()//转11圈子程序{unsignedchari,j;for(j=0;j<176;j++){for(i=0;i<4;i++)//4相{P0=F_Rotation[i];//输出对应的相可以自行换成反转表格Delay(500);//改变这个参数可以调整电机转速}}}voidmain(){while(1){if(key==0){Delay(100);if(key==0){while(!key);run();}}}}转速你自己计算一下在改一下就好了
以上就是关于求单片机c语言控制步进电机调速程序全部的内容,包括:求单片机c语言控制步进电机调速程序、求一个C语言程序,用msp430控制步进电机启动,停止,正转和反转。在线等,急求,给高分~~、求at89s51控制四项四拍步进电机的c语言驱动程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)