实验一直流步进电机综合控制系统设计_第1页
实验一直流步进电机综合控制系统设计_第2页
实验一直流步进电机综合控制系统设计_第3页
实验一直流步进电机综合控制系统设计_第4页
实验一直流步进电机综合控制系统设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-实验一 直流、步进电机综合控制系统设计一、实验目的通过本次实验熟悉MagicARM2410 GPIO、UART、RTC,步进电机,直流电机,IIC的工作原理;并能熟悉的编程控制。二、实验要求以MagicARM2410为实验平台,设计一个通过串口通信交互控制的综合型控制系统。具体来说,可在启动时,自动列出一些选项,通过键盘选择*个选项而实现其功能;考虑到实时性,再按*个控制键能立刻停顿当前功能而回到初始的待选状态。具体功能要求如下: 1、实现四个LED灯按照十六进制的规则依次亮灭; 2、在超级终端上输入两个两位数,实现两位数的加减乘除并显示运算结果; 3、显示当前的年月日、星期、时分秒; 4、

2、实现步进电机的调速和正反转;可用旋转按钮W1或按键控制调速,在超级终端和数码管上同步显示其正反转和转速信息; 5、实现直流电机德调速和正反转;可用旋转按钮W2或按键控制调速,在超级终端和数码管上同步显示其正反转和转速信息; 6、利用IIC通信,实现EEPROM的读写;在超级终端上显示地址和数据。三 、实验原理一LED灯四个小灯分别接于GPE11、GPE12 GPH4、GPH6端口;控制端口0和1分别实现亮灭(端口设为输出)如下:void LED_init(void) / 初始化I/O rGPECON = (rGPECON & (0*0F22) | (0*0522); / rGPECON25:2

3、2 = 0101b,设置GPE11、GPE12为GPIO输出模式 rGPHCON = (rGPHCON & (0*338) | (0*118); / rGPHCON13:8 = 01*01b,设置GPH4、GPH6为GPIO输出模式 二UARTUART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进展通信,包括与监控调试器和其它器件,如EEPROM通信。UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开场,后面是58个数据位,一个可用的奇偶位和一个或几个高位停顿位。接收器发现开场位时它就知道数据准备发

4、送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。 在接收过程中,UART从消息帧中去掉起始位和完毕位,对进来的字节进展奇偶校验,并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART就置位奇偶标志。UART作用1 发送/接收逻辑2 波特率的产生3 数据收发4 中断控制出现以下情况时,可使UART 产生中断: FIFO 溢出错误线中止错误line-break,即R* 信号一直为0 的状态,包括校验位和停顿位在奇偶校验错误帧错误停顿位不为1接收超时接收FIFO 已有数据但未满,而

5、后续数据长时间不来发送接收由于所有中断事件在发送到中断控制器之前会一起进展或运算操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数UARTIntStatus( ),软件可以在同一个中断效劳函数里处理多个中断事件多个并列的if 语句。5 回环操作6 串行红外协议UART初始化函数如下void UART_Init(void) int i;if(g_uart_sel)/ 判断是否为串口1/ I/O口设置 (GPH5,GPH4)rGPHUP = rGPHUP | (0*034);rGPHCON = (rGPHCON & (0*00000F00) | (0*00000A00)

6、;/ 串口模式设置rUFCON1 = 0*00; / 制止FIFO功能rUMCON1 = 0*00; / AFC(流控制)禁能rULCON1 = 0*03; / 制止IRDA,无奇偶校验,1位停顿位,8位数据位rUCON1 = 0*245; / 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式, / 制止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)/ 串口波特率设置rUBRDIV1=(int)(PCLK/16.0/UART_BPS + 0.5) -1; else/ I/O口设置 (GPH3,GPH2)rGPHUP = rGPHUP | (0*

7、032);rGPHCON = (rGPHCON & (0*000000F0) | (0*000000A0);/ 串口模式设置rUFCON0 = 0*00; / 制止FIFO功能rUMCON0 = 0*00; / AFC(流控制)禁能rULCON0 = 0*03; / 制止IRDA,无奇偶校验,1位停顿位,8位数据位rUCON0 = 0*245; / 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式, / 制止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)/ 串口波特率设置rUBRDIV0=(int)(PCLK/16.0/UART_BPS + 0

8、.5) -1; for(i=0;i100;i+);三RTCA概述实时时钟RTC单元在系统电源关闭的情况下可以在备用电池下工作。RTC 可以使用STRB/LDRB ARM 操作传输二进制码十进制数的 8 位数据给 CPU。数据包括秒、分钟、小时、日期、天、月、年的时间信息。RTC 单元可以在 32.768KHz 的外部晶振下工作,可以可以执行报警功能。B 特点- BCD 数:秒、分钟、小时、日期、日、月、年- 闰年生成器- 报警功能:报警中断或从掉电模式中唤醒- 已经解决 2000 年问题- 独立电源引脚RTCVDD- 支持对于实时核时间节拍的毫秒节拍时间中断C实时时钟操作C.1 闰年发生器闰年

9、发生器可以基于 BCDDATE、BCDMON、BCDYEAR 的数据,从 28、29、30、31 中确定每个月的最后一天。该模块在确定*月最后一天的时候会考虑闰年的因素。一个 8 位的计数器仅能代表两个 BCD 数字,所以它不能确定是否是 00 年该年的最后两个数字是00。C.2读写存放器为了写RTC模块中的BCD存放器,RTCCON存放器的位 0 必须置 1。为了显示秒分小时星期日月年,CPU应该分别读取在RTC模块中的BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,和BCDYEAR。但是,因为多存放器读取可能存在一秒的误差。例如,当用户读BCDYEA

10、R和BCDMON,构造假定是 2059 年 12 月 31 日 23 点 59 分。当用户读BCDSEC存放器,值的围是从 1 到 59秒就没有问题,但是如果值是 0,年月日就变成了 2060 年 1 月 1 日0 时 0 分因为有刚刚提到的 1 秒误差。在这种情况下如果BCDSEC为 0,用户应该重读BCDYEAR到BCDSEC。C.3 备用电池操作RTC 逻辑可以由备用电池驱动,其通过 RCTVDD 引脚给 RTC 模块提供电源,即使系统电源关闭。当系统关闭时,CPU 和 RTC 模块的接口是封闭的,备用电池仅驱动振荡电路和BCD 计数器以最小化电源消耗。C.4 报警功能RTC 在掉电模式

11、或正常操作模式下的特定时间会发出报警信号。在正常操作模式下报警中断INT_RTC被激活。在掉电模式下,电源管理唤醒信号PMWKUP也如 INT_RTC一样被激活。RTC 报警存放器RTCALM决定了报警的使能状态和报警时间设定的条。C.5 节拍时间中断RTC 节拍时间是用于中断请求。TIT 存放器有一个中断使能位和对于中断的计数器值当节拍时间中断出现时,计数器的值为 0。中断周期如下:Period = ( n+1 ) / 128 secondn: 节拍计数器值 (1127)RTC 节拍时间可以用于实时操作系统核时间节拍。如果时间节拍由 RTC 时间节拍生成,与实时操作系统功能相关的时间就会和实

12、时同步。D.RTC存放器1实时时钟控制存放器RTCCON2节拍时间计数存放器TIT3RTC 报警控制存放器RTCALM4报警秒数据存放器ALMSEC5报警分钟数据存放器ALMMIN6报警小时数据存放器ALMHOUR7报警日期数据存放器ALMDATE8报警月数据存放器ALMMON9报警年数据存放器ALMYEAR10BCD 秒存放器BCDSEC11BCD 分存放器BCDMIN12BCD 小时存放器BCDHOUR13BCD 日期存放器BCDDATE14BCD 日存放器BCDDAY15BCD 月存放器BCDMON16BCD 年存放器BCDYEAR四步进机与直流电机工作原理步进电机是一种将电脉冲转化为角

13、位移的执行机构。步进电机正传,双四拍程序。 时序控制为AB-BC-CD-DA-AB,共控制运转4圈(电机步距角为18度)。 每一步的延时控制。值越大,延时越久;步进电机反转,双四拍程序时序控制为AD-DC-CB-BA-AD。步距角为18度)。每一步的延时控制。值越大,延时越久。正转模式:dly为延时void MOTO_Mode1(uint32 dly) / AB相有效 GPIOSET(MOTOA); GPIOSET(MOTOB);Delay(dly); GPIOCLR(MOTOA); GPIOCLR(MOTOB); / BC相有效 GPIOSET(MOTOB); GPIOSET(MOTOC);

14、 Delay(dly); GPIOCLR(MOTOB); GPIOCLR(MOTOC); / CD相有效 GPIOSET(MOTOC); GPIOSET(MOTOD); Delay(dly); GPIOCLR(MOTOC); GPIOCLR(MOTOD);/ DA相有效 GPIOSET(MOTOD); GPIOSET(MOTOA); Delay(dly); GPIOCLR(MOTOD); GPIOCLR(MOTOA);直流电机由PWM脉冲调制控制;脉冲为1是电机转动,0时停顿转动。通过PWM占空比来实现加减速。参考程序:void StepMOTO_Test(void) / uint32 a =

15、 0; / 步进电机控制口设置 rGPCCON = (rGPCCON & (0*0000FC03) | (0*00005401);/ GPC0、GPC5-7口设置为输出 rGPCUP = rGPCUP | 0*00E1; / 制止GPC0、GPC5-7口的上拉电阻 rGPCDAT = rGPCDAT & (0*00E1); / 设置GPC0、GPC5-7口输出低电平 while(1)UART_SendStr(Please input z OR f to control zhengzhuan and fanzhuann);UART_SendStr(Press o key e*it testn);

16、switch(getch = UART_GetKey() case z:sprintf(Press j to speed up ; ESC break out.); for(;) Change_Speed();MOTO_Mode1(speed1); / 控制步进电机正转/在终端上显示速度sprintf(disp_buf2, Zhengzhuan: StepMoto_speed is %d n, (330-speed1); UART_SendStr(disp_buf2); if(UART_GetFlag() = j) speedup();/加速 if(UART_GetFlag() = 0*1B)

17、 /按Esc键退出测试 break; break;case f:sprintf(Press j to speed up ; ESC break out.); for(; ;) Change_Speed(); MOTO_Mode2(speed1); / 控制步进电机反转 /在终端上显示速度 sprintf(disp_buf2, Fanzhuan: StepMoto_speed is %d n, -(330-speed1); UART_SendStr(disp_buf2); if(UART_GetFlag() = j) UART_SendStr(j); speedup();/加速 if(UART_

18、GetFlag() = 0*1B) /按Esc键退出测试 break; break; default: break; if(getch = o) /按下字母o键退出整个步进电机测试 break; 直流电机测试程序:void DCMOTO_Test(void) uint32 i = 0, a = 0;uint16 pwm_dac;char get_ch = 0; / TOUT0口设置 rGPBCON = (rGPBCON & (0*030) | (0*020); / rGPBCON1:0 = 10b,设置TOUT0功能 rGPBUP = rGPBUP | 0*0001; / 制止TOUT0口的上

19、拉电阻 / 设置GPH9为GPIO输出模式 rGPHCON = (rGPHCON & (0*0318) | (0*0118); / GPH9口 rGPHDAT = rGPHDAT & (19); / 输出0电平 rGPHUP = rGPHUP | (19); / 初始化PWM输出。设PWM周期控制值为255 pwm_dac = 250*255/330; / 初始化占空比 PWM_Init(255, pwm_dac); while(1) /按z键控制正传,f键控制反转,s键停顿转动 Esc退出测试 UART_SendStr(nPress the key to control state: z-z

20、hengzhuan f-fanzhuan s-stopn); switch(get_ch =UART_GetKey() case z: rGPBDAT = rGPHDAT | (19); rGPHDAT = rGPHDAT & (19); while(1) Change_Speed(); rTCMPB0 = (speed2*255/330); sprintf(disp_buf3, DCMoto_speed is %d n, speed2); /终端显示正转速度 UART_SendStr(disp_buf3); if(UART_GetFlag() = s) rGPBDAT = rGPHDAT &

21、 (19); rGPHDAT = rGPHDAT & (19); break; break; case f: rGPBDAT = rGPHDAT & (19); rGPHDAT = rGPHDAT | (19); while(1) Change_Speed(); rTCMPB0 = (speed2*255/330); sprintf(disp_buf3, DCMoto_speed is %d n, (-speed2); /终端显示正转速度 UART_SendStr(disp_buf3); if(UART_GetFlag() = s) rGPBDAT = rGPHDAT & (19); rGPH

22、DAT = rGPHDAT & (19); break; break; default : break; if(UART_GetFlag() = 0*1B) break;五IIC通信实现EEPROM的读写一I2C,一种总线构造。I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。实验过程中必须先初始化总线启动总线后才能用其进展通信。int I2C_SendByte(uint8 dat) /发送一字节数据,并接收应答位int I2C_RcvByteNA(uint8 *

23、dat)/接收I2C总线上一字节数据并发送非应答位int I2C_RcvByteA(uint8 *dat)/接上I2C总线上一字节数据,并发送应答位void StopI2C(uint8 send)/完毕总线int ISendStr(uint8 sla, uint8 *suba, uint8 *s, uint8 no)【* Descriptions: 使用硬件I2C发送数据。* Input: sla从机地址* suba 器件子地址(第一字节用来表示子地址字节个数)* s 发送数据缓冲区* no发送数据个数* Output: 操作成功返回TRUE,仲载失败/无从机应答返回FALSE* Note:

24、使用前设置好参数。程序不会更改s、suba缓冲区的数据】int IRcvStr(uint8 sla,uint8 *suba,uint8 *s,uint8 no)/v使用硬件I2C读取数据。参数和发送对应二测试EEPROM程序void TestEEPROM(void) uint8 suba2;int rw_err;int i;rw_err = 0;/ 写数据测试suba0 = 1; / 1位子地址suba1 = 0*00; / 子地址for(i=0; i10; i+) dat_bufi = i+0;UART_SendStr(data of write:);for(i = 0; i 5; i+)U

25、ART_SendByte(dat_bufi);UART_SendStr(n);i2c_opsta=ISendStr(CAT1025, suba, dat_buf, 5);for(i=0; i10000; i+);/ 等待写周期/ 读出校验for(i=0; i5; i+) dat_bufi = 0*00;i2c_opsta=IRcvStr(CAT1025, suba, dat_buf, 5);UART_SendStr(data of read:);for(i = 0; i 5; i+)UART_SendByte(dat_bufi);UART_SendStr(n);for(i=0; i5; i+)

26、 if(dat_bufi != (i+0) rw_err = 1; / 判断操作是否出错,如果出错则蜂鸣报警if(rw_err) ErrorShow(); 【如果写入的数据和读出的一样,则测试通过】四、实验程序【main函数:主要实现与终端交互的功能,通过键盘输入字符的判断来决定执行的功能】int main(void)uint8 g_getch ;int i = 0;UART_Select(0); /选择UART0UART_Init(); /UART0初始化LED_init(); /LED相关初始化EINT_init(); /外部中断初始化while(1)fun_test();switch(g

27、_getch = UART_GetKey()case 1:UART_SendByte(g_getch);UART_SendStr(n);LED_DispAllOn(); /LED灯全亮DelayNS(10);UART_SendStr(nTest LED_DispAllOn is Over!n);break;case 2:UART_SendByte(g_getch);UART_SendStr(n);LED_DispAllOff(); /LED灯全灭DelayNS(10);UART_SendStr(nTest LED_DispAllOff is Over!n);break;case 3:UART_SendByte(g_getch);UART_SendStr(n);for(;) /死循环,当检测到按下Esc键时退出LED_onebyone(); /流水灯if(U

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论