<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>木客网 &#187; 单片机开发</title>
	<atom:link href="http://woodfeed.com/category/%e5%8d%95%e7%89%87%e6%9c%ba%e5%bc%80%e5%8f%91/feed/" rel="self" type="application/rss+xml" />
	<link>http://woodfeed.com</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jun 2010 12:15:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>C8051F020与80C51单片机的异同点</title>
		<link>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/</link>
		<comments>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 12:15:52 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[80c51]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=606</guid>
		<description><![CDATA[80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大部分工作人员都熟悉80C51单片机，各大专院校都采用80C51系列单片机作为教学模型。随着单片机的不断发展，市场上出现了很多高速、高性能的新型单片机，基于标准8051内核的单片机正面临着退出市场的境地。为此，一些半导体公司开始对传统8051内核进行大的构造，主要是提高速度和增加片内模拟和数字外设，以期大幅度提高单片机的整体性能。其中美国Cygnal公司推出的C8051F系列单片机把80C51系列单片机从MCU时代推向SoC时代，使得以8051为内核的单片机上了一个新的台阶。

　　C8051F系列单片机是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。熟悉NCS-51系列单片机的工程技术人员可以很容易地掌握C8051F的应用技术并能进行软件的移植。但是不能将8051的程序完全照搬的应用于C8051F单片机中，这是因为两者的内部资源存在较大的差异，必须经过加工才能予以使用。其中C8051F020以其功能较全面，应用较广泛的特点成为C8051F的代表性产品，其性能价格比在目前应用领域也极具竞争力。C8051F020的内部电路包括CIP-51微控制器内核及RAM、ROM、I／O口、定时／计数器、ADC、DAC、PCA、SPI和SMBus等部件，即把计算机的基本组成单元以及模拟和数字外设集成在一个芯片上，构成一个完整的片上系统(SoC)。本文将介绍C8051F020单片机与80C51的异同点(主要是不同之处)及初学者编程时应该注意的问题，并给出经过Cygnal开发工具IDE调试环境软件验证的源程序。
]]></description>
			<content:encoded><![CDATA[<p>1 引言 </p>
<p>　　80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大部分工作人员都熟悉80C51单片机，各大专院校都采用80C51系列单片机作为教学模型。随着单片机的不断发展，市场上出现了很多高速、高性能的新型单片机，基于标准8051内核的单片机正面临着退出市场的境地。为此，一些半导体公司开始对传统8051内核进行大的构造，主要是提高速度和增加片内模拟和数字外设，以期大幅度提高单片机的整体性能。其中美国Cygnal公司推出的C8051F系列单片机把80C51系列单片机从MCU时代推向SoC时代，使得以8051为内核的单片机上了一个新的台阶。</p>
<p>　　C8051F系列单片机是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。熟悉NCS-51系列单片机的工程技术人员可以很容易地掌握C8051F的应用技术并能进行软件的移植。但是不能将8051的程序完全照搬的应用于C8051F单片机中，这是因为两者的内部资源存在较大的差异，必须经过加工才能予以使用。其中C8051F020以其功能较全面，应用较广泛的特点成为C8051F的代表性产品，其性能价格比在目前应用领域也极具竞争力。C8051F020的内部电路包括CIP-51微控制器内核及RAM、ROM、I／O口、定时／计数器、ADC、DAC、PCA、SPI和SMBus等部件，即把计算机的基本组成单元以及模拟和数字外设集成在一个芯片上，构成一个完整的片上系统(SoC)。本文将介绍C8051F020单片机与80C51的异同点(主要是不同之处)及初学者编程时应该注意的问题，并给出经过Cygnal开发工具IDE调试环境软件验证的源程序。</p>
<p>2 相同点</p>
<p>　　C8051F020单片机与80C51系列单片机的指令系统完全一样。掌握80C51单片机的人员可以很容易地接受C8051F020的应用技术并能完成相应软件的移植。</p>
<p>3 主要硬件不同点</p>
<p>3.1 运行速度</p>
<p>　　C8051F020的指令运行速度是一般80C51系列单片机的10倍以上。因为其CIP-51中采用了流水线处理结构，已经没有了机器周期时序，指令执行的最小时序单位为系统时钟，大部分指令只要1～2个系统周期即可完成。又由于其时钟系统比80C51的更加完善，有多个时钟源，且时钟源可编程，时钟频率范围为0～25 MHz，当CIP-5l工作在最大系统时钟频率25 MHz时，它的峰值速度可以达到25 MI／s，C8051F020已进入了8位高速单片机行列。</p>
<p>3.2 I／O端口的配置方式</p>
<p>　　C8051F020拥有8个8位的I／O端口，大量减少了外部连线和器件扩展，有利于提高可靠性和抗干扰能力。其中低4个I／O端口除可作为一般的通用I／O端口外，还可作为其他功能模块的输入或输出引脚，它是通过交叉开关配置寄存器XBR0、XBR1、XBR2(各位名称及格式如表1所示)选择并控制的，它们控制优先权译码选择开关电路如图1所示，可将片内的计数器／定时器、串行总线、硬件中断、比较器输出及其它的数字信号配置为在端口I／O引脚出现，这样用户可以根据自己的特定需要选择所需的数字资源和通用I／O口。数字交叉开关是一个比较大的数字开关网路，这在所有80C51系列单片机上是一个空白。另外P1MDIN用于选择P1的输入方式是模拟输入还是数字输入，复位值为11111111B，即默认为数字输入方式。而80C51单片机的I／O引脚是固定分配的，即占用引脚多，配置又不够灵活。</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" rel="lightbox[606]"></a><a href="http://woodfeed.com/wp-content/uploads/2010/06/image001.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-602" title="image001" src="http://woodfeed.com/wp-content/uploads/2010/06/image001.jpg" alt="" width="550" height="384" /></a></p>
<p style="text-align: center;">　<a href="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-603" title="image002" src="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" alt="" width="550" height="238" /></a>　</p>
<p>      C8051F020通过优先权交叉开关译码器(如图2所示)控制数字开关网路，端口引脚的分配顺序是从P0.0开始一直到P3.7。当交叉开关配置寄存器XBR0、XBR1和XBR2中外设的对应使能位被设置为逻辑“1”时，交叉开关将端口引脚分配给外设，例如，如果UARTOEN位(XBR0.2)被设置为逻辑“1”，则TX0和RX0引脚将分别被分配到P0.0和P0.1。因为UART0有最高优先权，所以当UARTOEN位被设置为逻辑“1”时其引脚将总是被分配到P0.0和P0.1。未被设置的交叉开关分配端口可作为通用I／O口。注意：当选择了串行通信外设(即SMBus、SPI或UART)时，交叉开关将为所有相关功能分配引脚。例如，不能为UART0功能只分配TX0引脚而不分配RX0引脚。交叉开关寄存器被正确配置后，通过将XBARE(XBR2.6)设置为逻辑“1”来使能交叉开关。 </p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/image003.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-604" title="image003" src="http://woodfeed.com/wp-content/uploads/2010/06/image003.jpg" alt="" width="550" height="462" /></a></p>
<p>3.3 内部功能</p>
<p>　　C8051F020内部带有数据采集所需的ADC和DAC，其中ADC有两个，一个是8路12位逐次逼近型ADC，可编程转换速率，最大为100 kS／s．可通过多通道选择器配置为单端输入或差分输入。内有可编程增益放大器PGA用于将输入的信号放大，提高A／D的转换精度。可编程增益为：0.5、1、2、4、8或16，复位时默认值为1。另一个是8路8位ADC，可编程转换速率最大为500 kS／s，其可编程放大增益为0.5、1、2、4，复位时默认值为0.5。有2个12位的DAC，用于将12位的数字量转换为电压量，可产生连续变化的波形，两路信号可同步输出。</p>
<p>3.4 外部接口</p>
<p>　　C8051F020外设还增添了三个串行口。可同时与外界进行串行数据通信，SMBus兼容于I2C串行扩展总线；SPI串行扩展接口；两个增强型UART串口。C8051F020具有基于JTAG接口的在系统调试功能，片内的调试电路通过JTAG接口可提供高速、方便的在系统调试。</p>
<p>4 软件编程举例</p>
<p>　　鉴于C8051F020在硬件方面与80C51的不同之处，故它们在软件编程时也会有所区别，这种区别主要体现在初始化程序上。该程序是在Cygnal的开发工具即IDE调试环境中予以验证的。</p>
<p>　　例：利用定时器T0定时,在P1.2端输出一方波,方波周期为20 ms,已知晶振频率为12 MHz，采用中断的方式实现。</p>
<p>　　采用C8051F020单片机实现的程序如下： </p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/image005.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-601" title="image005" src="http://woodfeed.com/wp-content/uploads/2010/06/image005.jpg" alt="" width="400" height="526" /></a><a href="http://woodfeed.com/wp-content/uploads/2010/06/image004.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-605" title="image004" src="http://woodfeed.com/wp-content/uploads/2010/06/image004.jpg" alt="" width="380" height="203" /></a></p>
<p>　　从上面的程序中可以看出：在C8051F020软件编程中须首先设置看门狗定时器的工作状态，其次，要由内部振荡器控制寄存器OSCICN设置采用内部时钟还是外部时钟工作，若选择外部时钟可通过外部振荡器控制寄存器OSCXCN来选择适当的频率，本题目采用内部时钟，并通过时钟控制寄存器CKCON选择使用系统时钟的12分频。再次，若选择的I／O口是低四个端口P0～P3作为工作口，需要设定寄存器XBR0、XBR1、XBR2(复位值为0)，在本设计中未用到数字资源，故XBR0、XBR1的值为复位值，只需设定XBR2的值为40H允许功能选择开关即可，若本设计中的P1.2换为P4.2，则无需设定寄存器XBR0、XBR1、XBR2，因为高端口P4～P7与交叉开关无关。最后还要选择所用I／O口的输出方式，P0、P1、P2、P3口分别由POMDOUT、P1MD-OUT、P2MDOUT、P3MDOUT端口输出方式寄存器来选择，寄存器中的某位置0为漏极开路输出方式，置1则为推拉输出方式。另外，由于C8051F020的专用寄存器比一般51单片机多，而8051指令不能识别它增加的专用寄存器，公司提供了所有的专用寄存器及相应位的地址定义文件，用户只需加一条＄include(C8051F020.inc)指令即可。</p>
<p>　　该程序只需将与上面提到的几点相关的指令去掉即为80C51的源程序(程序中已标示)。当然这仅仅是一个简单的例子，并不能完全说明所有不同之处，但可说明它们典型的不同点。</p>
<p>5 结束语</p>
<p>　　C8051F020与80C51单片机的指令系统完全兼容，给用户使用带来了极大的方便，但它们的硬件结构不同，因此在使用上有所区别，只有了解了它们之间的异同点，才能更好地对C8051F020进行开发利用，充分发挥它的先进功效。 </p>
<p>来源：世界电子元器件</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/" title="基于C8051F020单片机的Web远程控制的温度采集系统">基于C8051F020单片机的Web远程控制的温度采集系统</a><br /><small>      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>基于C8051F020单片机的Web远程控制的温度采集系统</title>
		<link>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/</link>
		<comments>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 09:16:24 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[温度采集]]></category>
		<category><![CDATA[远程控制]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=599</guid>
		<description><![CDATA[      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化，以实现分布式远程监控、信息交换与共享。目前广泛使用的以太网以及TCP/IP 协议已经成为最常用的网络标准之一，其高速、可靠、分层以及可扩充性使其在各个领域的应用越来越灵活，很多情况下采用以太网和TCP/IP，能够简化结构和降低成本。 
　　
     目前大多数智能设备和仪表都是采用RS232/485 或USB通讯方式，不具备远程控制和数据传输能力。 利用以太网实现工业系统远程控制，通过互联网共享小型嵌入式设备的信息，是工业控制研究的发展趋势。本系统采用高速单片机C8051F020及 RTL8019AS 以太网控制器，用嵌入式TCP/IP 协议可以实现TCP和UDP等网络功能,进一步实现HTTP协议服务,实现Web Server 及接入Internet 的功能。
]]></description>
			<content:encoded><![CDATA[<p>         随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化，以实现分布式远程监控、信息交换与共享。目前广泛使用的以太网以及TCP/IP 协议已经成为最常用的网络标准之一，其高速、可靠、分层以及可扩充性使其在各个领域的应用越来越灵活，很多情况下采用以太网和TCP/IP，能够简化结构和降低成本。　　</p>
<p>     目前大多数智能设备和仪表都是采用RS232/485 或USB通讯方式，不具备远程控制和数据传输能力。 利用以太网实现工业系统远程控制，通过互联网共享小型嵌入式设备的信息，是工业控制研究的发展趋势。本系统采用高速单片机C8051F020及 RTL8019AS 以太网控制器，用嵌入式TCP/IP 协议可以实现TCP和UDP等网络功能,进一步实现HTTP协议服务,实现Web Server 及接入Internet 的功能。　　</p>
<ol>
<li><strong>1.     </strong><strong>系统的总体设计</strong><strong> </strong></li>
</ol>
<p>          系统的结构框图如图1所示，高速单片机C8051F020 是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。可以满足系统在功耗和处理速度方面的要求。</p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/kuangjia.gif" rel="lightbox[599]"><img class="size-full wp-image-597  aligncenter" title="kuangjia" src="http://woodfeed.com/wp-content/uploads/2010/06/kuangjia.gif" alt="" width="545" height="333" /></a></p>
<p><strong> </strong></p>
<p>          RTL8019AS 是一种全双工即插即用的以太网控制器，在一块芯片上集成了RTL8019内核和一个16KB的SDRAM存储器，兼容RTL8019控制软件和NE2000 8bit或16bit的传输，支持外接闪烁存储器读写操作，支持I/O口地址的完全解码，具有LED指示功能，接口符合Ethernet2和IEEE802.3（10Base5,10Base2,10BaseT）标准</p>
<p><strong>        </strong>RTL8019AS 是一种高度集成的10MB以太网控制器，与NE2000兼容, 支持8位、16位数据总线；内置16KB SRAM缓存；可连接同轴电缆和双绞线,并可自动检测所连接的介质。以太网隔离滤波器选用20F00IN。</p>
<p>　　</p>
<p>        RTL8019AS 与主处理器的接口方式有三种:跳线方式、PNP(即插即用)方式和免跳线方式。RTL8019AS 的第65 脚JP 决定网卡的工作方式，本设计中JP脚接高电平(VCC),即使用跳线方式，此时可以省掉外部E2PROM 93C46芯片。单片机通过I/O 模式访问以太网控制器。RTL8019AS 必须工作在8位模式下，其引脚IOCS16B经电阻接地。RTL8019AS 的第64 脚AUI决定接口方式，本设计中AUI接地，使用BNC接口，使用的是8线双绞。</p>
<p>  <strong>2 </strong><strong>以太网控制器的工作过程</strong>　</p>
<p>        以太网控制器的 RAM 以 256 字节为一页，是按页存储的结构，16位RAM地址的高 8位又叫页码。以太网控制器的16KB RAM的地址从0&#215;4000～0x7FFF，即从页0&#215;40 到页0x7F，共有64 页用来接收和发送数据包。这64页RAM是一块双端口RAM。所谓双端口就是说有两套总线连接到该RAM，总线A 用于以太网控制器读/写片上RAM，总线B 用于单片机读/写以太网控制器上的 RAM。总线A又叫Local DMA，总线B 又叫 Remote DMA。　</p>
<p>    2.1 数据包的发送过程　</p>
<p>        (1)封装数据包：数据包在发送前，单片机将其按如图2所示的以太网帧格式封装好,并存放在外部SRAM。</p>
<table style="text-align: center;" border="0" cellspacing="0" cellpadding="0" width="539">
<tbody>
<tr>
<td style="text-align: center;" width="53" valign="top">PR</td>
<td style="text-align: center;" width="51" valign="top">SD</td>
<td style="text-align: center;" width="57" valign="top">DA</td>
<td style="text-align: center;" width="57" valign="top">SA</td>
<td style="text-align: center;" width="104" valign="top">LENGTH/TYPE</td>
<td style="text-align: center;" width="95" valign="top">DATA</td>
<td style="text-align: center;" width="57" valign="top">PAD</td>
<td style="text-align: center;" width="66" valign="top">FCS</td>
</tr>
<tr>
<td style="text-align: center;" width="53" valign="top">56位</td>
<td style="text-align: center;" width="51" valign="top">8位</td>
<td style="text-align: center;" width="57" valign="top">48位</td>
<td style="text-align: center;" width="57" valign="top">48位</td>
<td style="text-align: center;" width="104" valign="top">16位</td>
<td style="text-align: center;" width="95" valign="top">N&lt;=1500</td>
<td style="text-align: center;" width="57" valign="top">可选</td>
<td style="text-align: center;" width="66" valign="top">32位</td>
</tr>
</tbody>
</table>
<p>    以太网(802.3)帧结构</p>
<p>      (2)通过远程DMA将数据包写入到 RLT8019AS 的数据发送缓冲区， 数据的目的缓冲区首地址和字节数由内部寄存器RSCR0、1设定。</p>
<p>      (3) 通过RTL8019AS的本地DMA将数据送入FIFO 缓冲器进行发送。　</p>
<p>    2.2 数据包的接收过程　</p>
<p>      (1)本地 DMA 将需要接收的数据包存入到接收缓冲环中。</p>
<p>      (2)由远程 DMA 将接收缓冲环中的数据包写入到外部 SRAM 中。　</p>
<p>      如果以太网控制器运行正常，接收到数据包时自动启动本地 DMA 将数据存入接收缓冲环中，也就是说第一步是由 RTL8019AS 自动完成的。但是，接收缓冲环的范围需要设置，PSTART、PSTOP 分别用于设置接收缓冲环的起始页和发送页，设置了接收缓冲环之后，接收到的第一个数据包放置的位置由当前页面寄存器CURR 决定。</p>
<p>3 服务器端工作过程</p>
<p>          图3 所示为本系统 TCP/IP 各层协议，链路层协议由单片机控制RTL8019AS 实现，而其他协议由单片机内部程序实现。</p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/tcpip4.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-596" title="tcpip4" src="http://woodfeed.com/wp-content/uploads/2010/06/tcpip4.jpg" alt="" width="567" height="273" /></a></p>
<p>　    服务器接收数据时，以太网驱动程序负责接收数据，由以太网控制器中断处理程序唤醒数据接收任务，由数据接收任务将接收到的数据帧交给网络接口 层，网络接口层取出帧头，判断接收数据的类型，如果是ARP 报文，则将ARP 报文交给ARP 协议模块处理；如果是IP 数据包，则将IP数据包交给IP 协议模块处理，IP协议模块取出IP 首部信息，然后根据数据包的类型，将报文交给相应的协议模块(UDP 模块、TCP 模块或ICMP 模块)处理，UDP 模块或TCP 模块收到报文后，取出首部进行处理，并将用户数据交给应用程序。</p>
<p style="text-align: center;">　<a href="http://woodfeed.com/wp-content/uploads/2010/06/tcpbao.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-598" title="tcpbao" src="http://woodfeed.com/wp-content/uploads/2010/06/tcpbao.jpg" alt="" width="568" height="249" /></a></p>
<p>　     服务器发送数据时，将用户数据交给UDP协议模块或TCP 协议模块处理，UDP协议模块或TCP协议模块将其首部和数据封装成UDP数据包或TCP数据包，然后将封装好的数据包交给IP协议模块，IP模块在上层 交给的数据包上添加IP首部，并封装成IP数据包，然后为 IP 数据包寻找路由，如果找不到相应路由，则向ICMP 协议发送出错报文，由ICMP 协议模块进行处理，在找到了合适的路由后，如果是以太网方式，则将数据包发送到网络接口层，利用ARP协议找到目的IP对应的物理地址，然后封装成以太网 帧，由网卡驱动程序将以太网帧发送出去。</p>
<p>4 利用HTTP协议实现Web接收与发送控制数据　</p>
<p>　     在单片机系统中实现HTTP 协议服务端的功能，就可以为其他的客户机提供超文本信息，客户端只需要使用统一的浏览器就可以与服务器进行信息交换。</p>
<p>　      超文本传输协议(HTTP)是目前通过Internet进行信息交换最主要的方式。在Internet上HTTP 通讯经常发生在 TCP/IP 连接之上。其缺省端口是TCP 协议的80 端口，当然，其他的端口也是可以使用的。HTTP 协议是建立在请求/响应(request/response) 模型上的。首先由客户建立一条与服务器的TCP链接，并发送一个请求到服务器，请求中包含请求方法、URI、协议版本以及相关的MIME (Multipurpose Internet Mail Extensions) 样式的消息。服务器响应一个状态行，包含消息的协议版本、一个成功或失败码以及相关的MIME 式样的消息(包含服务器的信息、资源实体的信息和可能的资源内容)。</p>
<p>　      单片机服务器除了包括HTML 文件以外，还有一个HTTP 驻留程序，用于响应计算机端的控制请求。用HTML 文件编写的网络界面，可以通过浏览器访问并利用相应的按扭向服务器发送HTTP 请求，此请求被送往由IP地址指定的URL。驻留程序接收到请求，在进行必要的操作后回送所要求的文件。在这一过程中，在网络上发送和接收的数据已经被分 成一个或多个数据包(packet)，每个数据包包括：要传送的数据；控制信息，即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。</p>
<p style="text-align: center;">　　<a href="http://woodfeed.com/wp-content/uploads/2010/06/web.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-600" title="web" src="http://woodfeed.com/wp-content/uploads/2010/06/web.jpg" alt="" width="553" height="334" /></a></p>
<p>　         图5 是通过Web 浏览器看到的网络控制界面，必需将客户计算机与服务器系统的IP地址设置在一个段内。如本系统服务器IP地址设为192.168.0.10，客户机IP地址设为192.168.0.11，默认网关均为255.255.255.0。</p>
<p>　       (1) 发送控制数据过程:①通过浏览器向服务器系统(单片机)发送HTTP 请求；②服务器系统通过HTTP服务程序查看网页程序中表单内输入变量的变化；③取出变量值,调用串口程序将数据发出。　</p>
<p>　       (2)接收采集数据过程：①系统HTTP 协议程序的http_serve 中调用串口程序接收串口数据,并用此数据取代其内部网页中的表格内“NO DATA”标记；②服务器系统把Web页面传送给用户界面的浏览器。</p>
<p style="text-align: left;">　      用低成本的单片机和以太网控制器，配合适当的网络协议，实现了通过网络对RS232接口设备的数据采集及系统控制。如对其进行适当的改变 与扩展，便可以用于其他接口的仪器仪表，并应用于更广泛的领域。由于系统的控制器使用的是单片机，限于其内部资源，所以网页文件不能过大。</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/" title="C8051F020与80C51单片机的异同点">C8051F020与80C51单片机的异同点</a><br /><small>80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>基于AVR单片机的远程控制系统的研究</title>
		<link>http://woodfeed.com/remote-control-system-based-on-avr-microcontroller/</link>
		<comments>http://woodfeed.com/remote-control-system-based-on-avr-microcontroller/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 15:32:48 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[RTL8019AS]]></category>
		<category><![CDATA[TCP/IP]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=568</guid>
		<description><![CDATA[介绍了一种利用AVR单片机和RTL8019AS以太网控制器实现的RS232接口设备远程控制系统,对AVR和RTL8019AS的硬件连接做了详细说明,并介绍了RTL8019AS的工作原理及系统的软件流程.该系统可实现段最大长度为100m、数据率为10Mbps的以太网数据接收与控制.]]></description>
			<content:encoded><![CDATA[<p>         随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化，以实现分布式远程监控、信息交换与共享。目 前广泛使用的以太网以及TCP/IP 协议已经成为最常用的网络标准之一，其高速、可靠、分层以及可扩充性使其在各个领域的应用越来越灵活，很多情况下采用以太网和TCP/IP，能够简化结构 和降低成本。<br />
　　<br />
    目前大多数智能设备和仪表都是采用RS232/485 或USB通讯方式，不具备远程控制和数据传输能力。 利用以太网实现工业系统远程控制，通过互联网共享小型嵌入式设备的信息，是工业控制研究的发展趋势。本系统采用高速单片机ATmega64及 RTL8019AS 以太网控制器，用嵌入式TCP/IP 协议可以实现TCP和UDP等网络功能,进一步实现HTTP协议服务,实现Web Sever 及接入Internet 的功能。</p>
<p>　　<br />
    1 系统硬件设计</p>
<p>　　<br />
    系统的结构框图如图1所示， ATmega64是基于增强的AVR RISC 结构的低功耗8位CMOS微控制器。内带64KB的Flash、2KB的E2PROM、4KB的SRAM。由于其先进的指令集以及单时钟周期指令执行时 间，ATmega64 的数据吞吐率高达1MIPS/MHz，从而可以满足系统在功耗和处理速度方面的要求。</p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/03/0433510.jpg" rel="lightbox[568]"><img class="aligncenter size-full wp-image-563" title="0433510" src="http://woodfeed.com/wp-content/uploads/2010/03/0433510.jpg" alt="" width="310" height="175" /></a></p>
<p>    RTL8019AS 是一种高度集成的10MB以太网控制器，与NE2000兼容, 支持8位、16位数据总线；内置16KB SRAM缓存；可连接同轴电缆和双绞线,并可自动检测所连接的介质。以太网隔离滤波器选用20F00IN。</p>
<p style="text-align: center;">　　<br />
    RTL8019AS 与主处理器的接口方式有三种:跳线方式、PNP(即插即用)方式和免跳线方式。RTL8019AS 的第65 脚JP 决定网卡的工作方式，本设计中JP脚接高电平(VCC),即使用跳线方式，此时可以省掉外部E2PROM 93C46芯片。单片机通过I/O 模式访问以太网控制器。RTL8019AS 必须工作在8位模式下，其引脚IOCS16B经电阻接地。电路框图如图2所示。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2010/03/0433511.jpg" rel="lightbox[568]"><img class="aligncenter size-full wp-image-564" title="0433511" src="http://woodfeed.com/wp-content/uploads/2010/03/0433511.jpg" alt="" width="310" height="163" /></a></p>
<p>    RTL8019AS本身具有地址译码功能，所有的控制功能或数据传输都是通过访问地址偏移为00H～1FH的寄存器完成的，所以只需要5条地址线(SA4～SA0)。在跳线方式下RTL8019AS的I/O 地址由引脚 IOS3～IOS0决定,将IOS3～IOS0对应引脚全部接低电平,这时RTL8019AS的I/O 基地址为300H，因此可以用SA8 和SA9进行片选接至单片机的PC7。当PC7引脚置高电平时选中RTL8019AS ，当PC7引脚置低电平时选中外部RAM，而将片选信号AEN接地，这种片选方式可以节省一个反向器。AUI 用来检测在AUI接口外部MAU 的使用情况。当该引脚未用时，应该接地。</p>
<p>　　<br />
    介质的选择由引脚PL1和PL0决定，RTL8019AS 还具有自动测试介质连接是否成功的功能。无屏蔽双绞线(UTP)电缆是目前使用最为普遍的电信介质类型。为了更方便地将嵌入式以太网模块接入到局域网中，本设计采用RTL8019AS 与双绞线连接的接口电路，即将PL0、PL1 接地。</p>
<p>　　<br />
    2 以太网控制器的工作过程</p>
<p>　　<br />
    以太网控制器的 RAM 以 256 字节为一页，是按页存储的结构，16位RAM地址的高 8位又叫页码。以太网控制器的16KB RAM的地址从0&#215;4000～0x7FFF，即从页0&#215;40 到页0x7F，共有64 页用来接收和发送数据包。这64页RAM是一块双端口RAM。所谓双端口就是说有两套总线连接到该RAM，总线A 用于以太网控制器读/写片上RAM，总线B 用于单片机读/写以太网控制器上的 RAM。总线A又叫Local DMA，总线B 又叫 Remote DMA。</p>
<p>　　<br />
    2.1 数据包的发送过程</p>
<p>　　<br />
    (1) 封装数据包：数据包在发送前，单片机将其按如图3所示的以太网帧格式封装好,并存放在外部SRAM。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2010/03/0433512.gif" rel="lightbox[568]"><img class="aligncenter size-full wp-image-565" title="0433512" src="http://woodfeed.com/wp-content/uploads/2010/03/0433512.gif" alt="" width="484" height="86" /></a></p>
<p>    (2)通过远程DMA将数据包写入到 RLT8019AS 的数据发送缓冲区， 数据的目的缓冲区首地址和字节数由内部寄存器RSCR0、1设定。</p>
<p>　　<br />
    (3) 通过RTL8019AS的本地DMA将数据送入FIFO 缓冲器进行发送。</p>
<p>　　<br />
    2.2 数据包的接收过程</p>
<p>　　<br />
    (1)本地 DMA 将需要接收的数据包存入到接收缓冲环中。</p>
<p>　　<br />
    (2)由远程 DMA 将接收缓冲环中的数据包写入到外部 SRAM 中。</p>
<p>　　<br />
    如果以太网控制器运行正常，接收到数据包时自动启动本地 DMA 将数据存入接收缓冲环中，也就是说第一步是由 RTL8019AS 自动完成的。但是，接收缓冲环的范围需要设置，PSTART、PSTOP 分别用于设置接收缓冲环的起始页和发送页，设置了接收缓冲环之后，接收到的第一个数据包放置的位置由当前页面寄存器CURR 决定。<br />
    3 服务器端工作过程</p>
<p>　　<br />
    图4 所示为本系统 TCP/IP 各层协议，链路层协议由单片机控制RTL8019AS 实现，而其他协议由单片机内部程序实现。<br />
<a href="http://woodfeed.com/wp-content/uploads/2010/03/0433513.gif" rel="lightbox[568]"><img class="aligncenter size-full wp-image-566" title="0433513" src="http://woodfeed.com/wp-content/uploads/2010/03/0433513.gif" alt="" width="408" height="257" /></a></p>
<p>　服务器接收数据时，以太网驱动程序负责接收数据，由以太网控制器中断处理程序唤醒数据接收任务，由数据接收任务将接收到的数据帧交给网络接口层，网络接口层取出帧头，判断接收数据的类型，如果是ARP 报文，则将ARP 报文交给ARP 协议模块处理；如果是IP 数据包，则将IP数据包交给IP 协议模块处理，IP协议模块取出IP 首部信息，然后根据数据包的类型，将报文交给相应的协议模块(UDP 模块、TCP 模块或ICMP 模块)处理，UDP 模块或TCP 模块收到报文后，取出首部进行处理，并将用户数据交给应用程序。</p>
<p>　　<br />
　服务器发送数据时，将用户数据交给UDP协议模块或TCP 协议模块处理，UDP协议模块或TCP协议模块将其首部和数据封装成UDP数据包或TCP数据包，然后将封装好的数据包交给IP协议模块，IP模块在上层 交给的数据包上添加IP首部，并封装成IP数据包，然后为 IP 数据包寻找路由，如果找不到相应路由，则向ICMP 协议发送出错报文，由ICMP 协议模块进行处理，在找到了合适的路由后，如果是以太网方式，则将数据包发送到网络接口层，利用ARP协议找到目的IP对应的物理地址，然后封装成以太网 帧，由网卡驱动程序将以太网帧发送出去。<br />
　　<br />
　4 利用HTTP协议实现Web接收与发送控制数据</p>
<p>　　<br />
　在单片机系统中实现HTTP 协议服务端的功能，就可以为其他的客户机提供超文本信息，客户端只需要使用统一的浏览器就可以与服务器进行信息交换。</p>
<p>　　<br />
　超文本传输协议(HTTP)是目前通过Internet进行信息交换最主要的方式。在Internet上HTTP 通讯经常发生在 TCP/IP 连接之上。其缺省端口是TCP 协议的80 端口，当然，其他的端口也是可以使用的。HTTP 协议是建立在请求/响应(request/response) 模型上的。首先由客户建立一条与服务器的TCP链接，并发送一个请求到服务器，请求中包含请求方法、URI、协议版本以及相关的MIME (Multipurpose Internet Mail Extensions) 样式的消息。服务器响应一个状态行，包含消息的协议版本、一个成功或失败码以及相关的MIME 式样的消息(包含服务器的信息、资源实体的信息和可能的资源内容)。</p>
<p>　　<br />
　单片机服务器除了包括HTML 文件以外，还有一个HTTP 驻留程序，用于响应计算机端的控制请求。用HTML 文件编写的网络界面，可以通过浏览器访问并利用相应的按扭向服务器发送HTTP 请求，此请求被送往由IP地址指定的URL。驻留程序接收到请求，在进行必要的操作后回送所要求的文件。在这一过程中，在网络上发送和接收的数据已经被分成一个或多个数据包(packet)，每个数据包包括：要传送的数据；控制信息，即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。</p>
<p>　　<br />
　图5 是通过Web 浏览器看到的网络控制界面，必需将客户计算机与服务器系统的IP地址设置在一个段内。如本系统服务器IP地址设为192.168.0.10，客户机IP地址设为192.168.0.11，默认网关均为255.255.255.0。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2010/03/0433514.gif" rel="lightbox[568]"><img class="aligncenter size-full wp-image-567" title="0433514" src="http://woodfeed.com/wp-content/uploads/2010/03/0433514.gif" alt="" width="390" height="304" /></a></p>
<p>     (1) 发送控制数据过程:①通过浏览器向服务器系统(单片机)发送HTTP 请求；②服务器系统通过HTTP服务程序查看网页程序中表单内输入变量的变化；③取出变量值,调用串口程序将数据发出。　　<br />
　(2)接收采集数据过程：①系统HTTP 协议程序的http_serve 中调用串口程序接收串口数据,并用此数据取代其内部网页中的表格内“NO DATA”标记；②服务器系统把Web页面传送给用户界面的浏览器。</p>
<p>　<br />
　用低成本的AVR单片机和以太网控制器，配合适当的网络协议，实现了通过网络对RS232接口设备的数据采集及系统控制。如对其进行适当的改变 与扩展，便可以用于其他接口的仪器仪表，并应用于更广泛的领域。由于系统的控制器使用的是单片机，限于其内部资源，所以网页文件不能过大。</p>
<p>　　<br />
　参考文献　<br />
　[1] 何苏勤. TMS320C2000系列DSP原理及实用技术[M]. 北京:电子工业出版社，2003.　<br />
　[2] 贾云飞，王景芹. 利用单片机控制以太网网卡进行数据传输的研究.网络与总线，2003,(6):41.　<br />
　[3] 闫保中,虞凌宏,王仁龙. 基于AVR高速单片机的Web sever的研究.应用科技，2006，33(3):25.</p>
<p>    [4] J. Magid. Web服务器技术指南.李谦译.北京：机械工业出版社,1996.　<br />
　[5] Network Working Group： RFC 2616 &#8211; Hypertext Transfer Protocol——HTTP/1.1.</p>
<p>作 者：<a href="http://s.wanfangdata.com.cn/paper.aspx?f=detail&amp;q=%e4%bd%9c%e8%80%85%3a%22%e5%be%90%e4%ba%9a%e5%a8%9f%22++DBID%3aWF_QK">徐亚娟</a> <a href="http://s.wanfangdata.com.cn/paper.aspx?f=detail&amp;q=%e4%bd%9c%e8%80%85%3a%22%e5%ad%99%e9%87%91%e7%8e%ae%22++DBID%3aWF_QK">孙金玮</a> <a href="http://s.wanfangdata.com.cn/paper.aspx?f=detail&amp;q=%e4%bd%9c%e8%80%85%3a%22XU+Ya+Juan%22++DBID%3aWF_QK">XU Ya Juan</a> <a href="http://s.wanfangdata.com.cn/paper.aspx?f=detail&amp;q=%e4%bd%9c%e8%80%85%3a%22SUN+Jin+Wei%22++DBID%3aWF_QK">SUN Jin Wei</a>  </p>
<p>作者单位：哈尔滨工业大学,智能测试及信息处理技术研究所,黑龙江,哈尔滨,150001 </p>
<p>刊 名：<a href="http://c.wanfangdata.com.cn/periodical-dzjsyy.aspx">电子技术应用</a>  ISTIC PKU</p>
<p>英文刊名：<a href="http://c.wanfangdata.com.cn/periodical-dzjsyy.aspx">APPLICATION OF ELECTRONIC TECHNIQUE</a> </p>
<p>年，卷(期)：<a href="http://c.wanfangdata.com.cn/periodical/dzjsyy/2007-6.aspx">2007 33(6)</a></p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/remote-control-system-based-on-avr-microcontroller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C8051f020外部数据存储器复用方式</title>
		<link>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/</link>
		<comments>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 09:35:48 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[EMIF]]></category>
		<category><![CDATA[复用方式]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=535</guid>
		<description><![CDATA[C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。]]></description>
			<content:encoded><![CDATA[<p><strong>外部数据存储器接口和片内XRAM</strong></p>
<p>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问<span style="background-color: #ffffff;">XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。</span></p>
<p><strong>配置外部存储器接口</strong></p>
<p>配置外部存储器接口的过程包括下面4 个步骤：</p>
<p>1. 将EMIF 选到低端口（P3、P2、P1 和P0 ）或选到高端口（P7、P6、P5 和P4 ）。<br />
2. 选择复用方式或非复用方式。<br />
3. 选择存储器模式（只用片内存储器、不带块选择的分片方式、带块选择的分片方式或只用片外存储器）。<br />
4. 设置与片外存储器或外设接口的时序。<br />
5. 选择所需要的相关端口的输出方式（寄存器PnMDOUT 和P74OUT ）。</p>
<p>下面将对上述每个步骤作出详细说明。端口选择、复用方式选择和存储器模式位都位于<span style="background-color: #ffffff;">EMI0CN 寄存器中，如下。</span></p>
<p align="center"><strong>EMI0CN:  外部存储器接口控制</strong></p>
<p>R/W       R/W      R/W      R/W     R/W      R/W      R/W     R/W   PGSEL7   PGSEL6  PGSEL5   PGSEL4  PGSEL3  PGSEL2  PGSEL1   PGSEL0        位7        位6      位5        位4      位3       位2       位1        位0</p>
<p>复位值:00000000   SFR地址: 0xAF<br />
位 7-0： PGSEL[7:0]：XRAM 页选择位</p>
<p>当使用 8 位的 MOVX 命令时，XRAM 页选择位提供 16 位外部数据存储器地址的高字节，实际上是选择一个256 字节的RAM 页。<br />
0&#215;00：0&#215;0000 – 0x00FF<br />
0&#215;01：0&#215;0100 – 0x01FF<br />
…<br />
0xFE：0xFE00 – 0xFEFF<br />
0xFF：0xFF00 – 0Xffff</p>
<p><strong>端口选择和配置</strong></p>
<p>外部存储器接口可以位于端口3、2、1 和0（C8051F020/1/2/3）或端口7、6、5 和4（只限于C8051F020/2），由PRTSEL 位（EMI0CF.5 ）的状态决定。如果选择低端口，则EMIFLE位（XBR2.1 ）必须被置‘1’，以使交叉开关跳过P0.7(W/R)、P0.6(R/D)和 P0.5(ALE，如果选择复用方式)。<br />
外部存储器接口只在执行片外 MOVX 指令期间使用相关的端口引脚。一旦 MOVX 指令执行完毕，端口锁存器或交叉开关又重新恢复对端口引脚的控制（端口 3、2、1 和 0）。端口锁存器应被明确地配置为使外部存储器接口引脚处于休眠状态，通常是通过将它们设置为逻辑‘1’来实现这一要求。<br />
在执行MOVX 指令期间，外部存储器接口将禁止所有作为输入的那些引脚的驱动器（例如，读操作期间的Data[7:0]）。端口引脚的输出方式（无论引脚被配置为漏极开路或是推挽方式）不受外部存储器接口操作的影响，始终受 PnMDOUT  寄存器的控制。</p>
<p align="center"><strong>EMI0CF:  外部存储器接口配置</strong></p>
<p>R/W       R/W     R/W     R/W     R/W      R/W      R/W     R/W</p>
<p>-         -     PRTSEL   EMD2    EMD1     EMD0    EALE1  EALE0</p>
<p>位7       位6    位5      位4     位3       位2      位1       位0    SFR地址： 0xA3复位值:00000011</p>
<p>位 7-6： 未用。读  = 00b，写  =      忽略。<br />
位 5：      PRTSEL ：EMIF 端口选择位<br />
0：EMIF 在P0-P3。<br />
1：EMIF 在P4-P7。<br />
位4：       EMD2 ：EMIF 复用方式选择位<br />
0：EMIF 工作在地址/数据复用方式。<br />
1：EMIF 工作在非复用方式（分离的地址和数据引脚）。<br />
位 3-2：  EMD1-0 ：EMIF 工作模式选择位<br />
这两位控制外部存储器接口的工作模式。<br />
00：只用内部存储器：MOVX 只寻址片内 XRAM 。所有有效地址都指向片内存储器空间。<br />
01：不带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于4K 边界的地址时访问片外存储器。8 位片外MOVX 操作使用地址高端口锁存器的当前内容作为地址的高字节。注意：为了能访问片外存储器空间，EMI0CN 必须被设置成一个不属于片内地址空间的页地址。</p>
<p>10：带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于 4K  边界的地址时访问片外存储器。8 位片外 MOVX  操作使用 EMI0CN           的内容作为地址的高字节。<br />
11：只用外部存储器：MOVX 只寻址片外XRAM 。片内XRAM 对 CPU 为不可见。<br />
位 1-0：  EALE1-0 ：ALE 脉冲宽度选择位（只在EMD2 =0 时有效）<br />
00：ALE 高和ALE 低脉冲宽度  = 1 个 SYSCLK 周期。<br />
01：ALE 高和ALE 低脉冲宽度  = 2 个 SYSCLK 周期。<br />
10：ALE 高和ALE 低脉冲宽度  = 3 个 SYSCLK 周期。<br />
11：ALE 高和ALE 低脉冲宽度  = 4 个 SYSCLK 周期。</p>
<p style="text-align: center;"><strong> 复用方式配置</strong><a href="http://woodfeed.com/wp-content/uploads/2009/12/163emif.jpg" rel="lightbox[535]"><img class="size-medium wp-image-538  aligncenter" title="163emif" src="http://woodfeed.com/wp-content/uploads/2009/12/163emif-300x194.jpg" alt="163emif" width="300" height="194" /></a></p>
<p style="text-align: center;"><strong>带块选择的8 位 MOVX：EMI0CF[4:2] =   ‘010’，</strong><span style="background-color: #ffffff;"><strong>带块选择的复用方式8 位 MOVX 时序</strong></span></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8read.jpg" rel="lightbox[535]"><img class="size-medium wp-image-539  aligncenter" title="8read" src="http://woodfeed.com/wp-content/uploads/2009/12/8read-300x134.jpg" alt="8read" width="300" height="134" /></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8write.jpg" rel="lightbox[535]"><img class="size-medium wp-image-540  aligncenter" title="8write" src="http://woodfeed.com/wp-content/uploads/2009/12/8write-300x137.jpg" alt="8write" width="300" height="137" /></a></p>
<p>EMIF在P4-P7的程序配置：</p>
<p><code>XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0<br />
XBR1    = 0x00;<br />
XBR2    = 0x44;                     // Enable crossbar and weak pull-ups<br />
EMI0CF=0x2d;                                          //外部存储器接口配置<br />
EMI0TC  = 0xff;                                //外部存储器时序控制<br />
P74OUT  = 0xFF;</code></p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/incremental-pid-algorithm/" title="增量式PID算法">增量式PID算法</a><br /><small>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量...</small></li><li><a href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/" title="源码公开的TCP/IP协议栈uIP的应用">源码公开的TCP/IP协议栈uIP的应用</a><br /><small>摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...</small></li><li><a href="http://woodfeed.com/internet-and-intranet-information-services/" title="Internet与Intranet信息服务">Internet与Intranet信息服务</a><br /><small>主要内容：1、环球信息网的服务和管理 
　2、动态Web文件与CGI技术 
　3、活...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-3/" title="Linux常用命令详解(3)">Linux常用命令详解(3)</a><br /><small>四 磁盘管理
1 cd 2 df 3 du 4 ls 5 mkdir 6 pwd 7 r...</small></li><li><a href="http://woodfeed.com/tencent-micoblog-invite/" title="发放腾讯微博邀请码（每天更新）">发放腾讯微博邀请码（每天更新）</a><br /><small>发放腾讯微博邀请码（每天更新）...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>霍尔传感器</title>
		<link>http://woodfeed.com/hall-sensor/</link>
		<comments>http://woodfeed.com/hall-sensor/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 02:25:22 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[电子设计]]></category>
		<category><![CDATA[霍尔传感器]]></category>
		<category><![CDATA[霍尔元件]]></category>
		<category><![CDATA[霍尔效应]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=304</guid>
		<description><![CDATA[霍尔传感器是一种磁传感器。用它可以检测磁场及其变化，可在各种与磁场有关的场合中使用。霍尔传感器以霍尔效应为其工作基础，是由霍尔元件和它的附属电路组成的集成传感器。霍尔传感器在工业生产、交通运输和日常生活中有着非常广泛的应用。]]></description>
			<content:encoded><![CDATA[<p>*霍尔传感器简介</p>
<p>from：2008-04-24  人教网 江苏省洪泽中学 程如林</p>
<p><strong>摘要：</strong>本文简略介绍霍尔传感器的工作原理、分类及其简单应用。</p>
<p><strong>关键词：</strong>霍尔效应 霍尔元件 霍尔传感器 分类 特性 应用</p>
<p>霍尔传感器是一种磁传感器。用它可以检测磁场及其变化，可在各种与磁场有关的场合中使用。霍尔传感器以霍尔效应为其工作基础，是由霍尔元件和它的附属电路组成的集成传感器。霍尔传感器在工业生产、交通运输和日常生活中有着非常广泛的应用。</p>
<p><strong>一、霍尔效应霍尔元件 霍尔传感器</strong></p>
<p>（一）霍尔效应</p>
<p>如图1所示，在半导体薄片两端通以控制电流<em>I</em>，并在薄片的垂直方向施加磁感应强度为<em>B</em>的匀强磁场，则在垂直于电流和磁场的方向上，将产生电势差为<em>U</em><sub>H</sub>的霍尔电压，</p>
<p>它们之间的关系为<a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893849350.gif" rel="lightbox[304]"><img style="border-right: 0px;border-top: 0px;border-left: 0px;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893849350_thumb.gif" border="0" alt="W020080424342893849350" width="73" height="41" /></a> 。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893849111.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893849111_thumb.gif" border="0" alt="W020080424342893849111" width="156" height="199" /></a></p>
<p>式中<em>d </em>为薄片的厚度，<em>k</em>称为霍尔系数，它的大小与薄片的材料有关。</p>
<p>上述效应称为霍尔效应，它是德国物理学家霍尔于1879年研究载流导体在磁场中受力的性质时发现的。</p>
<p>（二）霍尔元件</p>
<p>根据霍尔效应，人们用半导体材料制成的元件叫霍尔元件。它具有对磁场敏感、结构简单、体积小、频率响应宽、输出电压变化大和使用寿命长等优点，因此，在测量、自动化、计算机和信息技术等领域得到广泛的应用。</p>
<p>（三）霍尔传感器</p>
<p>由于霍尔元件产生的电势差很小，故通常将霍尔元件与放大器电路、温度补偿电路及稳压电源电路等集成在一个芯片上，称之为霍尔传感器。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893848427.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342893848427_thumb.gif" border="0" alt="W020080424342893848427" width="202" height="163" /></a></p>
<p>霍尔传感器也称为霍尔集成电路，其外形较小，如图2所示，是其中一种型号的外形图。</p>
<p><strong>二、霍尔传感器的分类</strong></p>
<p>霍尔传感器分为线性型霍尔传感器和开关型霍尔传感器两种。</p>
<p>（一）线性型霍尔传感器由霍尔元件、线性放大器和射极跟随器组成，它输出模拟量。</p>
<p>（二）开关型霍尔传感器由稳压器、霍尔元件、差分放大器，斯密特触发器和输出级组成，它输出数字量。</p>
<p><strong>三、霍尔传感器的</strong><strong>特性</strong></p>
<p>（一）线性型霍尔传感器的特性</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894000218.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894000218_thumb.gif" border="0" alt="W020080424342894000218" width="181" height="158" /></a></p>
<p>输出电压与外加磁场强度呈线性关系，如图3所示，可见，在<em>B<sub>1</sub>～B</em><sub>2</sub>的磁感应强度范围内有较好的线性度，磁感应强度超出此范围时则呈现饱和状态。</p>
<p>（二）开关型霍尔传感器的特性</p>
<p>如图4所示，其中<em>B</em><sub>OP</sub>为工作点“开”的磁感应强度，<em>B</em><sub>RP</sub>为释放点“关”的磁感应强度。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894005870.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894005870_thumb.gif" border="0" alt="W020080424342894005870" width="208" height="178" /></a></p>
<p>当外加的磁感应强度超过动作点<em>B</em><sub>op</sub>时，传感器输出低电平，当磁感应强度降到动作点<em>B</em><sub>op</sub>以下时，传感器输出电平不变，一直要降到释放点<em>B</em><sub>RP</sub>时，传感器才由低电平跃变为高电平。<em>B</em><sub>op</sub>与<em>B</em><sub>RP</sub>之间的滞后使开关动作更为可靠。</p>
<p>另外还有一种“锁键型”（或称“锁存型”）开关型霍尔传感器，其特性如图5所示。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894006699.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894006699_thumb.gif" border="0" alt="W020080424342894006699" width="162" height="169" /></a></p>
<p>当磁感应强度超过动作点<em>B</em><sub>op</sub>时，传感器输出由高电平跃变为低电平，而在外磁场撤消后，其输出状态保持不变（即锁存状态），必须施加反向磁感应强度达到<em>B</em><sub>RP</sub>时，才能使电平产生变化。</p>
<p><strong>四、霍尔传感器的应用</strong></p>
<p>按被检测对象的性质可将它们的应用分为：直接应用和间接应用。前者是直接检测受检对象本身的磁场或磁特性，后者是检测受检对象上人为设置的磁场，这个磁场是被检测的信息的载体，通过它，将许多非电、非磁的物理量，例如速度、加速度、角度、角速度、转数、转速以及工作状态发生变化的时间等，转变成电学量来进行检测和控制。</p>
<p>（一）线性型霍尔传感器主要用于一些物理量的测量。例如：</p>
<p>1．电流传感器</p>
<p>由于通电螺线管内部存在磁场，其大小与导线中的电流成正比，故可以利用霍尔传感器测量出磁场，从而确定导线中电流的大小。利用这一原理可以设计制成霍尔电流传感器。其优点是不与被测电路发生电接触，不影响被测电路，不消耗被测电源的功率，特别适合于大电流传感。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894002161.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894002161_thumb.gif" border="0" alt="W020080424342894002161" width="157" height="131" /></a></p>
<p>霍尔电流传感器工作原理如图6所示，标准圆环铁芯有一个缺口，将霍尔传感器插入缺口中，圆环上绕有线圈，当电流通过线圈时产生磁场，则霍尔传感器有信号输出。</p>
<p>2．位移测量</p>
<p>如图7所示，两块永久磁铁同极性相对放置，将线性型霍尔传感器置于中间，其磁感应强度为零，这个点可作为位移的零点，当霍尔传感器在<em>Z</em>轴上作<em>△</em><em>Z</em>位移时，传感器有一个电压输出，电压大小与位移大小成正比。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894000823.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894000823_thumb.gif" border="0" alt="W020080424342894000823" width="180" height="133" /></a></p>
<p>如果把拉力、压力等参数变成位移，便可测出拉力及压力的大小，如图8所示，是按这一原理制成的力传感器。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894001103.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894001103_thumb.gif" border="0" alt="W020080424342894001103" width="166" height="131" /></a></p>
<p>（二）开关型霍尔传感器主要用于测转数、转速、风速、流速、接近开关、关门告知器、报警器、自动控制电路等。</p>
<p>1．测转速或转数</p>
<p>如图9所示，，在非磁性材料的圆盘边上粘一块磁钢，霍尔传感器放在靠近圆盘边缘处，圆盘旋转一周，霍尔传感器就输出一个脉冲，从而可测出转数（计数器），若接入频率计，便可测出转速。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894004411.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894004411_thumb.gif" border="0" alt="W020080424342894004411" width="196" height="163" /></a></p>
<p>如果把开关型霍尔传感器按预定位置有规律地布置在轨道上，当装在运动车辆上的永磁体经过它时，可以从测量电路上测得脉冲信号。根据脉冲信号的分布可以测出车辆的运动速度。</p>
<p>2．各种实用电路</p>
<p>开关型霍尔传感器尺寸小、工作电压范围宽，工作可靠，价格便宜，因此获得极为广泛的应用。下面列举两个实用电路加以说明：</p>
<p>电路1  防盗报警器</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894001537.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894001537_thumb.gif" border="0" alt="W020080424342894001537" width="353" height="157" /></a></p>
<p>如图10所示，将小磁铁固定在门的边缘上，将霍尔传感器固定在门框的边缘上，让两者靠近，即门处于关闭状态时，磁铁靠近霍尔传感器，输出端3为低电平，当门被非法撬开时，霍尔传感器输出端3为高电平，非门输出端<em>Y</em>为低电平，继电器<em>J</em>吸合，<em>J</em><sub>a</sub>闭合，蜂鸣器得电后发出报警声音。</p>
<p>电路2  公共汽车门状态显示器</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894169491.gif" rel="lightbox[304]"><img class="aligncenter" style="border-right: 0px;border-top: 0px;float: none;margin-left: auto;border-left: 0px;margin-right: auto;border-bottom: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/85e7ba6ca9cf_920F/W020080424342894169491_thumb.gif" border="0" alt="W020080424342894169491" width="279" height="181" /></a></p>
<p>使用霍尔传感器，只要再配置一块小永久磁铁就很容易做成车门是否关好的指示器，例如公共汽车的三个门必须关闭，司机才可开车。电路如图11所示，三片开关型霍尔传感器分别装在汽车的三个门框上，在车门适当位置各固定一块磁钢，当车门开着时，磁钢远离霍尔开关，输出端为高电平。若三个门中有一个未关好，则或非门输出为低电平，红灯亮，表示还有门未关好，若三个门都关好，则或非门输出为高电平，绿灯亮，表示车门关好，司机可放心开车。</p>
<p><strong>参考文献：</strong></p>
<p>[1]成辉．传感器的理论与设计基础及其应用．北京：国防工业出版社，1999</p>
<p>[2]霍尔传感器及应用电路．北京电子报1994合订本<em>P</em>．381</p>
<p>*  霍尔传感器的使用要点</p>
<p>霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种，这一现象是霍尔（A.H.Hall，1855—1938）于1879年在研究金属的导电机构时发现的。后来发现半导体、导电流体等也有这种效应，而半导体的霍尔效应比金属强得多，利用这现象制成的各种霍尔元件，广泛地应用于工业自动化技术、检测技术及信息处理等方面。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数，能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。<br />
流体中的霍尔效应是研究“磁流体发电”的理论基础。<br />
（1）电流传感器必须根据被测电流的额定有效值适当选用不同的规格的产品。被测电流长时间超额，会损坏末极功放管（指磁补偿式），一般情况下，2倍的过载电流持续时间不得超过1分钟。<br />
（2）电压传感器必须按产品说明在原边串入一个限流电阻R1，以使原边得到额定电流，在一般情况下，2倍的过压持续时间不得超过1分钟。<br />
（3）电流电压传感器的最佳精度是在原边额定值条件下得到的，所以当被测电流高于电流传感器的额定值时，应选用相应大的传感器；当被测电压高于电压传感器的额定值时，应重新调整限流电阻。当被测电流低于额定值1/2以下时，为了得到最佳精度，可以使用多绕圈数的办法。<br />
（4）绝缘耐压为3KV的传感器可以长期正常工作在1KV及以下交流系统和1.5KV及以下直流系统中，6KV的传感器可以长期正常工作在2KV及以下交流系统和2.5KV及以下直流系统中，注意不要超压使用。<br />
（5）在要求得到良好动态特性的装置上使用时，最好用单根铜铝母排并与孔径吻合，以大代小或多绕圈数，均会影响动态特性。<br />
（6）在大电流直流系统中使用时，因某种原因造成工作电源开路或故障，则铁心产生较大剩磁，是值得注意的。剩磁影响精度。退磁的方法是不加工作电源，在原边通一交流并逐渐减小其值。<br />
（7）传感器抗外磁场能力为：距离传感器5～10cm一个超过传感器原边电流值2倍的电流，所产生的磁场干扰可以抵抗。三相大电流布线时，相间距离应大于5～10cm。<br />
（8）为了使传感器工作在最佳测量状态，应使用图1－10介绍的简易典型稳压电源。<br />
（9）传感器的磁饱和点和电路饱和点，使其有很强的过载能力，但过载能力是有时间限制的，试验过载能力时，2倍以上的过载电流不得超过1分钟。<br />
（10）原边电流母线温度不得超过85℃，这是ABS工程塑料的特性决定的，用户有特殊要求，可选高温塑料做外壳。</p>
<p>from：网络</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/computer-blue-screen-code/" title="电脑蓝屏代码">电脑蓝屏代码</a><br /><small>00000001 不正确的函数。
2 0×00000002 系统找不到指定的档案。
...</small></li><li><a href="http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/" title="C8051f020外部数据存储器复用方式">C8051f020外部数据存储器复用方式</a><br /><small>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/a-new-domain-name-laeon-com/" title="注册了一个域名laeon.com">注册了一个域名laeon.com</a><br /><small>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字...</small></li><li><a href="http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/" title="C8051F020与80C51单片机的异同点">C8051F020与80C51单片机的异同点</a><br /><small>80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大...</small></li><li><a href="http://woodfeed.com/uip-uipopt-h-configuration-2/" title="uIP &#8211; uipopt.h配置">uIP &#8211; uipopt.h配置</a><br /><small>使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译...</small></li><li><a href="http://woodfeed.com/2007-national-electronic-design-competition-f/" title="2007全国电子设计大赛F题(电动车跷跷板)">2007全国电子设计大赛F题(电动车跷跷板)</a><br /><small>2007全国电子设计大赛F题 

电动车跷跷板（F题）

一、任务



设计并制作一个...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-out/" title="alexa排名出来了">alexa排名出来了</a><br /><small>alexa上有排名了。...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li><li><a href="http://woodfeed.com/network-architecture-and-protocol/" title="网络体系结构及协议">网络体系结构及协议</a><br /><small>    主要内容：1、网络体系结构及协议的定义 2、开放系统互连参考模型OSI 3、TC...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/hall-sensor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>光电编码器的特性及应用</title>
		<link>http://woodfeed.com/optical-encoder-features-and-applications/</link>
		<comments>http://woodfeed.com/optical-encoder-features-and-applications/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 00:28:19 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[电子设计]]></category>
		<category><![CDATA[光电编码器]]></category>
		<category><![CDATA[码盘测速]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=301</guid>
		<description><![CDATA[光电编码器，是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器， 光电编码器是由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴，电动机旋转时，光栅盘与电动机同速旋转，经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号，其原理示意图如图1所示；通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。此外，为判断旋转方向，码盘还可提供相位相差90º的两路脉冲信号。]]></description>
			<content:encoded><![CDATA[<p>1.光电编码器的工作原理<br />
光电编码器，是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器， 光电编码器是由光栅盘和光电检测装置组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴，电动机旋转时，光栅盘与电动机同速旋转，经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号，其原理示意图如图1所示；通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。此外，为判断旋转方向，码盘还可提供相位相差90º的两路脉冲信号。</p>
<p><a href="http://blog.gkong.com/uploadfile/2005729145553878.jpg" rel="lightbox[301]"></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292459681.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292459681_thumb.jpg" border="0" alt="200782292459681" width="380" height="135" /></a></p>
<p>根据检测原理，编码器可分为光学式、磁式、感应式和电容式。根据其刻度方法及信号输出形式，可分为增量式、绝对式以及混合式三种。<br />
1.1增量式编码器<br />
增量式编码器是直接利用光电转换原理输出三组方波脉冲A、B和Z相；A、B两组脉冲相位差90º，从而可方便地判断出旋转方向，而Z相为每转一个脉冲，用于基准点定位。它的优点是原理构造简单，机械平均寿命可在几万小时以上，抗干扰能力强，可靠性高，适合于长距离传输。其缺点是无法输出轴转动的绝对位置信息。<br />
1.2绝对式编码器<br />
绝对编码器是直接输出数字量的传感器，在它的圆形码盘上沿径向有若干同心码道，每条道上由透光和不透光的扇形区相间组成，相邻码道的扇区数目是双倍关系，码盘上的码道数就是它的二进制数码的位数，在码盘的一侧是光源，另一侧对应每一码道有一光敏元件；当码盘处于不同位置时，各光敏元件根据受光照与否转换出相应的电平信号，形成二进制数。这种编码器的特点是不要计数器，在转轴的任意位置都可 读出一个固定的与位置相对应的数字码。显然，码道越多，分辨率就越高，对于一个具有 N位二进制分辨率的编码器，其码盘必须有N条码道。目前国内已有16位的绝对编码器产品。<br />
绝对式编码器是利用自然二进制或循环二进制（葛莱码）方式进行光电转换的。绝对式编码器与增量式编码器不同之处在于圆盘上透光、不透光的线条图形，绝对编码器可有若干编码，根据读出码盘上的编码，检测绝对位置。编码的设计可采用二进制码、循环码、二进制补码等。它的特点是：<br />
1.2.1可以直接读出角度坐标的绝对值；<br />
1.2.2没有累积误差；<br />
1.2.3电源切除后位置信息不会丢失。但是分辨率是由二进制的位数来决定的，也就是说精度取决于位数，目前有10位、14位等多种。<br />
1.3混合式绝对值编码器<br />
混合式绝对值编码器，它输出两组信息：一组信息用于检测磁极位置，带有绝对信息功能；另一组则完全同增量式编码器的输出信息。<br />
光电编码器是一种角度（角速度）检测装置，它将输入给轴的角度量，利用光电转换原理 转换成相应的电脉冲或数字量，具有体积小，精度高，工作可靠,接口数字化等优点。它广泛应用于数控机床、回转台、伺服传动、机器人、雷达、军事目标测定等需要检测角度的装置和设备中。<br />
2. 光电编码器的应用电路<br />
2.1 EPC－755A光电编码器的应用<br />
EPC－755A光电编码器具备良好的使用性能，在角度测量、位移测量时抗干扰能力很强，并具有稳定可靠的输出脉冲信号，且该脉冲信号经计数后可得到被测量的数字信号。因此，我们在研制汽车驾驶模拟器时，对方向盘旋转角度的测量选用EPC－755A光电编码器作为传感器，其输出电路选用集电极开路型，输出分辨率选用360个脉冲/圈，考虑到汽车方向盘转动是双向的，既可顺时针旋转，也可逆时针旋转，需要对编码器的输出信号鉴相后才能计数。图2给出了光电编码器实际使用的鉴相与双向计数电路，鉴相电路用1个D触发器和2个与非门组成，计数电路用3片74LS193组成。</p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292443682.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292443682_thumb.jpg" border="0" alt="200782292443682" width="534" height="484" /></a></p>
<p><a href="http://blog.gkong.com/uploadfile/2005729145619208.jpg" rel="lightbox[301]"></a></p>
<p>当光电编码器顺时针旋转时，通道A输出波形超前通道B输出波形90°，D触发器输出Q(波形W1)为高电平，Q(波形W2)为低电平，上面与非门打开，计数脉冲通过(波形W3)，送至双向计数器74LS193的加脉冲输入端CU，进行加法计数；此时，下面与非门关闭，其输出为高电平(波形W4)。当光电编码器逆时针旋转时，通道A输出波形比通道B输出波形延迟90°，D触发器输出Q(波形W1)为低电平，Q(波形W2)为高电平，上面与非门关闭，其输出为高电平(波形W3)；此时，下面与非门打开，计数脉冲通过(波形W4)，送至双向计数器74LS193的减脉冲输入端CD，进行减法计数。<br />
汽车方向盘顺时针和逆时针旋转时，其最大旋转角度均为两圈半，选用分辨率为360个脉冲/圈的编码器，其最大输出脉冲数为900个；实际使用的计数电路用3片74LS193组成，在系统上电初始化时，先对其进行复位(CLR信号)，再将其初值设为800H，即2048(LD信号)；如此，当方向盘顺时针旋转时，计数电路的输出范围为2048～2948，当方向盘逆时针旋转时，计数电路的输出范围为2048～1148；计数电路的数据输出D0～D11送至数据处理电路。<br />
实际使用时，方向盘频繁地进行顺时针和逆时针转动，由于存在量化误差，工作较长一段时间后，方向盘回中时计数电路输出可能不是2048，而是有几个字的偏差；为解决这一问题，我们增加了一个方向盘回中检测电路，系统工作后，数据处理电路在模拟器处于非操作状态时，系统检测回中检测电路，若方向盘处于回中状态，而计数电路的数据输出不是2048，可对计数电路进行复位，并重新设置初值。<br />
2.2 光电编码器在重力测量仪中的应用<br />
采用旋转式光电编码器，把它的转轴与重力测量仪中补偿旋钮轴相连。重力测量仪中补偿旋钮的角位移量转化为某种电信号量；旋转式光电编码器分两种，绝对编码器和增量编码器。<br />
增量编码器是以脉冲形式输出的传感器，其码盘比绝对编码器码盘要简单得多且分辨率更高 。一般只需要三条码道，这里的码道实际上已不具有绝对编码器码道的意义，而是产生计数 脉冲。它的码盘的外道和中间道有数目相同均匀分布的透光和不透光的扇形区（光栅），但 是两道扇区相互错开半个区。当码盘转动时，它的输出信号是相位差为90°的A相和B相脉冲 信号以及只有一条透光狭缝的第三码道所产生的脉冲信号（它作为码盘的基准位置，给计数 系统提供一个初始的零位信号）。从A，B两个输出信号的相位关系（超前或滞后）可判断旋转的方向。由图3（a）可见，当码盘正转时，A道脉冲波形比B道超前π/2，而反转时 ，A道脉冲比B道滞后π/2。图3（b）是一实际电路，用A道整形波的下沿触发单稳态 产生的正脉冲与B道整形波相‘与’，当码盘正转时只有正向口脉冲输出，反之，只有逆向口脉冲输出。因此，增量编码器是根据输出脉冲源和脉冲计数来确定码盘 的转动方向和相对角位移量。通常，若编码器有N个（码道）输出信号，其相位差为π/ N，可计数脉冲为2N倍光栅数，现在N=2。图3电路的缺点是有时会产生误记脉冲造成误差， 这种情况出现在当某一道信号处于‘高’或‘低’电平状态，而另一道信号正处于‘高’和 ‘低’之间的往返变化状态，此时码盘虽然未产生位移，但是会产生单方向的输出脉冲。例如，码盘发生抖动或手动对准位置时（下面可以看到，在重力仪测量时就会有这种情况）。<br />
<a href="http://blog.gkong.com/uploadfile/2005729145648787.jpg" rel="lightbox[301]"></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292554866.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292554866_thumb.jpg" border="0" alt="200782292554866" width="554" height="534" /></a><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292614967.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292614967_thumb.jpg" border="0" alt="200782292614967" width="574" height="552" /></a></p>
<p>图4是一个既能防止误脉冲又能提高分辨率的四倍频细分电路。在这里，采用了有记忆功能 的D型触发器和时钟发生电路。由图4可见，每一道有两个D触发器串接，这样，在时钟脉 冲的间隔中，两个Q端（如对应B道的74LS175的第2、7引脚）保持前两个时钟期的输入 状态，若两者相同，则表示时钟间隔中无变化；否则，可以根据两者关系判断出它的变化方 向，从而产生‘正向’或‘反向’输出脉冲。当某道由于振动在‘高’、‘低’间往复变化 时，将交替产生‘正向’和‘反向’脉冲，这在对两个计数器取代数和时就可消除它们的影 响（下面仪器的读数也将涉及这点）。由此可见，时钟发生器的频率应大于振动频率的可能 最大值。由图4还可看出，在原一个脉冲信号的周期内，得到了四个计数脉冲。例如，原每 圈脉冲数为1000的编码器可产生4倍频的脉冲数是4000个，其分辨率为0.09°。实际上 ，目前这类传感器产品都将光敏元件输出信号的放大整形等电路与传感检测元件封装在一起 ，所以只要加上细分与计数电路就可以组成一个角位移测量系统(74159是4-16译码器)。<br />
3.应用中问题分析及改进措施<br />
3.1应用中问题分析<br />
光电检测装置的发射和接收装置都安装在生产现场，在使用中暴露出许多缺陷，其有内在因素也有外在因素，主要表现在以下几个方面：<br />
3.1.1发射装置或接受装置因机械震动等原因而引起的移位或偏移，导致接收装置不能可靠的接收到光信号，而不能产生电信号。例如；光电编码器应用在轧钢调速系统中，因光电编码器是直接用螺栓固定在电动机的外壳上，光电编码器的轴通过较硬的弹簧片和电动机转轴相连接，因电动机所带负载是冲击性负载，当轧机过钢时会引起电动机转轴和外壳的振动。经测定；过钢时光电编码器振动速度为2.6mm/s，这样的振动速度会损坏光电编码器的内部功能。造成误发脉冲，从而导致控制系统不稳定或误动作，导致事故发生。<br />
3.1.2因光电检测装置安装在生产现场，受生产现场环境因素影响导致光电检测装置不能可靠的工作。如安装部位温度高、湿度大，导致光电检测装置内部的电子元件特性改变或损坏。例如在连铸机送引锭跟踪系统，由于光电检测装置安装的位置靠近铸坯，环境温度高而导致光电检测装置误发出信号或损坏，而引发生产或人身事故。<br />
3.1.3生产现场的各种电磁干扰源，对光电检测装置产生的干扰，导致光电检测装置输出波形发生畸变失真，使系统误动或引发生产事故。例如；光电检测装置安装在生产设备本体，其信号经电缆传输至控制系统的距离一般在20—100米，传输电缆虽然一般都选用多芯屏蔽电缆，但由于电缆的导线电阻及线间电容的影响再加上和其它电缆同在一起敷设，极易受到各种电磁干扰的影响，因此引起波形失真，从而使反馈到调速系统的信号与实际值的偏差，而导致系统精度下降。<br />
3.2改进措施<br />
3.2.1改变光电编码器的安装方式。光电编码器不在安装在电动机外壳上，而是在电动机的基础上制作一固定支架来独立安装光电编码器，光电编码器轴与电动机轴中心必须处于同一水平高度，两轴采用软橡胶或尼龙软管相连接，以减轻电动机冲击负载对光电编码器的机械冲击。采用此方式后经测振仪检测，其振动速度降至1.2mm/s。<br />
3.2.2合理选择光电检测装置输出信号传输介质，采用双绞屏蔽电缆取代普通屏蔽电缆。双绞屏蔽电缆具有两个重要的技术特性，一是对电缆受到的电磁干扰具有较强的防护能力，因为空间电磁场在线上产生的干扰电流可以互相抵消。双绞屏蔽电缆的另一个技术特点是互绞后两线间距很小，两线对干扰线路的距离基本相等，两线对屏蔽网的分布电容也基本相同，这对抑制共模干扰效果更加明显。<br />
3.2.3利用PLC软件监控或干涉。在连铸生产的送引锭过程要求光电检测装置产生有时序性的电信号，同时，该信号与整个过程不同阶段相对应。如图5。<br />
<a href="http://blog.gkong.com/uploadfile/2005729145824680.jpg" rel="lightbox[301]"></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292632427.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292632427_thumb.jpg" border="0" alt="200782292632427" width="243" height="130" /></a></p>
<p>①送引锭过程启动前，光电信号1为“1”。<br />
②送引锭过程启动后，在A阶段，辊道启动，引锭杆上送。当引锭杆挡住光电装置发射出的红外光时，光电信号为“0”；当红外光透过引锭杆中部2个小圆孔时，光电装置发出信号2和3，均为“1”。<br />
③送引锭过程在B阶段，光电信号为“0”，辊道停下，引锭杆暂停上送，扇形10段压下，启动拉矫机和“同步1”，引锭杆继续上送。<br />
④送引锭过程在C阶段，引锭杆上送，并不再挡住红外光，光电信号4为“1”，启动“同步2”，停下“同步1”，引锭杆继续上送。至此光电装置工作过程结束。<br />
根据光检测电装置的工作过程，只要现场测定送引锭过程中各个光电信号发生的时间，结合送引锭过程与光电信号的关系，利用PLC应用程序中的相关数据，编制符合要求的PLC程序，将PLC程序输出信号输入至PLC的输入模块，替代原光电信号的输入信号。其程序框图如图6所示。</p>
<p><a href="http://blog.gkong.com/uploadfile/2005729145850395.jpg" rel="lightbox[301]"></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292648598.jpg" rel="lightbox[301]"><img class="aligncenter" style="border-top-width: 0px;border-left-width: 0px;float: none;border-bottom-width: 0px;margin-left: auto;margin-right: auto;border-right-width: 0px" src="http://woodfeed.com/wp-content/uploads/2009/08/c00a7d14e9ce_F57E/200782292648598_thumb.jpg" border="0" alt="200782292648598" width="129" height="284" /></a></p>
<p>4.结语<br />
光电检测装置本身是由电子元器件构成，它对安装环境有一定的技术要求，特别是在较恶劣环境下使用，要采取相应的保护措施，以使光电检测装置工作在其产品要求的技术条件下，才能发挥装置的技术性能。否则光电检测装置的使用寿命及其工作的可靠性都将受到不同程度的影响。结合光电检测装置在生产过程控制中的应用实践，在控制系统设计中；不宜采用光电检测装置的信号作为重要的控制信号，以避免光电装置突然损坏或工作不稳定（环境高温、湿度大、机械振动、外力碰创等）引起其它设备事故。在控制系统中应用PLC程序实适进行过程控制的监控或干涉，以克服了因系统中采用光电装置而存在的各种缺陷，是提高系统可靠性的有效途径。</p>
<p>来源：转载</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/wp-k2/" title="wp主题k2">wp主题k2</a><br /><small>k2是一款功能强大且外观易于定制的主题。...</small></li><li><a href="http://woodfeed.com/uip-uipopt-h-configuration-2/" title="uIP &#8211; uipopt.h配置">uIP &#8211; uipopt.h配置</a><br /><small>使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译...</small></li><li><a href="http://woodfeed.com/digital-compression-coding-techniques/" title="数字压缩编码技术">数字压缩编码技术</a><br /><small> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li><li><a href="http://woodfeed.com/obstacle-avoidance-module/" title="避障模块">避障模块</a><br /><small>采用红外避障传感器实现简单避障。...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/autotools-generated-makefile/" title="利用autotools生成Makefile">利用autotools生成Makefile</a><br /><small>对于一个较大的项目而言，完全手动建立Makefile是一件费力而又容易出错的工作。aut...</small></li><li><a href="http://woodfeed.com/interconnection-technology/" title="网络互连技术">网络互连技术</a><br /><small>主要内容：1、局域网互连 
　2、网络互连原理 
　3、无连接网络互连、各种路由选择...</small></li><li><a href="http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/" title="C8051f020产生16位PWM">C8051f020产生16位PWM</a><br /><small>脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节D...</small></li><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/optical-encoder-features-and-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浅谈机器人在线迷宫中的控制策略问题</title>
		<link>http://woodfeed.com/robot-control-of-linear-maze/</link>
		<comments>http://woodfeed.com/robot-control-of-linear-maze/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 10:06:31 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[传感器]]></category>
		<category><![CDATA[循迹]]></category>
		<category><![CDATA[线迷宫]]></category>

		<guid isPermaLink="false">http://woodfeed.com/%e6%b5%85%e8%b0%88%e6%9c%ba%e5%99%a8%e4%ba%ba%e5%9c%a8%e7%ba%bf%e8%bf%b7%e5%ae%ab%e4%b8%ad%e7%9a%84%e6%8e%a7%e5%88%b6%e7%ad%96%e7%95%a5%e9%97%ae%e9%a2%98.html</guid>
		<description><![CDATA[循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理的处理每种道路情况，以让机器人能以最快时间或最短路程从起点走到终点，是我们探讨的主要内容。]]></description>
			<content:encoded><![CDATA[<p>线迷宫如下图所示，存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理的处理每种道路情况，以让机器人能以最快时间或最短路程从起点走到终点，是我们探讨的主要内容。</p>
<p>文中内容结合了自己在机器人开发中的一些体验，并重点参考了国外Richard T-Vannoy教授有关机器人控制材料而完成这篇文章的。</p>
<p>好，下面就让我们进入机器人的迷宫世界吧。</p>
<p><strong>1、线迷宫简介</strong></p>
<p><strong>1.1 线迷宫的类型</strong></p>
<p>线迷宫从结构上看一般又可以分为赛道式和迷宫式，如下图所示：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/0J866.400.jpg" rel="lightbox[293]"><img style="border-right: 0px; border-top: 0px; display: block; float: none; margin: 0px auto; border-left: 0px; border-bottom: 0px" title="0J866.400" src="http://woodfeed.com/wp-content/uploads/2009/08/0J866.400_thumb.jpg" border="0" alt="0J866.400" width="404" height="272" /></a></p>
<p align="center">p1.0 赛道式线迷宫</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/0J878.300.jpg" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="0J878.300" src="http://woodfeed.com/wp-content/uploads/2009/08/0J878.300_thumb.jpg" border="0" alt="0J878.300" width="304" height="212" /></a></p>
<p align="center">p1.1 迷宫式线迷宫</p>
<p>赛道式由不同形状的曲线组合而成。这类迷宫的特点是，赛道连贯性强，岔道少（或没有岔道），方便机器人对赛道的判断。但赛道方向不规则的变化也为机器人寻迹增加了很多难度。</p>
<p>迷宫式则是由不同长度的直线组合而成。这类迷宫的特点是，赛道复杂、赛道岔道多、机器人运动路线不唯一。如何准确判断岔道类型，并作出合理判断，是走这类迷宫时机器人遇到的难题。</p>
<p>从颜色看，线迷宫一般又可分为白底黑线和黑底白线两种类型（但鉴于很多赛道采用电胶带粘贴而成，所以白底黑线的情况较为多见）。</p>
<p>但无论是哪种类型的线迷宫，都有一个共同特点就是：<strong>要有起点和终点</strong>。</p>
<p>机器人从起点开始，沿着赛道前进，在终点停止。整个过程中，最快的速度或最短的时间是每位机器人设计者追求的目标，也是迷宫机器人比赛的评判标准。</p>
<p><strong>1.2 线迷宫的技术难点</strong></p>
<p>对于赛道式的线迷宫，技术难点在于如何让机器人在高速运动的状态下，能事先判断赛道变化趋势，以更好的沿着赛道运动；尤其是在弯道上，不会出现偏离或冲出赛道的情况。这里面除了赛道探测传感器的选用外，控制方法也是不可或缺的因素。现在国内的“飞思卡尔智能车比赛”重点考核的就是这个技术难点。</p>
<p>对于迷宫式的线迷宫，机器人如何准确的判断赛道岔路类型，是技术难点。在这类线迷宫中，赛道岔道一般可以分为左转路口、右转路口、丁字路口、十字路口、前进或左转路口、前进或右转路口、死胡同、赛道终点等八种类型。还有些线迷宫带有封闭赛道，更增添了机器人判断的难度。如何让机器人具备自我学习能力，能够发现并记住不能通行的岔道，以期使机器人在第二次穿越时，可以用最短的距离走完线迷宫，是机器人设计的难点。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg_thumb.png" border="0" alt="showimg" width="404" height="310" /></a></p>
<p align="center">p1.2 线迷宫机机器人可能遇到的八种情形</p>
<p align="center">
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg1.png" rel="lightbox[293]"><img class="aligncenter" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="showimg(1)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg1_thumb.png" border="0" alt="showimg(1)" width="304" height="140" /></a></p>
<p align="center">p1.3 带有封闭赛道的线迷宫</p>
<p>我们这片文章就重点就这第二类迷宫式线迷宫做探讨。</p>
<p><strong>2、机器人控制策略</strong></p>
<p><strong>2.1 左手法则（</strong>Left Hand Rule）</p>
<ul>
<li>机器人执行左转的优先级高于直行或右转；</li>
<li>机器人执行直行的优先级高于右转；</li>
</ul>
<p>即机器人在线迷宫中，如果遇到“十字路口”（即有左转、直行和右转），机器人会左转；如果遇到“直行或右转路口”，机器人会直行；只有遇到“右转路口”，机器人才右转。一句话就是，执行左手法则的机器人永远是沿着左侧走。如果线迷宫不存在向p1.3图所示的封闭赛道，都可以顺利的从起点走到终点。</p>
<p><strong>2.2 右手法则（</strong>Right Hand Rule）</p>
<ul>
<li>机器人执行右转的优先级高于直行或左转；</li>
<li>机器人执行直行的优先级高于左转；</li>
</ul>
<p>即机器人在线迷宫中，遇到右转路口，一定右转。如果遇到“十字路口”（即有左转、直行和右转），机器人会右转；如果遇到“直行或左转路口”，机器人会直行；只有遇到“左转路口”，机器人才左转。一句话就是，执行右手法则的机器人永远是沿着右侧走。</p>
<p><strong>2.3 我们的选择</strong></p>
<p>很多初学者在机器人控制时，会为是选择“左手法则”还是选择“右手法则”而矛盾。</p>
<p>这没有任何关系！</p>
<p>无论是左手法则还是右手法则都可以让你的机器人顺利的从起点走到终点，完成迷宫穿越。选用哪种方法纯粹是个人爱好问题。</p>
<p><strong>3、寻线传感器</strong></p>
<p><strong>3.1 寻线传感器类型</strong></p>
<p>这个小节我们介绍一下寻线传感器。可以说机器人的最终走迷宫效果如何，很大程度和寻线传感器有关系。机器人只有通过寻线传感器准确的判断了当前所处赛道的位置，机器人控制机构才可以根据赛道状况做出准确的反应。</p>
<p>寻线传感器模块是多个传感器阵列。从组合方式上主要有两种类型：一字型和八字型（具体看下图所示）。八字形和一字型相比较，前部突出的传感器，让机器人具有了预判断功能。（如果赛道具有丁字路口、十字路口，八字型寻线传感器模块将会使机器人判断工作变得简单）</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/GSC5A1.jpg" rel="lightbox[293]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="GS-C5A1" src="http://woodfeed.com/wp-content/uploads/2009/08/GSC5A1_thumb.jpg" border="0" alt="GS-C5A1" width="304" height="187" /></a><br />
p3.1八字型寻线传感器</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg2.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="showimg(2)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg2_thumb.png" border="0" alt="showimg(2)" width="254" height="254" /></a></p>
<p align="center">p3.2 一字型寻线传感器</p>
<p>从数量上来说，有3个、4个、5个，乃至更多传感器组合。</p>
<p>一般说，3个的寻线传感器适合做赛道式线迷宫寻线（如图p1.0），不适合迷宫式寻线场合；</p>
<p>传感器数量多于3个时，则可以做迷宫式寻线。数量越多越便于机器人对线路做出预判（这也是为什么我们在看飞思卡尔智能车比赛时，很多小车前头都加了长长一排的寻线传感器，十多个之多的原因）。</p>
<p>从输出信号类型分类，又有模拟信号输出传感器模组和开关量输出传感器模组。这些由于对我们后续的介绍没有太大关系，就不多做分析（当然在我们实际控制上，开关量传感器模组相对简单一些。传感器信号直接送给单片机IO即可；如果是模拟量输出，则还要通过AD模数转换后才可以。但模拟量输出传感器也有其自身的好处，那就是可以准确判断场地灰度值，可以做防坠落功能）。</p>
<p>在我们接下来介绍的机器人走迷宫的内容中，为了介绍方便，我们选用“一字型5通道寻线传感器模组”作为讲解对象。</p>
<p><strong>3.2 寻线传感器工作原理</strong></p>
<p>寻线传感器一般是由光电对管组成，一个发射，一个接收。根据发射光（分可见光和红外光）对赛道介质的反射参数的差别，来判断传感器下面是赛道还是场地。</p>
<p>我们都在物理课本中学过，颜色越深的物体，吸收光线的能力就越强；颜色越浅的物体，发射光线的能力就越强。</p>
<p>当光电对管通过深颜色物体时，由于发射光被吸收很多，能反射出来的光线就小，能被接收管收到的光线就更少；反之，当光电滴灌通过浅颜色物体时，由于发射光被吸收较少，能反射出来的光线就多，能被接收管接收到的光线也随之增多。而光电接收管会随着接收光线的多少而发生电压或电流变化，我们根据这些电参数变化就可以知道传感器碰到的是深颜色物体还是浅颜色物体。赛道之所以要做成黑底白线，或白底黑线，就是为了让电参数变化差异增大，更便于我们判断。</p>
<p>为了方便介绍，在机器人走迷宫时，我们这里设定，遇到黑色，传感器输出“1”高电平；遇到白线，传感器输出“0”低电平。</p>
<p><strong>3.3 寻线传感器的使用</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg3.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(3)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg3_thumb.png" border="0" alt="showimg(3)" width="304" height="163" /></a></p>
<p align="center">p3.3 机器人在寻线时的传感器的显示</p>
<p>当机器人沿着线走时（在图中自下向上行驶），处于不同情形时，传感器会有不同的显示。这里列出了5种常见情形：</p>
<ul>
<li>10000=机器人严重向右偏离赛道（在控制上我们就要让机器人在前进的同时向左做大幅度转动）</li>
<li>01000=机器人轻微向右偏离赛道（在控制上我们就要让机器人在前进的同时向左做轻微转动）</li>
<li>00100=机器人正处在赛道上（在控制上我们就要让机器人继续直线前进）</li>
<li>00010=机器人轻微向左偏离赛道（在控制上我们就要让机器人在前进的同时向右做轻微转动）</li>
<li>00001=机器人严重向左偏离赛道（在控制上我们就要让机器人在前进的同时向右做大幅度转动）</li>
</ul>
<p>通过传感器对不同情形的反馈，就可以确保机器人准确的沿着赛道前进。</p>
<p><strong>4、机器人对岔路口的处理方法</strong></p>
<p><strong>4.1 机器人走迷宫过程分析</strong></p>
<p>机器人在走线迷宫时，常用的控制方法无非是以下几个步骤：</p>
<p>(1)、机器人沿着当前赛道前进（following the line）；前进同时检测前方是否有岔路口。</p>
<p>(2)、一旦检测到岔路口，机器人要判断岔路口的类型；</p>
<p>(3)、确定岔路口类型后，在一定的控制法则下完成转弯。</p>
<p>整个流程在机器人走迷宫时将会循环作用，直到机器人到达迷宫重点。简单用流程图示意一下就是下图：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg4.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(4)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg4_thumb.png" border="0" alt="showimg(4)" width="189" height="244" /></a></p>
<p align="center">p4.1 机器人走迷宫示意图</p>
<p>PS.当然上面的流程图中并没有涉及到后面我们所要讲到的“机器人自主学习功能”。这块功能将单拉出来讲解。</p>
<p><strong>4.2 机器人寻线方法（following the line）</strong></p>
<p>机器人寻线相对而言还是比较简单的，我们只需根据传感器数调整机器人左右转速就可以了。这里提供一个简单的控制代码范例：</p>
<p><em> Select Case Pattern                              //选择可能的模式；请参考3.3寻线传感器的使用；<br />
Case Pattern = %00100                   //这种模式表示机器人处于赛道正上方，则全速前进；<br />
leftMotor=fast; rightMotor=fast        //即左侧电机和右侧电机都快速前进；<br />
Case Pattern = %01000                  //这种模式表示机器人轻微向右偏离赛道；<br />
leftMotor=medium; rightMotor=fast  //针对这种状况，左侧电机中速转动，右侧电机快递转动，</em></p>
<p><em> //通过两侧轮子转速差减少机器人向右偏移；<br />
Case Pattern= %10000                   //这种模式表示机器人已经严重向右偏离赛道；<br />
leftMotor=slow; rightMotor=fast      //针对这种状况，左侧电机慢速转动，右侧电机快速转动，</em></p>
<p><em> //以快速纠正机器人。<br />
…and so on</em></p>
<p>以上范例代码中，慢速、中速和快速只是根据机器人偏离赛道程度大小而使用的描述词语。在实践中，机器人电机转动的速度需要你不断实验、尝试，才能使机器人有更好的寻线效果。（在控制上，这加入了反馈，属于闭环控制。建议去尝试着了解一下闭环控制理论中PID算法的介绍，这将对机器人的速度控制有很大帮助）</p>
<p><strong>4.3 赛道路口的识别和处理。</strong></p>
<p>有了4.2中介绍的内容，我们的机器人就可以沿着赛道走了，但这个时候它还不会判断岔路口，更不知道遇到岔路口应该如何操作。这一小节就重点介绍岔路口的识别和对应操作。</p>
<p>让我们再次去回顾一下1.2小节中“P1.2线迷宫机机器人可能遇到的八种情形”的图片，我们就对图中的八种状况做分析。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg31.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg[3]" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg3_thumb1.png" border="0" alt="showimg[3]" width="404" height="310" /></a></p>
<p>说到这里，我们要重点强调一个概念：岔路口。</p>
<p>至少到现在为止，岔路口的概念还不会对我们介绍的内容造成理解上的偏差。但后面小节要介绍“机器人的自主学习能力”，如果不对这一概念做澄清，会影响后续内容的开展：</p>
<p>岔道口：机器人可以有一个以上行进方向的路口。</p>
<p>按照上面的定义，下图中的两个路口就不能再成为岔路口了。虽然在这两个路口，机器人要执行转向的操作，但在方向选择，显然机器人不必要思考的，左转或右转时他们唯一的选择。同样不能作为岔路口的还有“死胡同”。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg5.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(5)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg5_thumb.png" border="0" alt="showimg(5)" width="195" height="115" /></a></p>
<p align="center">p4.2 不是岔路口的路口</p>
<p>弄明白了这个概念对下一小节的内容就容易理解了。下面就切入本小节的正题：路口的识别和处理。</p>
<p>4.3.1 死胡同的识别和处理</p>
<p>死胡同是8种路口中最简单的一个。当寻线传感器数值从“00100”变化为“00000”时，我们就可以认为机器人是遇到了死胡同。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg6.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(6)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg6_thumb.png" border="0" alt="showimg(6)" width="94" height="113" /></a></p>
<p align="center">p4.3 死胡同</p>
<p>当机器人遇到死胡同时，机器人的动作应该是掉头（make a U-turn）。示意程序代码为：</p>
<p><em>If Pattern = %00000  then  gosub  U-Turn   //当遇到死胡同，机器人直行掉头的子函数。</em></p>
<p>4.3.2 “右转路口”和“右转或直行路口”识别和处理</p>
<p>当机器人遇到这两种路口时，传感器输出模式都是“00111”。这个时候机器人如何做选择呢？</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg7.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(7)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg7_thumb.png" border="0" alt="showimg(7)" width="203" height="119" /></a></p>
<p align="center">p4.4 右转路口和右转或直行路口</p>
<p>解决方式是，我们编写一个子程序，假设名字是inch（），执行的操作是让机器人再前进一点（一英寸）。当传感器越过赛道后，如果寻线传感器显示数值为“00000”，那么这个路口就一定是“右转路口”；如果寻线传感器显示数值为“00100”，那么这个路口就一定是“右转或直行路口”。</p>
<p>那接下来机器人该如果动作呢？</p>
<p>如果机器人使用的是“左手法则”，在“右转路口”只能有一种选择——右转；在“右转或直行路口”，机器人就要执行“直行”的动作；</p>
<p>如果机器人使用的是“右手法则”，在“右转路口”显然要——右转；在“右转或直行路口”，机器人就要执行“右转”的动作；</p>
<p>4.3.3 “左转路口”和“左转或直行路口”识别和处理</p>
<p>当机器人遇到这两种路口时，传感器输出模式都是“11100”。这个时候机器人如何做选择呢？</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg8.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(8)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg8_thumb.png" border="0" alt="showimg(8)" width="203" height="119" /></a></p>
<p align="center">p4.5 左转路口和左转或直行路口</p>
<p>同样我们也是借助子函数inch（），让机器人再前进一点（一英寸）。当传感器越过赛道后，如果寻线传感器显示数值为“00000”，那么这个路口就一定是“左转路口”；如果寻线传感器显示数值为“00100”，那么这个路口就一定是“左转或直行路口”。</p>
<p>那接下来机器人该如果动作呢？</p>
<p>如果机器人使用的是“左手法则”，在“左转路口”显然要——左转；在“左转或直行路口”，机器人就要执行“左转”的动作；</p>
<p>如果机器人使用的是“右手法则”，在“左转路口”只能——左转；在“左转或直行路口”，机器人就要执行“直行”的动作；</p>
<p>4.3.4 “丁字路口”、“十字路口”和“终点路口”识别和处理</p>
<p>当机器人遇到这三种路口时，传感器输出模式都是“11111”。这个时候机器人如何做选择呢？</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg9.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(9)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg9_thumb.png" border="0" alt="showimg(9)" width="285" height="111" /></a></p>
<p align="center">p4.6 其他路口</p>
<p>我们还是利用inch（）函数，让机器人再前进一点距离，这将帮助我们分辨这三种路口：</p>
<p>如果寻线传感器数值是“00000”，那么这个路口就是丁字路口；</p>
<p>如果寻线传感器数值是“00100”，那么这个路口就是十字路口；</p>
<p>如果寻线传感器数值是“11111”，那么这个路口就是迷宫终点了。</p>
<p>针对不同路口的判断，我们这里提供一个程序范例：</p>
<p><em> Gosub inch()                                        //机器人再前进一点的子函数（距离越过赛道宽度就可以）<br />
ReadSensors()                                      //读取寻线传感器数值<br />
If Pattern = “00000” then<br />
?Found the T intersection                   //如果数值是“00000”，遇到丁字路口<br />
Elseif Pattern = “11111” then<br />
?Found the end of the maze –STOP!    //如果数值是“11111”，到达了迷宫重点；<br />
Else<br />
?At a four-way intersection                 //如果是其他情况，则是遇到了十字路口。<br />
Endif</em></p>
<p><strong> PS.在这篇文章中，我们使用的是一字型寻线传感器。如果我们使用八字型寻线传感器的话，由于传感器是分前后两排分布的，这样在判断岔路口方面就非常方便，无需借助inch()函数，就可以直接识别。八字型传感器的识别方法，留给读者自己解决。</strong></p>
<p>当我们准确的判断出每个路口的类型后，机器人就可以在一定的走迷宫法则指导下完成走迷宫任务。</p>
<p>但我们发现，在线迷宫中，有很多死胡同是不必要走的，有些弯路也是可以省略的，对于机器人，它们应该如何选择一条最短的距离呢？下一小节我们就重点介绍机器人的自学习能力。</p>
<p><strong>5、机器人自主学习算法</strong></p>
<p><strong>5.1 机器人自主学习功能介绍</strong></p>
<p>下面我们通过一个简易线迷宫来介绍机器人的自主学习功能。</p>
<p>在这个迷宫中，有十字路口、直行或右转路口、直行或左转路口、死胡同等，从图中可以看出，有些线路是无效线路，如死胡同，就是可以绕过的。但机器人并不知道那些路口时有效路口，哪些路口是无效的。</p>
<p>我们使用“左手法则”进行穿越线迷宫，图中的蓝色的线，就是其穿越路径。可以看出绕了很大的圈。机器人的自主学习功能就是机器人在经过第一次穿越后，能够发现并记住所经过的无效线路，从而在第二次穿越时，自动绕过那些无效路口，实现最短距离穿越线迷宫，如图中绿线所示路径。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg10.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(10)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg10_thumb.png" border="0" alt="showimg(10)" width="304" height="175" /></a><br />
p5.1 机器人穿越线迷宫路径</p>
<p><strong>5.3 机器人自主学习算法</strong></p>
<p>不要嫌作者啰嗦，这里我们再次强调一下上小节中介绍的“岔路口”的概念：机器人可以有一个以上行进方向的路口称之为岔路口。好了，有了这个概念，就容易了。当机器人穿越线迷宫时，每穿越一个“岔路口”，我们就让机器人在存储器中记录一个字符：如果是直行就保存一个“S”；如果是左转就保存一个“L”；如果是右转就保存一个“R”；如果是掉头，就保存一个“U”。只要是岔路口，就要记录一次。</p>
<p>PS.右转路口和左转路口不属于我们所说的岔路口概念，机器人经过时不要记录。有了这个共识，我们就开始下面的算法介绍！</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg11.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(11)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg11_thumb.png" border="0" alt="showimg(11)" width="299" height="158" /></a><br />
p5.2 第一个转弯</p>
<p>我们就借助上面的建议线迷宫，分步介绍机器人的自主学习过程的。机器人第一次穿越线迷宫时，我们采用“左手法则”来进行。沿途将有一些“岔路口”，我们需要记录。</p>
<p>机器人开始从起点出发了，然后就遇到了第一个“岔路口”——直行或右转路口。根据“左手法则”，机器人将直行。这时候，机器人将在存储器中记录一个直行的标示符<strong>“S”，</strong>如p5.2所示。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg12.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(12)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg12_thumb.png" border="0" alt="showimg(12)" width="299" height="158" /></a><br />
p5.3 第二个转弯</p>
<p>机器人继续前进，这时就遇到第二个“岔路口”——死胡同。这个时候机器人需要掉头回来。这时候，机器人将在存储器中记录一个掉头的标示符“U”，如图p5.3所示。这样存储器中的标示符就变成了<strong>“SU”</strong></p>
<p>PS.从图中可以看出机器人每记录一个死胡同类型的岔路口，就意味着机器人走了错误路线。在任何线迷宫中，最佳或最短路线都不包括死胡同线路。所以遇到死胡同类型的岔路口就是告诉我们在前一个路口的转向时不正确的，我们需要更正。</p>
<p>当机器人掉头回到第一个岔道口（也是机器人行进过程中的第三个岔路口），根据左手法则，机器人将会左转，如图p5.4所示。这时候，机器人将在存储器中记录一个左转的标示符“L”。这样存储器中的标示符就变成了“SUL”。从上面的介绍中可以知道死胡同类型的岔路口将不会在机器人穿越迷宫的路径中，所以机器人应该在第一个岔路口向右转“R”，才可以避免经过死胡同。</p>
<p>从以上分析我们就可以得出：SUL=R（即机器人直行、掉头、左转就相当于机器人直接右转）。这样在存储器中&#8221;SUL&#8221;就被标示符<strong>“R”</strong>取代。这就代表着当机器人再次穿越这个线迷宫时，遇到第一个岔路口直接右转。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg13.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(13)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg13_thumb.png" border="0" alt="showimg(13)" width="299" height="158" /></a><br />
p5.4 第三个转弯</p>
<p>机器人继续前进，就遇到了十字路口类型的岔路口，根据左手法则，机器人将会左转，如图p5.5所示。这时候，机器人将在存储器中记录一个左转的标示符&#8221;L&#8221;。这样存储器中的标示符就变成了<strong>“RL”。</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg14.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(14)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg14_thumb.png" border="0" alt="showimg(14)" width="299" height="158" /></a></p>
<p align="center">p5.5 第四个转弯</p>
<p>机器人继续前进将遇到“右转路口”，前面介绍过，这种只有一种方向选择的路口不属于我们定义的“岔路口”，所以这里机器人不记录转弯标示符“R”。接下来又是死胡同类型的岔路口，机器人仍旧做掉头动作。同时在存储器中记录一个掉头标示符“U”，这个时候存储器中的标示符就变成了<strong>“RLU”。</strong>如图p5.6所示。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg15.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(15)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg15_thumb.png" border="0" alt="showimg(15)" width="299" height="158" /></a></p>
<p align="center">p5.6 第四个转弯</p>
<p>机器人掉头回来，再次遇到“十字路口”，根据左手法则，机器人将做左转。同时，机器人将在存储器中记录一个左转标示符“L”。这样存储器中的标示符就变成了“<strong>RLUL”。</strong></p>
<p>从图p5.7可以看出，A和B之间又是一个死胡同，在机器人路径上时是要避免通过的，所以机器人在第一遇到十字路口时不应该左转，而是应该前进&#8221;S&#8221;，这样才可以避免死胡同。</p>
<p>从以上分析我们可以得出：LUL=S。这样在存储器中“LUL”就被标示符&#8221;S&#8217;所取代，这就代表机器人再次穿越这个线迷宫时，遇到第一个十字路口将直行。这个时候机器人存储器中的标示符将变为<strong>“RS”</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg16.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(16)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg16_thumb.png" border="0" alt="showimg(16)" width="299" height="158" /></a></p>
<p align="center">p5.7 第五个转弯</p>
<p>机器人左转后又遇到一个死胡同，同样的在存储器中将记录一个标示符“U”，这样存储器中的标示符就变为<strong>“RSU”，</strong>如图p5.8所示。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg17.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(17)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg17_thumb.png" border="0" alt="showimg(17)" width="299" height="158" /></a></p>
<p align="center">p5.8 第六个转弯</p>
<p>机器人掉头后，根据左手法则，再次遇到十字路口，将左转。同样机器人在存储器中记录一个标示符“L”。这样存储器中的标示符就变为“RSUL”。 根据前面介绍的，SUL=R。这样存储器中的RSUL标示符就被<strong>RR</strong>所替代。如图p5.9</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg18.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(18)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg18_thumb.png" border="0" alt="showimg(18)" width="299" height="158" /></a></p>
<p align="center">p5.9 第七个转弯</p>
<p>机器人经过十字路口后，又将遇到“左转路口”，同样这不属于岔路口，机器人不在存储器中做左转记录。机器人继续前进，就遇到“左转或直行路口”。根据左手法则，机器人将左转。同时在存储器中记录一个标示符“L”。到现在，机器人已经走到了线迷宫的终点。</p>
<p>我们回顾一下机器人存储器中的标示符：<strong>RRL</strong>。如图p5.10所示。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg19.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(19)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg19_thumb.png" border="0" alt="showimg(19)" width="299" height="158" /></a></p>
<p align="center">p5.10 第八个转弯</p>
<p>当机器人再次穿越这个线迷宫时，机器人就不再遵循左手法则，而且按照存储器中的标示符的提示来完成转弯，如图p5.11所示。这路径是整个迷宫中最短的路径。那些死胡同则可以得到避免。我们就可以得到本小节视频中机器人的自主学习功能了。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/showimg20.png" rel="lightbox[293]"><img style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="showimg(20)" src="http://woodfeed.com/wp-content/uploads/2009/08/showimg20_thumb.png" border="0" alt="showimg(20)" width="299" height="158" /></a></p>
<p align="center">p5.11 机器人第二次穿越迷宫的路径</p>
<p>在穿越这个简易线迷宫的过程中，我们可以得到两个公式：</p>
<ul>
<li>LUL=S（左转+掉头+左转=直行）</li>
<li>SUL=R（直行+掉头+左转=右转）</li>
</ul>
<p><em>文章来源于</em><a style="color: #0365bf; text-decoration: none; line-height: 18px;" href="http://www.61mcu.com/bbs" target="_blank"><em>科技伊甸园论坛</em></a></p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/tracking-detection-circuit/" title="循迹检测电路">循迹检测电路</a><br /><small>用TCRT5000型光电对管。TCRT5000是一种一体化反射型光电探测器，其发射器是一...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/robot-control-of-linear-maze/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C8051f020产生16位PWM</title>
		<link>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/</link>
		<comments>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 10:35:39 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[c8051]]></category>
		<category><![CDATA[pca]]></category>
		<category><![CDATA[pwm]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=285</guid>
		<description><![CDATA[脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。]]></description>
			<content:encoded><![CDATA[<p>脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。<br />
用于闭环控制应用的PWM信号的频率并不重要，只要波形足够快就可以了，象控制系统的阶跃响应时间就应远远小于PWM信号的周期。信号所携带的的信息用波形的占空度来编码，占空度是波形为高电平的时间与PWM信号的周期之比。对于一个PWM实现来说，其输入是一个数值，通常为整数，该数值与所要求的输出波形的占空度成正比。<br />
在一个基于8051的设计中，有很多方法用于产生PWM波形:软件循环,查询或中断驱动的定时器等.本应用笔记中的例子使用可编程计数器阵列PCA.相对于任何查询机制基于软件或定时器而言,使用PCA产生PWM可以大大降低所需要的CPU带宽,并可以消除在中断驱动的基于定时器的设计中因中断延迟不一致而产生的时序抖动。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块如图2所示计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN每个捕捉/比较模块有一个用于选择模块工作方式边沿触发捕捉软件定时器高速输出或PWM的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器。<br />
PCA0CPHn:PCA0CPLn由于所有的捕捉/比较模块共享一个时间基准因此它们同步工作例如在电机控制应用中可以提供锁相激励波形另外由于每个模块有其自己的控制和捕捉/比较寄存器因此每一个模块工作上又独立于其它模块只要任何一个模块的服务程序都不影响共享的时间基准停止或重新设置计数器/定时器改变计数器/定时器的时钟源本应用笔记中的例子将PCA配置为独立工作每个模块的服务程序只影响该模块的配置寄存器和捕捉/比较寄存器PCA方式寄存器设置一次后不再改变让计数器/定时器寄存器PCA0H: PCA0L自由运行。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块。计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L、一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN。每个捕捉/比较模块有一个用于选择模块工作方式（边沿触发、捕捉软件、定时器高速输出或PWM）的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器PCA0CPHn:PCA0CPLn。<br />
由于所有的捕捉/比较模块共享一个时间基准，因此它们同步工作，例如在电机控制应用中可以提供锁相激励波形。另外，由于每个模块有其自己的控制和捕捉/比较寄存器，因此每一个模块工作上又独立于其它模块，只要任何一个模块的服务程序都不影响共享的时间基准（停止或重新设置计数器/定时器、改变计数器/定时器的时钟源）。<br />
PCA的时基信号可以是下述四个时钟源之一SYSCLK/12、SYSCLK/4、定时器0溢出、或出现在一个外部引脚ECI上的下降沿。<br />
用PCA产生16位PWM  为了产生一个具有16位精度的PWM波形，我们将PCA模块配置为高速输出方式。在该方式下，每当主定时器/计数器的寄存器PCA0H:PCA0L与模块的捕捉/比较寄存器PCA0CPHn:PCA0CPLn相匹配时CEXn引脚发生电平转换并可以选择产生中断。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> SysClkInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//配置系统时钟</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 OSCXCN <span style="color: #339933;">=</span> <span style="color: #208080;">0x67</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">255</span><span style="color: #339933;">;</span> n<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>OSCXCN <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x80</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 OSCICN <span style="color: #339933;">=</span> <span style="color: #208080;">0x0C</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> SystemInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//系统配置</span>
<span style="color: #009900;">&#123;</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xDE</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// 关闭 WDT</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xAD</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PortInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//端口配置</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//交叉开关配置</span>
 XBR0 <span style="color: #339933;">=</span> <span style="color: #208080;">0x10</span><span style="color: #339933;">;</span>
 XBR1 <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 XBR2 <span style="color: #339933;">=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;">// P0 口分配状况</span>
 <span style="color: #666666; font-style: italic;">// P0.0 = CEX0</span>
 <span style="color: #666666; font-style: italic;">// P0.1 = CEX0</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_Init<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 EIE1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x08</span><span style="color: #339933;">;</span>
 PCA0MD <span style="color: #339933;">=</span> <span style="color: #208080;">0X01</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//系统时钟的12分频</span>
 PCA0L <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0H <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM1 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 PCA0CPM1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 <span style="color: #666666; font-style: italic;">//PWM频率计算：系统时钟/12/计数=22118400/12/65536=28.125</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL0<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span>  PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL1<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span><span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_ISR<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> interrupt <span style="color: #0000dd;">9</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF0 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CF<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CF <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li><li><a href="http://woodfeed.com/wp-k2/" title="wp主题k2">wp主题k2</a><br /><small>k2是一款功能强大且外观易于定制的主题。...</small></li><li><a href="http://woodfeed.com/digital-compression-coding-techniques/" title="数字压缩编码技术">数字压缩编码技术</a><br /><small> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字...</small></li><li><a href="http://woodfeed.com/incremental-pid-algorithm/" title="增量式PID算法">增量式PID算法</a><br /><small>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量...</small></li><li><a href="http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/" title="视频采集设备的标准采集分辨率">视频采集设备的标准采集分辨率</a><br /><small>QCIF全称Quarter common intermediate format。QCI...</small></li><li><a href="http://woodfeed.com/simple-smar-electric-ehicles/" title="简单智能电动车">简单智能电动车</a><br /><small>本简易智能电动车跷跷板分为电动车智能行驶和跷跷板两个主要部分，都以单片机为控制核心，根据...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li><li><a href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/" title="源码公开的TCP/IP协议栈uIP的应用">源码公开的TCP/IP协议栈uIP的应用</a><br /><small>摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-out/" title="alexa排名出来了">alexa排名出来了</a><br /><small>alexa上有排名了。...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>位置式PID控制算法</title>
		<link>http://woodfeed.com/location-type-pid-control-algorithm/</link>
		<comments>http://woodfeed.com/location-type-pid-control-algorithm/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 03:31:43 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[PID]]></category>

		<guid isPermaLink="false">http://woodfeed.com/%e4%bd%8d%e7%bd%ae%e5%bc%8fpid%e6%8e%a7%e5%88%b6%e7%ae%97%e6%b3%95.html</guid>
		<description><![CDATA[输出值与阀门开度一一对应，所以称为位置式PID控制算法。]]></description>
			<content:encoded><![CDATA[<p>当采样时间很短时，可用一阶差分代替一阶微分，用累加代替积分。连续时间的离散化，即 t=KT (K=0,1,2,…,n)</p>
<p>1.离散的PID表达式积分用累加求和近似得</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image0024.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image002[4]" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image0024_thumb1.gif" border="0" alt="clip_image002[4]" width="189" height="45" /></a> （1）</p>
<p>微分用一阶差分近似得</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image004.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image004" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image004_thumb.gif" border="0" alt="clip_image004" width="147" height="41" /></a> （2）</p>
<p>T ——为采样周期；k——为采样序号，k＝0，1，2，…；e（k）——系统在第次采样时刻的偏差值；e（k-1）——为系统在第k-1次采样时刻的偏差值。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image006.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image006" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image006_thumb.gif" border="0" alt="clip_image006" width="296" height="45" /></a> （3）</p>
<p>将式（1）和式（2）代入式（3），则可得到离散的PID表达式</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image008.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image008" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image008_thumb.gif" border="0" alt="clip_image008" width="12" height="23" /></a><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image010.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image010" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image010_thumb.gif" border="0" alt="clip_image010" width="343" height="47" /></a> （4）</p>
<p>2.物理模型</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/pid_wzs.png" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="pid_wzs" src="http://woodfeed.com/wp-content/uploads/2009/08/pid_wzs_thumb.png" border="0" alt="pid_wzs" width="458" height="125" /></a></p>
<p>式（4）表示的控制算法提供了执行机构的位置u（k）（如阀门开度），即输出值与阀门开度一一对应，所以称为位置式PID控制算法。</p>
<p>3.离散化的PID位置式控制算法的编程表达式对于式（4），令</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image012.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image012" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image012_thumb.gif" border="0" alt="clip_image012" width="153" height="45" /></a></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image014.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image014" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image014_thumb.gif" border="0" alt="clip_image014" width="23" height="23" /></a>称为积分系数,<a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image016.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image016" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image016_thumb.gif" border="0" alt="clip_image016" width="25" height="23" /></a>称为微分系数</p>
<p>则离散化的PID位置式控制算法的编程表达式为</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image018.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image018" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image018_thumb.gif" border="0" alt="clip_image018" width="332" height="45" /></a></p>
<p>由式可以看出，每次输出与过去的状态有关，要想计算u（k），不仅涉及到e（k-1）和e（k-2），且须将历次相加。</p>
<p>上式计算复杂，浪费内存。考虑到第次采样时有</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image020.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image020" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image020_thumb.gif" border="0" alt="clip_image020" width="407" height="47" /></a></p>
<p>两式相减，得</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image022.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image022" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image022_thumb.gif" border="0" alt="clip_image022" width="500" height="45" /></a></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image024.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image024" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image024_thumb.gif" border="0" alt="clip_image024" width="485" height="69" /></a></p>
<p>其中<a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image026.gif" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="clip_image026" src="http://woodfeed.com/wp-content/uploads/2009/08/clip_image026_thumb.gif" border="0" alt="clip_image026" width="325" height="45" /></a></p>
<p>上式是PID的递推形式，是编程时常用的形式之一。</p>
<p>4.软件算法流程图流程图如图所示。其中系数α0、α1、α2可以预先算出。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/pid_wzsp.png" rel="lightbox[258]"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" title="pid_wzsp" src="http://woodfeed.com/wp-content/uploads/2009/08/pid_wzsp_thumb.png" border="0" alt="pid_wzsp" width="460" height="354" /></a></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/clip_image002.gif" rel="lightbox[258]"> </a></p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/incremental-pid-algorithm/" title="增量式PID算法">增量式PID算法</a><br /><small>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/location-type-pid-control-algorithm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>增量式PID算法</title>
		<link>http://woodfeed.com/incremental-pid-algorithm/</link>
		<comments>http://woodfeed.com/incremental-pid-algorithm/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 09:19:27 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[PID]]></category>

		<guid isPermaLink="false">http://woodfeed.com/%e5%a2%9e%e9%87%8f%e5%bc%8fpid%e7%ae%97%e6%b3%95.html</guid>
		<description><![CDATA[所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量，而不是位置量的绝对数值时，可以使用增量式PID控制算法进行控制。
位置式算法每次输出与整个过去状态有关，计算式中要用到过去偏差的累加值，容易产生较大的积累误差。而增量式只需计算增量，当存在计算误差或精度不足时，对控制量计算的影响较小。]]></description>
			<content:encoded><![CDATA[<p>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量，而不是位置量的绝对数值时，可以使用增量式PID控制算法进行控制。<br />
增量式PID控制算法可以通过（式1）推导出。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/shi1.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; margin-left: 0px; border-left: 0px; margin-right: 0px; border-bottom: 0px" title="shi1" src="http://woodfeed.com/wp-content/uploads/2009/08/shi1_thumb.jpg" border="0" alt="shi1" width="412" height="81" /></a> 式1</p>
<p>由（式1）可以得到控制器的第k－1个采样时刻的输出值为：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/shi2.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="shi2" src="http://woodfeed.com/wp-content/uploads/2009/08/shi2_thumb.jpg" border="0" alt="shi2" width="448" height="83" /></a> 式2</p>
<p>将（式1）与（式2）相减并整理，就可以得到增量式PID控制算法公式为：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/shi3.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="shi3" src="http://woodfeed.com/wp-content/uploads/2009/08/shi3_thumb.jpg" border="0" alt="shi3" width="599" height="169" /></a> 式3</p>
<p>其中：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/shi31.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="shi3-1" src="http://woodfeed.com/wp-content/uploads/2009/08/shi31_thumb.jpg" border="0" alt="shi3-1" width="230" height="174" /></a></p>
<p>由（式3）可以看出，如果计算机控制系统采用恒定的采样周期T，一旦确定A、B、C，只要使用前后三次测量的偏差值，就可以由（式3）求出控制量。<br />
增量式PID控制算法与位置式PID算法（式1）相比，计算量小的多，因此在实际中得到广泛的应用。<br />
而位置式PID控制算法也可以通过增量式控制算法推出递推计算公式：</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/shi4.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="shi4" src="http://woodfeed.com/wp-content/uploads/2009/08/shi4_thumb.jpg" border="0" alt="shi4" width="147" height="35" /></a> 式４</p>
<p>上式就是目前在计算机控制中广泛应用的数字递推PID控制算法。</p>
<p><strong>物理模型:</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/tu1.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="tu1" src="http://woodfeed.com/wp-content/uploads/2009/08/tu1_thumb.jpg" border="0" alt="tu1" width="712" height="132" /></a></p>
<p><strong>软件算法流程图流程图</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/tu2.jpg" rel="lightbox[215]"><img style="border-right: 0px; border-top: 0px; display: inline; margin-left: 0px; border-left: 0px; margin-right: 0px; border-bottom: 0px" title="tu2" src="http://woodfeed.com/wp-content/uploads/2009/08/tu2_thumb.jpg" border="0" alt="tu2" width="274" height="434" /></a><strong> </strong></p>
<p>在实际编程时α0、α1、α2可预先算出，存入预先固定的单元，设初值e（k-1）、e（k-2）为0。</p>
<p><strong>增量式PID算法的优点</strong>（1）位置式算法每次输出与整个过去状态有关，计算式中要用到过去偏差的累加值，容易产生较大的积累误差。而增量式只需计算增量，当存在计算误差或精度不足时，对控制量计算的影响较小。</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/incremental-pid-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>循迹检测电路</title>
		<link>http://woodfeed.com/tracking-detection-circuit/</link>
		<comments>http://woodfeed.com/tracking-detection-circuit/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 08:49:17 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[单片机开发]]></category>
		<category><![CDATA[电子设计]]></category>
		<category><![CDATA[光电探测]]></category>
		<category><![CDATA[循迹]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=187</guid>
		<description><![CDATA[用TCRT5000型光电对管。TCRT5000是一种一体化反射型光电探测器，其发射器是一个砷化镓红外发光二极管，而接收器是一个高灵敏度，硅平面光电三极管。]]></description>
			<content:encoded><![CDATA[<p>用TCRT5000型光电对管。TCRT5000是一种一体化反射型光电探测器，其发射器是一个砷化镓红外发光二极管，而接收器是一个高灵敏度，硅平面光电三极管。</p>
<p>TCRT5000采用DIP4封装，其具有如下特点：</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160; 塑料透镜可以提高灵敏度。</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160; 内置可见光过滤器能减小离散光的影响。</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160; 体积小，结构紧凑。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/image017.png" rel="lightbox[187]"><img title="image017" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="175" alt="image017" src="http://woodfeed.com/wp-content/uploads/2009/08/image017_thumb.png" width="246" border="0" /></a> <a href="http://woodfeed.com/wp-content/uploads/2009/08/image013.png" rel="lightbox[187]"><img title="image013" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="212" alt="image013" src="http://woodfeed.com/wp-content/uploads/2009/08/image013_thumb.png" width="244" border="0" /></a> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 图7 TCRT 5000简图</p>
<p>当发光二极管发出的光反射回来时，三极管导通输出低电平。此光电对管调理电路简单，工作性能稳定。</p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/08/image019.png" rel="lightbox[187]"><img title="image019" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="337" alt="image019" src="http://woodfeed.com/wp-content/uploads/2009/08/image019_thumb.png" width="564" border="0" /></a> </p>
<p align="center">图8 循迹检测单元电路[注1]</p>
<p>三个检测单元X1,X2,X3分别位于黑线的中间、左侧、右侧，根据它们的输出信号判断小车的转向和直行。当检测白线时，输出低电平，黑线时，高电平。</p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td width="114">
<p align="center">X1（中）</p>
</td>
<td width="114">
<p align="center">X2（左）</p>
</td>
<td width="114">
<p align="center">X3（右）</p>
</td>
<td width="114">
<p align="center">车体位置</p>
</td>
<td width="114">
<p align="center">下一步车体运动</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">中间</p>
</td>
<td width="114">
<p align="center">直行</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
<td width="114" rowspan="2">
<p align="center">偏左</p>
</td>
<td width="114" rowspan="2">
<p align="center">转右</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
<td width="114" rowspan="2">
<p align="center">偏右</p>
</td>
<td width="114" rowspan="2">
<p align="center">转左</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">0</p>
</td>
</tr>
<tr>
<td width="114">
<p align="center">0</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center">1</p>
</td>
<td width="114">
<p align="center"></p>
</td>
<td width="114">
<p align="center"></p>
</td>
</tr>
<tr>
<td valign="top" width="114">
<p align="center">0</p>
</td>
<td valign="top" width="114">
<p align="center">0</p>
</td>
<td valign="top" width="114">
<p align="center">0</p>
</td>
<td valign="top" width="114">
<p align="center"></p>
</td>
<td valign="top" width="114">
<p align="center"></p>
</td>
</tr>
<tr>
<td valign="top" width="114">
<p align="center">1</p>
</td>
<td valign="top" width="114">
<p align="center">1</p>
</td>
<td valign="top" width="114">
<p align="center">1</p>
</td>
<td valign="top" width="114">
<p align="center"></p>
</td>
<td valign="top" width="114">
<p align="center"></p>
</td>
</tr>
</tbody>
</table>
<hr size="1" />[注1]R3=10~30K</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/robot-control-of-linear-maze/" title="浅谈机器人在线迷宫中的控制策略问题">浅谈机器人在线迷宫中的控制策略问题</a><br /><small>循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/tracking-detection-circuit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C8051F02X外部存储器接口和I/O端口配置</title>
		<link>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/</link>
		<comments>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 03:51:01 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>

		<guid isPermaLink="false">http://woodfeed.com/c8051f02x%e5%a4%96%e9%83%a8%e5%ad%98%e5%82%a8%e5%99%a8%e6%8e%a5%e5%8f%a3%e5%92%8cio%e7%ab%af%e5%8f%a3%e9%85%8d%e7%bd%ae.html</guid>
		<description><![CDATA[介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配置方法和有关注意的问题；在此基础上列举两个关于EMIF、I/O的配置应用。]]></description>
			<content:encoded><![CDATA[<p><strong> </strong></p>
<p>作者:魏永红 张勉 赵捷 来源:单片机与嵌入式系统应</p>
<p><strong>摘要：</strong>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配置方法和有关注意的问题；在此基础上列举两个关于EMIF、I/O的配置应用。</p>
<p><strong>关键词：</strong>C8051F02X EMIF I/O 交叉开关</p>
<p>美国Cygnal公司C8051F02X系列单片机是集成在一起芯片上的混合信号系统级单片机。该单片机具有32/64位数字I/O端口（引脚）、25MIPS高速流水线式8051微控制器内核、64KB在系统可编程Flash存储器、 64KB地址的外部存储器接口、4352（4096+256）B片内RAM、各自独立的SPI、SMBUS/I2C和两个UART串行接口等特点。其最突出的优点就是，通过设置交叉开关寄存器控制片内数字资源映射到外部I/O引脚，这就允许用户根据自己的特定应用，选择通用I/O端口和所需要数字资源。当然，在设置数字交叉开关寄存器时，应该首先考虑EMIF的配置问题。其配置不同，将导致单片机通过不同的端口（低或高）访问片外存储器和存储器映像的 I/O部件，以及数字交叉开关是否分配外部设备给P0.7(WR)、P0.6（RD）、P0.5（ALE）引脚。（如图EMIF设置为多路器模式。）</p>
<p><strong>1 EMIF和I/O配置方法</strong></p>
<p>1.1 外部存储器接口（EMIF）配置</p>
<p>C8051F02X系列MCU有4KB的RAM可以只映射在片内，也可以映射在64KB外部数据存储器地址空间，还可以同时映射到片内和片外（4KB地址以内在片内存储器空间访问，4KB以上经过EMIF访问）三种方式。对于后两种存储器工作模式，需通过外部存储器接口使用MOVX和DPTR或MOVX和R0（R1）指令访问外部数据存储器和存储器映像的I/O设备。但是对于高8位地址，必须由外部存储器接口寄存器（EMI0CN）提供；而EMIF可将外部数据存储器接口映射到低端口（P0～P3）（F020/2/3系列）或高端口（P4～P7）（F020/2系列），以及配置为复用模式或非复用模式等。配置外部存储器接口的步骤下：</p>
<p>*设置EMIF为低端口或高端口；</p>
<p>*设置EMIF为复用模式或非复用模式；</p>
<p>*选择存储器模式（片内方式、无块选择分片方式、带块选择分片方式、片外方式）；</p>
<p>*设置片外存储器或片外设备时基；</p>
<p>*选择相关I/O端口（寄存器PnMOUT、P74OUT）的输出模式。</p>
<p>外部存储器接口（EMI）映射为低端口（P0～P3）即PRTSEL位（EMIOCH.5）置为0，如PRTSEL位置为1，EMI映射为高端口（P4～P7）（适用于P020/2系列）。此时如果EMIFLE位（XBR2.5）被设置为逻辑1，那么，数字交叉开关将不分配外部设备给P0.7（WR）、P0.6（RD）、P0.5（ALE）引脚（如果EMI设置为多中模式）；如果EMIFLE位设为0，那么P0.7、P0.6、P0.5引脚的功能将由交叉开关寄存器或端口锁存器来决定。外部存储器接口只有执行片外 MOVX指令期间使用相关的端口引脚，一旦MOVX指令执行完毕，端口锁存器或交叉开关寄存器又重新恢复对端口引脚的控制。</p>
<p>1.2 I/O端口配置</p>
<p>数字交叉开关译码器按照被使用设备的优先权顺序将端口P0～P7的引脚分配给外部数字外设。端口引脚的分配是从P0.0开始，没有被使用的引脚可作为一般通用的I/O引脚，通过读写相应的端口数据寄存器访问。在数字交叉开关寄存器XBR0、 XBR1、XBR2中将相应的内部数字资源使能位置1，数字资源就映射到I/O端口引脚。例如：将UART0EN位（XBR0.2）置为1，那么，TX0 和RX0引脚被分别映射到P0.0和P0.1。因为UART0具有最高的优先权，故在它的使能位置1时，TX0和RX0引脚总是被映射到P0.0和 P0.1。如果一个数字外设的使能位没有置1，它的端口的I/O引脚上是不能被访问的。数字交叉开关寄存器被正确配置以后，通过置XBARE （XBR2.4）位1来使能交叉开关。在交叉开关使能后。P0～P3（F020/1/2/3系列）或P0～P7（F020/2系列）输出驱动自动被禁止，从而避免了交叉开关寄存器和其它寄存器写入时在端口引脚上产生的冲突。注意：对于由交叉开关分配的输入引脚（如T0、INT0、RX0等），其输出驱动自动被禁止，因此，端口数据寄存器和PnMDOUT寄存器的值对这些引脚的状态没有影响。</p>
<p>在给单片机内部数字资源分配了相应的I/O引脚后，还应设置其输出方式：推挽和漏极开路。 PnMDOUT寄存器各位决定P0～P7端口引脚的输出方式，某一位置1，则该位为推挽输出方式；置0，为漏极开路输出方式。PnMDOUT寄存器控制端口引脚的输出方式，而与交叉开关是否把端口引脚分配给数字外设无关。注意：对于由交叉开关分配的输入引脚（如：SDA、SCL、RX0、RX1等）自动配置为漏极开路方式，而与相应的端口配置寄存器的设置无关。但对于一般的I/O引脚配置为输入时，与这一引脚相关的PnMDOUT设置为漏极开路，同时端口配置寄存器位必须清0。</p>
<p>尽管在C8051F021/3中P4、P5、P6和P7没有对应的引脚，但端口数据寄存器仍然存在，并可为软件所用。由于数字输入通路保持活动状态，所以建议不要将这些引脚处于“悬空”状态，避免因输入浮空为无效逻辑电平而导致不必要的功率消耗。下面的三种方法可以防止这种情况的发生：</p>
<p>①通过将WEAKPUD（XBR2.7）设置为逻辑0来使能弱上拉部件；</p>
<p>②通过写P74OUT=0xFF，将P4、P5、P6和P7的输出方式配置为推挽方式；</p>
<p>③通过向端口数据寄存器写0，将P4、P5、P6和P7的输出状态强制为逻辑0，即P4=0&#215;00、P5=0&#215;00、P6=0&#215;00、P7=0&#215;00。</p>
<p><strong>2 EMIF和I/O端口配置应用</strong></p>
<p>下面应用基于C8051F021/3单片机，也适应于C8051F020/2单片机。</p>
<p>*假设有一应用需要配置UART0、SMBus、UART1、INT0和INT1（8位），存储器的工作模式为片内方式；另外，P1端口作为4×4键盘的接口，P2、P3口作为通用的I/O端口。该应用的EMIF和I/O端口配置如下：</p>
<p>①设EMI的配置寄存器FMI0CF=0&#215;00，因为本应用无扩展存储器和存储器映像的I/O设备，即存储器工作模式为片内方式；同时，将EMIFLE（XBR2.5）设置为0，这样P0.7、P0.5的引脚将由交叉开关寄存器或端口锁存器来决定，不被交叉开关跳过。</p>
<p>②按UART0EN=1、UART1EN=1、SMB0EN=1、INT0E=1、INT1E=1和EMIFLE=0，设置XBR0、XBR1、XBR2为XBR0=0&#215;05、XBR1=0&#215;14、XBR2=0&#215;04。</p>
<p>③配置P1端口为数字输入模式，即P1MDIN=0xFF；P1端口低四位为键盘输出，高四位为输入，即P1MDOUT=0x0FH（P1.0～P1.3为推挽方式，P1.4～P1.7为漏极开路方式），P1|=0xF0。</p>
<p>④使能交叉开关，即XBARE=1、XBR2=0&#215;44。</p>
<p>因为EMIFLE=0，交叉开关译码器将不跳过P0.7、P0.6、P0.5引脚，所以按优先极交叉开关译码表进行分配。UART0具有最高优先极，故P0.0分配给TX0，P0.1分配给RX0；SMBus的SDA、SCL分别分配在 P0.2、P0.3引脚；UART1的TX1、RX1分别分配在P0.4、P0.5引脚；INT0分配在P0.6引脚；INT1分配在P0.7引脚。</p>
<p>⑤设置UART0的TX0引脚（TX0、P0.0）、UART1的TX1引脚（TX1，P0.4）为推挽输出方式，即P0MDOUT=0&#215;11。RX0、SDA、SCL、RX1、INT0和INT1是由交叉开关分配输入的，因此与其端口配置寄存器的值无关。</p>
<p>⑥P2、P3作为一般I/O端口初始化为输入状态，即P2MDOUT=0&#215;00、P2=0xFF和P3MDOUT=0&#215;00、P3=0xFF。</p>
<p>引脚功能如表1所列。<br />
<strong>表1</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/07/tab1.jpg" rel="lightbox[138]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="tab1" src="http://woodfeed.com/wp-content/uploads/2009/07/tab1_thumb.jpg" border="0" alt="tab1" width="568" height="53" /></a></p>
<p>*设现有一应用需要UART0、SMBus、UART1、INT0和INT1共8位。另外，存储器工作方式为带块选择的分片方式，EMIF为复用模式、低端口，并配置P1.2、P1.3、P1.4为模拟输入模式，通过这三个引脚利用ADC1 来测量输入电压。具体配置步骤如下：</p>
<p>①配置EMI为复用模式和工作在低端口，即PRTSEL=0，EMD2=0；存储器模式为带块选择的分片方式，即EMD1～0=10；ALE时基设为2个SYSCLK周期，即EALE1～0=01。</p>
<p>②按UART0EN=1、UART1EN=1、SYB0EN=1、INT0E=1、INT1E和EMIFLE=1，设置XBR0、XBR1、XBR2为XBR0=0&#215;05、XBR1=0&#215;14、XBR2=0&#215;42。</p>
<p>③配置P1端口的P1.2、P1.3、P1.4为模拟输入模式，这些引脚对应的位在P1MDIN寄存器中置为0，即P1MDIN=0xE3。</p>
<p>④使能交叉开关，即XBARE=1、XBR2=0&#215;46。</p>
<p>UART0具有最高优先权，故P0.0分配给TX0，P0.1分配给RX0；依次按照优先极分配表，SMBus的SDA、SCL分配在P0.2、P0.3引脚；UART1的TX1、RX1分配在P0.4、P1.0引脚。因为EMI工作在低端口且为复用模式，交叉开关译码器将不分配内部数字资源给P0.7(WR)、P0.6(RD)、P0.5(ALE)，所以，RX1按次序分配在P1.0引脚， INT0分配在P1.1引脚。由于P1.2、P1.3、P1.4被配置为模拟输入，交叉开关跳过这些引脚，故INT1分配在P1.5引脚。在执行片外 MOVX指令时，EMI将驱动P2和P3端口。</p>
<p>⑤配置UART0的TX0引脚（TX0，P0.0）、UART1的TX1引脚（TX1，P0.4）、P0.7(WR)、P03.6(RD)、P0.5(ALE)为推挽输出方式，即P0MDOUT=0xF1。</p>
<p>⑥配置EMIF的端口（P2、P3）输出为推挽方式，即P2MDOUT=0xFF和P3MDOUT=0xFF。</p>
<p>⑦通过设置P1MDOUT=0&#215;00(输出为开漏极)和P1=0xFF(P1为高阻状态)来禁止P1.2、P1.3、P1.4三个模拟输入引脚的输出驱动器。</p>
<p>引脚功能如表2所列。<br />
<strong>表2</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/07/tab2.jpg" rel="lightbox[138]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="tab2" src="http://woodfeed.com/wp-content/uploads/2009/07/tab2_thumb.jpg" border="0" alt="tab2" width="564" height="83" /></a></p>
<p><strong>3 总结</strong></p>
<p>C8051F02X具有低功耗（3V工作电压）、大容量存储器、高速度、高集成度等特点，广泛应用于工业控制、测量系统、报警系统。该单片机具有双串行口，更适合于定位和报警系统的前端，从而提高移动终端集成度和降低功耗。</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/" title="C8051F020与80C51单片机的异同点">C8051F020与80C51单片机的异同点</a><br /><small>80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大...</small></li><li><a href="http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/" title="基于C8051F020单片机的Web远程控制的温度采集系统">基于C8051F020单片机的Web远程控制的温度采集系统</a><br /><small>      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
