<?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://www.stars625.com/category/embedded/feed" rel="self" type="application/rss+xml" />
	<link>http://www.stars625.com</link>
	<description>记录生活点滴，分享学习体会，专注微嵌开发。</description>
	<lastBuildDate>Sat, 03 Dec 2011 13:05:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>解决嵌入式系统中实时时钟RTC无法工作问题</title>
		<link>http://www.stars625.com/embedrtc.html</link>
		<comments>http://www.stars625.com/embedrtc.html#comments</comments>
		<pubDate>Fri, 17 Jul 2009 09:40:29 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[rtc]]></category>
		<category><![CDATA[sysfs]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=146</guid>
		<description><![CDATA[最近在做NTPD网络时间同步的时候，发现开发板自身的硬件时钟不起作用，每次重启后系统时间都回到1970年；并且使用hwclock命令既不能查看硬件时钟，也不能把系统时间同步到硬件时钟里去，在多次试验后发现是由于驱动和设备文件的原因导致的。]]></description>
			<content:encoded><![CDATA[<p>在嵌入式Linux下完成了NTPD的移植后，发现硬件时钟无法使用，具体现象为：每次重启后系统时间回到1970年；使用hwclock命令无法操作硬件时钟，提示无法识别的时间格式；“cat /proc/drivers/rtc”显示乱码。按照由易到难、由软到硬的解题思路，先从软件上下手。</p>
<p>因为开发板中目前使用的是Busybox自带的一个hwclock工具，可能精简过了，重新下载源码包编译了一个完整的hwclock，传到开发板运行，现象照旧，只是提示信息变了变。查看“/dev”目录下的确有rtc这个设备，用“ls -l”查看其设备号也都正常。</p>
<p>查看rtc的手册，没耐心看下去直接跳到最后，看到在“/usr/src/linux/Documentation”目录下有个“rtc.txt”文件（目录可能略有不同），里面有一段RTC的测试程序，拷出来编译后放到开发板上进行测试，还是有问题，再把测试程序中的其它部分都去除，只保留读写时间的测试项目，运行后发现读到的还是1970年的时间，不可写入。从测试代码中可以看到，在操作RTC的时候跟操作普通文件一样，首先打开设备文件“/dev/rtc”，再通过“ioctl”命令传入不同的参数（RTC_RD_TIME、RTC_UIE_ON、RTC_ALM_SET）进行操作。</p>
<p>至此，经过多次软件方面的测试，可以确定不是程序问题，那么就有可能是设备驱动或硬件问题。</p>
<p>由于重新编译过内核，不太确定编译选项，遂把开发板原始内核文件写进去，现象依旧。没办法看看开发板的硬件配置吧，看了开发板的手册，发现RTC不是使用MCU自带的时钟，而是使用了一个外扩的串行时钟芯片DS1339，它与MCU通过IIC总线进行通讯，到开发板上果然找到了该芯片，非常小，并且旁边还有一个时钟晶振，第一反应会不会是内核中没有把该驱动编进去呢。</p>
<p>打开内核配置选项，在RTC目录下找到了使用DS1339的配置选项，编进内核重新启动，在Log中出现了“rtc-ds1307 0-0068: rtc core: registered ds1339 as rtc0”，非常兴奋，总算有起色了，但是通往成功的道路往往并不是一帆风顺的。</p>
<p>重复了开头软件测试的过程，一如继往地无效，只有在“cat /proc/drivers/rtc”的时候有点反应，可以正常显示时间了，而且来到了新世纪2000年了，重启了几次，发现此处的时间是可以正常往前走的，感觉这边的时间显示的应该就是硬件时钟里的时间了，可为什么通过hwclock还是无法访问呢。</p>
<p>跑到“/dev”目录下找不到“rtc0”设备文件，明显与Log中关于“registered ds1339 as rtc0”冲突，手工建一个设备“rtc0”吧，主次设备号又不知道，乱建了几个都无效，而且还搞重启了。</p>
<p>后来才发现“/dev/rtc”对应内核中的GenRTC－－General RTC通用的RTC，就是为了应付某些命令产生的一个假的设备文件，并不能产生实际作用，读出来的时间也永远是1970年；可是我们的“rtc0”去哪了呢，跟踪了源码无解，不过有个意外发现：在注册RTC时会同时在三个地方创建文件，一个是“/proc/drivers/rtc”就是前面一直用的，用来反映设备状态的文件，该文件目前正常；一个是“/dev/rtc0”目前没有；最后一个是“/sys/class/rtc/rtc0”也没找到，“/sys”下整个就是空的。当然这三处与内核选项中也是有对应关系的，如果你在内核中没打开这三个相关选项，对应的文件也是不会创建的。</p>
<p>关于“/dev”与“/sys”是有一些历史原因的，前者是Linux 2.4内核使用的设备管理方式，由于固有的缺点到了Linux 2.6就不再使用了，改用“sysfs”虚拟文件系统来进行管理设备，但为什么我们的“/sys”目录下是空的呢，查看了“/etc/fstab”、“/etc/rc.d/init.d/filesystem”，原来在后者的初始化过程中只挂载了“/proc”，遂依照挂载了“sysfs”文件系统：“mount -n -t sysfs sysfs /sys”，此时在“/sys”目录已经能看到丰富的设备文件信息了，赶紧把这句话也加到启动脚本中吧。</p>
<p>“cat /sys/class/rtc/rtc0/dev”显示“254：0”这应该就是传说中的主、次设备号了吧，系统没有自动帮我们创建“/dev/rtc0”那自己手工建一个吧“mknod /dev/rtc0 c 254 0”，这回使用测试程序能读出时间了，用hwclock还是无效，完全正常，因为hwclock默认操作的是“/dev/rtc”，我们可以通过给hwclock命令增加参数指定设备文件，也可以把原来的“/dev/rtc”删除，建一个指向“/dev/rtc0”的链接“ln -s /dev/rtc0 /dev/rtc”。世界总于回复了平静，一切都按秩序正常的工作了，成就感又一次占领了至高点。</p>
<p>前面提到通过“/dev”管理设备有着固有的缺点，其中之一就是不能智能的创建设备文件，也可能出现设备文件与设备不对应的情况，在嵌入式开发中由于缺少其它服务脚本更有可能产生。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/embedrtc.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之滤波算法</title>
		<link>http://www.stars625.com/firefighterdata.html</link>
		<comments>http://www.stars625.com/firefighterdata.html#comments</comments>
		<pubDate>Thu, 11 Jun 2009 12:50:46 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>
		<category><![CDATA[滤波]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=136</guid>
		<description><![CDATA[传感器在系统中作为输入装置，输入的是模拟量，经过A/D转换器将模拟信号转换成数字信号后，才能被系统所使用。因此，数模转换后数值的准确性直接影响到系统的判断。本文就介绍了实际应用中使用的滤波算法。]]></description>
			<content:encoded><![CDATA[<p>在系统中总会存中部分电路噪声或电磁辐射干扰A/D信号，影响数字信号的准确性和平滑性。一般情况下先在硬件上尽可能地进行优化，降低噪声辐射干扰，当硬件上无法进一步改善信号干扰时，这时候就需要采用软件滤波的方法来减少干扰。</p>
<p>滤波算法有很多种，如：限幅滤波、中位值滤波、一阶滤波、消抖滤波等，但各种滤波算法各有特点，使用场合也各不相同。在本系统中使用了中位值、平均、递推复合滤波算法，简称中位值平均递推滤波。</p>
<p>中位值滤波算法是通过连续采样N次，把N次采样值排序，取中间值为本次有效值。该滤波算法能有效克服因偶然因素引起的波动干扰；对变化缓慢的被测参数有良好的滤波效果，但是对快速变化的参数不宜。使用在本系统中，可以消除因电压波动引起的偶然脉冲干扰。</p>
<p>算术平均滤波算法是连续取N个采样值进行算术平均运算，当N值较大时，信号平滑度较高，但灵敏度较低；N值较小时，信号平滑度较低，但灵敏度较高，该算法可以很好的滤除随机干扰。在本系统中，考虑到系统的执行速度较快，并且保证信号的灵敏度，这里N取4，可以很好的滤除随机干扰。</p>
<p>递推平均滤波算法又称滑动平均滤波法，它是将N个采样值放入一个队列，有新的采样值到来时，将最早的一个值去除，再将新值加入队列，求队列平均值。这种算法对周期性干扰有良好的抑制作用，平滑度高，但具有灵敏度低，数据滞后等特点。</p>
<p>在本系统中使用了以上三个算法的复合算法，结合了三种算法各自的优点，并且能够保证系统的灵敏度。</p>
<p>下面将滤波算法列出，以便更好地进行分析：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">uint16</span> ADC_mget<span style="color: #009900;">&#40;</span><span style="color: #993333;">uint8</span> channel<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>	<span style="color: #993333;">uint16</span> adc_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">static</span> <span style="color: #993333;">uint16</span> pre_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">uint16</span> temp<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">uint32</span> sum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">uint8</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>	adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> ADC_get<span style="color: #009900;">&#40;</span>channel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//连取十个值</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>j<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">9</span><span style="color: #339933;">;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//冒泡排序</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">9</span><span style="color: #339933;">-</span>j<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span>adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				temp <span style="color: #339933;">=</span> adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				adc_temp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>temp<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>	
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>	
	sum <span style="color: #339933;">+=</span> adc_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//累加</span>
	sum <span style="color: #339933;">+=</span> adc_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	sum <span style="color: #339933;">+=</span> adc_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	sum <span style="color: #339933;">+=</span> adc_temp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	
	sum <span style="color: #339933;">&gt;&gt;=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//求均值</span>
	pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//递推入列</span>
	pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">uint16</span><span style="color: #009900;">&#41;</span>sum<span style="color: #339933;">;</span>	
	sum <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	
	sum <span style="color: #339933;">+=</span> pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//累加</span>
	sum <span style="color: #339933;">+=</span> pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	sum <span style="color: #339933;">+=</span> pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	sum <span style="color: #339933;">+=</span> pre_temp<span style="color: #009900;">&#91;</span>channel<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	
	sum <span style="color: #339933;">&gt;&gt;=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//求均值</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">uint16</span><span style="color: #009900;">&#41;</span>sum<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>从以上程序中可以看到，在中位值滤波中连取十个值，取中间四个有效，将这四个值累加求均值后加入到递推滤波算法的队列中，再累加求平均值后才作为最终有效值返回。在程序中，累加值个数都取四，是为了求均值时可以使用移位的方法来快速求平均值。</p>
<p>在嵌入式系统中，资源和效率始终是程序员不断追求的，求平均值时使用除法运算需要三到四个指令周期，如果使用移位操作同样可以达到除法的效果，但只要用一个指令周期，节省了CPU时间。同样地，递推入列的时候采用的是四个赋值语句，相比循环语句经编译器编译后，四个赋值语句执行效率更高。软件滤波的效果请参考图7-1。</p>
<div id="attachment_163" class="wp-caption aligncenter" style="width: 566px"><a href="http://www.stars625.com/firefighterdata.html/firefighterdata-2" rel="attachment wp-att-163"><img src="http://www.stars625.com/wp-content/uploads/firefighterdata.jpg" alt="灭火机器人软件滤波算法示意图" title="灭火机器人软件滤波算法示意图" width="556" height="317" class="size-full wp-image-163" /></a><p class="wp-caption-text">灭火机器人软件滤波算法示意图</p></div>
<p>由上图可以看出初始采样值波动比较大，峰峰值达到42，对实际距离的判断可能会有5cm左右的误差，经过软件滤波后峰峰值仅为1，大大提高了转换值的准确性，增强了系统的稳定性。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefighterdata.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之运动控制</title>
		<link>http://www.stars625.com/firefighterpid.html</link>
		<comments>http://www.stars625.com/firefighterpid.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 12:25:21 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[pid]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=134</guid>
		<description><![CDATA[在运动控制中，常用的算法有：程序和顺序控制、比例积分微分控制、直接数字控制、最优控制、模糊控制，其中比例积分微分控制（简称 PID控制）现在应用最广，技术最成熟。本文就将应用在灭火机器人上的PID算法做下介绍。]]></description>
			<content:encoded><![CDATA[<p>PID算法其控制结构简单，参数容易调整，不必求出被控对象的数学模型便可以调节，因此在本系统中采用PID算法进行控制。</p>
<p>由于博客上不方便贴出公式，具体的PID算法请大家参考网络资料。</p>
<p>在本系统中，为了使速度始终能够最快，在控制电机沿墙走时是通过降低一侧电机的速度来纠正运动方向，所以只要求出一个增量信号即可。因此只要得到增量型PID的位置控制算法。</p>
<p>在PID控制系统中KP、KI、KD三个系数是经验值，即不同的系统，不同的环境这三个值都是需要人工调整的，无法由计算得出。</p>
<p>为了进一步验证PID算法，找出P、I、D三个系数的最佳值，通过实验来进行统计分析。使用机器人沿墙走程序，程序中设定值为600，起始位置为500，在机器人运行中每隔2ms通过串口发送PSD数据到PC机进行统计分析，统计曲线如图6-1、图6-2、图6-3、图6-4。</p>
<div id="attachment_166" class="wp-caption aligncenter" style="width: 522px"><a href="http://www.stars625.com/firefighterpid.html/firefighterpid_pid1" rel="attachment wp-att-166"><img src="http://www.stars625.com/wp-content/uploads/firefighterpid_pid1.jpg" alt="灭火机器人PID控制演示1" title="灭火机器人PID控制演示1" width="512" height="294" class="size-full wp-image-166" /></a><p class="wp-caption-text">灭火机器人PID控制演示1</p></div>
<div id="attachment_167" class="wp-caption aligncenter" style="width: 522px"><a href="http://www.stars625.com/firefighterpid.html/firefighterpid_pid2" rel="attachment wp-att-167"><img src="http://www.stars625.com/wp-content/uploads/firefighterpid_pid2.jpg" alt="灭火机器人PID控制演示2" title="灭火机器人PID控制演示2" width="512" height="294" class="size-full wp-image-167" /></a><p class="wp-caption-text">灭火机器人PID控制演示2</p></div>
<div id="attachment_168" class="wp-caption aligncenter" style="width: 522px"><a href="http://www.stars625.com/firefighterpid.html/firefighterpid_pid3" rel="attachment wp-att-168"><img src="http://www.stars625.com/wp-content/uploads/firefighterpid_pid3.jpg" alt="灭火机器人PID控制演示3" title="灭火机器人PID控制演示3" width="512" height="294" class="size-full wp-image-168" /></a><p class="wp-caption-text">灭火机器人PID控制演示3</p></div>
<div id="attachment_170" class="wp-caption aligncenter" style="width: 522px"><a href="http://www.stars625.com/firefighterpid.html/firefighterpid_pid4" rel="attachment wp-att-170"><img src="http://www.stars625.com/wp-content/uploads/firefighterpid_pid4.jpg" alt="灭火机器人PID控制演示4" title="灭火机器人PID控制演示4" width="512" height="294" class="size-full wp-image-170" /></a><p class="wp-caption-text">灭火机器人PID控制演示4</p></div>
<p>对比图6-1和图6-2可以发现，微分系数的改变对系统的影响不是很大，可以说是几乎没有，分析其原因是由于微分控制对具有较大惯性或滞后的被控对象效果比较明显，如温控系统等，在本系统由于直流电机的惯性或滞后性都比较小，速度改变迅速，因此微分控制对系统的影响并不是很大。</p>
<p>对比图6-2和图6-3可以发现，积分系数的改变对系统的影响还是比较大的，具体表现在积分系数变小使系统纠正周期变长，也就是说回复变慢了。积分项的引入是为了消除稳态误差，即消除系统中周期性的波动，使系统能快速地回复到设定值。</p>
<p>对比图6-3和图6-4可以发现，当积分、微分系数都为零时，系统回复曲线很好，但是这样的参数设定机器人无法顺利拐弯，究其原因是PID算法一般用在改变相对比较平滑的系统中，在这里机器人拐弯时采样值会有突变，因此系统中必须存在一定的振荡才能使机器人顺利的拐过弯。</p>
<p>另外，本系统中使用的是简化的PID算法，采样周期不准确，这也导致了系统输出与预期效果有一定的出入。</p>
<p>综上所述，在设定三个系数时要从小到大按顺序查，先进行比例系数的调整，然后再调整积分系数和微分系数；当曲线振荡很频繁时，比例度盘要放大，曲线漂浮绕大湾时，比例度盘要往小扳；如果曲线偏离回复慢，积分时间应该往下降，曲线波动周期长时，积分时间应该再加长；曲线振荡频率快时，要先把微分降下来，如果动差大并且波动慢，微分时间应该加长，如此调节系统就能进入一个最佳状态。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefighterpid.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之房间策略</title>
		<link>http://www.stars625.com/firefightertactics.html</link>
		<comments>http://www.stars625.com/firefightertactics.html#comments</comments>
		<pubDate>Tue, 09 Jun 2009 12:59:08 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=131</guid>
		<description><![CDATA[灭火比赛场地采用国际标准比赛场地，总共四个房间，按照机器人搜索房间房间的次序不同，走过的路径长短不同，那么消耗的时间也不一样；同样的，机器人行驶的难易程度也不同，因此选择一条合适的路径相当重要。]]></description>
			<content:encoded><![CDATA[<p>比赛场地具体尺寸及房间分布如下图（单位：厘米）：</p>
<div id="attachment_177" class="wp-caption aligncenter" style="width: 536px"><a href="http://www.stars625.com/firefightertactics.html/fireroom" rel="attachment wp-att-177"><img src="http://www.stars625.com/wp-content/uploads/fireroom.jpg" alt="国际灭火机器人大赛标准场地" title="国际灭火机器人大赛标准场地" width="526" height="480" class="size-full wp-image-177" /></a><p class="wp-caption-text">国际灭火机器人大赛标准场地</p></div>
<p>规则要求，蜡烛放在任意一个房间内，所以要求搜索房间时使用最优路径。按照搜索房间的次序有以下几种可能的路径：</p>
<p>a)	4-3-2-1，路径长度为608cm。<br />
b)	3-4-2-1，路径长度为608cm。<br />
c)	1-2-3-4，路径长度为624cm。<br />
d)	1-2-4-3，路径长度为582cm。</p>
<p>根据以上对比，很容易得出最优路径为1-2-4-3，但是考虑到传感器的安装位置，机器人到达3号房间门口时无法检测到火焰，遂采用以下路径：1-2-3-4-3。</p>
<p>第1次进入3号房间时，不检测火焰，直接退出到4号房间，等4号检测完后，再进入到3号房间进行检测。</p>
<p>这样做有两个好处：一是当火焰在门口相对较近的3或4号房间时，机器人多搜索一个房间会有0.35的减分系数，可观的减分系数相对于多走的路程还是相当有利的；二是可以避免3号房间传感器无法看到火焰的情况。</p>
<p>还有一种策略是先搜索完所有房间，记下有火的房间号，等四个房间搜索完了再去灭火，这种策略一味追求低分赢得比赛，看见火不灭，有悖于比赛的初衷：“模拟现实家庭中机器人响应火警的过程”，所以不予采用。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightertactics.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之灭火装置</title>
		<link>http://www.stars625.com/firefighterwater.html</link>
		<comments>http://www.stars625.com/firefighterwater.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:35:57 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=128</guid>
		<description><![CDATA[比赛规则中，使用非风扇灭火方式灭火的给于0.8的减分系数（灭火比赛以分数低为胜），首先想到灭火器的工作原理，经过多次的实验终于成功了。本文主要介绍了在比赛中成功运用的灭火装置的设计原理。]]></description>
			<content:encoded><![CDATA[<p>灭火器原理是通过混合碳酸氢钠和硫酸铝两种化学原料进行反应，使用其生成物来进行灭火。那么在本系统中采用类似的原理，在一个大瓶里装入一种化学原料，里面另外放入一个小瓶，装适量另一种化学原料，灭火时将大瓶颠倒，使两种原料混合发生反应，再从塑料管喷出，装置示意图如下：</p>
<div id="attachment_180" class="wp-caption aligncenter" style="width: 494px"><a href="http://www.stars625.com/firefighterwater.html/firefighterwater-2" rel="attachment wp-att-180"><img src="http://www.stars625.com/wp-content/uploads/firefighterwater.jpg" alt="灭火机器人灭火装置原理图" title="灭火机器人灭火装置原理图" width="484" height="480" class="size-full wp-image-180" /></a><p class="wp-caption-text">灭火机器人灭火装置原理图</p></div>
<p>比赛要求两种化学原料能剧烈充份反应，由于硫酸铝比较难配，所以选择了碳酸氢钠与氢氟酸进行反应。氢氟酸对玻璃的腐蚀性较强，对人体或其它家具伤害较小，使用相对比较安全，使其与兑成饱和溶液的碳酸氢钠进行反应可以在短时间内产生大量水和二氧化碳，二氧化碳气体使瓶内压力增大，从而将水和二氧化碳的混合物从输液管中喷出灭火。</p>
<p>碳酸氢钠原本是粉末状的，兑成饱和溶液主要是为了使用反应更迅速、充份，实际运用中由于反应不完全，在喷出的液体中带有少量氢氟酸，请注意使用安全。难点在于喷头的制作，请大家在实际运用中自己调试，如果有不明确的地方请留言。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefighterwater.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之底盘</title>
		<link>http://www.stars625.com/firefightertank.html</link>
		<comments>http://www.stars625.com/firefightertank.html#comments</comments>
		<pubDate>Sun, 07 Jun 2009 13:41:47 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=118</guid>
		<description><![CDATA[灭火机器人的底盘，可以是轮式的、履带式的，本文就几种不同类型的底盘作下对比，为大家在选择机器人底盘时提供一点思路。比赛结束后也曾想过反正规则中没详细规定底盘细则，以后是不是可以用气垫的、飞的。]]></description>
			<content:encoded><![CDATA[<p>两轮差动底盘，这种底盘在中间两侧各有一个直流电机控制的轮子，另外在前后有一个或两个万向轮作为支撑。它的驱动力由中间两个轮子提供，当两轮速度、方向相同时，可以向前或向后运动；当两轮速度不一致时，就会拐弯，因此称为两轮差动。这种底盘速度快，最小转弯角可以为零度，也就是可以原地转弯，缺点是无法爬坡。</p>
<p>后驱前转向底盘，这种底盘有四个轮子，后面两个同轴由一个直流电机控制行驶速度，前面两轮连接转向舵机控制行驶方向。因此，该底盘可以达到很高的速度，也可以爬坡，但转向不便。</p>
<p>履带底盘，这种底盘就像我们所见的坦克底盘那像，可以原地转弯、爬坡等，并且运行稳定，但运动速度慢。</p>
<p>通过以上比较，比赛中的场地比较小，底盘转向角度越小越好，并且为了便于控制，可以爬坡等，所以选择履带式底盘，通过加电提速法，提高行驶速度。履带底盘如下图：</p>
<div id="attachment_183" class="wp-caption aligncenter" style="width: 650px"><a href="http://www.stars625.com/firefightertank.html/firefightertank-2" rel="attachment wp-att-183"><img src="http://www.stars625.com/wp-content/uploads/firefightertank.JPG" alt="灭火机器人履带坦克驱动底盘" title="灭火机器人履带坦克驱动底盘" width="640" height="480" class="size-full wp-image-183" /></a><p class="wp-caption-text">灭火机器人履带坦克驱动底盘</p></div>
<p>后来在比赛中也看到一种底盘，左右各两轮共四输，每个轮子用一个额定电压为12V的大电机驱动，那速度是相当的快啊，而且保留了两轮差动优点，并且可以爬坡，实在太强悍了。当然，其实如果车身轻的话用不了四个电机也能达到很快的速度。曾看到一款机器人，快得停止的时候都刹不住车，后轮都会跳起来的。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightertank.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之传感器</title>
		<link>http://www.stars625.com/firefightersensor.html</link>
		<comments>http://www.stars625.com/firefightersensor.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 13:30:08 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[sensor]]></category>
		<category><![CDATA[传感器]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=111</guid>
		<description><![CDATA[在灭火机器人中主要使用了三类传感器，火焰传感器是用来探测火焰的；红外传感器用来测量小车到墙壁的距离，用来定位；灰度传感器主要是用来识别地面的白线，当然还有声音传感器在<a href="http://www.stars625.com/firefightersch.html">灭火机器人的设计与制作之电路设计</a>那一章已经作了说明。]]></description>
			<content:encoded><![CDATA[<p>火焰传感器</p>
<p>远红外火焰探头将外界红外光的变化转化为电流的变化，通过 A/D转换器反映为 0~1023 范围内的数值。外界红外光越强，数值越小。因此越靠近热源，机器人显示读数越小。根据函数返回值的变化能判断红外光线的强弱,从而能大致判别出火源的远近。此外，远红外火焰探头探测角度为 60°。火焰传感器的原理图如下：</p>
<div id="attachment_186" class="wp-caption aligncenter" style="width: 421px"><a href="http://www.stars625.com/firefightersensor.html/firesensor" rel="attachment wp-att-186"><img src="http://www.stars625.com/wp-content/uploads/firesensor.jpg" alt="火焰传感器原理图" title="火焰传感器原理图" width="411" height="149" class="size-full wp-image-186" /></a><p class="wp-caption-text">火焰传感器原理图</p></div>
<p>使用中在火焰传感器上串联了一个电位器，这样便可以调整传感器的灵敏度。在不同光线环境下，直接调整电位器，即可减少外界光对传感器的影响。</p>
<p>在以往的比赛中，一般都在机器人前方加装三个以上的火焰传感器来探测火焰，这样机器人到达房间门口即可感应到火焰是否存在，但是这种方案容易受相机闪光灯、阳光等影响，所以本系统中未采用。本系统中采用的是单传感器加舵机的方案。取一不透光黑色胶卷筒，在其尾部钻孔，将火焰传感器装入其中，再将胶卷筒固定在舵机舵盘上。这样，火焰传感器就能随舵机转动，在转动的过程中进行A/D采样，实验证明抗干扰能力很好。并且小车距离火焰2.6cm以外即可“看”到底部距地面15cm～20cm高度不定的火焰，满足比赛要求。</p>
<p>红外测距传感器</p>
<p>红外测距传感器使用的是SHARP公司的GP2D12集成高精度传感器，测量有效距离为10cm~80cm，对应输出电压为2.5V~0V。传感器外形及距离－电压曲线图如下：</p>
<div id="attachment_188" class="wp-caption aligncenter" style="width: 517px"><a href="http://www.stars625.com/firefightersensor.html/irsensor" rel="attachment wp-att-188"><img src="http://www.stars625.com/wp-content/uploads/irsensor.jpg" alt="GP2D12红外传感器" title="GP2D12红外传感器" width="507" height="201" class="size-full wp-image-188" /></a><p class="wp-caption-text">GP2D12红外传感器</p></div>
<p>本系统中共使用了三个红外测距传感器（以下简称PSD），一个装于机器人正前方，另外两个分别装于机器人两侧，与前方PSD成90度。主要用这三个PSD来测量前方、左方、右方离开墙壁的距离。但是在使用该传感器的过程中有很多不当的地方在此作一些说明。</p>
<p>传感器安装错误。在组装机器人时，为了安装方便将传感器安装成如图4-4所示，这样安装就使得机器人在沿墙走的过程中如果遇到内角拐弯时就必需不断配合检测前方传感器的值才能完成拐弯动作如图4-6，增加了程序的复杂性，降低了系统的可靠性。比较好的安装方式是如图4-5，左右传感器斜向前装，这样的安装在遇到内角拐弯时单传感器就能完成所有动作如图4-7，系统运行稳定可靠。</p>
<p>另外前方传感器安装在机器人的最前面也是不恰当的，PSD在距离10cm内读出的数值是无效的，数值不确定，无法用在程序中进行判断，这就容易使机器人了误判，出现撞墙或打转等现象。</p>
<div id="attachment_189" class="wp-caption aligncenter" style="width: 575px"><a href="http://www.stars625.com/firefightersensor.html/irsetsensor" rel="attachment wp-att-189"><img src="http://www.stars625.com/wp-content/uploads/irsetsensor.jpg" alt="红外传感器安装示意图" title="红外传感器安装示意图" width="565" height="392" class="size-full wp-image-189" /></a><p class="wp-caption-text">红外传感器安装示意图</p></div>
<p>距离使用错误。在本系统中为图便利，直接将A/D采样的数值作为距离值放入程序中进行判断，但是从图4-8可以看出A/D采样值与距离不是成线性关系，在使用前必需对采样值进行数学运算后才能应用到程序中进行判断。</p>
<div id="attachment_190" class="wp-caption aligncenter" style="width: 562px"><a href="http://www.stars625.com/firefightersensor.html/iroutput" rel="attachment wp-att-190"><img src="http://www.stars625.com/wp-content/uploads/iroutput.jpg" alt="红外传感器输出曲线" title="红外传感器输出曲线" width="552" height="316" class="size-full wp-image-190" /></a><p class="wp-caption-text">红外传感器输出曲线</p></div>
<p>PSD所输出的电压与测量的距离是非线性的。因此若要求出所测距离，必须根据实验数据求出 、 的值，在灭火比赛中由于对距离的精度要求不是很高，可以采用分段线性插值法对距离值进行校正。</p>
<p>灰度传感器</p>
<p>灰度传感器可以检测地面反射光线的强度，使机器人能识别地面颜色的深浅。在灭火比赛中，灰度传感器主要是用来检测地面的白线。灰度传感器是利用光敏电阻的阻值会随着光照强度的变化而变化这一特性制成的。</p>
<p>灰度传感器由两个主要部件组成：高亮LED和光敏电阻。LED通过串联一个限流电阻连到电源两端，使之提供反射光源。光敏电阻其实是一个能根据光照强度而变化的可变电阻，在电路中串联一个电阻进行分压，另外在光敏电阻两端并联一个104电容，降低信号干扰。灰度传感器电路图如下：</p>
<div id="attachment_191" class="wp-caption aligncenter" style="width: 296px"><a href="http://www.stars625.com/firefightersensor.html/graysensor" rel="attachment wp-att-191"><img src="http://www.stars625.com/wp-content/uploads/graysensor.jpg" alt="灰度传感器原理图" title="灰度传感器原理图" width="286" height="136" class="size-full wp-image-191" /></a><p class="wp-caption-text">灰度传感器原理图</p></div>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightersensor.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之电路设计</title>
		<link>http://www.stars625.com/firefightersch.html</link>
		<comments>http://www.stars625.com/firefightersch.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 14:27:48 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=104</guid>
		<description><![CDATA[在前几篇文章中介绍了灭火机器人的概况，在本文中主要介绍了在主控板上各功能模块的电路设计方案，文中主要介绍了微处理器、指示灯、按键等、A/D采样模块、电机驱动模块、稳压电源模块等，并提供了原理图下载、当然设计中也参考了一些其它设计。]]></description>
			<content:encoded><![CDATA[<p>考虑到灭火机器人功能模块较多，需要实时处理的数据量大，并且系统比较复杂。所以要求MCU具有：集成度高、体积小、速度快等特点。</p>
<p>在对比了多款MCU后，结合自己的使用习惯，选择了调试接口简单、体积小、速度快的基于ARM7内核的LPC2148微处理器。</p>
<p>LPC2148是NXP公司出品的一个支持实时仿真和嵌入式跟踪的32位ARM7 TDMI-S CPU微控制器，并带有32kB片内SRAM和512kB嵌入的高速Flash存储器。这使得不必外扩RAM或ROM即可完成程序的存储及运行，大大简化了外围电路的设计。</p>
<p>LPC2148有2个32位定时器、2个10位ADC（共14路）、1个10位DAC、1个PWM控制器、45个高速GPIO口以及多达9个边沿或电平触发的外部中断管脚，如此丰富的资源完全可以胜任系统的要求。</p>
<p>通过一个可编程的片内 PLL（100us 的设置时间）可实现最大为 60MHz 的 CPU工作频率。在本系统中，为了能给串口通信提供准确的时钟信号，使用了频率为11.0592MHz的外部晶振，通过片内PLL四倍频将系统时钟提高到44.2368MHz。</p>
<p>系统采用两节锂电池串联作为电源，锂电池正常放电电压为7.2V，充满电时，电压可以达到8V，低于5V时将停止工作。锂电池无记忆效应，电能转化效率高，但对充放电要求比较高，过充和过放都会降低锂电池的使用寿命，为了降低电路复杂度，在系统中没有设置低压检测以及充电电路。在使用过程中，为防止过放电，工作一段时间就充电，充电时使用外部现成的充电器。</p>
<p>在本系统中共有三路稳压电源，一路3.3V为CPU供电、一路5V为其它外围器件供电、一路12V为电机供电。</p>
<p>LPC2148操作电压范围为3.0V~3.6V(3.3 V±10%)，在这里采用最大电流为800mA的低压差三端稳压块SPX1117-3.3，输出电压误差为2%，满足CPU稳定工作的要求。</p>
<p>5V稳压模块采用开关稳压芯片LM2575T-5.0，LM2575是美国国家半导体公司生产的1A集成稳压电路，它内部集成了一个固定的振荡器，只须极少外围器件便可构成一种高效的稳压电路，可大大减小散热片的体积，而在大多数情况下不需散热片；内部有完善的保护电路，包括电流限制及热关断电路等；芯片可提供外部控制引脚。相对于传统的线性稳压芯片，它采用开关式的电源IC，就这使的电源转换效率提高，减少了电能的浪费，是传统三端式稳压集成电路的理想替代产品。</p>
<p>本系统中使用的电机是额定电压为6V的直流电机，为了使机器人能达到更快的速度，采用加电提速法。经过实验，电机可以短时间内工作在12V左右。因此，使用DC-DC升压芯片LM2577T-12将电压提高并稳定在12V，这样可以使电机高速运行，并且保证了电机供电电压的稳定性，消除了电机转速与控制信号由于电压下降产生的不一致性。</p>
<p>在拥有A/D转换的电路中，为了降低电路噪声对采样电路的影响，一般来说会将数字电路和模拟电路分开，即电源下游有两组稳压电源，一组数字电源给MCU及其它数字电路供电，另一组模拟电源专门给传感器及MCU上的A/D转换器供电，降低互相之间的干扰。并且数字地与模拟地之间需单点共地，即数字电源的地线与模拟电源的地线通过跳线、零欧电阻或电感相连，确保两组电源保持同一参考电势，且不构成回路。</p>
<p>A/D转换器工作时需要有两个基准电压，通过将输入的信号电压与基准电压相比较，最终将输入的模拟信号转换成数字信号。基准电压的稳定性直接关系到输出数字信号的准确性和稳定性。系统中下基准定为0V即直接接地，上基准使用MC1403AU芯片产生的2.5V基准电压，该芯片的输出电压误差为1%即0.025V，在10位AD转换器上会产生10.23的偏差，通过软件滤波后的输出值可以满足系统对精度的要求。</p>
<p>LPC2148有两个A/D转换器，共提供14路模拟输入，本系统中使用其中的10路作为外扩A/D，使用三脚排针引出用来连接传感器。在模拟信号输入与5V电源之间使用地线隔开降低干扰，并且在模拟信号输入端加入小电阻限流，防止因外部电路短路导致输入电流过大而烧毁ARM芯片。</p>
<p>为了机器人能够支持声音启动方式，在控制主板上加入了声音检测电路，规则中要求是能检测到3kHz～4kHz频率的声音才能启动机器人，在系统中为了降低设计难度，采用判断声音强弱的方式来启动机器人。</p>
<p>麦克风采集到声音信号后通过LM386音频运放进行放大，放大倍数为200，没有声音时输出电压在2.5V左右，当有声音时输出电压会在2.5V上下波动，通过电阻和电容构成高频滤波，滤去电路板其他元器件产生的高频噪声。</p>
<p>在本系统中使用两片LMD18200分别驱动两个直流电机为机器人提供动力。LMD18200是美国国家半导体公司推出的专用于直流电动机驱动的H桥组件，同一芯片上集成有CMOS控制电路和DMOS功率器件。此种芯片瞬间驱动电流可达6A，正常工作电流可达3A，具有很强的驱动能力。</p>
<p>LMD18200的5脚为PWM波输入端，通过改变PWM的占空比就可调节电机的速度，改变3脚的高低电平即可控制电机的正反转，改变4脚的高低电平可以使能或禁能电机驱动。</p>
<p>在最初的调试过程中发现，有刷直流电机运行过程中的电磁干扰对电源电路的影响很大。通过示波器观察发现，电机在运行过程中，电源信号中会有很多周期性的高频干扰。电源电压不稳定导致传感器的输出信号非常不稳定。为了降低电机对A/D采样电路的影响，采用光耦将控制电路与电机驱动电路隔离，使用单独的一组电源为电机驱动电路供电。实践证明，隔离后电机对A/D采样电路的影响非常小，可以满足系统要求。</p>
<p>原理图：<a href="http://download.csdn.net/source/1007034">点击下载</a></p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightersch.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之主控板</title>
		<link>http://www.stars625.com/firefightermainctrl.html</link>
		<comments>http://www.stars625.com/firefightermainctrl.html#comments</comments>
		<pubDate>Wed, 03 Jun 2009 13:38:43 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=101</guid>
		<description><![CDATA[在控制主板的设计过程中，考虑到系统的可重用性和灵活性，采用两个双面板相连的设计，即上层是ARM最小系统板，下层是系统附加功能扩展板，这样的设计也降低了PCB设计的复杂性。PCB设计中大量采用贴片元器件，提高了系统的稳定性。]]></description>
			<content:encoded><![CDATA[<p>灭火机器人控制主板主要分为上层最小系统板，包括微处理器、指示灯、按键等；下层板主要包括A/D采样模块、电机驱动模块、稳压电源模块等。控制主板实拍图如下：</p>
<div id="attachment_194" class="wp-caption aligncenter" style="width: 650px"><a href="http://www.stars625.com/firefightermainctrl.html/firefighter_board" rel="attachment wp-att-194"><img src="http://www.stars625.com/wp-content/uploads/firefighter_board.JPG" alt="灭火机器人主控板" title="灭火机器人主控板" width="640" height="480" class="size-full wp-image-194" /></a><p class="wp-caption-text">灭火机器人主控板</p></div>
<p>上层最小系统板设计时考虑今后能独立使用在其它平台上，所以电路中包含了电源电路、复位电路，JTAG调试电路等，并且搭载了三个LED、四个KEY、一个BEEP作为系统的输入输出装置。</p>
<p>电源电路采用简单的三端稳压IC，加入钽电容和瓷片电容进行滤波，并在MCU的电源输入口再次用钽电容和104瓷片电容进行滤波，防止MCU因为电源波动意外复位，保证系统稳定可靠运行。</p>
<p>复位电路采用集成的复位芯片CAT1025，该芯片支持高、低电平复位以及上电和手动两种复位方式，并且内部集成了EEPROM，通过IIC总线与MCU进行通信，能够存储一些系统常用配制信息。</p>
<p>一般情况下，MCU的吸收电流比驱动电流要大，因此LED的连接采用共阳的方式，即将LED阳极接到3.3V电源上，将负极连到I/O口上，如此可以减轻MCU的驱动负担。</p>
<p>另外，在最小系统板上也留出了丰富的扩展接口如串口、IIC、USB口，USB工作指示灯接口在不使用时亦可当作普通I/O口来使用。</p>
<p>为了最小系统板在独立使用时容易放置并且防止短路，将接插件母座焊接在最小系统板反面，与安装在下层板正面的公座对接。</p>
<p>下层板留出了许多功能接口，以便将来能即插即用。下层板的外围放置的是接插件和大的分立器件，中间区域即最小系统板下面是不用插拔且体积较小的四个稳压电源电路及声音检测电路，既节省了空间又不会与上层板接触。</p>
<p>下层板共有十路A/D插座供传感器使用，两路PWM输出控制舵机，两路直流电机驱动，两路边缘捕获输入用来连接电机码盘反馈，提供包含电源的四针UART、IIC各一路。</p>
<p>在其它空余地方放置了标准间距的焊盘供系统扩展其它功能使用。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightermainctrl.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>灭火机器人的设计与制作之概述</title>
		<link>http://www.stars625.com/firefighteroverview.html</link>
		<comments>http://www.stars625.com/firefighteroverview.html#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:41:15 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[嵌入开发]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=98</guid>
		<description><![CDATA[作者设计制作了一款以ARM为核心的灭火机器人，参加了第三届江苏省机器人大赛，在网上发布了比赛视频后，受到了大家的欢迎，应广大网友要求在此公开设计方案，以便与大家进行交流，本文是摘录的一些机器人比赛的概要和意义等。]]></description>
			<content:encoded><![CDATA[<p>机器人灭火比赛在国内虽然才刚刚开展几年时间，但是它吸引了越来越多人的关注。因为它以喜闻乐见的方式走进了我们的视野，虽然它的体积很小，但是它的意义非常重大。它是综合了计算机技术、自动化技术、机电一体化技术、人工智能技术、模式识别技术的一门综合技术。</p>
<p>目前，比赛中使用的灭火机器人大部分是通过单片机来进行控制的，这使得机器人的性能受到了很大的限制。为了提高机器人的处理能力，在本设计中尝试使用基于ARM体系结构的32位微处理器来进行控制。</p>
<p>整个灭火机器人主要由以下几个部份组成：控制主板、传感器、运动执行装置、灭火装置。灭火机器人整体实物图如下:</p>
<div id="attachment_197" class="wp-caption aligncenter" style="width: 650px"><a href="http://www.stars625.com/firefighteroverview.html/firefighter" rel="attachment wp-att-197"><img src="http://www.stars625.com/wp-content/uploads/firefighter.JPG" alt="灭火机器人实物图" title="灭火机器人实物图" width="640" height="480" class="size-full wp-image-197" /></a><p class="wp-caption-text">灭火机器人实物图</p></div>
<p>目前机器人大赛开展的如火如荼，全国机器人大赛、江苏机器人大赛，还有各大公司举办的大学生机器人大赛等，为学生提供了广阔的交流与学习空间。作为计算机软件专业的学生，我有幸参加了2006年第二届江苏机器人大赛Robocup中型组1:1、2:2比赛，使用的是AS-R教学机器人平台，主要在VC++环境下使用机器人自带的库函数进行比赛策略的编写与研究。</p>
<p>随着研究的深入，发现底层函数的封装提高了开发者的便利性，却失去了使用的灵活性和开放性，因此逐渐转向直接面向底层应用的嵌入式系统的研究。</p>
<p>机器人灭火比赛在国际上已经非常成熟，规则也相对合理，正值第三届江苏机器人大赛报名，所以就以《灭火机器人的设计与制作》作为研究课题，研究的结果也可以在比赛中得到验证。</p>
<p>研究机器人技术能够对相关学科领域的发展起到一定的推动作用。随着比赛要求的不断提高，只有在分辨率、速度、智能等方面随之提高才能在比赛中获胜，这就能够相应地促进传感器技术、运动控制技术、微处理器技术、人工智能等方面的发展与提高。机器人竞赛促使研究人员利用各种更加先进的技术，以获得更好的解决方案，从而应用到工业中，促进各个领域的发展，这也正是开展机器人竞赛、研究机器人制作技术的深远意义，同时也是机器人竞赛的魅力所在。</p>
<p>同时关注<a href="http://www.stars625.com/tag/firefighter">灭火机器人http://www.stars625.com/tag/firefighter</a>其它系列文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefighteroverview.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

