历史上的今天
今天是:2025年10月13日(星期一)
2022年10月13日 | STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
2022-10-13 来源:csdn
一、环境介绍
MCU: STM32F103ZET6
编程软件: Keil5
二、硬件介绍
开发板采用STM32F103ZET6 最小系统板

电机驱动板采用的是ULN2003

步进电机采用的是28BYJ4 (5V 4相5线步进电机)
三、驱动代码

3.1 motor.c
#include "motor.h"
//步进电机正反转数组1
u16 PositiveSequence[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A
u16 ReverseOrder[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.
void motor_delay_ms(u32 ms)
{
u32 i,j;
for(i=0;i } void motor_stop(void) { MOTOR_1=0; MOTOR_2=0; MOTOR_3=0; MOTOR_4=0; } void motor_init(void) { RCC->APB2ENR|=1<<4; GPIOC->CRL&=0x00FFFFFF; GPIOC->CRL|=0x33000000; GPIOC->CRH&=0xFFFFFF00; GPIOC->CRH|=0x00000033; // IN4: PC9 d // IN3: PC8 c // IN2: PC7 b // IN1: PC6 a } void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) { GPIOx->ODR = PortVal; } void motor_just(int speed) //一个脉冲 { uint8_t i; for(i=0;i<4;i++) { GPIO_Write(GPIOC,PositiveSequence[i]); motor_delay_ms(speed); } } void motor_back(int speed) { uint8_t i; for(i=0;i<4;i++) { GPIO_Write(GPIOC,ReverseOrder[i]); motor_delay_ms(speed); } } //由于 *一个脉冲* *输出轴* 转0.08789度(电机实转0.08789*64=5.625度),即步进角为5.625度。则转完A-B-C-D为 *8个脉冲* //,即0.08789*8=0.70312度。若称A-B-C-D为一个周期,则j为需要的转完angle角度所需的周期数。 //步进电机正转角度函数 void motor_just_angle(int angle,int speed) { int i,j; j=(int)(angle/0.70312); for(i=0;i motor_just(speed); } motor_stop(); } //步进电机反转角度函数 void motor_back_angle(int angle,int speed) { int i,j; j=(int)(angle/0.70312); for(i=0;i motor_back(speed); } motor_stop(); } //步进电机反转圈函数 void motor_back_circle(int ring ,int speed) { int i; for(i=0;i motor_back_angle(360,speed); } } //步进电机正转圈函数 void motor_just_circle(int ring,int speed) //步进电机正转角度函数 { int i; for(i=0;i motor_just_angle(360,speed); } } 3.2 motor.h #ifndef _MOTOR_H #define _MOTOR_H #include "sys.h" void motor_delay_ms(u32 x);//延时函数 void motor_init(void); //步进电机初始化 void motor_just(int speed); //步进电机正转函数 void motor_back(int speed); //步进电机反转函数 void motor_just_angle(int angle,int speed); //步进电机正转角度函数 void motor_back_angle(int angle,int speed); //步进电机反转角度函数 void motor_stop(void); //步进电机停止函数 void motor_just_circle(int ring ,int speed); //步进电机正转圈函数 void motor_back_circle(int ring ,int speed);//步进电机反转圈函数 //IN #define MOTOR_1 PCout(6) #define MOTOR_2 PCout(7) #define MOTOR_3 PCout(8) #define MOTOR_4 PCout(9) #endif 3.3 main.c /* ULN2003控制28BYJ-48步进电机接线: ULN2003接线: IN4: PC9 d IN3: PC8 c IN2: PC7 b IN1: PC6 a + : 5V - : GND */ int main() { u8 time_cnt=0; u8 key; LED_Init(); KEY_Init(); USART1_Init(115200); motor_init(); //步进电机初始化 USART1_Printf("程序初始化.....rn"); while(1) { //按键可以测试开锁和关锁 key=KEY_Scan(0); if(key==1) { LED1=0; //亮灯--表示开锁 motor_just_circle(1,300); //电机正转1圈 } else if(key==2) { LED1=1; //灭灯--表示关锁 motor_back_circle(1,300); //电机反转1圈 } DelayMs(10); time_cnt++; if(time_cnt>=50) { time_cnt=0; LED2=!LED2; } } }
史海拾趣
|
在三星原驱动的基础上修改摄像头驱动(应用程序几乎没改,应用BSP原来所带的demo),修改了相应的设置后,图像出来后结果是花屏,好像是把屏幕分成4块(从左往右),颜色也对。 将摄像头设置为斑马线测试格式输出时,出现的也不对,相差很多。 有 ...… 查看全部问答> |
|
EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 麻烦帮忙看看 EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 附STEPLDR。NB1引导时DNW信息 Step ldr run to here //加的DEBUG 22222222 //加的DEBUG Microsoft Windows CE Bootloader Common ...… 查看全部问答> |
|
我还是个学生,超级菜鸟,因为老师的项目,刚接触到这个开发板,现在遇到这样问题:我在VS2005里面做WIN CE6.0的一个模拟器,我从论坛里下了个WINCE6.0_CHS_SDK.msi,我单独做一个模拟器的时候就能能够运行,可是在华恒给的BSP上面调用的时候就一直 ...… 查看全部问答> |
|
网上很多网友都反映altium designer在某些方面还是优于10年经典版protel99se ,所以在空闲之余也下载了一个免安装绿化版的altium designer折腾了下。希望altium designer不要追究我使用了盗版的altium designer,只因个人财力有限。折腾不起正版。 ...… 查看全部问答> |
|
时间与地点 日期地点课程地址8月9日北京MSP430 LaunchPad北京市中关村科学院南路2号融科资讯中心A座518室8月16日深圳C2000 LaunchPad深圳市南山区华侨城兴隆街汉唐大厦19楼上海C2000 Concerto上海市浦东新区世纪大道1568号中建大厦32楼北京C2000 L ...… 查看全部问答> |
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; //设置为EXTI0 但是编译的时候却说“EXTI0_IRQChannel”没有定义,之后我吧其他的在固件库使用手册中给的中断的定义试了一下,都不行 ...… 查看全部问答> |
|
宿舍请个保姆是不可能的事情,不过我们可以通过蓝牙和单片机的结合设计一个电子宿舍保姆。早上系统闹钟会按时提醒我们起床,之后会通过该模块上的各种传感器给我们指出当前环境情况。再有单片机与继电器相连,很方便的通过蓝牙来遥控宿舍内电灯、风 ...… 查看全部问答> |
|
如果你输入3个关键字“电阻器”Baidu一下,你会发现很多与电阻器有关的信息。电阻器是一种最常用的元器件,虽然看起来简单,如果使用者对电阻器的了解不深入,势必将会影响到电路指标和产品质量。比如,设计一个高精度的温度采集器,则对电阻器的选 ...… 查看全部问答> |






