步进电机加减速程序

合集下载

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两相同时通电,并依次循环。

步进电机梯形加减速算法

步进电机梯形加减速算法

步进电机梯形加减速算法
步进电机梯形加减速算法,是指在步进电机控制中,通过梯形加减速算法实现步进电机从静止到达目标位置,并且达到平稳加速和减速的目的。

具体的算法步骤如下:
1. 设置加速度值、减速度值、最大速度值以及目标位置。

2. 初始化步进电机的速度为0。

3. 计算步进电机加速度的时间常数,即在单位时间内速度增加的大小。

4. 根据加速度时间常数计算加速步数,即从0速度加速到最大速度所需要的步数。

5. 根据加速步数和加速度值计算出加速段每一步的速度值。

6. 将电机速度从0开始逐步增加,直至达到最大速度。

7. 当电机速度达到最大速度后,继续保持最大速度运动到距离目标位置一定的距离。

8. 计算减速度的时间常数,即在单位时间内速度减小的大小。

9. 根据减速度时间常数计算减速步数,即从最大速度减速到0速度所需要的步数。

10. 根据减速步数和减速度值计算出减速段每一步的速度值。

11. 逐步减小电机速度,直至达到0速度。

12. 完成以上步骤后,步进电机达到目标位置。

这样通过梯形加减速算法,可以保证步进电机在加速和减速过程中平稳运动,避免了突变或者震动,提高了步进电机的运动精度和稳定性。

1.1 步进电机加减速控制原理

1.1 步进电机加减速控制原理

1.1 步进电机加减速控制原理步进电机驱动执行机构从一个位置向另一个位置移动时,要经历升速、恒速和减速过程。

当步进电机的运行频率低于其本身起动频率时,可以用运行频率直接起动并以此频率运行,需要停止时,可从运行频率直接降到零速。

当步进电机运行频率fb>fa(有载起动时的起动频率)时,若直接用fb频率起动会造成步进电机失步甚至堵转。

同样在fb频率下突然停止时,由于惯性作用,步进电机会发生过冲,影响定位精度。

如果非常缓慢的升降速,步进电机虽然不会产生失步和过冲现象,但影响了执行机构的工作效率。

所以对步进电机加减速要保证在不失步和过冲前提下,用最快的速度(或最短的时间)移动到指定位置。

步进电机常用的升降频控制方法有2种:直线升降频(图1)和指数曲线升降频(图2)。

指数曲线法具有较强的跟踪能力,但当速度变化较大时平衡性差。

直线法平稳性好,适用于速度变化较大的快速定位方式。

以恒定的加速度升降,规律简练,用软件实现比较简单,本文即采用此方法。

1.2 定位方案要保证系统的定位精度,脉冲当量即步进电机转一个步距角所移动的距离不能太大,而且步进电机的升降速要缓慢,以防止产生失步或过冲现象。

但这两个因素合在一起带来了一个突出问题:定位时间太长,影响执行机构的工作效率。

因此要获得高的定位速度,同时又要保证定位精度,可以把整个定位过程划分为两个阶段:粗定位阶段和精定位阶段。

粗定位阶段,采用较大的脉冲当量,如0.1mm/步或1mm/步,甚至更高。

精定位阶段,为了保证定位精度,换用较小的脉冲当量,如0.01mm/步。

虽然脉冲当量变小,但由于精定位行程很短(可定为全行程的五十分之一左右),并不会影响到定位速度。

为了实现此目的,机械方面可通过采用不同变速机构实现。

工业机床控制在工业自动化控制中占有重要位置,定位钻孔是常用工步。

设刀具或工作台欲从A点移至C点,已知AC=200mm,把AC划分为AB与BC 两段,AB=196mm,BC=4mm,AB段为粗定位行程,采用0.1mm/步的脉冲当量依据直线升降频规律快速移动,BC段为精定位行程,采用0.01mm/步的脉冲当量,以B点的低频恒速运动完成精确定位。

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

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

#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++);}}。

步进电机加减速资料

步进电机加减速资料

2 升降频方法及其实现2.1 升降频方法当步进电机的运行频率低于它本身的起动频率时,步进电机可以用运行频率直接起动,并以该频率连续运行,需要停止的时候,可以从运行频率直接降到零速。

此时,电机运行于恒速状态,无需升降频控制。

当步进电机的运行频率fb>fa (fa为步进电机有载起动时的起动频率)时,若直接用fb起动,由于频率太高,步进电机会丢步,甚至产生堵转。

同样,在fb频率下突然停止,步进电机会超程。

因此,当要求步进电机在运行频率.fb下正常工作时,就需要采用升降频控制,以使步进电机从启动频率fa开始,逐渐加速升到运行频率fb,然后进入匀速运行,最后的降频可以看作是升频的逆过程。

步进电机常用的升降频控制方法有3种:(1)直线升降频。

如图1所示。

这种方法是以恒定的加速度进行升降,平稳性好,适用于速度变化较大的快速定位方式。

加速时间虽然长,但软件实现比较简单。

图1 直线升降频(2)指数曲线升降频。

如图2所示,这种方法是从步进电机的矩频特性出发,根据转矩随频率的变化规律推导出来的。

它符合步进电机加减速过程的运动规律,能充分利用步进电机的有效转矩,快速响应性能较好,升降时间短。

指数升降控制具有较强的跟踪能力,但当速度变化较大时平衡性较差,一般适用于跟踪响应要求较高的切削加工中。

图2 指数曲线升降频(3)抛物线升降频。

如图3所示,抛物线升降频将直线升降频和指数曲线升降频融为一体,充分利用步进电机低速时的有效转矩,使升降速的时间大大缩短,同时又具有较强的跟踪能力,这是一种比较好的方法。

图3 抛物线升降频2.2 软件实现步进电机在升降频过程中,脉冲序列的产生,即两个脉冲时间间隔的软件确定,有2种方法:(1)递增/递减一定值。

如线性升降频,两脉冲频率的差值Δf= |f i-f i-1|是相等的,其对应的时间增量Δf也是相等。

时间的计算若采用软件延时的方法,可先设置一个基本的延时单元Te,不同频率的脉冲序列可由Te的不同倍数产生。

c语言实现单片机控制步进电机加减速源程序

c语言实现单片机控制步进电机加减速源程序

C 语言实现单片机控制步进电机加减速源程序1. 引言在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。

而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。

本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。

2. 单片机控制步进电机的加减速原理步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。

在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。

在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。

这一过程需要通过单片机的定时器和输出控制来实现。

3. C 语言实现步进电机加减速的源程序在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。

在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。

以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:```c#include <reg52.h>void main() {// 初始化定时器// 设置脉冲频率,控制步进电机的加减速过程// 控制步进电机的方向// 控制步进电机的启停}```4. 总结与回顾通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。

掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。

在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。

希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。

5. 个人观点与理解在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。

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一定要串联电阻,否则可能会烧坏驱动器控制接口电路。

步进电机的加减速控制

步进电机的加减速控制

步进电机的加减速控制一、引言随着科学技术的发展和微电子控制技术的应用,步进电机作为一种可以精确控制的电机,广泛应用在高精密加工机床,微型机器人控制,航天卫星等高科技领域。

二、步进电机的原理步进电机是一种控制用的特种电机,它无法像传统电机那样直接通过输入交流或直流电流使其运行,而是需要输入脉冲电流来控制电机的转动,所以步进电机又称为脉冲电机。

其功能是将脉冲电信号变换为相应的角位移或直线位移,即给一个脉冲电信号,电机就转动一个角度或前进一步。

按励磁方式可以分为反应式、永磁式和混合式三种类型,本设计中选用的是反应式步进电机,其结构如图 1 所示。

这是一台四相反应式步进电机的典型结构。

共有4 套定子控制绕组,绕在径向相对的两个磁极上的一套绕组为一相,也就是说定子上两个相对的大齿就是一个相,电机按照A —B —C —D — A 的顺序不断接通和断开控制绕组,转子就会一步一步的连续转动。

其转速取决与各控制绕组通电和断电的频率,即输入的脉冲频率。

旋转的方向则取决与各控制绕组轮流通电的顺序。

三、步进电机的驱动控制步进电机不能直接接到直流或交流电源上工作,必须使用专门的步进电机驱动控制器。

步进电机和步进电机驱动器构成步进电机驱动系统。

步进电机驱动系统的性能,不仅取决于步进电机自身的性能,也取决于步进电机驱动器的优劣。

步进电机的驱动方式有很多种,包括单电压驱动、双电压驱动、斩波驱动、细分驱动、集成电路驱动和双极性驱动。

本设计选用的是恒频脉宽调制细分驱动控制方式,这是在斩波恒流驱动的基础上的进一步改进,既可以使细分后的步距角均匀一致,又可以避免复杂的计算。

四、恒频脉宽调制细分电路的设计1、脉冲分配的实现在步进电机的单片机控制中,控制信号由单片机产生。

它的通电换相顺序严格按照步进电机的工作方式进行。

通常我们把通电换相这一过程称为脉冲分配。

本设计中选用8713 脉冲分配器芯片来进行通电换相控制。

2、系统控制电路设计步进电机控制系统主电路设计如图 2 所示。

步进电机梯形加减速实验实验原理

步进电机梯形加减速实验实验原理

步进电机梯形加减速实验实验原理步进电机是一种将电脉冲信号转换为角位移的电动机。

它以其精度高、定位准确和响应速度快等特点,在自动化控制系统中得到了广泛应用。

其中,步进电机梯形加减速实验是一种用于研究步进电机运动特性的实验方法。

步进电机梯形加减速实验的原理是通过调节电脉冲信号的频率和相序来控制步进电机的运动,实现不同速度下的加减速运动。

具体步骤如下:1.实验仪器准备:实验所需仪器包括步进电机、电流驱动器、控制器和计时仪等。

其中,电流驱动器用于提供电流给步进电机,控制器用于控制电流驱动器的工作状态,计时仪则用于测量步进电机的运动时间。

2.实验电路搭建:将电脉冲发生器的输出连接到控制器的输入口,控制器的输出口连接到电流驱动器的控制端口,电流驱动器的输出端口连接到步进电机的相线上。

同时,将电流驱动器的电源和步进电机的电源连接,确保实验电路可正常工作。

3.实验参数设置:根据实验要求,设置控制器的电流值、步进角度和加速度等参数。

其中,电流值决定步进电机的扭矩大小,步进角度决定电机每次接收到电脉冲后转动的角度,加速度则影响电机的加减速过程。

4.实验步骤控制:通过控制器调节电脉冲信号的频率和相序,可以实现对步进电机的控制。

通过改变电脉冲的频率和相序,可以控制步进电机的转动速度和运动方式。

在加减速实验中,可以通过逐步增加电脉冲的频率和相序,来实现步进电机的加速过程;通过逐步减小电脉冲的频率和相序,则可以实现步进电机的减速过程。

5.运动时间测量:通过将计时仪连接到步进电机上,可以测量电机在不同速度下的运动时间。

通过测量多次,可以得到步进电机的平均运动时间,并计算出电机的平均速度。

步进电机梯形加减速实验原理简单来说就是通过调节电脉冲信号的频率和相序来控制步进电机的转动速度和运动方式,从而实现不同速度下的加减速运动。

在实验中通过设置电流值、步进角度和加速度等参数,可以控制步进电机的性能。

通过测量电机的运动时间,可以得到步进电机的平均速度,并探究步进电机的运动特性。

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:。

步进电机加速 减速方法

步进电机加速 减速方法

不需要专门的延迟。

但是软件中应该做到使速度是连续的渐变,而不是突变。

类似物理里面我们分析的“上抛物体”的运动一样:先按匀减速运动,速度减到零后就变成反方向的匀加速运动了。

不要有从某个速度“突变”为静止,或由静止“突变”为某个速度的操作。

这种“突变”自然会产生冲击振动。

至于这个“匀加速度”、“匀减速度”的加速度大小,则可以根据步进电机的性能和负载的惯性大小来确定。

通常,步进电机都会给出一个“最大力矩”的参数。

根据这个最大力矩,和负载的惯性(包括步进电机的转子和传动机构的惯性在内)大小,可以计算出加速度不应该超过多少。

实际设计时,还应该比最大允许值再留出相当的余地。

当然,我上面说的“速度”、“加速度”都是一个连续的理论值,实际的步进电机是一步一步离散的操作的,和理论规律总会有差别。

但是只要这种“量化误差”不超过一定限度,就可以有满意的效果了。

最理想的是,这个误差的累计值不超过0.5步。

也就是说,假如按照上述“匀加速”、“匀减速”的理论计算,在时刻t的时候应该走到x步(有小数)的位置,而真实的执行效果是:走到的位置总是等于x的四舍五入取整的值。

这是最理想的。

如果算法设计不好,这个累积误差可能会大些。

但最坏的情况下,这个误差的累计值不要超过半个相位周期。

例如,您的脉冲分配如果是“四相八拍制”,那么,累积误差就必须小于4步。

超出的话,就会发生步进电机的“失步”。

上面说的道理,对于采用不采用“细分”,道理是一样的。

只是采用细分后的每一个“步”(“细步”)比原来小了,容易做到比较均匀。

例如上面说的“四相八拍制累积误差就必须小于4步”,如果采用了“16细分”,那么只要小于64“细步”就可以,显然软件里处理起来更容易一些。

但是,只要软件考虑设计仔细一些,不采用细分也是可以做到的。

【看了“广州一丁”兄的回答后,再补充说明一点】上面“广州一丁”兄说的“减速时间长点,加速时间同时也长点”,就相当于我这里说的“匀加速运动”和“匀减速运动”段中,加速度的绝对值再小一些。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

比较几种步进电机加减速控制方案

比较几种步进电机加减速控制方案

比较几种步进电机加减速控制方案加减速算法是运动控制中的关键技术之一,也是实现高速、高效率的关键因素之一。

在工业控制中,一方面要求加工的过程平滑、稳定,柔性冲击小;另一方面需要响应时间快,反应迅速。

在保证控制精度的前提下来提高加工效率,实现机械运动平滑稳定,是目前工业加工中一直要解决的关键问题。

当前运动控制系统中常用的加减速算法主要有:梯形曲线加减速、S形曲线加减速、指数曲线加减速、抛物线曲线加减速等。

1、“梯形”加减速定义:指按直线方式(从启动速度到目标速度的加减速),以一定的比例进行加速/减速图1:“梯形”加减速速度及加速度曲线计算公式:优缺点: 梯形曲线其特点是算法简便,占用时少、响应快、效率高,实现方便。

但匀加速和匀减速阶段不符合步进电机速度变化规律,在变速和匀速转折点不能平滑过渡。

所以这种算法主要应用在对升降速过程要求不高的场合。

“指数形”加减速定义:指按指数函数方式进行加减速。

图2:“指数型”加减速速度及加速度曲线计算公式:优缺点:指数曲线克服了梯形加减速的速度不平稳问题,运动精度得到了提高,但初始加速度大,容易引起机械部件的冲击,在加减速的起点仍然存在加减速突变,限制了加速度的提高。

“S形”加减速定义:加速/减速开始时速度比较缓慢,然后逐渐加快。

在加速/减速接近结束时速度再次减慢下来,从而使移动较为稳定。

S 字加减速的类型有Sin 曲线、2次曲线、循环曲线、3 次曲线图3:“S型”加减速速度及加速度曲线计算公式:优缺点:S曲线加减速是一种柔性程序较好的控制策略,能让电机性能得到充分的发挥,冲击振动小,但是实现过程比较复杂,计算量相对较大,并且加减速效率不高。

加减速控制评价指标1、机械运动轨迹及位置误差应该尽量的小2、机械运动过程平稳、抖动小,且响应迅速3、加减速算法应该尽量简单,便于实现,能够满足控制的实时性要求梯形加减速速度曲线采用“梯形”加减速算法,在运动过程中分成以下四个状态:空闲状态,加速状态,匀速状态与减速状态。

步进电机加减速控制方法

步进电机加减速控制方法

步进电机加减速控制方法-CAL-FENGHAI.-(YICAI)-Company One1步进电机加减速控制方法时间:2011-08-03 来源:未知编辑:电气自动化技术网点击: 1039次字体设置: 大中小[摘要]:步进电机只能够由数字信号控制运行的,当脉冲提供给驱动器时,在过于短的时间里,控制系统发出的脉冲数太多,也就是脉冲频率过高,将导致步进电机堵转。

要解决这个问题,必须采用加减速的办法。

就是说,在步进电机起步时,要给逐渐升高的脉冲频率,减速时的脉冲频率需要逐渐减低。

这就是我们常说的“加减速”方法。

[关键词]:步进电机数字信号驱动器步进电机只能够由数字信号控制运行的,当脉冲提供给驱动器时,在过于短的时间里,控制系统发出的脉冲数太多,也就是脉冲频率过高,将导致步进电机堵转。

要解决这个问题,必须采用加减速的办法。

就是说,在步进电机起步时,要给逐渐升高的脉冲频率,减速时的脉冲频率需要逐渐减低。

这就是我们常说的“加减速”方法。

步进电机转速度,是根据输入的脉冲信号的变化来改变的。

从理论上讲,给驱动器一个脉冲,步进电机就旋转一个步距角(细分时为一个细分步距角)。

实际上,如果脉冲信号变化太快,步进电机由于内部的反向电动势的阻尼作用,转子与定子之间的磁反应将跟随不上电信号的变化,将导致堵转和丢步。

所以步进电机在高速启动时,需要采用脉冲频率升速的方法,在停止时也要有降速过程,以保证实现步进电机精密定位控制。

加速和减速的原理是一样的。

下面就加速实例加以说明:加速过程,是由基础频率(低于步进电机的直接起动最高频率)与跳变频率(逐渐加快的频率)组成加速曲线(降速过程反之)。

跳变频率是指步进电机在基础频率上逐渐提高的频率,此频率不能太大,否则会产生堵转和丢步。

加减速曲线一般为指数曲线或经过修调的指数曲线,当然也可采用直线或正弦曲线等。

使用单片机或者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.}。

自动门控制的步进电机正反转和加速减速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`函数来实现延时,从而控制步进电机的转速。

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

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

控制步进电机正反转的加减速程序程序#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)。

步进电机加减速程序2009-7-24 14:52提问者:568826036|浏览次数:1251次要求C语言写的程序2009-7-29 14:43最佳答案main.c文件内容:#include"stm32f10x_lib.h"#include"main.h"TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; int pulse;int StepCount;int pulse1;int pulse2;int t1;int t2;int r1;int r2;void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void TIM2_Configuration(void);void f(int Vt,int a,int d,int S);#define VECT_TAB_RAMint main(void){#ifdef DEBUGdebug();/*[初始化外围设备指针]*/#endifRCC_Configuration(); //初始化时钟与复位NVIC_Configuration();//初始化中断嵌套TIM2_Configuration();//初始化定时器GPIO_Configuration();GPIO_WriteBit(GPIOD, GPIO_Pin_7, (BitAction)(0));GPIO_WriteBit(GPIOD, GPIO_Pin_6, (BitAction)(0)); //DCY1 DCY2为00,即Normal %0 DECAYGPIO_WriteBit(GPIOE, GPIO_Pin_7, (BitAction)(1));GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(0)); //M1M2为10,即1-2-phase//GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1)); //正向旋转//GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPI OA,GPIO_Pin_4)));正、反向旋转控制GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(0));GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)(1)); //TQ1 TQ2为01,即Current Ratio为50%GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1)); //StepReset位GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1)); //StepEn 使能位while(1){r1=0;r2=10;StepCount=0;GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIO A,GPIO_Pin_4)));TIM2_Configuration();do{}while(r2);TIM_Cmd(TIM2, DISABLE);Delay(7000000);}}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7; //PA 的3.4.7接CLK,CW/CCW,StepResetGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5 | GPIO_Pin_6; //PA的6.7接Protect和MoGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5; //PC的4.5接StepEn和TQ2GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1; //PB的0.1接TQ1和M2GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; //PE7接M1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7; //PD的67接DCY2和DCY1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);}void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //设置TIM2通道输入中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*配置优先级组*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*允许TIM2全局中断*/NVIC_Init(&NVIC_InitStructure);}void TIM2_Configuration(void){TIM_SetCounter( TIM2, 0x0000);TIM_ClearFlag(TIM2, TIM_FLAG_Update); /*清除更新标志位*/TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); //清除TIM2等待中断更新中断标志位TIM_ARRPreloadConfig(TIM2, ENABLE); /*预装载寄存器的内容被立即传送到影子寄存器*/TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能TIM2的更新TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 2000; //设定的最大计数值2000,最大计数值是0xffffTIM_TimeBaseStructure.TIM_Prescaler = 72; //分频72TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_Cmd(TIM2, ENABLE); //TIM2 enable counter}void RCC_Configuration(void){RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource() != 0x08){}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOE,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开TIM2的时钟}void Delay(u32 nCount){do{}while(nCount--);}void f(int Vt,int a,int d,int S){int pulse1;int pulse2;t1=Vt/a;if(StepCount<t1) //加速阶段,分t1级加速{r1++;pulse1=(150000*t1)/(r1*Vt);TIM_SetAutoreload(TIM2,pulse1);}if(t1<=StepCount<=4*S) //匀速阶段运行要求的步数或者距离{pulse=150000/Vt;TIM_SetAutoreload(TIM2,pulse);}if(StepCount>4*S) //减速阶段,走完S步后开始减速,分t2-1级减速{r2--;if(t2>=1){pulse2=(150000*t2)/(r2*Vt);TIM_SetAutoreload(TIM2,pulse2);}}}main.h文件内容:#define StepEnPin GPIO_Pin_4extern int S;extern int t1;extern int r2;extern int pulse1;extern int pulse2;extern int StepCount;extern TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;void Delay(u32 nCount);void f(int Vt,int a,int d,int S);TIM2中断函数程序:void TIM2_IRQHandler(void){if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){TIM_ClearFlag(TIM2, TIM_FLAG_Update);GPIO_WriteBit(GPIOA,GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIO A,GPIO_Pin_3)));StepCount=StepCount+1;f(300,10,10,4000);}。

相关文档
最新文档