步进电机加减速运行程C程序
- 格式:doc
- 大小:44.50 KB
- 文档页数:4
单片机课机电一体化课程设计题目:步进电机正反转及加减速设计专业:机械工程及自动化班级:机械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,减1//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式//电机转速一共10档,通过按键调节转速//电机正转时最高位数码管显示0,反转时显示1#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit s4 = P3^1;sbit s5 = P3^2;//按键定义,s1正转,s2反转,s3加1,s4减1sbit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//数码管位选定义sbit a = P2^7;sbit b = P2^6;sbit c = P2^5;sbit d = P2^4;//脉冲信号输入端定义uchar code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管驱动信号0---9,不显示uchar codetime_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xb c}, //9.7 ----1ms{0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};uchar code qudong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};uchar num1 = 0;//控制取励磁信号变量uchar num2 = 8;char k=0;//加减档位控制,1为最小档char pause=1;//暂停时保存之前的转速,开机默认1bit flag1 = 0;//初始正转,正反转标志uchar buf[4]={0,10,0,0};//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低//================================定时器0/1初始化函数================================void T0_T1_init(){TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式TH1 = time_counter[k-1][0];TL1 = time_counter[k-1][1];//定时器1,定时10ms用于步进电机转速控制TR1 = 0;ET1= 1;//开定时器中断EA = 1;//开总中断}//================================ms级延时函数=======================================void delay1m(uint x){uint i,j;for(i=0;i<x;i++) //连数x次,约 x msfor(j=0;j<120;j++); //数120 次,约1 ms}void display(){wei3=1;wei2=1;wei1=1;wei0=0;led = tab[buf[3]];delay1m(1);led=0xff; wei3=1;wei2=1;wei1=0;wei0=1;led = tab[buf[2]];delay1m(1);led=0xff;wei3=1;wei2=0;wei1=1;wei0=1;led = tab[buf[1]];delay1m(1);led=0xff;wei3=0;wei2=1;wei1=1;wei0=1;led = tab[buf[0]];delay1m(1);led=0xff; }//================================主函数============================================= void main(){T0_T1_init();buf[1] = 10;//不显示while(1){display();if(s1 == 0){delay1m(3);if(s1 == 0){flag1 = 0;//正转buf[0] = 0;//最高位显示0// haha = 0x00;//停止}while(!s1) display();}if(s2 == 0 ){delay1m(3);if(s2 == 0){flag1 = 1;//反转buf[0] = 1;//最高位显示1 // haha = 0x00;//停止}while(!s2) display();}if(s3 == 0) //速度加1档{delay1m(3);if(s3 == 0){k++;TR1=1;if(k > 10 ){k = 1;}buf[2]= k/10;buf[3]= k%10;}while(!s3) display();}if(s4 == 0) //速度减1档{delay1m(3);if(s4 == 0){k--;TR1=1;if(k <= 0){k = 10;}buf[2]= k/10;buf[3]= k%10;}while(!s4) display();}if(s5==0){delay1m(3);if(s5==0){if(TR1==1){pause=k;k=0;TR1=0;a=b=c=d=0;}else if(TR1==0){k=pause;TR1=1;}buf[2]= k/10;buf[3]= k%10;while(!s5) display();}}}}//==================================定时器1中断函数,用于脉冲频率控制=====================================void time1_interrupt()interrupt 3{static num1 = 0;static num2 = 0;TH1 = time_counter[k-1][0];TL1 = time_counter[k-1][1];//定时器1,定时1 用于步进电机转速控制if(flag1 == 0)//正转{switch(num1){case 0:a = 1;b = 0;c = 0;d = 0;break;case 1:a = 1;b = 1;c = 0;d = 0;break;case 2:a = 0;b = 1;c = 0;d = 0;break;case 3:a = 0;b = 1;c = 1;d = 0;break;case 4:a = 0;b = 0;c = 1;d = 0;break;case 5:a = 0;b = 0;c = 1;d = 1;break;case 6:a = 0;b = 0;c = 0;d = 1;break;case 7:a = 1;b = 0;c = 0;d = 1;break;}num1++;if(num1 == 8)num1 = 0;}else //反转{switch(num2){case 0:a = 1;b = 0;c = 0;d = 1;break;case 1:a = 0;b = 0;c = 0;d = 1;break;case 2:a = 0;b = 0;c = 1;d = 1;break;case 3:a = 0;b = 0;c = 1;d = 0;break;case 4:a = 0;b = 1;c = 1;d = 0;break;case 5:a = 0;b = 1;c = 0;d = 0;break;case 6:a = 1;b = 1;c = 0;d = 0;break;case 7:a = 1;b = 0;c = 0;d = 0;break;}num2++;if(num2 == 8)num2 = 0;}}。
1.3.4软件设计速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成 4个部 分的工作才能满足课题要求,即主程序部分、定时器中断部分、外部中断0和外部中断1部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测, 若启动开关合上则系统开始工作,反之系统停止工作;定时器部分控制脉冲频率, 它决定了步进电机转速的快慢;两个外部中断程序要做的工作都是为了完成改变 速度这一功能。
下面分析主程序与定时器中断程序及外部中断程序。
(1) 主程序设计主程序中要完成的工作主要有系统初始值的设置、系统状态的显示以及各种 开关状态的检测判断等。
其中系统初始状态的设置内容较多,该系统中,需要初始化定时器、外部中断;对P1 口送初值以决定脉冲分配方式,速度值存储区送初 值决定步进电机的启动速度,对方向值存储区送初值决定步进电机旋转方向等内 容。
若初始化P 1=11H 、速度和方向初始值均设为0,就意味着步进电机按四相单四拍运行,系统上电后在没有操作的情况下,步进电机不旋转,方向值显示“ 0”速度值显示“ 0”主程序流程图如图9所示。
C1iH:TC TC3 -> W需ReC2<TE>cTExTT^X2<TE><r>R5vTEKTtWflAMPCI.KADIPCI®削 D*PCUSAKRSTre.?;AP7PZITAEPZ.VAfiFZ^A-nALEFZ.4fl^-E日M*3M3FZ.T^-e Pin P1JP3IVnXDPJ.1l™p-IJPI.4 心旳P1SPliTI P1J <raacmP1Jpi.Tmis37KI10 F JIg工IlorsaT= -5-LC二r-EX图8总体电路图哥孰 ISC Si r •卞-TTWHprrr-Ex-K2lor FR4ft S通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加图9主程序流程图(2)定时中断设计步进电机的转动主要是给电机各绕组按一定的时间间隔连续不断地按规律通入电流,步进电机才会旋转,时间间隔越短,速度就越快。
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一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
-18-/2011.10/PLC控制步进电机加减速运行的设计沈阳航空职业技术学院 徐 宁 张博舒 张连华 李 虹【摘要】步进电机是一种将电脉冲转化为角位移的执行机构。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
本文以PLC高级指令中的PTO(脉冲串操作)/PWM(脉宽调制)发生器功能指令为例,对给出的步进电机加速起动、恒速运行和减速过程进行了全面的设计。
【关键词】步进电机;脉冲;PLC;加减速Abstract :Stepper motor is an actuator that transform the electrical pulse into the angular displacement.It can control the angular displacement by change the number of pulse.It can also control the rotation speed and acceleration by change the frequency of pulse to achieve the purpose of speed.In this paper ,use advanced PLC instructions including PTO (Pulse Train Operation )/PWM (Pulse Width Modulation )generator function instruction as an example ,comprehensive design the stepper motor speed up starting ,constant speed operation and deceleration process.Key words :Stepper motor ;pulse ;PLC ;accelerate and decelerate步进电机是数字控制系统中的执行电动机,改变输入脉冲的数目就能控制步进电动机转子机械位移的大小;改变输入脉冲的通电相序,就能控制步进电动机转子机械位移的方向,实现位置的控制[1]。
开关控制步进电机加速、匀速、减速程序/************************************************************** **************** ****;* SL300A单片机学习套件实验例程---步进电机加减速运行--- *;**;* 实验功能:*;* 步进电机启动时,转速由慢到快逐步加速。
*;* 步进电机匀速运行*;* 步进电机由快到慢逐步减速*;* 硬件联接:用一根6P线,一头插到步进电机板上的6P插座上,另一头插到SL300A的JP7上*;* 注意电源极性。
*;* 步进电机步进角为7.5度,一圈360 度。
*;* 双四拍工作方式:*;* AB-BC-CD-DA(即一个脉冲,转7.5 度) *;* 单双八拍工作方式:*;* A-AB-B-BC-C-CD-D-DA(即一个脉冲,转 3.75 度) *;* A组线圈对应P1.0 B组线圈对应P1.1 C组线圈对应P1.2 D组线圈对应P1.3 *;************************************************************** **************** ***/#include //51芯片管脚定义头文件#include //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intsbit K8=P3^7;uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};uchar rate ;/********************************************************//*/* 延时/* 11.0592MHz时钟,/*/********************************************************/ void delay(){uchar k;uint s;k = rate;do{for(s = 0 ; s <1500 ; s++) ;}while(--k);}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(){uchar i;for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]; //取数据delay(); //调节转速}}/******************************************************** **步进电机运行**********************************************************/ void motor_turn(){uchar x;rate=0x0a;x=0x80;do{motor_ffw(); //加速rate--;}while(rate!=0x01);do{motor_ffw(); //匀速x--;}while(x!=0x01);do{motor_ffw(); //减速rate++;}while(rate!=0x0a);}/******************************************************** ** 主程序**********************************************************/ main(){P1=0xf0;while(1){P1=0xf0;if(K8==0){motor_turn();}}}/********************************************************/。
单片机控制的直流电机正反转和加速减速C程序简介本文档旨在向读者介绍如何使用单片机控制直流电机实现正反转和加速减速功能的C程序。
程序实现正反转控制以下是控制直流电机正反转的C程序示例:include <avr/io.h>void motor_forward(){// 设置引脚控制直流电机正转}void motor_reverse(){// 设置引脚控制直流电机反转}int main(){// 初始化单片机引脚设置和其他必要的配置while (1){// 检测是否需要正转或反转,根据需要调用motor_forward()或motor_reverse()函数}return 0;}加速减速控制以下是控制直流电机加速减速的C程序示例:include <avr/io.h>void motor_speed_up(){// 调整引脚控制直流电机的占空比以加速电机转速}void motor_slow_down(){// 调整引脚控制直流电机的占空比以减速电机转速}int main(){// 初始化单片机引脚设置和其他必要的配置while (1){// 检测是否需要加速或减速,根据需要调用motor_speed_up()或motor_slow_down()函数}return 0;}结论通过上述示例程序,我们可以实现通过单片机控制直流电机的正反转和加速减速功能。
读者可以根据实际需求进行相应的参数调整和功能扩展。
请注意,上述示例程序仅为演示目的,具体的引脚配置和控制方式需根据实际硬件和单片机型号进行调整。
/****************************************************************************** ******** 标题: 步进电机试验一**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; 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();} }。
/****************************************************************** MSP430F149的步进电机程序主要实现步进电机的加减速运行程序步进电机转速由慢到快逐步加速步进电机的匀速运行程序步进电机由快到慢逐步减速到停止******************************************************************/#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intuchar FFW[8]={0xFE,0xFC,0xFD,0xF9,0xFB,0xF3,0xF7,0xF6}; //步进电机的正转数组uchar REV[8]={0xF6,0xF7,0xF3,0xFB,0xF9,0xFD,0xFC,0xFE}; //步进电机的反转数组uchar rate ; //步进电机的速度/********************************************************延时函数delay8MHz时钟,********************************************************/void delay(uchar k){uint s;k = rate;do{for(s = 0 ; s <200 ; s++) ;}while(--k);}/********************************************************步进电机的正转程序********************************************************/void motor_ffw(){uchar i;for (i=0; i<8; i++) //一个周期转30度{P5OUT = FFW[i];//取数据delay(2); //调节转速}}/******************************************************** 步进电机反转程序********************************************************/ void motor_rev(){uchar i;for (i=0; i<8; i++) //一个周期转30度{P5OUT = REV[i]; //取数据delay(2); //调节转速}}/******************************************************** 控制步进电机运行程序*********************************************************/ void motor_turn(){uchar x;rate=0x30;x=0xff;do{motor_ffw(); //正转加速rate--;}while(rate!=0x0a);do{motor_ffw(); //正转匀速x--;}while(x!=0x01);do{motor_ffw(); //正转减速rate++;}while(rate!=0x30);do{motor_rev(); //反转加速rate--;}while(rate!=0x0a);do{motor_rev(); //反转匀速x--;}while(x!=0x01);do{motor_rev(); //反转减速rate++;}while(rate!=0x30);}/********************************************************主程序*********************************************************//********************主函数********************/void main(void){uchar i;WDTCTL = WDTPW + WDTHOLD; //关闭看门狗/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF; //P1端口为输出端口//时钟初始化BCSCTL1&=~XT2OFF; //启动XT2振荡器BCSCTL2|=SELM1; //MCLK为XT2do{IFG1&=~OFIFG;for(i=0xFF;i>0;i--);}while((IFG1&OFIFG)!=0);while(1){P1OUT = 0x00; // 输出高电平motor_turn();}}。
1./******************************************************************/
2./*****************************************************************/
3./*
4./* 步进电机加减速运行程
序
5./* 步进电机启动时,转速由慢到快逐步加
速。
6./* 步进电机匀速运
行
7./* 步进电机由快到慢逐步减速到停止
8./*
9./******************************************************************/
10.
11.#include <reg52.h>
12.#include <string.h>
13.
14.#define uchar unsigned char
15.#define uint unsigned int
16.
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.do
37. {
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.do
104. {
105. motor_ffw(); //正转加速
106. rate--;
107. }while(rate!=0x0a);
108.
109.do
110. {
111. motor_ffw(); //正转匀速
112. x--;
113. }while(x!=0x01);
114.
115.do
116. {
117. motor_ffw(); //正转减速
118. rate++;
119. }while(rate!=0x30);
120.do
121. {
122. motor_rev(); //反转加速
123. rate--;
124. }while(rate!=0x0a);
125.
126.do
127. {
128. motor_rev(); //反转匀速
129. x--;
130. }while(x!=0x01);
131.
132.do
133. {
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.}。