步进电机加速减速正传反转程序

合集下载

PLC实现步进电机的正反转及调整控制

PLC实现步进电机的正反转及调整控制

实训课题三PLC实现步进电机正反转和调速控制一、实验目的1、掌握步进电机的工作原理2、掌握带驱动电源的步进电机的控制方法3、掌握DECO指令实现步进电机正反转和调速控制的程序二、实训仪器和设备1、FX2-48MR PLC 一台2、两相四拍带驱动电源的步进电机一套3、正反切换开关、起停开关、增减速开关各一个三、步进电机工作原理步进电机是纯粹的数字控制电动机,它将电脉冲信号转换成角位移,即给一个脉冲信号,步进电机就转动一个角度,图3-1是一个三相反应式步进电机结图。

从图中可以看出,它分成转子和定子两部分。

定子是由硅钢片叠成,定子上有六个磁极(大极),每两个相对的磁极(N、S极)组成一对。

共有3对。

每对磁极都绕有同一绕组,也即形成1相,这样三对磁极有3个绕组,形成三相。

可以得出,三相步进电机有3对磁极、3相绕组;四相步进电机有4对磁极、四相绕组,依此类推。

反应式步进电动机的动力来自于电磁力。

在电磁力的作用下,转子被强行推动到最大磁导率(或者最小磁阻)的位置,如图3-1(a)所示,定子小齿与转子小齿对齐的位置,并处于平衡状态。

对三相异步电动机来说,当某一相的磁极处于最大导磁位置时,另外两相相必处于非最大导磁位置,如图3-1(b)所示,即定子小齿与转子小齿不对齐的位置。

图3—1三相反应式步进电动机结构图把定子小齿与转子小齿对齐的状态称为对齿,把定子小齿与转子小齿不对齐的状态称为错齿。

错齿的存在是步进电机能够旋转的前提条件,所以,在步进电机的结构中必须保证有错齿的存在,也就是说,当某一相处于对齿状态时,其它绕组必须处于错齿状态。

本实验的电机采用两相混合式步进电机,其内部上下是两个磁铁,中间是线圈,通了直流电以后,就成了电磁铁,被上下的磁铁吸引后就产生了偏转。

因为中间连接的电磁铁的两根线不是直接连接的,是采用在转轴的位置用一根滑动的接触片。

这样如果电磁铁转过了头,原先连接电磁铁的两根线刚好就相反了,所以电磁铁的N极S极就和以前相反了。

c语言电动机正转反转程序,步进电机正反转和加速减速c源程序

c语言电动机正转反转程序,步进电机正反转和加速减速c源程序

c语⾔电动机正转反转程序,步进电机正反转和加速减速c源程序这是⼀个群⾥朋友发给我的步进电机实现正转反转和加速减速的单⽚机c语⾔源程序,这⾥给⼤家共享下,有需要的朋友直接复制到keil⾥编译就可以了,程序已测试成功。

/*****************************************单4拍正转 zheng[]={0x01,0x08,0x04,0x02}单4拍反转 fang[]={0x01,0x02,0x04,0x08}双4拍正转 zheng[]={0x09,0x0c,0x06,0x03}双4拍反转 fang[]={0x03,0x06,0x0c,0x09}单双8拍正转 zheng[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03}单双8拍反转 fang[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}*****************************************/#include"reg51.h"#include"intrins.h"#define uchar unsigned char#define uint unsigned intbit front_move,back_move;uchar jzaj(void); //单4拍正转 zheng[]={0x01,0x08,0x04,0x02}; 单4拍反转 fang[]={0x01,0x02,0x04,0x08};void ajcl(uchar jz);void delay(uchar del);uchar code zheng[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};uchar code fang[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};void timer0() interrupt 1{static uchar jz;TH0=0xfc;TL0=0x18;jz=jzaj();if(jz)ajcl(jz);}//步进电机正反转和加速减速程序void main(){uchar count=0;TMOD=0x01;TH0=0xFC;TL0=0x18;TR0=1;ET0=1;EA=1;while(1){if(front_move){P2=zheng[count];delay(100);count++;if(count==8) count=0;}if(back_move){P2=fang[count];delay(100);count++;if(count==8) count=0;}}}uchar jzaj(void){uchar hz,lz;P1=0xf0; //置所有⾏为低电平,⾏扫描,列线输⼊(此时)if((P1&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 0000),有往下执⾏{delay(10); //延时去抖动(10ms)if((P1&0xf0)!=0xf0) //再次判断列中是否是⼲扰信号,不是则向下执⾏{hz=0xfe; //逐⾏扫描初值(即先扫描第1⾏)while((hz&0x10)!=0) //⾏扫描完成时(即4⾏已经全部扫描完成)sccode为1110 1111 停⽌while程序{P1=hz; //输出⾏扫描码if ((P1&hz)!=hz) //***(P2&0xf0)!=0xf0***也可这样 本⾏有键按下(即P1(真实的状态)的⾼四位不全为1){lz=(P1&0xf0)|0x0f; //列while((P1&0xf0)!=0xf0);return((~hz)|(~lz)); //返回⾏和列break; //有按键返回 提前退出循环}else //所扫描的⾏没有键按下,则扫描下⼀⾏,直到4⾏都扫描,此时sccode值为1110 1111 退出while程序hz=_crol_(hz,1);//⾏扫描码左移⼀位}}}elsereturn 0; //⽆键按下,返回0}void ajcl(uchar jz){if(jz==0x11){back_move=0;front_move=1;}if(jz==0x21){front_move=0;back_move=1;}if(jz==0x41){P2=0x00;front_move=0;back_move=0;}}void delay(uchar del) {uchar i;for(;del>0;del--)for(i=0;i<125;i++) {;}}。

机电一体化设计 步进电机正反转及加减速设计 程序

机电一体化设计 步进电机正反转及加减速设计 程序

单片机课机电一体化课程设计题目:步进电机正反转及加减速设计专业:机械工程及自动化班级:机械092姓名:QCR学号:********指导教师:ZZY2012年6月23日目录1.设计目的 (1)2.题目及要求功能分析 (1)3.三相单、双六拍步进电机的结构和工作原理 (1)4. 步进电机的驱动电源 (2)5.设计方案 (3)5.1 整体方案 (3)5.2 具体方案 (4)6.硬件电路的设计 (4)6.1 硬件线路 (5)6.2 工作原理 (5)6.3 操作时序 (6)7. 软件设计 (6)7.1 软件结构 (6)7.2 程序流程 (6)7.3 源程序清单 (6)8. 系统仿真 (6)9. 设计总结 (7)参考文献 (8)附录 (一) (9)附录 (二) (10)附录 (三) (11)步进电机的正反转控制1.设计目的(1)熟练掌握机电一体化原理。

(2)综合运用51单片机的控制电路和最小系统。

(3)步进电机的正反转驱动负载。

2.设计题目及要求功能分析步进电机:步进电机是一种将电脉冲转化为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机可以作为一种控制用的特种电机,利用其精度高等特点,广泛应用于各种工业控制系统中。

3. 三相单、双六拍步进电机的结构和工作原理:三相单、双六拍步进电机通电方式:这种方式的通电顺序是:U -U V-V-VW-W-WU-U或为U-UW-W-WV-V-VU-U。

按前一种顺序通电,即先接通U相定子绕组;接着是U、V两相定子绕组同时通电;断开U相,使V相绕组单独通电;再使V、W两相定子绕组同时通电;W相单独通电;W、U两相同时通电,并依次循环。

电机正反转,加减速控制程序

电机正反转,加减速控制程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit PW1=P2^0 ;sbit PW2=P2^1 ; //控制电机的两个输入sbit accelerate=P2^2 ; //调速按键sbit stop=P2^3 ; //停止按键sbit left=P2^4 ; //左转按键sbit right=P2^5 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值uchar dflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}void time_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0 TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************//void keyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动end_turn;}if(left==0){TR0=1;dflag=1; //转向标志置位则左转}if(right==0){TR0=1;dflag=0; //转向标志复位则右转}if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60}if(count==2){t0=15000;t1=35000; //占空比为百分之70}if(count==3){t0=10000;t1=40000; //占空比为百分之80}if(count==4){t0=5000;t1=45000; //占空比为百分之90}if(count==5){count=0;}}}}。

51单片机控制步进电机的转动,加减速,停止,反转

51单片机控制步进电机的转动,加减速,停止,反转

#include <reg52.h>sbit inc=P3^2;sbit dec=P3^3;sbit zhzhd=P3^6;sbit fazhd=P3^7;bit flag=1;unsigned char t=0x00; //表正反速度void delay(unsigned int t);void motor_ffw();unsigned char code led7code[]={0x81,0xe7,0x92,0xc2,0xe4,0xc8,0x88,0xe3,0x00,0xc0};unsigned int num=0;unsigned char code FFW[8]={0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x48}; unsigned char code FFZ[8]={0x48,0x08,0x18,0x10,0x30,0x20,0x60,0x40}; //反转void main(){EA=1;IT0=1;EX0=1;IT1=1;EX1=1;TMOD=0x06;TL0=0xff;TH0=0xff;TR0=1;ET0=1;P3=0x3f;P0=led7code[num%10];while(1){motor_ffw();}}void motor_ffw() /* 步进电机驱动*/ //{unsigned char i;int j;while(1){for(j=0;j<12;j++) //12个周期转一圈{ for (i=0; i<8; i++) //一个周期转30度{if(flag==1)P2 = FFW[i]; //取数据elseP2 = FFZ[i];delay(t); //t调节转速}}}}void int0(void) interrupt 0{EX0=0;delay(10);if(inc==0){num++;P0=led7code[num%10];if(num%10!=0&&flag){zhzhd=0;fazhd=1;}else if (num%10==0){zhzhd=0;fazhd=0;}else {zhzhd=1;fazhd=0;}switch(num%10){case 0:t=0x00;break;case 1:t=0x12;break;case 2:t=0x11;break;case 3:t=0x10;break;case 4:t=0x09;break;case 5:t=0x08;break;case 6:t=0x07;break;case 7:t=0x06;break;case 8:t=0x05;break;case 9:t=0x04;break;}}while(!inc);EX0=1;}void int1(void) interrupt 2{EX1=0;delay(10);if(dec==0){num--;if(num==65535)num=65529;P0=led7code[num%10];if(num%10!=0&&flag){zhzhd=0;fazhd=1;}else if (num%10==0){zhzhd=0;fazhd=0;}else {zhzhd=1;fazhd=0;}if(num==65535)num=65529;switch(num%10){case 0:t=0x00;break;case 1:t=0x12;break;case 2:t=0x11;break;case 3:t=0x10;break;case 4:t=0x09;break;case 5:t=0x08;break;case 6:t=0x07;break;case 7:t=0x06;break;case 8:t=0x05;break;case 9:t=0x04;break;}}while(!dec);EX1=1;}void huanx(void) interrupt 1{ET0=0;TR0=0;delay(10);if(P3^4==0){if(flag==1) {flag = 0;zhzhd=1;delay(500);fazhd=0;} else {flag = 1;fazhd=1;delay(500);zhzhd=0;}}while(!(P3^4));ET0=1;TR0=1;}// 延时程序void delay(unsigned int t){unsigned int k;while(t--){for(k=0; k<80; k++);}}。

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。

所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图•注意:上图为共阳极接法,实际连接参考总体线路连接。

•驱动器信号端定义:PUL+:脉冲信号输入正。

( CP+ )PUL-:脉冲信号输入负。

( CP- )DIR+:电机正、反转控制正。

DIR-:电机正、反转控制负。

EN+:电机脱机控制正。

EN-:电机脱机控制负。

•电机绕组连接A+:连接电机绕组A+相。

A-:连接电机绕组A-相。

B+:连接电机绕组B+相。

B-:连接电机绕组B-相。

•电源连接VCC:电源正端“+”GND:电源负端“-”注意:DC直流范围:9-32V。

不可以超过此范围,否则会无法正常工作甚至损坏驱动器.•总体线路连接输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信号DIR+,DIR-③脱机信号EN+,EN-。

输入信号接口有两种接法,可根据需要采用共阳极接法或共阴极接法。

在这里我采用的是共阴极接法:分别将PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端);脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接入(不接也可,代码中未接,置空)。

按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。

注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路,以免损坏驱动器。

2、代码1.#include<reg51.h>2.#define MotorTabNum 53.unsigned char T0_NUM;4.sbit K1 = P3^5; // 启动5.sbit K2 = P3^4; // 反转6.sbit K3 = P3^3; // 加速7.sbit K4 = P3^2; // 减速8.sbit K5 = P3^1; //正反转9.10.sbit FX = P2^4; // 方向11.//sbit MotorEn = P2^5; // 使能12.sbit CLK = P2^6; // 脉冲13.14.inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};15.16.unsigned char g_MotorSt = 0; //17.unsigned char g_MotorDir = 0; //18.unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};19.20.signed char g_MotorNum = 0;21.22.void delayms(xms);23.void mDelay(unsigned int DelayTime);24.void T0_Init();25.26.void KeyScan(void);27.28.29.30.void main(void)31.{32.T0_Init();33.// MotorEn = 0; //34.FX = 0;35.while(1)36.{37.KeyScan(); //38.}39.40.41.}42.43.void T0_Init()44.{45.TMOD = 0x01;46.TH0 = (65535-100)/256; // 1ms47.TL0 = (65535-100)%256;48.EA = 1;49.ET0 = 1;50.// TR0 = 1;51.52.}53.54.void T0_time() interrupt 155.{56.// TR0 = 0;57.TH0 = (65535-100)/256;58.TL0 = (65535-100)%256;59.T0_NUM++;60.if(T0_NUM >= MotorTab[g_MotorNum]) //61.{62.T0_NUM = 0;63.CLK=CLK^0x01; //64.}65.// TR0 = 1;66.}67.68.69.//--------------------------70.void KeyScan(void)71.{72.if(K1 == 0)73.{74.delayms(10);75.if(K1 == 0)76.{77.g_MotorSt = g_MotorSt ^ 0x01;78.// MotorEn ^= 1;79.TR0 = 1;80.FX ^= 0; //反转81.}82.}83.84.if(K2 == 0)85.{86.delayms(10); //正转87.if(K2 == 0)88.{89.g_MotorDir = g_MotorDir ^ 0x01;90.FX ^= 1; //加速91.}92.}93.94.if(K3 == 0) //95.{96.delayms(5); //加速97.if(K3 == 0)98.{99.g_MotorNum++;100.if(g_MotorNum > MotorTabNum) 101.g_MotorNum = MotorTabNum; 102.}103.}105.if(K4 == 0) //106.{107.delayms(5); // 减速108.if(K4 == 0)109.{110.g_MotorNum--;111.if(g_MotorNum < 0)112.g_MotorNum = 0;113.}114.}115.116.if(K5 == 0) //117.{118.delayms(10); // 正反转119.if(K5 == 0)120.{121.g_MotorSt = g_MotorSt ^ 0x01; 122.g_MotorDir = g_MotorDir ^ 0x01; 123.MotorEn ^= 1;124.TR0 = 1;125.while(1)126.{127.FX ^= 1; //128.delayms(90000);129.FX ^= 0; //130.delayms(90000);131.}132.}133.}135.136.void delayms(xms)//延时137.{138.unsigned int x,y;139.for(x=xms;x>0;x--)140.for(y=110;y>0;y--);141.}3、常见问题解答•控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)自己写的,不规范还望包含,keil和protues文件单片机源程序如下:1.#include <reg52.h>2.3.#define uchar unsigned char4.#define uint unsigned int5.uint speed = 100; //初始转速6.uint max = 200; //最慢转速7.uint min = 20; //最快转速8.9.sbit swich = P2^0; //总开关10.sbit dir = P2^1; //电机旋转方向11.sbit le1=P2^6;12.sbit le2=P2^7;13.sbit speedadd=P3^2;14.sbit speedsub=P3^3;15.16.unsigned char uca_MotorStep[]={0x01,0x03,0x02,0x06, 0x04,0x0C,0x08,0x09}; //励磁电流数组。

17.18.19.uchar leddata[]={20.21.0x3F, //"0"22.0x06, //"1"23.0x5B, //"2"24.0x4F, //"3"25.0x66, //"4"26.0x6D, //"5"27.0x7D, //"6"28.0x07, //"7"29.0x7F, //"8"30.0x6F, //"9"31.0x40, //"-"32.0x00, //熄灭33.};34.35.36.void delay1ms(void) //误差 0us37.{38.unsigned char a,b,c;39.for(c=1;c>0;c--)40.for(b=142;b>0;b--)41.for(a=2;a>0;a--);42.}43.44.void delay(uint x ) //多功能毫秒延时45.{46.uint i;47.for(i=0;i<x;i++)48.{49.delay1ms();50.}51.}52.53.54.55.void display(void)56.{57.if(swich==1)58.{59.P0= leddata[11];60.delay(1);61.le2=1;62.le1=1;63.delay(1);64.le2=0;65.le1=0;66.67.}68.else69.{70.if(dir==1)71.{72.P0= leddata[11];73.delay(1);74.le2=1;75.delay(1);76.le2=0;77.}78.else79.{80.P0 =leddata[10];81.delay(1);82.le2=1;83.delay(1);84.le2=0;85.}86.87.P0=leddata[9-(speed-20)/20];88.delay(30);89.le1=1;90.delay(5);91.le1=0;92.93.}94.}95.96.97.void Init_INT0()98.{99.EX0=1; //开启外部中断 0100.IT0=1; //设置成低电平触发,1为下降沿触发101.EX1=1; //开启外部中断 1102.IT1=1; //设置成低电平触发,1为下降沿触发103.EA=1; //开启总中断104.}105.106.void Interrupt0_handler() interrupt 0107.{108.EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰109.delay(20); //同样是为了消除抖动而产生新的中断110.if(speed>min)111.{speed=speed-20;} //限制最快转速112.else113.{speed=min;}114.while(speedadd==0);115.EA=1; //恢复中断116.}117.118.119.void Interrupt1_handler() interrupt 2120.{121.EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰122.delay(20); //同样是为了消除抖动而产生新的中断123.if(speed<max)124.{speed=speed+20;}125.else126.{speed=max;} //限制最慢转速127.while(speedsub==0);128.EA=1; //恢复中断130.131.void main()132.{133.int i; //初始化134.dir=1;135.le1=0;136.le2=0;137.138.139.start:140.if(swich==0)141.{Init_INT0();} //总开关开启,初始化中断,开始转动142.else143.{display(); goto start; }144.145.146.if(dir==1)147.seq:148.{149.while(1)150.{151.display();152.for (i=0; i<8; i++)153.{154.P1 = uca_MotorStep[i]; //取数据155.delay(speed); //调节转速156.}157.if(dir==0) //是否换向159.delay(5); // 换向延时160.goto oppo; //换向161.}162.if(swich==1) //总开关运行中关闭163.goto start; //等待开启164.165.}166.167.}168.else169.oppo:。

步进电机调速程序

步进电机调速程序

/****************************************************************************** ******** 标题: 步进电机试验一**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)** J14短路冒需断开** 请学员一定要消化掉本例程********************************************************************************* *******/#include "reg52.h"//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动unsigned char MotorStep=0;unsigned int MotorTimer = 0;unsigned int MotorDelay,Speed=1,TIM,CT;/****************************************************** 初始化马达*******************************************************/void InitMotor(){F1 = 1;F2 = 1;F3 = 1;F4 = 1;}void SetMotor(){// if(Speed == 0) return;MotorDelay=Speed;switch(MotorStep){case 0:if(TIM) // A{F1 = 0; //0xf1F2 = 1;F3 = 1;F4 = 1;MotorStep = 1;TIM=0;}break;case 1: // ABif(TIM){F1 = 0; //0xf3F2 = 0;F3 = 1;F4 = 1;MotorStep = 2;TIM=0;}break;case 2: //Bif(TIM){F1 = 1;F2 = 0; //0xf2F3 = 1;F4 = 1;MotorStep = 3;TIM=0;}break;case 3: //BCif(TIM){F1 = 1;F2 = 0; //0xf6F3 = 0;F4 = 1;MotorStep = 4;TIM=0;}break;case 4: //Cif(TIM){F1 = 1;F2 = 1; //0xf4F3 = 0;F4 = 1;MotorStep = 5;TIM=0;}break;case 5: //CDif(TIM){F1 = 1;F2 = 1; //0xfcF3 = 0;F4 = 0;MotorStep = 6;TIM=0;}break;case 6: //Dif(TIM){F1 = 1;F2 = 1; //0xf8F3 = 1;F4 = 0;MotorStep = 7;TIM=0;}break;case 7: //DAif(TIM){F1 = 0;F2 = 1; //0xf9F3 = 1;F4 = 0;MotorStep = 0;TIM=0;}break;}}void system_Ini(){TMOD|= 0x11;TH0=0xDC; //11.0592MTL0=0x00;IE = 0x8A;TR0 = 1;}main(){ system_Ini();InitMotor();while(1){SetMotor();}}/************************************************* ** 定时中断延时*************************************************/void Tzd(void) interrupt 1{TH0 = 0xfe; //11.0592TL0 = 0x33;if( CT++==10){TIM=1;CT=0;}}/****************************************************************************** ******** 标题: 步进电机试验二**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)** J14短路冒需断开** 请学员一定要消化掉本例程*****************************************************************************************/#include "reg52.h"unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; void delay(unsigned int t);//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动void motor_ffw(){unsigned char i;for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]&0x1f; //取数据delay(5); //调节转速}}void delay(unsigned int t){unsigned int k;while(t--){for(k=0; k<60; k++){ }}}main(){while(1){motor_ffw();}}/****************************************************************************** ******** 标题: 步进电机试验三(加减速运行)**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)**** 请学员一定要消化掉本例程******************************************************************************** *******/#include "reg52.h"void delay();//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转unsigned int K, rate;/********************************************************** * * * 步进电机驱动* ***********************************************************/ void motor_ffw(){unsigned char i;for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]&0x1f; //取数据delay(); //调节转速}}/********************************************延时程序*********************************************/void delay(){unsigned int k,t;t=rate;while(t--){for(k=0; k<150; k++){ }}}/**********************************************************步进电机运行**********************************************************/ void motor_turn(){unsigned char x;rate=0x0a;x=0x40;do{motor_ffw(); //加速rate--;}while(rate!=0x01);do{motor_ffw(); //匀速x--;}while(x!=0x01);do{motor_ffw(); //减速rate++;}while(rate!=0x0a);}main(){while(1){motor_turn();}}/****************************************************************************** ********* 标题: 步进电机试验四**** 通过本例程了解步进马达使用及驱动程序编写** 双四拍工作方式:** AB-BC-CD-DA (即一个脉冲,转7.5 度)**** 请学员一定要消化掉本例程,********************************************************************************* *******/#include "reg52.h"//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动unsigned char MotorStep=0;unsigned int MotorTimer = 0;unsigned int TIM,CT;void InitMotor(){F1 = 1;F2 = 1;F3 = 1;F4 = 1;}void SetMotor(){// if(Speed == 0) return;switch(MotorStep){case 0:if(TIM){F1 = 0;F2 = 0;F3 = 1;F4 = 1;MotorStep = 1;TIM=0;}break;case 1:if(TIM){F1 = 1;F2 = 0;F3 = 0;F4 = 1;MotorStep = 2;TIM=0;}break;case 2:if(TIM){F1 = 1;F2 = 1;F3 = 0;F4 = 0;MotorStep = 3;TIM=0;}break;case 3:if(TIM){F1 = 0;F2 = 1;F3 = 1;F4 = 0;MotorStep = 0;TIM=0;}break;}}void system_Ini(){TMOD|= 0x11;TH0=0xDC; //11.0592MTL0=0x00;IE = 0x8A;TR0 = 1;}main(){ system_Ini();InitMotor();while(1){SetMotor();}}/************************************* [ t1 (0.5ms)中断] 中断中做PWM 输出------------1000/(0.02ms*250)=200Hz*************************************/ void Tzd(void) interrupt 1{TH0 = 0xfe; //11.0592TL0 = 0x33;if( CT++==20){TIM=1;CT=0;}}/****************************************************************************** ****** 标题: 步进电机试验五(正转一圈反转一圈)**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)**** 请学员一定要消化掉本例程********************************************************************************* *******/#include "reg52.h"void delay(unsigned int t);//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转unsigned int K;/*********************************************************************** ** 步进电机驱动** * ***********************************************************************/ void motor_ffw(){unsigned char i;unsigned int j;for (j=0; j<12; j++) //转1*n圈{for (i=0; i<8; i++) //一个周期转30度{if(K==1) P1 = FFW[i]&0x1f; //取数据if(K==2) P1 = FFZ[i]&0x1f;delay(5); //调节转速}}}/******************************************************** 延时程序*********************************************************/void delay(unsigned int t){unsigned int k;while(t--){for(k=0; k<80; k++){ }}}main(){while(1){K=1;motor_ffw();K=2;motor_ffw();} }。

单片机tb6600驱动步进电机正反转加减速应用案例

单片机tb6600驱动步进电机正反转加减速应用案例

单片机tb6600驱动步进电机正反转加减速应用案例TB6600是一款常见的步进电机驱动器,可以用来驱动步进电机进行正反转以及加减速。

以下是一个简单的应用案例,以单片机控制TB6600驱动步进电机为例,实现正反转和加减速。

硬件连接1. 单片机(如Arduino)连接到TB6600的信号输入端(A、B、C、D)。

2. 单片机连接到TB6600的使能端(Enable)。

3. 单片机连接到步进电机。

代码实现以下是一个简单的Arduino代码示例,用于控制步进电机正反转和加减速:```cppinclude <>// 定义步进电机参数const int motorPin1 = 2; // A端const int motorPin2 = 3; // B端const int motorPin3 = 4; // C端const int motorPin4 = 5; // D端const int enablePin = 6; // 使能端// 初始化步进电机对象Stepper stepper(200, motorPin1, motorPin2, motorPin3, motorPin4);void setup() {// 初始化串口通信(9600);}void loop() {// 正转加速到最大速度,然后减速到停止(5); // 设置初始速度为5步/秒(100); // 正转100步delay(500); // 等待500毫秒(减速时间)(200); // 设置最大速度为200步/秒(100); // 正转100步delay(500); // 等待500毫秒(减速时间)(5); // 设置速度为5步/秒(100); // 正转100步,然后停止delay(500); // 等待500毫秒(停止时间)// 反转加速到最大速度,然后减速到停止(5); // 设置初始速度为5步/秒(-100); // 反转100步delay(500); // 等待500毫秒(减速时间)(200); // 设置最大速度为200步/秒(-100); // 反转100步delay(500); // 等待500毫秒(减速时间)(5); // 设置速度为5步/秒(-100); // 反转100步,然后停止delay(500); // 等待500毫秒(停止时间)}```在这个例子中,我们使用了Arduino的`Stepper`库来控制步进电机。

步进电机程序

步进电机程序

/*本程序为步进电机控制程序步进电机步距角18°P1口低四位输出控制数码管共阳极P0为数据口P30~P32为位选个位~百位P33为标志正反转位三个独立按键P20~22 加减正反转切换键*/#include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit sum=P2^0; //加sbit inc=P2^1; //减sbit change=P2^2; //正反转uint T=300; //脉冲延时T毫秒uchar ledwx=0xfe; //位选数据///////////////////////////////// uchar sj=0x00; //段选数据uchar jj; //正转步数bit zd=0; //中断奇偶标志起记忆上一次按键标志bit zfo; //正反转上一次标志位bit zf=1; //正转标志位bit sum1=0; //加速标志位bit sumo; //加速键上一次记忆bit inco; //减速键上一次记忆bit inc1=0; //减速标志位uchar speed[4]={0}; //转速显示数据个十百位标志位uchar code LEDData[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //共阳极数码管表////////uchar code djz[4]={0x01,0x02,0x04,0x08}; //正时钟旋转相序表/*******************************/void count() //转速显示各数位的计算{uint n=0;n=3000/T; //转速speed[0]=n%10;speed[1]=(n/10)%10;speed[2]=n/100;if(zf)speed[3]=10;else speed[3]=11;}/*******************************/void init() //程序初始化开定时器中断{EA=1;ET0=1;TMOD=0x01;TH0=(65536-4608)/256; //定时5ms中断TL0=(65536-4608)%256;TR0=1;}/*******************************/void t0_time() interrupt 1 /////////////////////////{TH0=(65536-4608)/256; //定时5ms中断TL0=(65536-4608)%256;if(zd==0) // 记忆上一次按键标志{zfo=change;sumo=sum;inco=inc;} zd=~zd;if((zfo==change)&&(zfo==0)) //比较前5ms和现在是否一样为低电平,消除抖动zf=0;if((zfo==change)&&(zfo==1)) //比较前5ms和现在是否一样为低电平,消除抖动zf=1;if((sumo==sum)&&(sumo==0)){sum1=1;inc1=0;}if((inco==inc)&&(inc==0)){sum1=0;inc1=1;}P3=0xff; //数码管全灭P0=LEDData[speed[sj++]]; //送数据P3=ledwx; //点亮一个数码管ledwx=_crol_(ledwx,1);if(ledwx==0xef){ledwx=0xfe;sj=0;}}/*******************************/void delay1(uint i) //电机脉冲延时{uint j;for(;i>0;i--)for(j=114;j>0;j--);}/*******************************/void djzz() //电机正转{if(jj==4)jj=0;P1=djz[jj++];delay1(T);}/*******************************/void djfz() //电机反转{if(jj==0)jj=4;P1=djz[--jj];delay1(T);}/*******************************/void main(){init(); //初始化count();while(1){if(zf) //正转{if((sum1==1)&&(T>10)) //加速T--;if((inc1==1)&&(T<300)) //减速T++;djzz();}else //反转{if((sum1==1)&&(T>10)) //加速T--;if((inc1==1)&&(T<300)) //减速T++;djfz();}count();}}。

电子设备控制的步进电机正反转和加速减速C程序

电子设备控制的步进电机正反转和加速减速C程序

电子设备控制的步进电机正反转和加速减速C程序简介本文档介绍了如何使用C程序实现电子设备控制中步进电机的正反转和加速减速功能。

步骤以下是实现步进电机正反转和加速减速功能的步骤:1. 引入必要的库文件:在C程序中,首先需要引入适当的库文件来支持步进电机的控制功能。

2. 定义引脚:根据实际连接的硬件,定义步进电机相关的引脚。

3. 初始化引脚:在程序的开头部分,将步进电机相关的引脚初始化为适当的输入或输出。

4. 正转功能:编写代码来实现步进电机的正转功能,包括控制引脚的状态、延时等。

5. 反转功能:编写代码来实现步进电机的反转功能,包括控制引脚的状态、延时等。

6. 加速减速功能:编写代码来实现步进电机的加速减速功能,可以使用循环来实现逐渐增加或减少延时的效果。

7. 主程序:在主程序中调用以上功能函数,根据需要实现步进电机的正反转和加速减速。

8. 编译和调试:将代码编译为可执行文件,并在目标设备上进行调试和测试。

注意事项在编写和运行C程序时,需要注意以下事项:- 确保引脚定义正确:根据实际情况,确认步进电机相关的引脚定义是正确的。

- 调试和测试:在运行程序之前,可以先进行调试和测试。

可以逐步调试代码,确保每个功能都正常工作。

- 安全性考虑:在使用C程序控制电子设备时,需要考虑安全问题。

确保代码的执行不会对设备或人员造成危险。

结论本文档介绍了如何使用C程序实现电子设备控制中步进电机的正反转和加速减速功能。

按照以上步骤进行编码和调试,即可实现所需功能。

在编写和运行程序时,请注意相关安全事项。

PLC实现步进电机正反转和调速控制

PLC实现步进电机正反转和调速控制

PLC实现步进电机正反转和调速控制PLC(可编程逻辑控制器)是一种专门用于工业自动化控制系统的计算机控制设备。

它可以实现对多种设备和机器的控制,包括步进电机。

步进电机是一种通过步进角度来控制转动的电机,其转动可以精确地控制在每个步进角度停留一段时间。

步进电机的正反转和调速控制是实现工业自动化过程中常用的功能,PLC可以很好地实现这些控制。

一、步进电机的正反转控制步进电机的正反转控制是通过控制步进电机的相序来实现的。

步进电机有多种相序方式,常见的包括正向旋转、逆向旋转、双向旋转等。

PLC 可以通过控制步进电机的相序开关来实现步进电机的正反转。

在PLC中,可以使用PLC的输出口来控制步进电机的相序开关。

通过将输出口与步进电机的控制线路连接,可以控制相序开关的状态,从而控制步进电机的正反转。

例如,将PLC的一个输出口连接到步进电机的CW (Clockwise)输入线路,另一个输出口连接到步进电机的CCW(Counter Clockwise)输入线路,可以通过控制这两个输出口的状态来实现步进电机的正反转。

二、步进电机的调速控制步进电机的调速控制是通过控制步进电机的脉冲频率来实现的。

步进电机的转速与脉冲频率成正比,脉冲频率越高,步进电机的转速越快。

因此,通过控制PLC输出口给步进电机发送的脉冲频率,可以实现步进电机的调速控制。

在PLC中,可以使用定时器模块来控制步进电机的脉冲频率。

定时器模块可以通过设定计时器的定时时间和周期,来控制输出口的脉冲频率。

通过控制定时器的定时时间,可以控制步进电机每个步进角度的停留时间,从而控制步进电机的转速。

除了定时器模块,PLC还可以使用计数器模块来实现步进电机的调速控制。

计数器模块可以通过设定计数器的初始值和计数步长,来控制输出口的脉冲频率。

通过控制计数器的初始值和计数步长,可以控制步进电机每个步进角度的停留时间,从而实现步进电机的转速控制。

三、步进电机正反转和调速控制实例以下是一个使用PLC实现步进电机正反转和调速控制的实例。

步进电机加减速运行程C程序

步进电机加减速运行程C程序

1./******************************************************************/2./*****************************************************************/3./*4./* 步进电机加减速运行程序5./* 步进电机启动时,转速由慢到快逐步加速。

6./* 步进电机匀速运行7./* 步进电机由快到慢逐步减速到停止8./*9./******************************************************************/10.11.#include <reg52.h>12.#include <string.h>13.14.#define uchar unsigned char15.#define uint unsigned int16.17.sbit addr0 = P1^4;18.sbit addr1 = P1^5;19.sbit addr2 = P1^6;20.sbit addr3 = P1^7;21.22.uchar code FFW[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};//正转数组23.uchar code REV[8]={0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x0e};//反转数组24.uchar rate ;25./********************************************************/26./*27./* 延时28./* 11.0592MHz时钟,29./*30./********************************************************/31.void delay()32. {33. uchar k;34. uint s;36.do37. {38.for(s = 0 ; s <100 ; s++) ;39. }while(--k);40. }41.42.43.void delay2(uchar k)44. {45.46. uchar s;47.for(s = 0 ; s <k ; s++) ;48.49. }50.51./********************************************************/52./*53./*步进电机正转54./*55./********************************************************/56.void motor_ffw()57.{58. uchar i;59.60.for (i=0; i<8; i++) //一个周期转30度61. {62. P0 = FFW[i];//取数据63. addr0 = 1;64. addr1 = 0;65. addr2 = 1;66. addr3 = 1;67. addr3 = 0;68. delay(); //调节转速69. }70.}71.72./********************************************************/73./*74./*步进电机反转75./*76./********************************************************/77.void motor_rev()78.{80.81.for (i=0; i<8; i++) //一个周期转30度82. {83. P0 = REV[i]; //取数据84. addr0 = 1;85. addr1 = 0;86. addr2 = 1;87. addr3 = 1;88. addr3 = 0;89. delay(); //调节转速90. }91.}92.93./********************************************************94.*95.*步进电机运行96.*97.*********************************************************/98.void motor_turn()99.{100. uchar x;101. rate=0x30;102. x=0xf0;103.do104. {105. motor_ffw(); //正转加速106. rate--;107. }while(rate!=0x0a);108.109.do110. {111. motor_ffw(); //正转匀速112. x--;113. }while(x!=0x01);114.115.do116. {117. motor_ffw(); //正转减速118. rate++;119. }while(rate!=0x30);120.do121. {122. motor_rev(); //反转加速123. rate--;124. }while(rate!=0x0a);125.126.do127. {128. motor_rev(); //反转匀速129. x--;130. }while(x!=0x01);131.132.do133. {134. motor_rev(); //反转减速135. rate++;136. }while(rate!=0x30);137.}138.139./******************************************************** 140.* 141.* 主程序142.* 143.*********************************************************/ 144.main()145.{146.147. P1=0xf0;148.149.while(1)150. {151. P0 = 0x00;//ULN2003输出高电平152. addr0 = 1;153. addr1 = 0;154. addr2 = 1;155. addr3 = 1;156. addr3 = 0;157. delay2(255);158.159. motor_turn();160.161. }162.}。

步进电机完整程序

步进电机完整程序
MOV A,R7
ADD A,#12H
MOVC A,@A+DPTR
MOV P0,A //速度等级显示
MOV A,R3
MOVC A,@A+DPTR
JZ STA
MOV P1,A //P1.0--P1.3输出步进电机控制脉冲
CS: CJNE R7,#0,XIANSHI //速度显示初始化
CSZT:MOV R7,#5 //速度显示保护,初始状态
LJMP XIANSHI
YY:MOV R2,#1 //加速标志
JNB P2.4,YS1 //启停键按下,跳至防抖
LJMP PDR0 //判断R0奇偶性
SS:INC R0 //R0+1
LJMP PDR0 //判断R0奇偶性
MOV R0,#0 //启停标志
MOV R1,#0 //正反标志
MOV R7,#0 //速度控制及查表
MOV R3,#0 //查表
STA:
START:
JNB P2.5,YS2 //正反键按下,跳至防抖
LJMP PDR1 //判断R1奇偶性
TT:INC R1
LJMP PDR1 //判断R1奇偶性
FAN:CJNE R3,#09H,PDR3F //反转
FANZ:
MOV R3,#09H //反转查表初始化
LJMP XX //跳至判断加减速
ZHENG:CJNE R3,#8,PDR3Z //正转
MOV A,R7
MOV R6,A
LCALL DELAY //速度控制
MOV A,R6
MOV R7,A
INC R3
LJMP STA

PLC实现步进电机的正反转和调整控制

PLC实现步进电机的正反转和调整控制

PLC实现步进电机的正反转和调整控制PLC(可编程逻辑控制器)是一种电子设备,用于控制工业自动化系统中的运动和操作。

步进电机是一种常用的驱动器,它的旋转运动是通过一步一步地前进来实现的。

本文将探讨如何使用PLC来实现步进电机的正反转和调整控制。

步进电机的正反转控制是通过改变电机绕组的相序来实现的。

在PLC 中,我们可以使用输出模块来控制电机的相序。

以下是步骤:1.配置PLC硬件:在PLC中插入输出模块,并与电机的各个相连接。

确保正确连接。

2.编程PLC:使用PLC编程软件,编写一个控制程序来实现电机的正反转。

首先,定义输出模块的输出信号来控制电机。

然后使用程序语言来编写逻辑控制指令,根据需要来改变输出信号的状态。

为了实现正反转,需要改变输出信号的相序。

3.实现正反转控制:在编程中,定义一个变量来控制步进电机的运动方向。

当变量为正值时,电机正转;当变量为负值时,电机反转。

根据变量的值来改变输出模块的输出信号,以改变电机的相序。

4.运行程序:将PLC连接到电源,并加载程序到PLC中。

启动PLC,程序将开始运行。

通过改变变量的值,我们可以控制电机的正反转。

除了控制步进电机的正反转,PLC还可以实现步进电机的调整控制。

调整控制是通过改变电机的步距和速度来实现的。

以下是步骤:1.配置PLC硬件:在PLC中插入输出模块,并与电机的各个相连接。

与正反转控制相同,确保正确连接。

2.编程PLC:使用PLC编程软件编写控制程序。

首先,定义输出模块的输出信号来控制电机的相序。

然后,使用程序语言来编写逻辑控制指令,根据需要改变输出信号的状态。

为了实现调整控制,需要改变输出信号的频率和占空比。

3.实现调整控制:在编程中,定义两个变量来控制电机的步距和速度。

步距变量控制电机每一步的距离,速度变量控制电机的旋转速度。

根据变量的值来改变输出模块的输出信号,以改变电机的相序,并控制步距和速度。

4.运行程序:将PLC连接到电源,并加载程序到PLC中。

自动门控制的步进电机正反转和加速减速C程序

自动门控制的步进电机正反转和加速减速C程序

自动门控制的步进电机正反转和加速减速C程序步进电机的正反转和加速减速是实现自动门控制的关键功能。

通过编写C程序,我们可以实现对步进电机的控制,使其按照设定的方向旋转,并可以进行加速和减速操作。

步进电机正反转步进电机的正反转是通过控制电机的相序来实现的。

下面是一个简单的C程序示例,用于控制步进电机的正反转:include <stdio.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int direction = 1; // 1表示正转,-1表示反转// 正转if (direction == 1) {for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}// 反转else if (direction == -1) {for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}return 0;}在以上示例代码中,我们通过设置`sequence`数组来表示电机的相序,其中`sequence[0]`表示第一相,`sequence[1]`表示第二相,以此类推。

通过循环遍历数组中的元素,并控制步进电机相序的输出,从而实现步进电机的正反转。

步进电机加速减速步进电机的加速减速是通过逐渐改变电机的驱动信号频率来实现的。

下面是一个简单的C程序示例,用于控制步进电机的加速减速:include <stdio.h>include <unistd.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int delay = 1000; // 初始延时时间,单位为毫秒int minDelay = 100; // 最小延时时间,单位为毫秒// 加速for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay > minDelay) {delay -= 100; // 减小延时时间,实现加速}}// 延时一段时间// 减速for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay < 1000) {delay += 100; // 增加延时时间,实现减速}}return 0;}在以上示例代码中,我们通过循环遍历数组中的元素,并控制步进电机相序的输出,并通过调用`usleep`函数来实现延时,从而控制步进电机的转速。

步进电机加速-匀速-减速运行程序(C51)

步进电机加速-匀速-减速运行程序(C51)
if(K1==0)
{
motor_turn();
}
}
}
rate=0x10;
x=0xf0;
do
{
motor_ffw(); //加速
rate--;
}while(rate!=0x01);
do
{
motor_ffw(); //匀速
x--;
}while(x!=0x01);
do
{
motor_ffw(); //减速
rate++;
}while(rate!=0x10);
}
步进电机加速-匀速-减速运行程序(C51)
作者:gguoqing出处:willar更新时间:2006年08月05日
步进电机模块/shop_view.asp?id=48
ME300系列Leabharlann 片机开发系统+步进电机模块演示程序
功能:
步进电机以加速方式启动,转速达到程序规定的最快速度后保持一段时间匀速运转,又开始以减速
}
}
/********************************************************
*
*步进电机运行
*
*********************************************************/
void motor_turn()
{
uchar x;
方式运行直到步进电机停止转动。由K1键控制演示程序运行。步进电机模块上D1-D4可以指示工作状态。
/******************************************************************/

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序#include#define KeyPort P1#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^4;//定义锁存使能端口段锁存sbit LATCH2=P0^0;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;#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;}//DA相通电,其他相断电#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_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed=1;bit StopFlag;void Display(unsigned char FirstBit,unsigned char Num);void Init_Timer0(void);unsigned char KeyScan(void);/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned int i=512;//旋转一周时间unsigned int n=0;unsigned char num,vo,v;Init_Timer0();Coil_OFF;while(1) //正向{num=KeyScan(); //循环调用按键扫描if(num==1)//第一个按键,速度等级增加{if(Speed<15)Speed=Speed+2;//+8}if(num==2)//第二个按键,速度等级减小{if(Speed>1)Speed=Speed-2;//-8}if(num==3)//第三个按键,电机停转{Coil_OFFStopFlag=1;}if(num==4)//第四个按键,电机启动{StopFlag=0;TR0=1;}if(num==5)//第五个按键,电机反转{TR0=0;TR1=1;}if(num==6)//第六个按键,电机正传{TR0=1;TR1=0;}vo=(0.25*(20-Speed)*64*32)/1000;v=60/vo;TempData[0]=dofly_DuanMa[v/10]; //分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[v%10];}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附录六:源程序#include "reg52.h"#define uchar unsigned char#define uint unsigned intUcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0 x79,0x71,0x76};sbit dula=P2^6;sbit wela=P2^7;sbit bb=P1^7; //控制步进电机启停sbit zhuanxiang=P1^6;//键盘sbit mode_choose=P1^1;//模式选择键sbit queren=P1^0;//确认键sbit shiweijia=P1^4; //设置十位sbit geweijia=P1^5; //设置个位sbit jia1=P1^2; //加一sbit jian1=P1^3; //减1sbit F1=P2^0;//步进电机sbit F2=P2^1;sbit F3=P2^2;sbit F4=P2^3;uchar flag=1, MotorStep=0;//步进电机标志变量uchar keyflag=0;//按键次数标识Uinta=0,b,TIM,CT=0,Count=0,Count1=0,bai,shi,ge,shi1,ge1,zhuansu=0,yusheshiwei=0,yushegewei=0 ,yushebaiwei=0,c=0,cc=0;void delay(uchar z);//延时函数void display(uint a,uchar flag);//显示预设转速函数void display1(uint c);//显示实际转速函数void display2(uchar flag,uchar,uchar,uchar) ;void SetMotor(); //步进电机转动函数void key(); //键盘扫描void InitMotor()//步进电机初始化{F1=0;F2=0;F3=0;F4=0;}void system_Ini(){TMOD=0x11; //T1为16位计数模式,T0为16位定时模式TH0=(65536-200)/256; //重新赋值200usTL0=(65536-200)%256;TH1=(65536-46080)/256; //重新赋值50msTL1=(65536-46080)%256;EA=1; //打开总中断ET0=1; //T0允许中断产生PWM波ET1=1; //T1允许中断计数EX1=1; //开外部中断1IT1=1; //外部中断1下降沿触发方式TR0=0; //打开定时器0,TR仅仅与定时器计数器有关,与中断无关TR1=1; //打开定时器1}void main(){system_Ini();InitMotor();while(1){key();// display(a,flag);display1(zhuansu);}}void key()//键盘扫描{if(!queren) //确认键P1.0{keyflag=0;TR0=1;}if(!mode_choose) //模式选择P1.1{delay(10);if(!mode_choose){keyflag++; //表示按键的次数if(keyflag>=3)keyflag=0;}}if(keyflag==0)display(a,flag);if(keyflag==1) //模式1:预设速度{if(!geweijia){delay(5);if(!geweijia){ while(!geweijia);yushegewei++;if(yushegewei>9)yushegewei=0;}}if(!shiweijia){delay(5);if(!shiweijia){ while(!shiweijia);yusheshiwei++;if(yusheshiwei>9){yusheshiwei=0;yushebaiwei++;if(yushebaiwei>=1&&yusheshiwei>=5)//预设值大于150转时,报警{yushebaiwei=1;yusheshiwei=5;// baojing=~baojing;}}}}a=yushebaiwei*100+yusheshiwei*10+yushegewei;display2(0,yushebaiwei,yusheshiwei,yushegewei);}if(jia1==0){delay(10);if(jia1==0){ a=a+1;if(a>199)a=199;}while(!jia1);delay(10);while(!jia1);}if(jian1==0){delay(10);if(jian1==0){a=a-1;if(a<1)a=1;}while(!jian1);delay(10);while(!jian1);}if(zhuanxiang==0){delay(10);if(zhuanxiang==0)flag=~flag;while(!zhuanxiang);delay(10);while(!zhuanxiang);}switch(a){/* case 0:b=10000; break;case 1:b=1000; break;case 2:b=220; break;case 3:b=200; break;case 5:b=180; break;case 6:b=160; break;case 7:b=140; break;case 8:b=120; break;case 9:b=100; break;case 10:b=70; break; */ case 11:b=65; break;case 12:b=60; break;case 13:b=54; break;case 14:b=49; break;case 15:b=46; break;case 16:b=44; break;case 18:b=42; break; case 19:b=36; break; case 20:b=35; break; case 21:b=34; break; case 22:b=32; break; case 23:b=31; break; case 24:b=30; break; case 25:b=28; break; case 26:b=27; break; case 27:b=26; break; case 28:b=25; break; case 29:b=24; break; case 30:b=23; break; case 31:b=23; break; case 32:b=22; break; case 33:b=22; break; case 34:b=21; break; case 35:b=20; break; case 36:b=19; break; case 37:b=19; break; case 38:b=18; break; case 39:b=18; break; case 40:b=17; break; case 41:b=17; break; case 42:b=16; break; case 43:b=16; break; case 44:b=16; break; case 45:b=15; break; case 46:b=15; break; case 47:b=15; break; case 48:b=14; break; case 49:b=14; break; case 50:b=14; break; case 51:b=13; break; case 52:b=13; break; case 53:b=13; break; case 54:b=13; break; case 55:b=12; break; case 56:b=12; break; case 57:b=12; break; case 58:b=12; break; case 60:b=11; break; case 61:b=11; break;case 63:b=11; break;case 64:b=10; break;case 65:b=9; break;case 66:b=8; break;case 67:b=7; break;}}//0:外部中断0;优先级最高//1:定时器0;//2:外部中断1;//3:定时器1;//4:串行口中断;优先级最低void PWM(void) interrupt 1 //pwm中断,定时器0{TH0=(65536-36)/256; //重新赋值37TL0=(65536-36)%256;CT++;if(CT==b){TIM=1;CT=0;SetMotor();}}void Exter1(void) interrupt 2 //外部中断1 P3^3{Count1++;}void Exter0(void) interrupt 0 //外部中断0 P3^2{TR0=~TR0;}void timer1(void) interrupt 3 //定时器中断1{TH1=(65536-46080)/256; //重新赋值50ms TL1=(65536-46080)%256;Count++;if(Count==120){Count=0;zhuansu=Count1;}if(bb==0)delay(5);if(bb==0){while(!bb);TR0=~TR0;}}void display(uint a,uchar flag) { if(flag==1){wela=1;P0=0xef;wela=0;P0=0xff;dula=1;P0=table[15];dula=0;P0=0xff;delay(1);}else{wela=1;P0=0xef;wela=0;P0=0xff;dula=1;P0=table[16];dula=0;P0=0xff;delay(1);}bai=a/100 ;shi=(a%100)/10;ge=a%10;wela=1;P0=0xdf;wela=0;P0=0xff;P0=table[bai];dula=0;P0=0xff;delay(1);wela=1;P0=0xbf;wela=0;P0=0xff;dula=1;P0=table[shi];dula=0;P0=0xff;delay(1);wela=1;P0=0x7f;wela=0;P0=0xff;dula=1;P0=table[ge];dula=0;P0=0xff;delay(1);}void display2(uchar cc,uchar yushebaiwei,uchar yusheshiwei,uchar yushegewei) {wela=1;P0=0xef;wela=0;P0=0xff;dula=1;P0=table[0];dula=0;P0=0xff;delay(1);wela=1;P0=0xdf;wela=0;P0=0xff;dula=1;P0=table[yushebaiwei];P0=0xff;delay(1);wela=1;P0=0xbf;wela=0;P0=0xff;dula=1;P0=table[yusheshiwei];dula=0;P0=0xff;delay(1);wela=1;P0=0x7f;wela=0;P0=0xff;dula=1;P0=table[yushegewei];dula=0;P0=0xff;delay(1);}void display1(uint zhuansu) {shi1=zhuansu/10;ge1=zhuansu%10;wela=1;P0=0xfe;wela=0;P0=0xff;dula=1;P0=table[shi1];dula=0;P0=0xff;delay(1);wela=1;P0=0xfd;wela=0;P0=0xff;dula=1;P0=table[ge1];dula=0;P0=0xff;delay(1);}void SetMotor()//四项步进电机运行{if(flag==1)//电机正传{switch(MotorStep){case 0:if(TIM) // A{F1 = 0; //0xf1F2 = 1;F3 = 1;F4 = 1;MotorStep = 1;TIM=0;}break;case 1: // ABif(TIM){F1 = 0; //0xf3F2 = 0;F3 = 1;F4 = 1;MotorStep = 2;TIM=0;}break;case 2: //Bif(TIM){F1 = 1;F2 = 0; //0xf2F3 = 1;F4 = 1;MotorStep = 3;TIM=0;break;case 3: //BCif(TIM){F1 = 1;F2 = 0; //0xf6F3 = 0;F4 = 1;MotorStep = 4;TIM=0;}break;case 4: //Cif(TIM){F1 = 1;F2 = 1; //0xf4F3 = 0;F4 = 1;MotorStep = 5;TIM=0;}break;case 5: //CDif(TIM){F1 = 1;F2 = 1; //0xfcF3 = 0;F4 = 0;MotorStep = 6;TIM=0;}break;case 6: //Dif(TIM){F1 = 1;F2 = 1; //0xf8F3 = 1;F4 = 0;MotorStep = 7;TIM=0;break;case 7: //DAif(TIM){F1 = 0;F2 = 1; //0xf9F3 = 1;F4 = 0;MotorStep = 0;TIM=0;}break;}}else //电机反转{switch(MotorStep){case 0:if(TIM){F1=0;F2=1;F3=1;F4=0;MotorStep=1;TIM=0;}case 1:if(TIM){F1=1;F2=1;F3=1;F4=0;MotorStep=2;TIM=0;}case 2:if(TIM){F1=1;F2=1;F3=0;F4=0;MotorStep=3;TIM=0;}case 3:if(TIM) //c{F1=1;F2=1;F3=0;F4=1;MotorStep=4;TIM=0;}case 4: //BCif(TIM){F1 = 1;F2 = 0; //0xf6F3 = 0;F4 = 1;MotorStep = 5;TIM=0;}case 5: //Bif(TIM){F1 = 1;F2 = 0; //0xf2F3 = 1;F4 = 1;MotorStep = 6;TIM=0;}break;case 6: // ABif(TIM){F1 = 0; //0xf3F2 = 0;F3 = 1;F4 = 1;MotorStep = 7;TIM=0;}break;case 7:if(TIM) // A{F1 = 0; //0xf1F2 = 1;F3 = 1;F4 = 1;MotorStep = 0;TIM=0;}break;}}}void delay(uchar z)//延时函数{uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

相关文档
最新文档