求单片机c语言控制步进电机调速程序

求单片机c语言控制步进电机调速程序,第1张

给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:

#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语言驱动程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9349426.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存