完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用
uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA 其A、B、C、D指的是uln2003芯片驱动板的1N1、1N2、1N3、1N4 ,波形在上表示有输入信号,波形在下表示无输入信号。 我们采用红牛开发板进行步进电机控制,为了便于接线,我们需要在红牛开发板上焊接两 此外至少需要4根杜邦线,还需提供一个5V的直流电源,接线方式如下: PC4接IN1 PC5接IN2 PC6接IN3 PC7接IN4 5V电源连接 网友fangyuan和奋斗中写了一个纯.NET MF C #的控制代码,比较容易理解,但是由于是托管代码,需要虚拟机解释执行,所以运行效率 较低,部分代码如下: //四相八拍:A->AB->B->BC->C->CD->D->DA while (true) { //A相输出高电平,BCD低 pios[0].Write(high); pios[1].Write(low); pios[2].Write(low); pios[3].Write(low); Thread.Sleep(sleepTime); //AB相输出高电平,CD低 pios[0].Write(high); pios[1].Write(high); pios[2].Write(low); pios[3].Write(low); Thread.Sleep(sleepTime); … … } 详细内容请参见fangyuan的博客文章《【.NET MF 学习笔记系列(一)】MF 控制步进电机》。 由于步进电机一般都采用PWM控制,我最初也打算这么做,STM32 系列的芯片的时钟控制器是可以输出4路PWM的,但是研究后我觉得采用uln2003 芯片的驱动板是无法实现PWM控制的。如果硬要采用PWM控制,其中一路的PWM (占空比)是可以实现的,但是其它三路,无法调整相位,所以目前我无法输出占空比相? ???窍辔徊煌?牟ㄐ巍? 我调整了一下思路,实现了所谓的IO Timer功能,就是采用Timer定时中断,定时处理C #上层的IO输出要求,底层代码暂且不说了,先说一下封装后的上层接口。 public sealed class IOTimer { public static bool Initialize(byte timer, int Compare, int psc, byte[ ] pins, byte[] states); public static bool SetPSC(byte timer, int psc); public static bool Start(byte timer); public static bool Stop(byte timer); public static bool Uninitialize(byte timer); } STM32F103芯片有8个定时器,其中timer1和timer8暂且不要用,timer的取值为1~6。 timer1和timer8连接APB2总线,其它定时器连接APB1总线,APB1操作速度限于36MHz, APB2操作于全速(最高72MHz)。Compare是计数器数值,16位最大65535,psc 预分频器数值,也是16位的,最大为65535,计数器的时钟频率CK_CNT是fCK_PSC/(PSC[15 :1]+1)。 Psc可以实时动态调整。 Pins数组存放要设置的IO的pin脚号,一次最多可以控制8路,states数组存放IO 的输出状态,最多可以有32个状态值,一个字节的每一位控制每一路。 Start就是计时器开始工作,IO此时输出,Stop就是定时器停止工作,IO停止输出。 好了,在实际控制步进电机之前,我们先控制一下LED灯,让它亮一秒,灭3秒( 红牛开发板,输出0灯亮),相关代码如下: //LED灯控制(定时器timer6) byte[] pins = new byte[] { (byte)GPIO_NAMES.PF7 }; //亮一秒,灭3秒(红牛开发板,输出0灯亮) byte[] control_Data = new byte[] { 0x0, 0x1, 0x1, 0x1}; //时钟频率36M 计数60000次,在分频(599+1)次大概一秒触发一次 IOTimer.Initialize(5, 60000, 599, pins, control_Data); IOTimer.Start(5); 至于控制步进电机,其代码也是非常简单,核心代码如下: //顺时针旋转 static void Run() { IOTimer.Uninitialize(5); byte[] pins = new byte[] { (byte)GPIO_NAMES.PC4, (byte)GPIO_NAMES.PC5 , (byte)GPIO_NAMES.PC6, (byte)GPIO_NAMES.PC7 }; byte[] control_Data = new byte[] { 0x1, 0x3, 0x2, 0x6, 0x4, 0xC, 0x8, 0x9 }; IOTimer.Initialize(5, 60000, 1, pins, control_Data); IOTimer.Start(5); } //逆时针旋转 static void AntiRun() { IOTimer.Uninitialize(5); byte[] pins = new byte[] { (byte)GPIO_NAMES.PC4, (byte)GPIO_NAMES.PC5 , (byte)GPIO_NAMES.PC6, (byte)GPIO_NAMES.PC7 }; byte[] control_Data = new byte[] { 0x9, 0x8, 0xc, 0x4, 0x6, 0x2, 0x3, 0x1 }; IOTimer.Initialize(5, 60000, 1, pins, control_Data); IOTimer.Start(5); } //速度级别 static void SetV(int value) { switch(value) { case 1: IOTimer.SetPSC(5,1); break; case 2: IOTimer.SetPSC(5,5); break; case 3: IOTimer.SetPSC(5,10); break; } } 至于PWM方式控制步进电机的示例,需要等我采购好相关驱动板后,再做探究。 注:该示例程序,红牛开发板需要部署最新的V0.9.7固件。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:14 , Processed in 0.831762 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号