基于STM32的步进电机实验
目录
基于STM32的步进电机实验
步进电机介绍
步进电机基础知识
步进电机参数说明
例题说明
基于28BYJ步进电机的介绍
28BYJ步进电机的配置流程
电机工作状态与引脚的关系
四相八拍的正向旋转工作方式
STM32的PWM控制步进电机运转的实质
STM32库函数配置
Main.c
Led.c
Led.h
Timer.c
Timer.h
基于STM32的步进电机实验
步进电机介绍
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机基础知识
步进电机参数说明
四相步进电机有两种运行方式 1.四相四拍;2.四相八拍。
拍数
指电机转过一个齿距角所需脉冲数,通俗的来讲拍数指的是步进电机运行时每转一个齿距所需的脉冲数。以四相电机为例,有四相单四拍运行方式即A-B-C-D-A,有四相四拍运行方式即AB-BC-CD-DA-AB,有四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
转速
以基本步距角1.8°的步进电机为例(现在市场上常规的二、四相混合式步进电机基本步距角都是1.8°),四相八拍运行方式下,每接收一个脉冲信号,转过0.9°,如果每秒钟接收400个脉冲,那么转速为每秒400X0.9°=360°,相当与每秒钟转一圈,每分钟60转。
步距角
对应一个脉冲信号,电机转子转过的角位移用θ表示,即在没有减速齿轮的情况下,对于一个脉冲信号,转子所转过的机械角度。θ=360度/(转子齿数*运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步)。
连续运行的最高工作频率fmax
步进电机连续运行时,它所能接受的,即保证不丢步运行的极限频率,称为最高工作频率。它是决定定子绕组通电状态最高变化频率的参数,它决定了步进电机的最高转速。
传动比
我们知道主从齿轮之间有传动关系,如下图所示:
如果让齿轮1的齿数为:Z1,转速为:n1,齿轮2的齿数为:Z2,转速为:n2,则两啮合齿轮转速和齿数间的关系为:n1/n2=Z2/Z1。
减速比
减速装置的传动比,是传动比的一种,是指减速机构中瞬时输入速度zhi与输出速度的比值,用符号“i”表示减速比的意思:比如减速比1/64,:如果步进电机输出1N.m的转矩的话,通过减速箱转换后的输出力矩64N.m,当然转速降低为原转速的1/64
例题说明
例如:2相4线步进电机57BYG250-56,它的相数是2,转子齿数是50,步距角是1.8°
则它的每一个转子齿距为:360°/50=7.2°,
拍数为:7.2°/1.8°=4(拍)
也就是说,步进电机57BYG250-56每转一个齿距需要4个脉冲。
基于28BYJ步进电机的介绍
以双四拍为例:
当28BYJ步进电机的转子转动5.625°时,最外面齿轮的转速由于经过了齿轮的传动转速变为了原来的1/64。
这里要注意减速比的概念,1/64并不是指电机的转子减速1圈最外面齿轮减速64圈,这里的指的是电机的转子输出1N.m的扭矩,由于传动比,最外面的齿轮会输出64N.m的扭矩进行减速。
其次,这里“起动频率>=550Hz”很有迷惑性,这里他应该表示的意思是ABCD四个引脚的电平变化频率小于550Hz,28BYJ电机可以按照指定参数正常工作。
28BYJ步进电机的配置流程
电机工作状态与引脚的关系
四相八拍的正向旋转工作方式
于是得到双相8拍正向旋转码为:{0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09},如果想要反转只需将顺序颠倒即可。
STM32的PWM控制步进电机运转的实质
① 不是说可以通过调节频率来调节步进电机的转速吗,可是现在只有这么窄的范围,可以实现转速调节吗?而且我发现在这些频率内,电机转速都差不多,是不是我理解错了?
转速和PWM的频率没关系,和绕线的通电方向的切换速度有关。
② 当我调节PWM占空比的时候,发现也没有什么实际作用,电机转速也不会改变,那么占空比对于步进电机有什么意义呢?
PWM占空比会影响步进电机的力矩但不会影响速度,占空比太小了其力矩无法推动自身的惯性就会出现转不动的现象。
③ 我该如何利用PWM模块来调节步进电机不同的转速?
以4节拍为例
A+:A线组正向通电
B+:B线组正向通电
A+ -> B+ -> A- -> B- ->A+ ->…
该循环越快电机转速越快,但注意是有上限的
对于直流电机:影响速度的是占空比,频率与电机转速无关,相对而言,频率越高,电流纹波越小,但是,电源的损耗越高,因此,调节频率的主要原则是电流纹波满足要求的情况下,开关频率适当低.
占空比可改变输出电压的平均值,从而改变电机的电流和转速.这是一种数字脉冲技术,来达到改变送到电机的平均电压来调速。还有一种模拟技术:电压控制技术。
对于步进电机:采用脉冲频率控制。不能用占空比控制,也不能用电压控制。影响速度的是脉冲频率,影响位置的是脉冲个数。
以4节拍为例
A+:A线组正向通电
B+:B线组正向通电
A+ -> B+ -> A- -> B- ->A+ ->…
该循环越快电机转速越快,但注意是有上限的。
回到前面的频率问题,就如刚才说的,1秒内,0.5秒开,0.5秒灭,占空比是50%对吧?那么,1毫秒内,0.5毫秒开,0.5毫秒灭,占空比也是50%,对吧?如果是1秒呢,频率就是1HZ,如果是1毫秒,频率就是1KHZ,显然,同样是50%占空比,如果频率是1HZ,那电机肯定是跳着走的,灯光肯定闪得可以跳舞,不具有调速和调光的意义。
STM32库函数配置(以PWM调节直流电机速度为例)
Main.c
#include "timer.h"
#include "delay.h"
#include "key.h"
#include "led.h" int main()
{ u16 ARR = 5000, PR = 7200, CompareValue = 0; LED_InitConfig(); delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); TIMER_InitConfig(ARR, PR); // 周期:0.01秒,占空比:0%-31% KEY_InitConfig(); while(1) { CompareValue += 5; TIM_SetCompare1(TIM1, CompareValue); // 修改比较值 CompareValue &= 0xFFF; delay_ms(100); // 延迟100ms }
}
Led.c
Led.h
#ifndef _LED_H
#define _LED_H #include "sys.h" void LED_InitConfig(); #define LED0 PBout(5)
#define LED1 PEout(5) #endif
Timer.c
#include "timer.h"
#include "stm32f10x.h"
#include "sys.h"
#include "led.h" void TIMER_InitConfig(u16 ARR,u16 PR)
{ GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1, ENABLE); // 使能GPIOA与TIMER1的总线时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // PA8设置为复用推挽输出 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&NVIC_InitStructure); // 配置NVIC的TIM1定时器溢出中断通道使能 NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); // 配置NVIC的TIM1比较中断通道使能 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = ARR; TIM_TimeBaseInitStructure.TIM_Prescaler = PR; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure); // 配置TIM1的计数器 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Disable; TIM_OC1Init(TIM1, &TIM_OCInitStruct); // 配置TIM1_CH1为PWM2输出模式 TIM_ITConfig(TIM1, TIM_IT_CC1|TIM_IT_Update, ENABLE); // TIM1捕获比较/更新中断配置 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 使能TIM1预加载寄存器 TIM_Cmd(TIM1, ENABLE); // TIM1使能
} void TIM1_CC_IRQHandler()
{ if(TIM_GetITStatus(TIM1,TIM_IT_CC1) == SET) // 中断标志位被捕获 { LED0 = !LED0; } TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); // 清除中断标志位
} void TIM1_UP_IRQHandler()
{ if(TIM_GetITStatus(TIM1, TIM_IT_Update) == SET) { LED1 = !LED1; } TIM_ClearITPendingBit(TIM1,TIM_IT_Update); // 清除中断标志位
}
Timer.h
#ifndef _TIMER_H
#define _TIMER_H #include "sys.h" void TIMER_InitConfig(u16 ARR,u16 PR); #endif
注:这里的LED0,LED1的工作状态是否反转标志着是否进入相应的中断。
基于STM32的步进电机实验相关推荐
- 基于51单片机霍尔测速直流电机控制设计(含源码+原理图+论文+PCB封装)、基于STM32闭环步进电机控制系统设计(仿真,程序,说明)-转发分享
设计思路: 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法.本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理.产生方法以及如何通过软件编 ...
- STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序
STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...
- 基于STM32的TFT-LCD触摸屏实验(HAL库)
前言:TFT-LCD作为显示终端必不可少的设备,目前大部分的TFT-LCD都具备了触摸功能.无论是在MCU亦或是SOC(MPU)中,触摸屏的使用都是十分常见的.触摸屏LCD通常分为2种:电阻触摸屏,电 ...
- 基于stm32的模拟楼道光控开关的实验
实验目的:本文基于stm32开发板做一个模拟光控开关的实验,实验最后的实现的功能是,在光照强度大于临界值LED灯就变暗,如果光照强度小于临界值LED灯就变亮. 文章目录 一.硬件设计 1.本实验所用到 ...
- 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+
## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...
- 实验5 基于stm32的HF高频RFID通信协议
实验5 基于stm32的HF高频RFID通信协议 实验目的 1.1 掌握高频读卡器的通讯协议 1.2 掌握本平台高频模块的操作过程 1.3 掌握高频模块工作原理 实验设备 硬件:RFID实验箱套 ...
- STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数
STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...
- 基于STM32的智能循迹避障小车实验(小车运动部分)
写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...
- 基于stm32电梯管理系统设计
基于stm32电梯管理系统设计 ==这里记录一下以前自己做的嵌入式课程设计,报告中的图片和文字太多了,全部一个一个把搬过来太麻烦了,需要完整文本和代码自行主页私我== 摘要 关键词 一.课题概述 1. ...
最新文章
- Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)
- aba问题mysql_解决CAS机制中ABA问题的AtomicStampedReference详解
- Linux的pcel问题-bash: pecl: command not found
- 算法问题拓展——kadane算法及其二维数组的扩展
- 讨论.NET Core 配置对GC 工作模式与内存的影响
- LeetCode 1442. 形成两个异或相等数组的三元组数目(前缀异或)
- 交易引擎的对账状态为空的处理方式
- CLion 的使用(一)
- bzoj 1673: [Usaco2005 Dec]Scales 天平(DFS)
- 在c语言Windows窗口添加按钮,C语言用windows.h创建按钮的问题
- win10 Visio软件运行 闪退
- Unity3d 周分享(8期 2018.12.16)
- 高手教你如何从零开始学游戏编程
- 惠普服务器文档,惠普服务器详细整理参数
- 从唐虞夏商宋五字的甲骨文本意来重温那段历史。
- Apache-drill Architechture
- centos 7安装部署 单节点 Elasticsearch 6.6.0
- Linux的mask什么意思中文,mask是什么意思
- 简述一个html文档应包含几个基本标记,简述HTML文件的基本标记组成
- 使用WMI provider创建进程