步进电机加减速代码
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++) {;}}。
电机正反转,加减速控制程序

#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;}}}}。
单片机数码管显示+步进电机正反加速转动C语言程序

{
if(jia_key == 0)
{
delay(5);
if(jia_key == 0)
{
num++; //速度标识位
feng_ming_qi();
while(jia_key == 0) ;
for(k=125;k>0;k--);
}
/***************************************************************************************************/
void xianshi ( )//显示程序
{
delay(50);
if(zf_key ==0)
{
flag=~flag;
feng_ming_qi();
while(zf_key == 0);
}
}
if(stop_key == 0)
{
{
uchar j;
uint i;
for(j=0+table_begin;j<4+table_begin;j++)
{
P1 = code_table[j];
for(i=0;i<maichong;i++)
{
xianshi();
}
{
tong = 0xff;
tong = on[0];//位选为0;
liang = table[show_num];
delay(3);
liang = 0xff;
}
/***************************************************************************************************/
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一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
单片机(微机)原理课程设计 步进电机正反转 2秒内加减速程序

30转每分钟正转ORG 0000H;起始地址LJMP MAIN;长跳转到mainORG 001BH;定时器1中断入口LJMP ZD;跳转到中断指令ORG 002FH;随便给一个数MAIN: MOV SP,#6FH;给堆栈赋地址MOV SCON,#00H;串口工作于方式0MOV TMOD,#15H;定时器1工作于方式1,计数器0工作于方式1MOV TH0,#00H;计数器的高8位为零MOV TL0,#00H;计数器的低8位为零MOV TH1,#3CH;即十位数的60MOV TL1,#0B0H;即十位数的176,定时器1赋初值,3CB0H的值为15536,65536-15536=50000,一个机器周期为1us,十六进制为3CB0;定时50ms,计数器0计数MOV R7,#20;循环计数20次共定时1sMOV P1,#00H;以正传为例MOV 30H,#01HMOV 31H,#02HMOV 32H,#04HMOV 33H,#08HMOV 34H,#08HMOV 35H,#04HMOV 36H,#02HMOV 37H,#01HSETB EA;允许中断SETB ET1;允许定时器/计数器1中断SETB TR1;启动定时器1SETB TR0;启动计数器0START: MOV R0,#30HMOV R6,#4LOOP1: MOV A,@R0MOV P1,ALCALL DELAYINC R0DJNZ R6,LOOP1SJMP STARTZD: MOV TH1,#3CHMOV TL1,#0B0HDJNZ R7,HHMOV A,TL0MOV TL0,#00HMOV B,#5MUL ABMOV B,#3DIV AB;计算转速,存于A中LCALL BCDLCALL DISPLAYMOV R7,#20HH: RETIDELAY: MOV R5,#50;150000/(50*100)=30r/minDE1: MOV R4,#100DE2: DJNZ R4,DE2DJNZ R5,DE1RETBCD: MOV B,#100DIV ABMOV 78H,AMOV A,#10XCH A,BDIV ABMOV 79H,AMOV 7AH,BRETDISPLAY:MOV R3,#3MOV R1,#7AHMOV DPTR,#TABLELOOP3: MOV A,@R1MOVC A,@A+DPTRMOV SBUF,ADEC R1LOOP4: JNB TI,LOOP4CLR TIDJNZ R3,LOOP3RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 30转每分钟反转反转只需把START子程序中第一句话的#30H改为#34H即可2秒内加减速ORG 0000H;起始地址LJMP MAIN;长跳转到mainORG 001BH;定时器1中断入口LJMP ZD;跳转到中断指令ORG 002FH;随便给一个数MAIN: MOV SP,#6FH;给堆栈赋地址MOV R2,#2MOV SCON,#00H;串口工作于方式0MOV TMOD,#15H;定时器1工作于方式1,计数器0工作于方式1MOV TH0,#00H;计数器的高8位为零MOV TL0,#00H;计数器的低8位为零MOV TH1,#3CH;即十位数的60MOV TL1,#0B0H;即十位数的176,定时器1赋初值,3CB0H的值为15536,65536-15536=50000,一个机器周期为1us,十六进制为3CB0;定时50ms,计数器0计数MOV R7,#20;循环计数20次共定时1sMOV P1,#00H;以正传为例MOV 30H,#01HMOV 31H,#02HMOV 32H,#04HMOV 33H,#08HMOV 34H,#08HMOV 35H,#04HMOV 36H,#02HMOV 37H,#01HSETB EA;允许中断SETB ET1;允许定时器/计数器1中断SETB TR1;启动定时器1SETB TR0;启动计数器0START: MOV R0,#30HMOV R6,#4LOOP1: MOV A,@R0MOV P1,ALCALL DELAYINC R0DJNZ R6,LOOP1SJMP STARTZD: MOV TH1,#3CHMOV TL1,#0B0HDJNZ R7,HHMOV A,TL0MOV TL0,#00HMOV B,#5MUL ABMOV B,#3DIV AB;计算转速,存于A中LCALL BCDLCALL DISPLAYMOV R7,#20DJNZ R2,HHMOV R2,#1HH: RETIDELAY: MOV R5,#200MOV A,#2SUBB A,R2MOV B,#180MUL ABMOV R5,AMOV A,#200SUBB A,R5MOV R5,ADE1: MOV R4,#100DE2: DJNZ R4,DE2DJNZ R5,DE1RETBCD: MOV B,#100DIV ABMOV 78H,AMOV A,#10XCH A,BDIV ABMOV 79H,AMOV 7AH,BRETDISPLAY:MOV R3,#3MOV R1,#7AHMOV DPTR,#TABLELOOP3: MOV A,@R1MOVC A,@A+DPTRMOV SBUF,ADEC R1LOOP4: JNB TI,LOOP4CLR TIDJNZ R3,LOOP3RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。
电机加减速算法源码

电机加减速算法源码以下是一个简单的电机加减速算法的源代码示例:```c++#include <iostream>#include <cmath>// 电机加减速算法void motorAcceleration(int targetSpeed) {int currentSpeed = 0;int acceleration = 1; // 加速度int deceleration = 1; // 减速度while (currentSpeed != targetSpeed) {if (currentSpeed < targetSpeed) {currentSpeed += acceleration;if (currentSpeed > targetSpeed) {currentSpeed = targetSpeed;}} else {currentSpeed -= deceleration;if (currentSpeed < targetSpeed) {currentSpeed = targetSpeed;}}std::cout << "Current Speed: " << currentSpeed << std::endl;}}int main() {int targetSpeed = 10;motorAcceleration(targetSpeed);return 0;}```该示例中,`motorAcceleration`函数接收一个目标速度作为参数,通过不断调整电机的速度来逐步接近目标速度。
加速度和减速度通过`acceleration`和`deceleration`两个变量来控制,可以根据实际情况进行调整。
在主函数`main`中,我们将目标速度设为10,并调用`motorAcceleration`函数进行加减速计算。
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:。
单片机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`库来控制步进电机。
步进电机控制代码

基于单片机的步进电机控制系统设计软件程序代码:#include<reg52.h>#define uchar unsigned char //宏定义"uchar"代替"unsigned char"。
#define uint unsigned int //宏定义"uint"用来定义无符号整型数。
//数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, // A B C D E F 不显示0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码sbit A1=P2^1; //定义步进电机连接端口sbit B1=P2^2;sbit C1=P2^3;sbit D1=P2^4;sbit LED_Z = P2^7; //正转指示灯sbit LED_F = P2^6; //反转指示灯sbit LED_Q = P1^6; //启动指示灯sbit key1 = P3^5; //启动sbit key2 = P3^4; //暂停sbit key3 = P3^3; //正转sbit key4 = P3^2; //反转sbit key5 = P3^1; //速度加sbit key6 = P3^0; //速度减#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 StopFlag = 1; //启动/停止标志bit ZXflag = 0 ; //转向标志unsigned char sudu = 5; //速度变量/********************************************************************* 名称 : delay_1ms()* 功能 : 延时1ms函数* 输入 : q* 输出 : 无***********************************************************************/ void delay_1ms(uchar q){uint i,j;for(i=0;i<q;i++)for(j=0;j<110;j++);}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;TH0=(65536-1000)/256; //重新赋值 1msTL0=(65536-1000)%256;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开PT0=1; //优先级打开}void key() //独立按键程序{if(key1 == 0) // 启动按键{delay_1ms(10); //按键消抖动{if (key1 == 0)while(!key1);StopFlag = 0 ;LED_Q = 0;}}if(key2 == 0) //暂停按键{delay_1ms(10); //按键消抖动{if (key2 == 0)while(!key2);StopFlag = 1;LED_Q = 1;}}if(key3 == 0) //正转{delay_1ms(10); //按键消抖动{if (key3 == 0)while(!key3);ZXflag = 0;LED_Z = 0; //正转指示灯LED_F = 1; //反转指示灯}}if(key4 == 0) //反转{delay_1ms(10); //按键消抖动{if (key4 == 0)while(!key4);ZXflag = 1;LED_Z = 1; //正转指示灯LED_F = 0; //反转指示灯}}if(key5 == 0) //速度加{delay_1ms(30); //按键消抖动{if (key5 == 0)sudu++ ;if(sudu>=9)sudu = 9;P0 =smg_du[sudu]; //数码管显示速度等级while(!key5);}}if(key6 == 0) //速度减{delay_1ms(30); //按键消抖动{if (key6 == 0)sudu-- ;if(sudu<=1)sudu = 1;P0 =smg_du[sudu]; //数码管显示速度等级while(!key6);}}}/********************************************************************/*------------------------------------------------*/void main(){StopFlag = 1; //默认停止LED_Q = 1; //启动指示灯灭ZXflag = 0; //默认正转LED_Z = 0; //正转指示灯亮LED_F = 1; //反转指示灯灭sudu = 5; //默认速度为5P0 =smg_du[sudu]; //数码管显示速度等级Init_Timer0(); //定时器初始化while(1){key(); //按键扫描}}/*------------------------------------------------定时器中断子程序------------------------------------------------*/ void Timer0_isr(void) interrupt 1{static unsigned char times,i;TH0=(65536-1000)/256; //重新赋值 1msTL0=(65536-1000)%256;if(!StopFlag) //启动/暂停控制{if(times==(11-sudu))//速度控制{times=0;if( ZXflag == 0) //转向选择{switch(i){case 0:Coil_A1; i++;break;case 1:Coil_B1; i++;break;case 2:Coil_C1; i++;break;case 3:Coil_D1; i=0;break;default:break;}}else{switch(i){case 0:Coil_D1; i++;break;case 1:Coil_C1; i++;break;case 2:Coil_B1; i++;break;case 3:Coil_A1; i=0;break;default:break;}}}times++;}}。
28BYJ-48四相步进电机手动调速 (单步+加减速)

}
//------------------------------串口发送----------------------------------------
void usart_char_send(uchar data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
//---------------------main函数----------------------
int main()
{
usart_init();
//----------------------IO口初始化----------------------
void PORT_INIT()
{
PORTA=0x00;//所有口初始化为上拉输入
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
cli();//关全局中断
timer0_init();
sei();//开全局中断
PORT_INIT();
PORTB=0x00;
DDRB=0xFF;
PORTD=0xFF;
DDRD=0xFF;
// uchar i=0;
while(1)
{
//usart_char_send(0x88);
步进电机完整程序

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
步进电机C语言代码

#include <AT89X51.h>static unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数void main(void){count = 0;step_index = 0;spcount = 0;stop_flag = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数turn = 0;speedlevel = 2;delay(10000);speedlevel = 1;do{speedlevel = 2;delay(10000);speedlevel = 1;delay(10000);stop_flag=1;delay(10000);stop_flag=0;}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount){count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;return;}switch(step_index) {case 0: //0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 0;break;case 1: //0、1P1_0 = 1;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 2: //1P1_0 = 0;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 3: //1、2P1_0 = 0;P1_1 = 1;P1_2 = 1;P1_3 = 0;break; case 4: //2P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 0;break; case 5: //2、3P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 1;break; case 6: //3P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 1;break; case 7: //3、0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 1; }if (turn==0){step_index++;if (step_index>7)step_index=0; }else{step_index--;if (step_index<0)step_index=7; }}。
步进电机加减速运行程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程序示例,用于控制步进电机的正反转: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表示从第一个显示。
用PLC控制步进电机的相关指令说明

用PLC控制步进电机的相关指令下面介绍的指令只适用于FX1S、FX1N系列的晶体管输出PLC,如高训的FX1N-60MT。
这些指令主要是针对用PLC直接联动伺服放大器,目的是可以不借助其他扩展设备(例如1GM模块)来进行简单的点位控制,使用这些指令时最好配合三菱的伺服放大器(如MR-J2)。
然而,我们也可以用这些指令来控制步进电机的运行,如高训810室的实验台架。
下面我们来了解相关指令的用法:1、脉冲输出指令PLSY(FNC57)PLSY指令用于产生指定数量的脉冲。
助记法为HZ、数目Y出来。
指令执行如下:2、带加减速的脉冲输出指令PLSR(FNC59)3、回原点ZRN(FNC156)--------重点撑握ZRN指令用于校准机械原点。
助记法为高速、减速至原点。
指令执行如下:4、增量驱动DRVI(FNC158)--------重点撑握DRVI为单速增量驱动方式脉冲输出指令。
这个指令与脉冲输出指令类似但又有区别,只是根据数据脉冲的正负多了个转向输出。
本指令执行如下:5、绝对位置驱动指令DRVA(FNC159)本指令与DRVI增量驱动形式与数值上基本一样,唯一不同之处在于[S1.]:在增量驱动中,[S1.]指定的是距离,也就是想要发送的脉冲数;而在绝对位置驱动指令中,[S1.]定义的是目标位置与原点间的距离,即目标的绝对位置。
下面以高训810室的设备为例,说明步进电机的驱动方法:在用步进电机之前,请学员考虑一下几个相关的问题:1、何谓步进电机的步距角?何为整步、半步?何谓步进电机的细分数?2、用步进电机拖动丝杆移动一定的距离,其脉冲数是如何估算的?3、在步进顺控中运用点位指令应注意什么?(切断电源的先后问题!)步进电机测试程序与接线如下:1、按下启动按钮,丝杆回原点,5秒钟后向中间移动,2秒后回到原点。
注:高训810步进电机正数为后退,Y2亮,负数为向前,Y2不亮。
向前方为向(3#带侧)运动为,向后为向(1#带侧)运动。
步进电机调速程序

/****************************************************************************** ******** 标题: 步进电机试验一**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; 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();} }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void RCC_Configuration(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_Cmd(TIM2, ENABLE); //TIM2 enable counter
{
NVIC_InitTyபைடு நூலகம்eDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
}
void TIM2_Configuration(void)
{
TIM_SetCounter( TIM2, 0x0000);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); /*清除更新标志位*/
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); //清除TIM2等待中断更新中断标志位
#endif
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //设置TIM2通道输入中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*配置优先级组*/
TIM2_Configuration();
do
{
}while(r2);
TIM_Cmd(TIM2, DISABLE);
Delay(7000000);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
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_RAM
int main(void)
GPIO_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)); //正向旋转
main.c文件内容:
#include"stm32f10x_lib.h"
#include"main.h"
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
int pulse;
int StepCount;
int pulse1;
int pulse2;
int t1;
int t2;
int r1;
int r2;
void RCC_Configuration(void);
GPIO_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和DCY1
GPIO_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和M2
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
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和Mo
GPIO_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接M1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void NVIC_Configuration(void)
TIM_TimeBaseStructure.TIM_Period = 2000; //设定的最大计数值2000,最大计数值是0xffff
TIM_TimeBaseStructure.TIM_Prescaler = 72; //分频72
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割
GPIO_Configuration();
GPIO_WriteBit(GPIOD, GPIO_Pin_7, (BitAction)(0));
GPIO_WriteBit(GPIOD, GPIO_Pin_6, (BitAction)(0)); //DCY1 DCY2为00,即Normal %0 DECAY
GPIO_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和TQ2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*允许TIM2全局中断*/
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7; //PA的3.4.7接CLK,CW/CCW,StepReset
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
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(GPIOA,GPIO_Pin_4)));
TIM_ARRPreloadConfig(TIM2, ENABLE); /*预装载寄存器的内容被立即传送到影子寄存器 */