Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
步进电机
简单的步进电机驱动调试
发布于 2023-11-27 00:35:37 浏览:1205
订阅该版
[tocm] # 1.背景 收拾东西发现一个步进电机(应该是之前从摄像头拆下来的,42步进电机),驱动一下试试。简单记录一下,内容比较简单,欢迎大家指正。 # 2.硬件 都是用手边有的材料: 控制板用ART-Pi; 驱动板L298N模块; 电源DC12V; # 3.原理 ## 3.1 什么是步进电机 步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。 步进电机的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。(网上摘录) ## 3.2 步进电机驱动方式 1) 4拍,整步控制,就是依据电机固有结构设计固定的步距角工作,一个电脉冲,步进电机前进一个步距角; 2)8拍,半步控制,是以电机固有的结构决定的步距角的一半角度进行步进旋转; 3)微步,细分控制,步距角更小,就是1/4步、1/8步、1/16步、1/32步,可以到很高的细分(最高应该是1/256步),对应的步进角度就是在整步步距角乘以微步系数。微步控制就要用到驱动芯片了,比如TI的DRV8889A。 ## 3.3 L298N模块 L298N常用的双H桥电机驱动模块,都应该比较熟悉了不再过多介绍。 # 4.硬件连接 1)步进电机2相4线,直接接L298N模块的OUT1~OUT4,ENA、ENB跳线帽,电源DC12V; OUT1--->A+ OUT2--->A- OUT3--->B+ OUT4--->B- 2)L298N接ART-Pi IN1--->PH7 IN2--->PH8 IN3--->PH9 IN4--->PH10 ![1.png](https://oss-club.rt-thread.org/uploads/20231127/f1011c249e9b5b85278180740c35f4c1.png.webp) # 5.程序代码 这里采用8拍控制方式,简单驱动电机转动,实现任意角度的正反转控制。 ## 5.1 正转控制(顺时针) ```c void turn_angle_forward(float_t angle) { rt_uint16_t half_beat_num = 0;//角度转换半拍总数 rt_uint16_t half_beat_count = 0;//半拍计数 rt_uint8_t beat_now = 0;//当前节拍 //半拍步进值360°/50/8 = 0.9° half_beat_num = (angle * 10) / 9; while(1) { switch (beat_now) { case 0://1000 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 1; break; case 1: //1010 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 2; break; case 2://0010 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 3; break; case 3://0110 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 4; break; case 4://0100 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 5; break; case 5://0101 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 6; break; case 6://0001 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 7; break; case 7://1001 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 0; break; default: beat_now = 0; break; } DELAY; half_beat_count++; if(angle > 0) { if(half_beat_count > half_beat_num) break; } } turn_stop(); } ``` ## 5.2 反转控制(逆时针) 反正控制时序,形象点从硬件上来说,把A相和B相调换,对应程序的话就是调整一下控制时序。 ```c void turn_angle_reverse(float_t angle) { rt_uint16_t half_beat_num = 0;//角度转换半拍总数 rt_uint16_t half_beat_count = 0;//半拍计数 rt_uint8_t beat_now = 0;//当前节拍 //半拍步进值360°/50/8 = 0.9° half_beat_num = (angle * 10) / 9; while(1) { switch (beat_now) { case 0://0010 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 1; break; case 1://1010 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 2; break; case 2://1000 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 3; break; case 3://1001 rt_pin_write(IN1_PIN, PIN_HIGH); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 4; break; case 4://0001 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 5; break; case 5://0101 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_HIGH); beat_now = 6; break; case 6://0100 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 7; break; case 7://0110 rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_HIGH); rt_pin_write(IN3_PIN, PIN_HIGH); rt_pin_write(IN4_PIN, PIN_LOW); beat_now = 0; break; default: beat_now = 0; break; } DELAY; half_beat_count++; if(angle > 0) { if(half_beat_count > half_beat_num) break; } } turn_stop(); } ``` ## 5.3 停止 ```c void turn_stop(void) { rt_pin_write(IN1_PIN, PIN_LOW); rt_pin_write(IN2_PIN, PIN_LOW); rt_pin_write(IN3_PIN, PIN_LOW); rt_pin_write(IN4_PIN, PIN_LOW); } ``` ## 5.4 转动效果 正转360°,反转360° ![2118b951ef6d95f2c93b0c2a5978f6ec.gif](https://oss-club.rt-thread.org/uploads/20231127/57e3d753a926bd76c45da58c3023cb38.gif) # 6.总结 简单写了段程序驱动一下步进电机,实现了步进电机的8拍控制,可以任意角度正反转。调速可以通过修改脉冲频率,也就是代码中的DELAY,但是由于步进电机特性限制,速度不能太快,否则会驱动不起来;太慢长时间运转会发热严重。 后续有时间搞个芯片,调调微步控制效果。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小小李sunny
这家伙很懒,什么也没写!
文章
4
回答
1443
被采纳
289
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部