完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,很高兴又给大家写博客了。平时工作比较繁忙,恰巧最近在学习和研究DSP,给大家带来这篇文章。文章的第1部分和第2部分为普中开发攻略摘抄的,因为写的比较详细,我也就不过多解释了,本文关注的点在于原理和程序,希望能给大家带来些帮助。本文实现的效果就是通过三个按键去控制四相双极性步进电机的正转,反转和停止。
1.步进电机的介绍(该部分来自普中开发板攻略摘抄,了解一下) 强烈推荐大家看这个文章 四相双极性电机的驱动原理(点此进入),下面这些适当了解,如果大家从来没有接触过电机的话可能会花那么一些时间,你需要去花上一两个小时去了解下步进电机然后再回来看下面的内容,学习当循序渐进。 四相双极性电机 我们先来看看这两张图,从图中我们可以看到有4个线圈,我们把它称做4相,一个线圈就是一个相,有几个线圈就对应几个相,比较好理解。我们看到它的一组线圈有两个互相连接,那么很明显它有2个接线头,我们把它称做A+和A-,B+和B-。我们的电流从A+流到A-,通过我们的安培定理和右手定则,我们可以得到电流和磁场的关系,这个并不重要 ,我们只要知道,A+和A-是互相连接的,所以它们是先后流过电流的,这对于我们的程序来说,假如A+对应一个GPIO口,A-对应一个GPIO口,我们只要按照顺序来给它一个高低电平,就会有电流流过,假如A+为高,A-为低电平,这时候,电流从A+流到A-,产生磁场,同样我们的B+和B-也是一样的。所以四相就对应四个GPIO口的高低电平。只要我们按照顺序来开启相序,我们的转子就会转起来了。后面的电机时序就是这样来的。 (图片来自网上,借用一下) 引用:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。 步进电机主要分为以下几类: (1)永磁式(PM) (2)反应式(VR) (3)混合式(HB) 步进电机主要威廉希尔官方网站 指标如下: (1)相数 (2)步距角 (3)拍数 (4)保持转矩 步进电机有三线式、 四线式、 五线式和六线式, 但其控制方式均相同, 都要以脉冲信号电流来驱动。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8° 。 其旋转角度与脉冲的个数成正比。 步进电动机的正、 反转由励磁脉冲产生的顺序来控制。 六线式四相步进电机是比较常见的, 它的控制等效电路如下图所示: 励磁方式 步进电机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。 假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电动机前进 1.8°。简要介绍如下: ①一相励磁:在每一瞬间, 步进电机只有一个线圈导通.每送一个励磁信号, 步进电机旋转 1.8, 这是三种励磁方式中最简单的一种。 其特点是:精确度好、 消耗电力小,但输出转矩最小, 振动较大。 如果以该方式控制步进电机正转 ②二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号, 步进电机旋转 1.8。 其特点是: 输出转矩大, 振动小, 因而成为目前使用最多的励磁方式。 如果以该方式控制步进电机正转, 对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。 ③一二相励磁:为一相励磁与二相励磁交替导通的方式。 每送一个励磁信号, 步进电机旋转 0.9。 其特点是:分辨率高, 运转平滑, 故应用也很广泛。 如果以该方式控制步进电机正转,对应的励磁顺序见下表。 若励磁信号反向传送, 则步进电机反转。 2.步进电机的原理图 其实这个电路很简单,就是一个驱动芯片(TC15085)来驱动马达,就是一个非门的达林顿管,大家知道它是非门就可以了,它有多个通道。适用于把多个电平进行翻转,它的驱动电流也比较大,所以比较适合用于驱动马达。为什么用到驱动IC呢?而不是直接用GPIO口去控制电机的各个相位,这里的相指的是线圈。原因很简单,因为我们不能直接通过控制IC去控制电机,第一,耗电流,我们需要知道GPIO口能输出多大的电流。第二,有危险因素,可能会烧掉主芯片。所以通过IC的GPIO口去作一个开关控制,类似于MOS管的栅极给它一个门限电压导通一样,常见的把控制芯片的GPIO口当做开关用的很多,比如继电器,LED灯等等,都是把IO口作为一个控制作用,而不是去直接去驱动它。下图中我们用到了GPIO2,3,4,5这四个GPIO口。 这里是我自己用EXCEL列出来的,后面程序用到,原理就是把时序依次送到数据寄存器里。本部分为最核心的位与运算屏蔽算法,单独操作寄存器的多位而不影响其它无关的位,从而实现电机的运作。这里有点难理解,看不懂就多思考几次顺便去学习下逻辑运算,还是给大家讲讲这个算法吧 假设寄存器A有32位,分别为1111 1111 1111 1111 1111 1111 1100 1001, 如果我们只想改变最后6位使得其变成1111 1111 1111 1111 1111 1111 1111 0110,不影响前面的26位,那么可以采用万能的核心屏蔽算法: (A | 0000 0000 0000 0000 0000 0011 1111 )&1111 1111 1111 1111 1111 1111 1111 0110 因为我们是要把GPIO和电机的极性时序分别对应上,所以请看下面这张图,右边就是28335的GPIO和电机的电极对应关系。我们要保证把这4位数送进GPIO数据寄存器里,而且又要保证GPIO数据寄存器的其他的位不受影响,所以这里我们用到逻辑运算屏蔽其他位,逻辑运算不熟悉的同学可以去百度查询下。 利用该算法去屏蔽其他位 ,用到了逻辑运算。这个比较难理解,希望大家不懂的多多看一下。 Uint32 STEP_MOTOR_ZTurn[] = { (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef }; Uint32 STEP_MOTOR_FTurn[] = { (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7 }; 3.步进电机的驱动程序 程序的话大家仔细看,其实不难,按键扫描程序的话,由于开发板是矩阵按键,驱动程序我这里就不列出来了。等会我把源码打包供大家下载。现在来给大家讲解下程序 /* * main.c * * Created on: 2020年5月31日 * Author: Administrator */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "key.h" #include "leds.h" #include "beep.h" #include "relay.h" #include "dc_motor.h" #include "step_motor.h" void delay(void); // //#define 4LINE2 void main(){ InitSysCtrl(); LED_Init(); KEY_Init(); BEEP_Init(); StepMotorInit(); // the sequence of step_motor by working,1000,0100,0010,0001 //这里定义正反转的数组,根据上面给的图片推导出来的 Uint32 STEP_MOTOR_ZTurn[] = { (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef }; Uint32 STEP_MOTOR_FTurn[] = { (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffef, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffffb, (GpioDataRegs.GPADAT.all|0x0000003c)&0xffffffdf, (GpioDataRegs.GPADAT.all|0x0000003c)&0xfffffff7 }; Uint16 i = 0; static short flag_key1 = 0;//按键1按下标志 static short flag_key2 = 0;//按键2按下标志 static short flag_key4 = 0;//按键4按下标志 while(1){ i++; if(i%5000==0){LED2_TOGGLE;}//打开LED2 BEEP_ON;//打开蜂鸣器 DELAY_US(200); char key_scan = Key_Scan(); //判断按键按的是哪个,需要消抖,给个15ms的消抖时间 //如果确定按键按的是1,标志为1 if(key_scan==1){ DELAY_US(15000); if(key_scan==1){ flag_key1 = 1; flag_key2 = 0; flag_key4 = 0; } } //如果确定按键按的是2,标志为2 if(key_scan==2){ DELAY_US(15000); if(key_scan==2){ flag_key2 = 1; flag_key1 = 0; flag_key4 = 0; } } //如果确定按键按的是4,标志为4 if(key_scan==4){ DELAY_US(15000); if(key_scan==4){ flag_key2 = 0; flag_key1 = 0; flag_key4 = 1; } } //如果按键1按下 if(flag_key1==1){ int j; for(j=0;j<4;j++){ GpioDataRegs.GPADAT.all = STEP_MOTOR_ZTurn[j];//把时序送到GPADAT寄存器里,GPADAT是GpioDataRegs寄存器里的一组,包含GPIO0-31共32个GPIO口 DELAY_US(5000); //delay 5ms } } //如果按键2按下 if(flag_key2==1){ int j; for(j=0;j<4;j++){ GpioDataRegs.GPADAT.all = STEP_MOTOR_FTurn[j]; DELAY_US(5000); //delay 5ms } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
2438 浏览 0 评论
9107 浏览 4 评论
36786 浏览 19 评论
5029 浏览 0 评论
24757 浏览 34 评论
1536浏览 2评论
1755浏览 1评论
2202浏览 1评论
1561浏览 0评论
532浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 03:51 , Processed in 1.203304 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号