舵机远距离数字控制毕业设计_第1页
舵机远距离数字控制毕业设计_第2页
舵机远距离数字控制毕业设计_第3页
舵机远距离数字控制毕业设计_第4页
舵机远距离数字控制毕业设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

- 1 舵机远距离数字控制 摘要 随着船舶工业的发展以前我们所用的模拟电路控制舵机存在着这样或那样的问题已经收到越来越多的关注。当传输距离很长的时候,模拟电子线路就会容易收到外部信号的干扰从而出现舵机的角度出现大的偏差。并且如果反馈电位器长时间工作就会出现磨损的情况,另外模拟电路和电源的漂移等等诸多的问题都影响舵机准确性。现在很多大型的船舶都采用动舵轮或者是液压舵 ,但由于它是机械式的控制所以它的控制受人的反应熟读的影响,误差范围大,精确度不高。 本设计采用的控制器件有 ARM2148 和 STC89C52 单片机。采用 E6B2-CWZ5G 作为角度传感器,通过ARM2148 控制舵机传动,将角度传给 STC89C52 单片机控制的 LCD1602 来显示。单片机会定时采集舵机的角度从而实时的显示相应角度。其中 ARM2148 为核心控制器, STC89C52 单片机为辅助控制器。核心控制器与辅助控制器通过串口数据线进行数据传输,从而实现对舵机的远程控制。这种数字电路控制舵机的方法精确度高,结构简单。数字电路控制舵机,再结合轮船的动力系统, GPS 技术与 GIS 技术从而实现船舶的自动驾驶。相对于汽车无人驾驶其难度更低,安全性跟高,前景很广阔。 关键 词: ARM2148;角度传感器;远程控制;自动驾驶; 目录 1 绪论 . 3 2 系统相关技术分析 .错误 !未定义书签。 2.1 核心控制器件的选择 . 错误 !未定义书签。 2.2 辅助器件的选择 .错误 !未定义书签。 2.3 角度传感器的选择 .错误 !未定义书签。 2.4 显示器件的选择 . -5- 2.5 电动机驱动模块的选择 . -5- 2.6 小结 . -6- 3 系统硬件电路设计 .错误 !未定义书签。 3.1 电源的设计 .错误 !未定义书签。 3.2 LCD 液晶显示电路设计 .错误 !未定义书签。 3.3 驱动电路设计 . -8- 4 系统软件设计 .错误 !未定义书签。 4.1 整体流程图设计 .错误 !未定义书签。 4.2 整体程序设计论证 .错误 !未定义书签。 4.2.1 角度检测程序: .错误 !未定义书签。 4.2.2LCD1602 液晶显示程序 .错误 !未定义书签。 4.2.3 串口通信程序 .错误 !未定义书签。 5 实现相关技术 .错误 !未定义书签。 5.1 ARM2148 的简介及运用领域 错误 !未定义书签。 2 5.2 单片机的简介及运用 . 错误 !未定义书签。 6 总结 .错误 !未定义书签。 致谢信 .错误 !未定义书签。 参考文献 .错误 !未找到引用源。 附 录程序清单和专利申请书 .错误 !未定义书签。 3 1.绪论 我们采用数字电路控制舵机是考虑了模拟电路控制舵机的缺点的,正是为了克服这些缺点,从而跟好对舵机进行远程控制,提高其精确度。论文中包括本次设计的整体简介,硬件连接,软件编程。 本次设计采用核心控制器件 ARM2148 和辅助控制器件 STC89C52 单片机。我们选择ARM2148 是因为其比较实用,也是初学者首先接触的因此比较熟悉。至于单片机的 悬着 是由于其易用,外围模块较少。 系统的硬件包括: ARM 模块、单 片机最小系统、 L298 电动机驱动模块、角度传感器、电动机、 蓄电池, LCD1602、编码器等。 软件部分包括:电动机驱动模块程序、 ARM 控制电动机模块、单片机控制 LCD1602显示模块。 4 2.系统相关技术分析 整体设计如下图所示:采用 ARM2148 为核心控制器件, 采用STC89C52 来控制 LCD1602 来动态显示舵机角度,采用 C 语言编程实现各种逻辑的算法和逻辑控制,角度传感器的脉冲信号作为中端引入 ARM2148,然后通过串口线通过单片机控制的液晶显示显示相应的角度。按键 控制舵机左转还是右转。 图 1 总体结构图 2.1 核心控制器件的选择 核心控制器件的选择没有选择单片机而是选择 ARM2148 来控制是由于本次设计采用的是三级流水线模式。它需要软件有很快的处理指令的速度。为了避免 52 单片机执行指令过多出现卡死的情况,来实现多个操作同时进行,使处理和存储之间的操作更加流畅连续,能提供 0.9MIPS/MHZ 的指令执行速度,这样在舵机快速偏转时,处理器仍然可以远远满足编码器瞬间给出的众多条代码值,使系统更加稳定。并且我们首先接触的也是 ARM2148 这款软件相对于其它款的我们更熟悉。在整个系统中 ARM2148 起着控制电动机驱动模块使电动机运转,同时接受来自角度传感器的数据即舵机旋转角度然后将其传输给STC89C52 单片机从而实现角度的显示。因此它是核心模块。 2.2 辅助器件的选择 辅助模块只需接受来自 ARM2148 的关于舵机角度的数据和控制 LCD1602 液晶显示。由于 STC89C52单片机功耗低、性能高、灵活性高且使我们经常接触到的单片机类软件,所以我们选择了这款单片机。 2.3 角度传感器的选择 角度传感我们我们采用工业用 E6B2-CWZ5G 角度传感器,它拥有非常低的阻尼,在轴上固定一重物只需要 10 来克就能将实时角度准确的传输到 ARM2148 中。它是一种增量式的旋转译码器,它是通过内部两个光敏接受管转化其角度码盘的时序和相位关系,从而得到其角度码盘角度位移量增加或减少。增加为正方向,减少为反方向。它具有价格低廉和简易的优势,因此我们选择了它。如下图为它的工作原理: 角度传感器 主控制系统()() 液晶显示器 辅助控制系统 按键控制 电 机驱动模块 串口线 5 图 2 E6B2-CWZ5G 工作原理图 2.4 显示器件的选择 显示模块我们有两种设计方案,分别为数码管显示和液晶显示。数码管静态显示编程简单,但其占用的 I/O 口过多 ,电路复杂,成本高。动态显示又不能满足太复杂的电路。因此我们选择液晶显示。液晶显示就克服了数码管显示的缺点,同时它还具有功耗低、显示信息多、操作简便等优点。 2.5 电动机驱动模块的选择 驱动模块我们选择的是 L298N, L298N 是 ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片采用 15 脚封装。它内含含两个 H 桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端, 使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。而且 L298N 有过电流保护功能,当出现电机卡死时,可以保护电路和电机等。 因此,我们采用安全性更高的 L298N 驱动芯片来驱动电机 ,。以下为该芯片的相关参数: 额定电流 2A 额定电压 12.5V 额定功率 25W 最大电流 3A 最大电压 46V 2.6 小结 经过一番的论证与比较,我们决定了系统各个主要模块的方案如下:电机 驱动模块采用 L298N;角度传感模块采用 E6B2-CWZ5G 角度传感器;液晶显示模块采用现成的数码管;电源采用单电源双输出模块。 硬件电路设计 3.1 电源的设计 图 3 电源原理图 6 3.2 LCD 液晶显示电路设计 图 4 液晶显示 3.3 驱动电路设计 图 5 驱动电路 3.系统软件设计 4.1 整体流程图设计 EN A6EN B11IN15IN27IN310IN412OUT12OUT23OUT313OUT414ISEN A1ISEN B15VS4VSS9GND8U1L298N0.1uFC2104100uFC1+5V +12VD11N4007D21N4007D31N4007D41N4007D51N4007D61N4007D71N4007D81N40070.1uFC4104100uFC3+5V+12V电机驱动 L298NLED11KR112PWMA12Power 5V1234IN1-IN41KR21KR31KR4LED2LED3LED41KR51KR61KR71KR812PWMB12Power 12V12M112M212 34TLP521-112 34TLP521-212 34TLP521-312 34TLP521-4+5V +5V+5V+5V 7 N Y N Y Y 4.2 整体程序设计论证 4.2.1 角度检测程序 我们采用的角度传感器是通过计算脉冲的数量来计算小车的偏转角的。由于脉冲的时间很短,如果采用端口扫描那么在 ARM2148 没有执行扫描时就会错过一些脉冲的检测,数初始化各种参数 开始 偏转 左转(大于现有角度)度) 向单片机发送角度 右转(小于现有角度) 检测限位开关 检测串口 和现有角度对比 8 据就会出现错误。我们采用外部中断来计算角度,程序很短所以可以迅速的执行不会耽误其它程序执行的执行,数值在 0-900,实际值为 0-90 度。 /*/ * 函数名称: void _irq IRQ_Eint3(void) * 功能描述: 外部中断计算旋转角度 * 参 数: 每一个角度有不同的脉冲组成 /*/ void _irq IRQ_Eint3(void) /* a2 脉冲触发中断服务主程序 */ / EXTINT = EINT3; /* clear interrupt 中断服务主程序 */ k=IOPIN0; /输入状态 if(k&1KEY3)=0) /测试 b2 脉冲位置 eint2_counter+; /* 如果超前 +*/ else eint2_counter-; /* 如果超前 +*/ ii5=eint2_counter ; /脉冲数传送到 ii5 寄存器 EXTINT =8; /* clear interrupt 中断服务主程序 */ / 清除 EINT3 中断标志 VICVectAddr = 0x00; / 通知 VIC 向量中断结束 void EINT1_Handler (void) _irq/* a1 脉冲触发中断服务主程序 */ IENABLE; /* handles nested interrupt 嵌套中断 */ k=IOPIN0; /输入状态 if(k&1KEY1)=0) /测试 b 脉冲位置 KEY1= b /IOSET1 = 0x000F0000; eint1_counter+; /* 如果超前 +*/ else /IOCLR1 = 0x000F0000; eint1_counter-; /*如果反转 - */ /测试原点位置 if(k&1KEY2)=1&(ii3 =0) ) /原本原点位置从 0 改变为 1 eint1_counter=1000; ii3 = k&1KEY2 ; / 记录 z 原点位置 0、 1,KEY2=z ii4 =eint1_counter ; /脉冲数传送到 ii4 寄存器 IDISABLE; 9 IOPIN1=0xf50000; VICVectAddr = 0; EXTINT =2; /* clear interrupt 中断服务主程序 */ 4.2.2 LCD1602 液晶显示程序 本系统采用的是 1602 液晶显示。前面我给大家介绍了选择该软件的原因。它的显示是由 STC89C52 控制的。它显示的角度由操作台操作,它将操作台实时操作显示出来,同时由串口线发送数据给 ARM2148 控制舵机的旋转。 程序如下: # include /* P1-DB0 DB7 P2.0-RS P2.1-RW P2.2-E */ # define LCD_DB P1 sbit LCD_RS=P20; sbit LCD_RW=P21; sbit LCD_E=P22; /*定义函数 */ # define uchar unsigned char # define uint unsigned int void LCD_init(void);/ void LCD_write_command(uchar command);/写指令函数 10 void LCD_write_data(uchar dat);/写数据函数 void LCD_disp_char(uchar x,uchar y,uchar dat);/在某个屏幕位置上显示一 个字符 ,X( 0-16),y(1-2) /void LCD_check_busy(void);/检查忙函数。我没用到此函数,因为通过 率极 低。 void delay_n40us(uint n);/延时函数 /* /*初始化函数 * void LCD_init(void) LCD_write_command(0x38);/设置 8 位格式, 2 行, 5x7 LCD_write_command(0x0c);/整体显示,关光标,不闪烁 LCD_write_command(0x06);/设定输入方式,增量 不移位 LCD_write_command(0x01);/清除屏幕显示 delay_n40us(100); /* /*写指令函数 * void LCD_write_command(uchar dat) LCD_DB=dat; LCD_RS=0;/指令 11 LCD_RW=0;/写入 LCD_E=1;/允许 LCD_E=0; delay_n40us(1); /* /*写数据函数 * void LCD_write_data(uchar dat) LCD_DB=dat; LCD_RS=1;/数据 LCD_RW=0;/写入 LCD_E=1;/允许 LCD_E=0; delay_n40us(1); /* /*显示 一个字符函数 * void LCD_disp_char(uchar x,uchar y,uchar dat) uchar address; 12 if(y=1) address=0x80+x; else address=0xc0+x; LCD_write_command(address); LCD_write_data(dat); /* /*检查忙函数 * void LCD_check_busy() do LCD_E=0; /for 循环作延时,普通指令只要 1 次循就可完成。清屏指令 LCD_RS=0; /要用 200 次 循环便能完成。 LCD_RW=1; LCD_DB=0xff; LCD_E=1; while(LCD_DB7=1); */ /*延时函数 * void delay_n40us(uint n) 13 uint i; uchar j; for(i=n;i0;i-) for(j=0;j2;j+); /在这个延时循环函数中我只做了 2 次循环, /* /*主函数 * void main(void) LCD_init(); LCD_disp_char(0,1,A); while(1); 4.2.3 串口通信程序 串口在本设计中起着至关重要的作用,它连接了单片机和 ARM,它将 ARM 接受的角度传感器的数据送给单片机让单片机把实时角度与操作台的操作角度对比然后将指令在送给 ARM 再由 ARM 控制舵机左转还是右转。 程序如下: /* P0.14 中断功能演示 按下板子 INT 键, 2 组 4 个 LED 交替灭或亮 . */ #include LPC214x.H /* LPC21xx definitions */ #include type.h #include irq.h 14 #include extint.h #include Config.H /* standard I/O .h-file */ #pragma _printf_args; /#include #include / #define uchar unsigned char #define CR 0x0D #define UART_BAUD(baud)(unsigned int)(FOSC*PLL_M ) / (baud *4 *16 ) #define uint unsigned int #define RW 22 /读写控制端 0 为写 1 为读 #define RS 4 /A0 为 1 时是数据, 0 时为指令数据 #define Elcm 21 / #define busy 0x0800 extern Scan_Key(void); /int printf( char ) ; extern int ii4,ii5; int xx1, x,xx4,xx5,ii6 ; / int i2,k , i3 ; unsigned int io_data=1,rcv_dat; unsigned char const mcu123=WWW.MCU222.COM ; unsigned long val1,val3,val; int i3,i2 ,t=0x31 , tmp ; uchar mcu124=0x34 ; uchar mcu122= ; long su44; unsigned char key,i,i4, strdata20 ; /* 系统设置 , Fosc、 Fcclk、 Fcco、 Fpclk 必须定义 */ #define Fosc 12000000 /Crystal frequence,10MHz25MHz, should be the same as actual status. /应当与实际一至晶振频率 ,10MHz25MHz,应当与实际一至 #define Fcclk (Fosc*1) /System frequence,should be (132)multiples of Fosc,and should be equal or less than 60MHz. /系统频率,必 须为 Fosc 的整数倍 (132),且 =60MHZ #define Fcco (Fcclk *1) /CCO frequence,should be 2、 4、 8、 16 multiples of Fcclk, ranged from 156MHz to 320MHz. /CCO 频率,必须为 Fcclk 的 2、 4、 8、 16 倍,范围为 156MHz320MHz #define Fpclk (Fcclk / 4) * 1 /VPB clock frequence , must be 1、 2、 4 multiples of (Fcclk / 4). /VPB 时钟频率,只能为 (Fcclk / 4)的 1、 2、 4 倍 #define BEEP 18); / 0X1; 0;/ 0 U0DLL = (unsigned char)Baud; / 0X86; 0X5D; / 8 U0LCR = 0x03; /* DLAB = 0 */ /* * 函数名称: UART0_GetByte() * 函数功能:从串口接收 1 字节数据,使 用查询方式接收。 * 入口参数:无 * 出口参数:接收到的数据 */ void UART0_GetByte (void) while (U0LSR & 0x01) =0); / 等待接收标志置位 rcv_dat = U0RBR; / 读取数据 U0LSR =0x60; /return (rcv_dat); /* 接收一个字节 */ int Get_Byte (void) /* Read character from Serial Port */ while (!(U0LSR & 0x01); return (U0RBR); 16 /* * 函数名称: UART0_GetStr() * 函数功能:从串口接收 * 入口参数: s 指向接收数据数组的指针 * n 接收的个数 * 出口参数: 无 */ void UART0_GetStr (unsigned int n) / unsigned char *s, for ( ; n0; n-) UART0_GetByte () ; / UART0_GetByte () ; strdata tmp=rcv_dat ; / *s=rcv_dat ; / *s=rcv_dat; tmp+; /* * 函数名称: UART0_SendByte() * 函数功能:向串口发送字节数据,并等待发送完毕,查询方式。 * 入口参数: dat 要发送的数据 * 出口参数:无 */ void UART0_SendByte (unsigned char dat) U0THR = dat; / 写入数据 while (U0LSR & 0x20) = 0); / 等待数据发送完毕 /* * 函数名称: UART0_SendStr() * 函数功 能:向串口发送一字符串 * 入口参数: str 要发送的字符串的指针 * 出口参数:无 */ void UART0_SendStr (unsigned int const *str) while (1) if (*str = 0) break; / 遇到结束符,退出 UART0_SendByte(*str+); / 发送数据 /* 发送一个字节 */ void Sent_Byte2(unsigned char data) 17 U0THR = data; / 发送数据 while( (U0LSR&0x20)=0 ); / 等待数据发送完毕 int sendchar (int ch) /* Write character to Serial Port */ if (ch = n) while (!(U0LSR & 0x20); U0THR = CR; /* output CR */ while (!(U0LSR & 0x20); return (U0THR = ch); /* 发送一串字符 */ void Sent_Str (unsigned char const *str) while(1) if( *str = 0 ) break; Sent_Byte2(*str+); / 发送数据 void delay(unsigned int i) unsigned int k=300; while(i0) i-; while(k1)k-; / void delayms2(unsigned int i) /* Delay function */ unsigned int n; while(i1) for(n=18;n1;n-); i-; 18 void delayms (unsigned int i) /* Delay function */ unsigned int n; while(i1) for(n=8535;n1;n-); i-; void delay1s(unsigned char i) while(i1) i-; delayms(20); void init_port(void) /port initialized IODIR1=0x00FF0000; IODIR0=0x00600010; / IODIR0=0x40600010; void Io_Set(uchar pin) /单个 IO 口置位函数 unsigned int io_data=1; io_data=io_datapin; IOSET0=io_data; /IOSET0 为 IO 线 上置位寄存器, 1 有效, 0 无 void Io_Clr(uchar pin) /单个 IO 口清零函数 unsigned int io_data=1; io_data=io_datapin; IOCLR0=io_data; /IOCLR0 为 IO 线上清零寄存器, 1 有效, 0 无 void Io_Set1(uchar pin) /单个 IO 口置位函数 unsigned int io_data=1; io_data=io_datapin; IOSET1=io_data; /IOSET0 为 IO 线上置位寄存器, 1 有效, 0 无 void Io_Clr1(uchar pin) /单个 IO 口清零函数 19 unsigned int io_data=1; io_data=io_datapin; IOCLR1=io_data; /IOCLR0 为 IO 线上清零寄存器, 1 有效, 0 无 void Sent_Byte(unsigned char data) unsigned char i; for(i=0;i1; /void init_port(void) / /port initialized /IODIR1=0x00FF0000; /IODIR0=0x40620010; / /*= 正常读写操作之前必须检测 LCD 控制器状态 : CS=1 RS=0 RW=1 DB7: 0 LCD 控制器空闲 ; 1 LCD 控制器忙 =*/ void WaitForEnable( void ) /unsigned int i; Io_Clr(RS); delay(1); Io_Set(RW); delay(1); Io_Set(Elcm); delayms(30); / i=IO1PIN; /读 P1 while( IO1PIN & busy ); Io_Clr(Elcm); 20 /*= 写控制字符子程序 : E=1 RS=0 RW=0 =*/ void LcdWrite_CMD( uchar CMD,uchar AttribC ) if (AttribC) WaitForEnable(); / 检测忙信号 ? Io_Clr(RS); delay(2); Io_Clr(RW); delay(2); Sent_Byte(CMD); Io_Set(Elcm); delay(2); delay(2); Io_Clr(Elcm); delay(2); /*= 当前位置写字符子程序 : E =1 RS=1 RW=0 =*/ void LcdWrite_D( char dataW ) WaitForEnable(); / 检测忙信号 Io_Set(RS); delay(2); Io_Clr(RW); delay(2); Sent_Byte(dataW); Io_Set(Elcm); delay(2); Io_Clr(Elcm); delay(2); /*= 显示光标定位 21 =*/ void LocateXY12864(char posx,char posy) uchar temp; / posy &= 0x1; / if ( posy )temp |= 0x98; / /if ( posy )temp |= 0x40; / temp = posx & 0x0f; temp = posx ; temp = posx +temp-1; WaitForEnable() ; / temp |= 0x80; LcdWrite_CMD(temp,1); /指令写定位 void LocateXY( char posx,char posy) uchar temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; / temp |= 0x80; LcdWrite_CMD(temp,0);/指令写定位 /*= 按指定位置显示数出一个字符 =*/ void DispOneChar(uchar x,uchar y,uchar Wdata) LocateXY ( x, y ); / 定位显示地址 LocateXY12864( x, y ); LcdWrite_D( Wdata); / 写字符 void DispOneChar2(uchar x,uchar y,uchar Wdata) / LocateXY( x, y ); /1602 定位显示地址 / LocateXY( x, y ); / 定位显示地址 /lcd_pos(x, y); LcdWrite_D(t ); / 写字符 /*= 显示字符串 =*/ void disp(uchar x,uchar y,const unsigned char *ptr) uchar i,l=0; while (ptrl 31)l+; 22 for (i=0;il;i+) DispOneChar(x+,y,ptri); if ( x = 16 ) x = 0; y = 1; /初始化 void lcdreset(void) LcdWrite_CMD(0x38, 0); /显示模式设置(不测试忙信号)共三次 delayms(50); LcdWrite_CMD(0x38, 0); delayms(50); LcdWrite_CMD(0x38, 0); delayms(50); LcdWrite_CMD( 0x38, 1); LcdWrite_CMD( 0x08, 1); LcdWrite_CMD( 0x01, 1); LcdWrite_CMD( 0x06, 1); LcdWrite_CMD( 0x0f, 1); /*= 显示字符串 (电压) =*/ void disp1(uchar x,uchar y,int ii) uchar i,l=5; / L 规定数字位数 vv1,:小数点参数 unsigned int hu10 ; /u1 , LocateXY( x, y ); / 定位显示地址 xx1=ii ; /脉冲数传送到 xx1(借用专用变量 ) hu2=xx1%100000/10000+0;/取余数求整数 ,加 0x30 hu3=xx1%10000/1000+0;/(xx1-hu2*100000) ; hu4=xx1%10000/1000+0;/ 1000 位余数 hu5=xx1%1000/100+0;/v1/100 位余数 /1000 位 v / hu6 =xx1%100/10+0; /10 位余数 hu7=xx1%10+0; /取个位余数 23 t=0; x=0; for (i=1;i31)l+; for (i=0;il;i+) DispOneChar(x+,y,ptri); if ( x = 16 ) x = 0; y = 1; t=t +1 ; /* * Main Function main() */ int main (void) /* 初始化中断 */ int i22; unsigned char j1,j2 ; unsigned int i1,k1; init_port(); delay(1); / lcdreset(); / disp(0,0 , zeg hz ) ; delay(1); /UART0_Ini () ; 24 / U0FCR = 0x81; / 使能 FIFO,并设置触发点为 8 字节 / U0FCR = 0x00; /关闭 FIFO 设置触发为 1 字节 delay(1); /Sent_Str(a1); delay(1); / printf (0x34) ; EINTInit(); /disp1(4,1 , ii4 ); EXTINT = 0x09; / 清除 EINT0、 EINT3 中断标志 VICIntEnable = (1 14)|(1 17); Init_Uart0(UART_BAUD(9600) ; Sent_Str( dddd) ; while( 1 ) /一直等 . / disp(0,1 , dfghg ) ; / ; k1=IOPIN0; /输入状态 k1=k1&0x20; if(k1=0x20) /测试 b 脉冲位置 j2=1; else j2=0; / disp(1,1 ,xx) ; / delay(1); / j1=0; if(j2=1) / Init_Uart0(UART_BAUD(9600) ; / UART0_GetStr( 12); / 从串口接收 12 个字符 Sent_Str(4321) ; Sent_Str(asdfg) ; for (i1=0;i112;) tmp=0; i1+; if(0x37= strdata4) Sent_Byte2(strdatai1); / 回传接收到的数据 if(0x41= strdata1&0x41= strdata2 ) /输入 AA 开头即可读出后 3 位 for (j1=4;j18;j1+ ) Sent_Byte2(strdataj1); / 回传接收到的数据 / UART0_SendByte (strdataj1); 25 / ii6=strdataj1; DispOneChar2(3+j1,1,strdataj1) ; /disp1(4,1 ,ii6) ; i2=0; if(j2=0) / EINTInit(); / EXTINT = 0x0f; / 清除 EINT0、 EINT3 中断标志 /VICIntEnable = (1 14)|(1 17)|(1 80) disp1(4,0 ,ii4 ) ; xx5=ii4; i22=0; / delay(10 ); delayms(1) ; i22+; if( xx4=ii5 ) /PLLCON else if ( i2280) disp1(4,1 ,ii5 ) ; xx4=ii5; i22=0; / delay(1 ); / delayms(1) ; i22+; / Scan_Key() ; / / return 0; /* * End Of File */ 26 4.系统实现的相关技术 5.1 ARM2148 简介及运用领域 定义 嵌入式操作系统( Embedded Operating System,简称: EOS)是指用于 嵌入式系统 的 操作系 统 。嵌入式操作系统是一种用途广泛的 系统软件 ,通常包括与硬件相关的底层 驱动 软件、系统 内核 、设备驱动接口、 通信协议 、 图形界面 、标准化 浏览器 等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务 调度 ,控制、协调并发活动。它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能 。 特点 1)系统 内核 小。由于 嵌入式系统 一般是应用于小型电子装置的, 系统资源 相对有限,所以 内核 较之 传统的操作系统要小得多。 比如 Enea 公司的 OSE 分布式系统 , 内核 只有 5K。 2)专用性强。 嵌入式 系统 的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和 通用软件 的 “升级 ”是完全两个概念。 3)系统精简。 嵌入式系统 一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于 控制系统 成本,同时也利于实现系统安全。 4)高实时性的系统软件 (OS)是 嵌入式软件 的基本要求。而且软件要求固态存储,以提高速度; 软件代码 要求高质量和高可靠性。 5) 嵌入式软件开发 要想走向标准化,就必须使用多任务的操作系统。 嵌入式系统 的 应用程序 可以没有操作系统直接在芯片上运行;但是为了合 理地调度多任务、利用 系统资源 、 系统函数 以及和专家 库函数 接口,用户必须自行选配 RTOS( Real Time Operating System)开发平台,这样才能保证程序执行的实时性、可靠性,并减少开 发时间,保障 软件质量 。 6) 嵌入式系统开发 需要开发工具和环境。由于其本身不具备 自举 开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发 ,这些工具和环境一般是基于 通用计算机 上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。 核心 嵌入式系统的核心是 嵌入式微处理器 。 嵌入式微处理器 一般具备以下 4 个特点: 1)对实时任务有很强的支持能力,能完成多任务并且有较短的 中断响应时间 ,从而使内部的代码和实时内核心的执行时间减少到最低限度。 2)具有功能很强的存储区保护功能。这是由于 嵌入式系统 的 软件结构 已模块化, 27 而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。 3)可扩展的处理器结构,以能最迅速地开发出满足应用的最高性能的 嵌入式微处理器 。 4)嵌入式微处理器 必须功耗很低,尤其 是用于便携式的无线及移动的计算和通信设备中靠电池供电的 嵌入式系统 更是如此,如需要功耗只有 mW 甚至 W 级。 应用 工业控制 基于嵌入式芯片的工业自动化设备将获得长足的发展,目前已经有大量的 8、 16、 32 位嵌入式微控制器在应用中,网络化是提高生产效率和产品质量、减少人力资源主要途径,如工业过程控制、数字机床、电力系统、电网安全、电网设备监测、石油化工系统。就传统的工业控制产品而言,低端型采用的往往是 8位 单片机 。但是随着技术的发展, 32位、 64位的处理器逐渐成为工业控制设备的核心,在未来几年内必将获得长足的发展。 交通管理 在车辆导航、 流量控制 、信息监测与汽车服务方面,嵌入式系统技术已经获得了广泛的应用,内嵌GPS 模块, GSM 模块的移动定位 终端 已经在各种运输行业获得了成功的使用。目前 GPS 设备已经从尖端产品进入了普通百姓的家庭,只需要几千元,就可以随时随地找到你的位置。 家庭智能管理系统 水、电、煤气表的远程 自动抄表 ,安全防火、防盗系统,其中嵌有的专用控制芯片将代替传统的人工检查,并实现更高,更准确和更安全的性能。目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。 机器人 嵌入式 芯片的发展将使 机器人 在微型化,高智能方面优势更加明显,同时会大幅度降低机器人的价格,使其在工业领域和服务领域获得更广泛的应用。 这些应用中,可以着重于在控制方面的应用。就远程家电控制而言,除了开发出支持 TCP/IP 的嵌入式系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。同样的道理,所有基于网络的远程控制器件都需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。所以 ,开发和探讨嵌入式系统有着十分重要的意义。 28 5.2 单片机的简介及运用 定义 单片机是一种集成在 电路 芯片,是采用 超大规模集成电路 技术把具有数据处理能力的中央处理器 CPU 随机存储器 RAM、 只读存储器 ROM、多种 I/O 口和中断系统、定时器 /计时器 等功能(可能还包括显示驱动电路、 脉宽调制 电路、模拟多路转换器、 A/D 转换器 等电路)集成到一块硅片上构成的一个小而完善的 计算机系统 。从上世纪 80 年代,由当时的 4 位、 8 位单片机,发展到现在的 32 位 300M 的高速单片机。 从上世纪 80 年代,由当时的 4 位, 8 位单片机,发展到现在的 32 位 300M 的高速单片机。 工作过程 单片机自动完成赋予它的任务的过程,也就是单片机 执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件 存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房 间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。 程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器 PC(包含在 CPU 中),在开始执行程序时,给 PC 赋以程序中第一 条指令所在的地址,然后取得每一条要执行的命令, PC 在中的内容就会自动增加,增加量由本条指令长度决定,可能是 1、 2或 3,以指向下一条指令的起始地址,保证指令顺序执行。 运用领域 1.在 智能仪器 仪表上的应用 : 单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的 传感器 ,可实现诸如电压、 功率 、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或 数字电路 更加强大。例如精密的测量设备( 功率计 , 示波器 ,各种分析仪)。 2.在工业控制中的应用 : 用单片机可以构成形式多样的控制系统、 数据采集系统 。例如工厂流水线的智能化管 理,电梯智能化控制、各种

温馨提示

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

评论

0/150

提交评论