基于ARM的步进电机控制示例(串口方式+中断方式)

发布者:快乐飞翔最新更新时间:2016-04-22 来源: eefocus关键字:ARM  步进电机控制  串口方式  中断方式 手机看文章 扫描二维码
随时随地手机看文章
  本设计实现了通过ARM对步进电机(Motor)的控制。控制方式有两种,一种是通过外部中断,另外一种是通过串口发送命令进行控制。

  本设计可实现步进电机的速度和方向控制。通过串口方式控制电机时,只要在仿真过程中在虚拟终端(Virtual Terminal)输入相应的命令即可控制电机的运转。

  

                                           虚拟终端

 

  串口控制命令(双引号内字符,可自己定义)如下:

  "<": 使电机逆时针方向转动;

  ">": 使电机顺时针方向转动;

  "+": 加速;

  "-" : 减速。

  

  如果读者在仿真过程中不小心关闭了虚拟终端(Virtual Terminal),可以在调试(Debug)菜单下找到它。

  

  整体电路连接如下图所示:

 

  如果读者在实践过程中出现电机运转不稳定的情况可尝试把电机的Maximum RPM设置为一个较大的数值,此处笔者设置为7200,如下图所示:

 

 

  附上本设计源代码:

1 #include "config.h"
2
3  int DelayTime=60; //延时参数
4  
5 typedef struct UartMode
6 {
7 uint8 datab; //字长度,5/6/7/8可选
8   uint8 stopb; //停止位,1/2可选
9   uint8 parity; //奇偶校验位,0:无校验;1:奇检验;2:偶检验
10  }UARTMODE;
11
12 uint8 rcv_buf; //UART0数据接收缓冲区
13  uint8 rcv_new; //接收数据标志
14
15  //延时函数原型声明
16  void delay(int dly);
17
18  //工作模式设置函数原型声明
19  void SetWorkMode(char WorkMode);
20
21  //中断服务程序原型声明
22 void __irq IRQ_Eint0(void);
23 void __irq IRQ_Eint1(void);
24 void __irq IRQ_Eint2(void);
25 void __irq IRQ_Eint3(void);
26
27 //中断初始化函数
28 void Int_Init(void);
29
30 //串口0接收中断服务程序
31 void __irq IRQ_UART0(void);
32
33 //串口0数据发送函数
34 void UART0_SendByte(uint8 dat);
35
36 //串口0初始化函数
37 uint8 UART0_Init(uint32 baud, UARTMODE set);
38
39
40 //********************************************************************************************************
41 //主函数
42 int main (void)
43 {
44
45 UARTMODE set;
46
47 set.datab=8; //设置字长度为8位
48 set.stopb=1; //设置停止位为1位
49 set.parity=0; //设置检验方式为无校验
50
51 rcv_new=0; //接收数据标志初始化
52
53 //配置引脚功能
54 PINSEL0=0x0005c0c5;
55 PINSEL1=0x00000301;
56
57 IO0DIR=0x03<<21; //设P0.21-P0.22为输出
58
59 UART0_Init(9600, set); //串口初始化
60 U0FCR=0x01; //使能FIFO,并设置触发点为1字节
61 U0IER=0x01; //允许RBR中断,即接收中断
62
63 Int_Init(); //中断初始化(外部中断、串口中断)
64
65 while(1)
66 {
67 if(rcv_new==1)
68 {
69 rcv_new=0;
70 SetWorkMode(rcv_buf); //根据输入的控制信号改变步进电机的工作模式
71 UART0_SendByte(rcv_buf); //把键盘输入发回虚拟终端回显
72 }
73 //模拟脉冲信号驱动步进电机转动
74 IO0SET=0x01<<22;
75 delay(DelayTime);
76 IO0CLR=0x01<<22;
77 delay(DelayTime);
78 }
79 return 0;
80 }
81
82 //********************************************************************************************************
83 //延时函数
84 void delay(int dly)
85 {
86 int i,j;
87 for(i=0; i 88 for(j=0; j<1200; j++);
89
90 }
91
92 //********************************************************************************************************
93 //工作模式设置函数
94 void SetWorkMode(char WorkMode)
95 {
96 //WorkMode:控制信号
97 // '+':加速 '-':减速 '<':逆时针 '>':顺时针
98 switch(WorkMode)
99 {
100 case '+':
101 if(DelayTime>20)
102 DelayTime=DelayTime-20; //减少延时,即加速
103 break;
104 case '-':
105 if(DelayTime<100)
106 DelayTime=DelayTime+20; //增加延时,即减速
107 break;
108 case '<':
109 IO0CLR=0x01<<21; //设置的步进电机的运转方向为逆时针
110 break;
111 case '>':
112 IO0SET=0x01<<21; //设置的步进电机的运转方向为顺时针
113 break;
114 default :break;
115 }
116 }
117
118 //********************************************************************************************************
119 //外部中断0服务程序
120 void __irq IRQ_Eint0(void)
121 {
122 IO0CLR=0x01<<21; //设置的步进电机的运转方向为逆时针
123
124 while((EXTINT&0x01)!=0)
125 {
126 EXTINT=0x01; //清除中断标志
127 }
128 VICVectAddr=0;
129 }
130
131 //********************************************************************************************************
132 //外部中断1服务程序
133 void __irq IRQ_Eint1(void)
134 {
135 IO0SET=0x01<<21; //设置的步进电机的运转方向为顺时针
136
137 while((EXTINT&0x02)!=0)
138 {
139 EXTINT=0x02; //清除中断标志
140 }
141 VICVectAddr=0;
142 }
143
144 //********************************************************************************************************
145 //外部中断2服务程序
146 void __irq IRQ_Eint2(void)
147 {
148 if(DelayTime>20)
149 DelayTime=DelayTime-5; //减少延时,即加速
150
151 while((EXTINT&0x04)!=0)
152 {
153 EXTINT=0x04; //清除中断标志
154 }
155 VICVectAddr=0;
156 }
157
158 //********************************************************************************************************
159 //外部中断3服务程序
160 void __irq IRQ_Eint3(void)
161 {
162 if(DelayTime<100)
163 DelayTime=DelayTime+5; //增加延时,即减速
164 while((EXTINT&0x08)!=0)
165 {
166 EXTINT=0x08; //清除中断标志
167 }
168 VICVectAddr=0;
169 }
170
171 //********************************************************************************************************
172 //中断初始化函数
173 void Int_Init(void)
174 {
175 EXTMODE=0x00; //设置外部中断为电平触发
176
177 IRQEnable(); //使能IRQ中断
178
179 VICIntSelect=0x00000000; //设置所有分配为IRQ中断
180
181 VICVectCntl4=0x20|0x0e; //分配外部中断4到向量中断0
182 VICVectCntl1=0x20|0x0f; //分配外部中断1到向量中断0
183 VICVectCntl2=0x20|0x10; //分配外部中断2到向量中断0
184 VICVectCntl3=0x20|0x11; //分配外部中断3到向量中断0
185 VICVectCntl0=0x20|0x06; //分配Uart0中断到向量中断0
186
187
188 //设置中断服务程序地址
189 VICVectAddr4=(uint32)IRQ_Eint0;
190 VICVectAddr1=(uint32)IRQ_Eint1;
191 VICVectAddr2=(uint32)IRQ_Eint2;
192 VICVectAddr3=(uint32)IRQ_Eint3;
193 VICVectAddr0=(uint32)IRQ_UART0;
194
195 EXTINT=0x0f; //清除所有外部中断标志
196
197 VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11)|(1<<0x06); //使能所用到的中断
198 }
199
200 //********************************************************************************************************
201 //串口0接收中断服务程序
202 void __irq IRQ_UART0(void)
203 {
204 if((U0IIR&0x0f)==0x04)
205 rcv_new=1; //设置接收到新的数据标志
206
207 rcv_buf=U0RBR; //读取FIFO的数据,并清除中断
208
209 VICVectAddr=0;
210 }
211
212 //********************************************************************************************************
213 //串口0数据发送函数
214 void UART0_SendByte(uint8 dat)
215 {
216 U0THR=dat;
217 while((U0LSR&0x20)==0); //等待数据发送完毕
218 }
219
220 //********************************************************************************************************
221 //串口0初始化函数
222 uint8 UART0_Init(uint32 baud, UARTMODE set)
223 {
224 uint32 bak;
225
226 //参数过滤
227 if((baud==0)||(baud>115200))return(0);
228 if((set.datab<5)||(set.datab>8))return(0);
229 if((set.stopb==0)||(set.stopb>2))return(0);
230 if(set.parity>4)return(0);
231
232 //设置串口的波特率
233 U0LCR=0x80; //DLAB=1
234 bak=(Fpclk>>4)/baud;
235 U0DLM=bak>>8;
236 U0DLL=bak&0xff;
237
238 //设置串口模式
239 bak=set.datab-5; //设置字长
240 if(set.stopb==2)bak|=0x04; //判断是否为2位停止位
241
242 if(set.parity!=0)
243 {
244 set.parity=set.parity-1;
245 bak|=0x08;
246 }
247 bak|=set.parity<<4; //设置奇偶校验
248
249 U0LCR=bak;
250
251 return(1);
252 }
253
254

关键字:ARM  步进电机控制  串口方式  中断方式 引用地址:基于ARM的步进电机控制示例(串口方式+中断方式)

上一篇:ARM7 2131 BEEP程序分析
下一篇:利用DM6437的McBSP配置SPI与ARM_S2440通信

推荐阅读最新更新时间:2024-03-16 14:51

购并ARM之后 软银依计划进一步发展物联网事业
软银(SoftBank)在2016年7月宣布购并ARM(ARM),引发市场震荡。而SoftBank在2017年2月8~9日于东京召开技术会议,Pepper World 2017,技术上相关的ARM全球市场策略主席Ian Ferguson获邀参加,日经科技网站(Nikkei Tech-On)特别进行访问,询问加入SoftBank旗下的差异,以及未来发展方向。 由于SoftBank社长孙正义对外表示,购并ARM的目的是发展物联网(Internet of things)事业,Ian Ferguson的说法也相同,锁定未来全球1兆个芯片的时代,ARM的技术在那时代将发挥重大作用。 而这次ARM会派员参加机器人Pepper的相关会议
[物联网]
微软高通合作:给ARM Windows 10设备提供更完善配套
微软今天宣布与高通公司建立合作伙伴关系,为保障 Windows on ARM 上应用的运行提供更完善的配套支持,微软将把具有 FastTrack 测试平台的 App Assure 进行扩展。 微软的 App Assure with FastTrack 计划可免费提供给合格的开发人员或客户。App Assure 是一个旨在帮助客户,开发人员和独立软件供应商解决应用程序兼容性问题的程序。 另外,也只有高通为 Windows 10 推出了专门的骁龙 8cx/7cx 处理器。高通高管表示:“移动计算的未来是配备 4G / 5G 连接的功能强大,轻薄的长续航 PC。我们很高兴看到 App Assure 计划将帮助确保在搭载骁龙的 W
[手机便携]
低成本ARM架构 工商业储能EMS能量控制单元飞凌嵌入式FCU2601新品发布
  FCU2601嵌入式控制单元是飞凌嵌入式为锂电池储能行业设计的EMS能量控制单元产品,设计兼具高性能,多接口,低功耗,广泛满足各类储能系统的本地能源管理应用需求。FCU2601嵌入式控制单元综合考虑到了储能行业不同场景的差异化需求,在硬件,防护,认证,软件等方面都做了充分的准备,以确保产品的适用性、稳定性和可靠性。   丰富的接口功能   飞凌嵌入式FCU2601嵌入式控制单元分为标准版和扩展版2种版本,扩展版拥有11路RS485,2路RS232,4路独立网口,2路CAN,8路DI,6路DO等多种常用接口。 (注:上图为FCU2601扩展版。标准版有4路RS485,2路千兆网口,无
[新能源]
ARM开发大脑芯片 可帮助脑损伤患者恢复活动
  据外媒报道, 芯片 设计巨头 ARM 已与美国研究人员合作开发出了一种大脑 芯片 ,这种 芯片 可以被植入人脑中。下面就随嵌入式小编一起拉来哦啊接一下相关内容吧。   这种芯片的设计目的是为了帮助脑部或脊椎损伤的病人。它可以被植入人的头骨内。   它不仅可以让人们执行各种任务,而且还能够接受感官反馈信息。   但是,我们可能需要等待一些时日才能看到这种芯片的好处。    ARM 公司将为华盛顿大学感觉运动神经工程中心(CSNE)设计的移植物开发芯片。   这些研究人员已开发出了早期的原型机。   “他们已开发出了一些原型机。” ARM 卫生保健科技负责人彼得-弗格森(Peter Ferguson)说,“现在的挑战就是能耗和热量
[嵌入式]
基于ARM的FPGA加载配置实现
0引言 基于SRAM工艺FPGA在每次上电后需要进行配置,通常情况下FPGA的配置文件由片外专用的EPROM来加载。这种传统配置方式是在FPGA的功能相对稳定的情况下采用的。在系统设计要求配置速度高、容量大、以及远程升级时,这种方法就显得很不实际也不方便。本文介绍了通过ARM对可编程器件进行配置的的设计和实现。 1 配置原理与方式 1.1配置原理 在FPGA正常工作时,配置数据存储在SRAM单元中,这个SRAM单元也被称为配置存储器(Configuration RAM)。由于SRAM是易失性的存储器,因此FPGA在上电之后,外部电路需要将配置数据重新载入到片内的配置RAM中。在芯片配置完成后,内部的寄存器以及I/O管脚必
[嵌入式]
定时器 T3定(8 位)通过中断方式控制 LED
CC2530的T3定时器(8位)需要了解T3CTL,T3CCTL0,T3CC0,T3CCTL1,T3CC寄存器.定时器3/4是8位定时器,具有定时器/计数器/PWM功能。 定时器2又称 MAC定时器,是专门为支持IEEE 802.15.4 MAC 中的事件跟踪协议而特别设计的。该定时器具有一个可以用来记录已经发生的周期数的8位溢出计数器;有一个16位捕获寄存器,用来记录一个帧开始定界符接收/发送的精确时间或者传输完成的精确时间;还含有一个16位输出比较寄存器,用来在特定时间对无线模块产生各种命令选通信号(开始接受,开始发送等)。关于定时器2,想了解的话可以参看有关资料。 有没有发现只要寄存器配置对了剩下的就没什么问题了。 T3C
[单片机]
英特尔ARM开启芯片之战 消费者该何去何从?
      【搜狐IT消息】据国外媒体报道,正在逼近的芯片之战将让消费者无所适从。   全球最大PC芯片制造商英特尔希望它的芯片产品能进入平板电脑和智能手机市场。全球最大移动处理器设计厂商ARM则希望自己的芯片产品能打进平板PC市场。如同上世纪90年代和2000年初的Mac和PC之争,新的芯片大战意味着出现这样一种局面,消费者喜欢的应用无法支持他的设备,或无法如他所希望的那样在设备上运行。   这将与目前我们习惯的局面大为不同。   现在,几乎所有的PC(包括Mac)都在使用英特尔芯片。高通、苹果、三星和Nvidia等厂商制造的ARM芯片则占据了移动设备市场的95%。移动和PC各有一个芯片平台,双方井水不犯河水。这方便了设备制造
[手机便携]
iPhone大揭秘 基于ARM处理器和三星闪存
7月2日消息,据国外媒体报道,苹果的iPhone手机已于6月29日正式上市。现经iFixit解剖发现,iPhone手机采用的是ARM处理器和三星闪存。 经iFixit拆机发现,iPhone手机采用的是三星生产的620MHz ARM 339S0030处理器,而闪存也来自三星。此外,音频芯片来自Wolfson, 802.11b/g模块来自Marvell,而GSM/Edge功率放大器来自Skyworks。 今年1月9日,苹果CEO史蒂夫-乔布斯发布了令业界期待已久的iPhone手机。6月29日,iPhone手机在美国市场首发。期间,有关iPhone手机的新闻一直都是媒体追踪的热点。 可以说,从来没有一款手机能够如此吸引人。Jupit
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved