步进电机加减速程序

合集下载

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 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。

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

相关文档
最新文档