完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前不久弄到一只28BYJ48型步进电机,没有资料,从网上查找,搜到一些资料,但按照网上介绍的程序实验,都没有成功。后来根据资料的原理部分,试着自己编写了一段程序,经过多次实验调试,终于成功了。
哈哈,收获不小!!! 步进电机是一种将电脉冲转化为角位移的执行设备。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 28BYJ48型步进电机是四相八拍电机,电压为DC5V~DC12V。当对步进电机按一定顺序施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号使得步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A……),双(双相绕组通电)四拍(AB-BC-CD-DA-AB……),四相八拍(A-AB-B-BC-C-CD-D-DA-A……)。本例是使用四相八拍驱动方式实现的。 下面是我写的C语言控制程序实现28BYJ48型步进电机正转五圈然后倒转五圈的效果: //******************************************************************************** //* 标题: 步进电机正反转演示程序 * //* 文件: 步进电机正反转演示.C * //* 日期: 2011-3-13 * //* 环境: 使用自制单片机最小系统板测试通过 * //******************************************************************************** //* 描述: 28BYJ-48步进电机正反转控制 * //* 电机使用端口:P1.0、P1.1、P1.2、P1.3 * //* 单双八拍工作方式:A-AB-B-BC-C-CD-D-DA * //******************************************************************************** #include #include //**********************正向旋转相序表***************************** unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //**********************反向旋转相序表***************************** unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //***********************延时子程序******************************** void delay(unsigned int t) { unsigned int k; while(t--) { for(k=0; k<125; k++) {} } } //**********************步进电机正转****************************** void motor_ffw(unsigned int n) { unsigned char i; unsigned int j; for (j=0; j<8*64*n; j++) { for (i=0; i<8; i++) { P1 = FFW; delay(1); } } } //*********************步进电机反转******************************** void motor_rev(unsigned int n) { unsigned char i; unsigned int j; for (j=0; j<8*64*n; j++) { for (i=0; i<8; i++) { P1 = REV; delay(1); } } } //*************************主程序********************************* main() { while(1) { motor_ffw(5); //电机正转5圈 delay(1000); motor_rev(5); //电机反转5圈 delay(1000); } } //******************************************************************************** //* 标题: 步进电机制作循光转台 * //* 文件: 步进电机正反转演示.C * //* 日期: 2014-3-13 * //* 环境: 使用自制单片机最小系统板测试通过 * //******************************************************************************** //* 描述: 28BYJ-48步进电机正反转控制 * //* 电机使用端口:P1.0、P1.1、P1.2、P1.3 * //* 单双八拍工作方式:A-AB-B-BC-C-CD-D-DA * //******************************************************************************** #include #include #define uchar unsigned char #define uint unsigned int ***it key1=P0^1; //光敏传感器,数字量I/O口 //**********************正向旋转相序表***************************** //电机使用端口:P1.0、P1.1、P1.2、P1.3 //unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; // 1000 1100 0100 0110 0010 0011 0001 1001 //电机使用端口:P2.0、P2.1、P2.2、P2.3 unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //1000 1100 0100 0110 0010 0011 0001 1001 //**********************反向旋转相序表***************************** unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //***********************延时子程序******************************** void delay(unsigned int t) { unsigned int k; while(t--) { for(k=0; k<125; k++) {} } } /******************************************************************************** ** 函数名称 : delay1(uint z) ** 函数功能 : 延时函数 ms 毫秒 ******************************************************************************** */ void delay1(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } //**********************步进电机正转****************************** void motor_ffw(unsigned int n) { unsigned char i; unsigned int j; for (j=0; j<8*64*n; j++) { for (i=0; i<8; i++) { P2 = FFW; delay(1); //模块在无光条件或者光强达不到设定阈值时,DO口输出高电平, //当外界环境光强超过设定阈值时,模块D0输出低电平; if(key1==0) { delay1(10); //消抖动 延时10ms if(key1==0) //确认触发 { } } } } } //*********************步进电机反转******************************** void motor_rev(unsigned int n) { unsigned char i; unsigned int j; for (j=0; j<8*64*n; j++) { for (i=0; i<8; i++) { P2 = REV; delay(1); //模块在无光条件或者光强达不到设定阈值时,DO口输出高电平, //当外界环境光强超过设定阈值时,模块D0输出低电平; if(key1==0) { delay1(10); //消抖动 if(key1==0) //确认触发 { while(!key1); //确定检测到光源,停止转动 } } } } } //*************************主程序********************************* main() { while(1) { motor_ffw(1); //电机正转1圈,处于检测状态 delay(1000); motor_rev(1); //电机反转1圈 delay(1000); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1567 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1509 浏览 1 评论
937 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
668 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1561 浏览 2 评论
1850浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
616浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
511浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
492浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-11 09:03 , Processed in 0.696349 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号