《智能車制作全過程(飛思卡爾).doc》由會員分享,可在線閱讀,更多相關《智能車制作全過程(飛思卡爾).doc(43頁珍藏版)》請在裝配圖網(wǎng)上搜索。
智能車制作全過程(飛思卡爾)
如果我寫得好,請頂我一下,我將再接再厲!
(本人在很久以前做的一輛用來比賽的智能車--獲得華北一等獎,全國二等獎,有許多可改進地方.)
下面我們來立即開始我們的智能車之旅:
首先,一個系統(tǒng)中,傳感器至關重要.
"不管你的CPU的速度如何的快,通信機制如何的優(yōu)越,系統(tǒng)的精度永遠無法超越傳感器的精度" .是的,在這個系統(tǒng)中,傳感器的精度,其準確性就顯得至關重要.如果你問我傳感器的電路,呵呵,我早就和大家分享了,在我發(fā)表的日志中,有一篇<<基于反射式距離傳感器>>的文章就詳細的說明了傳感器的硬件電路以及可以采取的信號采樣方式.
傳感器安裝成一排,如上面排列.(就是個一字排列,沒有什么特別)
接下來,看看我們?nèi)绾翁幚韨鞲衅鞯玫降男畔?
大家看到了.結構很簡單,我們已經(jīng)搞定了傳感器通路.下面我們來看看多機的控制方面的問題:
其實,不管是便宜還是比較貴的舵機,都是一樣的用法.舵機的特點就是不同的占空比方波就對應著舵機的不同轉角.當然不同的舵機有不同的頻率要求.比如我用的這個舵機:方波頻率50HZ.怎么改變占空比?這個不就是PWM模塊的功能嘛.PWM模塊可以輸出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵機的轉角.你只要將傳感器的狀態(tài)和這個占空比對應上,不就OK了?就這么簡單,做到這里,你就可以讓你的車在跑道上跑了!
接下來,我們的工作是讓智能車更加完善:速度要穩(wěn)定.
在當前的系統(tǒng)結構中,要使一個系統(tǒng)更穩(wěn)定更可靠,閉環(huán)系統(tǒng)是一個選擇.(如果你不知道什么是閉環(huán)系統(tǒng),可以參照我的文章里面的一篇"基于單片機的PID電機調(diào)速"),既然是一個閉環(huán)系統(tǒng),速度傳感器是必不可少的,用什么樣的傳感器做為速度反饋呢:
仔細看,和后輪之間有一條皮帶的這個貌似電機的東西,就是我的速度傳感器,它的學名叫"旋轉編碼器".這個器件的特點就是:每轉一圈,就會從輸出端輸出一定的脈沖,比如我這個旋轉編碼器是500線的,就是轉一圈輸出500個脈沖.因此,我只要在單位時間內(nèi)計數(shù)輸出端輸出的脈沖數(shù),我就可以計算出車輛的速度.顯然,這個速度可以用來作為PID速度調(diào)節(jié)的反饋.
現(xiàn)在有了反饋,我們需要的是調(diào)節(jié)智能車驅(qū)動電機的速度了,如何來調(diào)速,就成了必須解決的問題了.我用的是驅(qū)動芯片MC33886. 其實,這個芯片就是一個功率放大的模塊.
我們知道,單片機輸出的PWM信號還是TTL信號,是不能直接用來驅(qū)動電機的.非要通過功率模塊的放大不可.這個道理其實很簡單,就像上次我給大家畫的哪個電子琴電路的放大電路一樣:
看上面的那個三極管,就是將TTL電路的電流放大,才能夠來驅(qū)動蜂鳴器.其實這里的這個MC33886就是這樣的一個作用.而且我們自己也完全可以用三極管自己搭建一個這樣的功率放大電路,當然,驅(qū)動能力肯定不如這里的這個MC33886(如我們用三極管就搭建了超過MC33886的電路,摩托羅拉就不會賣幾十塊錢一個了.呵呵.)知道了這個MC33886的工作原理,就好說了,一句話,通過PWM來調(diào)節(jié)電機的速度.當方波中高電平占的比例大,電機的平均電壓肯定高,轉速肯定快.也就是說,PWM的占空比越大,電機轉速越高.
看,就這么簡單,這個智能車就做好了.接下來,我們就把我們知道的PID知識放到舵機和直流驅(qū)動電機的控制中去.就可以達到一個比較好的控制效果.
如果要達到更高的水平,肯定機械方面的改造也少不了.當然,這不屬于本文的討論范圍.呵呵.
智能車制作全過程(飛思卡爾---舵機篇
發(fā)表于 2008/11/28 10:00:55
感謝大家的支持!如果我寫得好,請頂我一下!
智能車的制作中,看經(jīng)驗來說,舵機的控制是個關鍵.相比驅(qū)動電機的調(diào)速,舵機的控制對于智能車的整體速度來說要重要的多.
PID算法是個經(jīng)典的算法,一定要將舵機的PID調(diào)好,這樣來說即使不進行驅(qū)動電機的調(diào)速(勻速),也能跑出一個很好的成績.
機械方面:
從我們的測試上來看,舵機的力矩比較大,完全足以驅(qū)動前輪的轉向.因此舵機的相應速度就成了關鍵.怎么增加舵機的響應速度呢?更改舵機的電路?不行,組委會不允許.一個非常有效的辦法是更改舵機連接件的長度.我們來看看示意圖:
從上圖我們能看到,當舵機轉動時,左右輪子就發(fā)生偏轉.很明顯,連接件長度增加,就會使舵機轉動更小的轉角而達到同樣的效果.舵機的特點是轉動一定的角度需要一定的時間.不如說(只是比喻,沒有數(shù)據(jù)),舵機轉動10度需要2ms,那么要使輪子轉動同樣的角度,增長連接件后就只需要轉動5度,那么時間是1ms,就能反應更快了.據(jù)經(jīng)驗,這個舵機的連接件還有必要修改.大約增長0.5倍~2倍.
在今年中,有人使用了兩個舵機分別控制兩個輪子.想法很好.但今年不允許使用了.
接下來就是軟件上面的問題了.
這里的軟件問題不單單是軟件上的問題,因為我們要牽涉到傳感器的布局問題.其實,沒有人說自己的傳感器布局是最好的,但是肯定有最適合你的算法的.比如說,常規(guī)的傳感器布局是如下圖:
這里好像說到了傳感器,我們只是略微的一提.上圖只是個示意圖,意思就是在中心的地方傳感器比較的密集,在兩邊的地方傳感器比較的稀疏.這樣做是有好處的,大家看車輛在行駛到轉彎處的情況:
相信看到這里,大家應該是一目了然了,在轉彎的時候,車是偏離跑道的,所以兩邊比較稀疏還是比較科學的,關于這個,我們將在傳感器中在仔細討論。
在說到接下來的舵機的控制問題,方法比較的多,有人是根據(jù)傳感器的狀態(tài),運用查表法差出舵機應該的轉角,這個做法簡單,而且具有較好的濾波"效果",能夠?qū)㈠e誤的傳感器狀態(tài)濾掉;還有人根據(jù)計算出來的傳感器的中心點(比如第四個和第五個傳感器檢測到黑線,中心點就是4.5),計算出舵機需要的轉角,這個做法也比較的簡單,但是必須有一個濾波的過程,必須要濾掉錯誤的傳感器狀態(tài).比如說:現(xiàn)在傳感器第四個,第五個和第11個檢測到了黑線,顯然第11個應該是個傳感器檢測錯誤.應該把它濾掉.關于這個如何濾波,我們待會在后面將進行討論.還有人的做法就是采用PID算法,這個方法比較的好,其實也不是很難,就是PID參數(shù)整定的時候有些麻煩.
大家可以自己選擇喜歡的方法.
關于濾波,有些許的方法:
1.平均值排序法.
這個方法大家肯定一聽就知道是怎么回事.就是不急于執(zhí)行,先多次檢測被測傳感器,累加,求平均值.這個方法不錯,特別在單片機中.比如:你如果連續(xù)采集8次,累加,最后你只要右移三位(value=value>>3;)就是value=value/8的結果.畢竟,在單片機中,右移比除法要快嘛.
2.中間值算法.
這個算法也簡單,顧名思義,就是取不大不小的中間的值.這個算法就需要把幾次采集的值排序,然后使用中間的那個值.
3.遞推濾波.
這個濾波方法比較的受認可,但是執(zhí)行起來也有風險所在.先說這個算法,就是根據(jù)當前值(傳感器的中心點所在值),推算接下來的傳感器中心點的量,如果發(fā)現(xiàn)前后變化劇烈,就視為干擾因素,忽略.這個算法看起來比較的好.但是風險就在于:如果出現(xiàn)了錯誤,并且錯誤的中心點成為的當前值,那么以錯誤的中心點為基準,正確的中心點就成了干擾.這樣就會出現(xiàn)極端情況.為了避免這個情況,我們應該有一個檢查的模塊,檢查當前的中心點是否有效.這個檢查,我們也許可以結合前面兩種方法,在一定時間對中心點的有效性進行檢查.
4.限幅濾波.
這個在舵機的控制中,特別是使用計算的方法獲得PWM信號占空比的(用來控制舵機的轉角),更是尤為重要.這個濾波的思路就是規(guī)定一個最大值和一個最小值,當計算出的值低于最小值時,令其等于最小值;大于最大值時,令其等于最大值.
智能車制作全過程(飛思卡爾)
發(fā)表于 2008/11/15 22:28:01
如果我寫得好,請頂我一下,我將再接再厲!
(本人在很久以前做的一輛用來比賽的智能車--獲得華北一等獎,全國二等獎,有許多可改進地方.)
下面我們來立即開始我們的智能車之旅:
首先,一個系統(tǒng)中,傳感器至關重要.
"不管你的CPU的速度如何的快,通信機制如何的優(yōu)越,系統(tǒng)的精度永遠無法超越傳感器的精度" .是的,在這個系統(tǒng)中,傳感器的精度,其準確性就顯得至關重要.如果你問我傳感器的電路,呵呵,我早就和大家分享了,在我發(fā)表的日志中,有一篇<<基于反射式距離傳感器>>的文章就詳細的說明了傳感器的硬件電路以及可以采取的信號采樣方式.
傳感器安裝成一排,如上面排列.(就是個一字排列,沒有什么特別)
接下來,看看我們?nèi)绾翁幚韨鞲衅鞯玫降男畔?
大家看到了.結構很簡單,我們已經(jīng)搞定了傳感器通路.下面我們來看看多機的控制方面的問題:
其實,不管是便宜還是比較貴的舵機,都是一樣的用法.舵機的特點就是不同的占空比方波就對應著舵機的不同轉角.當然不同的舵機有不同的頻率要求.比如我用的這個舵機:方波頻率50HZ.怎么改變占空比?這個不就是PWM模塊的功能嘛.PWM模塊可以輸出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵機的轉角.你只要將傳感器的狀態(tài)和這個占空比對應上,不就OK了?就這么簡單,做到這里,你就可以讓你的車在跑道上跑了!
接下來,我們的工作是讓智能車更加完善:速度要穩(wěn)定.
在當前的系統(tǒng)結構中,要使一個系統(tǒng)更穩(wěn)定更可靠,閉環(huán)系統(tǒng)是一個選擇.(如果你不知道什么是閉環(huán)系統(tǒng),可以參照我的文章里面的一篇"基于單片機的PID電機調(diào)速"),既然是一個閉環(huán)系統(tǒng),速度傳感器是必不可少的,用什么樣的傳感器做為速度反饋呢:
仔細看,和后輪之間有一條皮帶的這個貌似電機的東西,就是我的速度傳感器,它的學名叫"旋轉編碼器".這個器件的特點就是:每轉一圈,就會從輸出端輸出一定的脈沖,比如我這個旋轉編碼器是500線的,就是轉一圈輸出500個脈沖.因此,我只要在單位時間內(nèi)計數(shù)輸出端輸出的脈沖數(shù),我就可以計算出車輛的速度.顯然,這個速度可以用來作為PID速度調(diào)節(jié)的反饋.
現(xiàn)在有了反饋,我們需要的是調(diào)節(jié)智能車驅(qū)動電機的速度了,如何來調(diào)速,就成了必須解決的問題了.我用的是驅(qū)動芯片MC33886.
其實,這個芯片就是一個功率放大的模塊.我們知道,單片機輸出的PWM信號還是TTL信號,是不能直接用來驅(qū)動電機的.非要通過功率模塊的放大不可.這個道理其實很簡單,就像上次我給大家畫的哪個電子琴電路的放大電路一樣:
看上面的那個三極管,就是將TTL電路的電流放大,才能夠來驅(qū)動蜂鳴器.其實這里的這個MC33886就是這樣的一個作用.而且我們自己也完全可以用三極管自己搭建一個這樣的功率放大電路,當然,驅(qū)動能力肯定不如這里的這個MC33886(如我們用三極管就搭建了超過MC33886的電路,摩托羅拉就不會賣幾十塊錢一個了.呵呵.)知道了這個MC33886的工作原理,就好說了,一句話,通過PWM來調(diào)節(jié)電機的速度.當方波中高電平占的比例大,電機的平均電壓肯定高,轉速肯定快.也就是說,PWM的占空比越大,電機轉速越高.
看,就這么簡單,這個智能車就做好了.接下來,我們就把我們知道的PID知識放到舵機和直流驅(qū)動電機的控制中去.就可以達到一個比較好的控制效果.
如果要達到更高的水平,肯定機械方面的改造也少不了.當然,這不屬于本文的討論范圍.呵呵.
基于單片機的電子琴設計
發(fā)表于 2008/11/14 11:02:11
如果我寫得好,請頂我一下,我將再接再厲
很多朋友喜歡搞一些聲光的東西,因為能看到,能聽到,比搞個什么通信濾波要好玩多了.好!我們就開始做個電子琴.甚至做一個簡單的"MP3",呵呵,從簡單開始.我們先做電子琴,下一節(jié)再做"MP3".
首先,因為是發(fā)聲裝置,我們得先了解發(fā)聲的原理是什么,這有助于我們接下來的編程:
1.聲音是由于物體震動產(chǎn)生的.
2.電流的變化通過線圈就可以使磁場發(fā)聲變化.
上圖是一個喇叭的工作原理.不知道大家看明白了沒有.喇叭的電磁鐵的電源是接到我們的發(fā)聲電路上.當電路中的電路發(fā)生變化時,電磁鐵的吸引力也發(fā)生變化.因此就會吸合鐵皮.吸合鐵皮的時候也帶動了薄膜的運動.如果這個吸合過程非常的快.那么薄膜就會發(fā)生高頻的震動.這個震動就會發(fā)出聲音.
上面只是一個示意圖.實際上的喇叭并不是磁鐵吸音鐵框的問題,鐵框往往也會換成一個磁鐵,不過是永磁鐵,這樣不但可以吸引,還可以排斥.聲音幅度更大.
好了,總而言之一句話,就是來來回回的震動就會產(chǎn)生聲音.
接下來,我們開始制作吧:電路相當?shù)暮唵?
看到了吧,電路非常的簡單.下面是四個鍵盤的按鍵開關.上面就是一個三極管的放大.有人說,我直接接到單片機上就不行.完全可以!我為什么說是個電流放大呢,就是要發(fā)生的功率大,聲音大.如果你將蜂鳴器直接接到單片機的IO口上,當然是可以的.但是只是用來驗證用的,聲音太小,實際中是沒有用處的.
不過,我可得提醒你:
你如果這樣接,那就不對了.為什么?問題就在于,單片機的IO口的驅(qū)動能力是絕對有限的,你現(xiàn)在讓它直接驅(qū)動一個功率比較大(比較LED而言)蜂鳴器,是比較吃力的.但是你卻可以這樣設計:
什么?沒有發(fā)現(xiàn)有什么不同?呵呵,看看,蜂鳴器的電壓方向變了.為什么這樣做,這就是一個開發(fā)經(jīng)驗問題了:單片機的IO口吸收電流的能力要遠遠大于其提供電流的能力.所以不管是驅(qū)動蜂鳴器還是驅(qū)動LED發(fā)光二極管,都要做成低電平有效的這種形式,切實有效!
(本人的實驗板,具備上述模塊,其原理圖和上述完全一致.有實驗板的朋友可以接著往下做了)
好了,硬件連接OK了,我們趕緊開始我們的編程吧:
我先說說算法,要實現(xiàn)一定頻率的震動,不就是將IO端口進行一定頻率的開和關就是了.要進行一定頻率的開和關,就必須有一個計數(shù).在這里,定時計數(shù)器就比較合適了.自動重裝載模式顯然比較合適.我們來看看程序吧(鑒于c語言良好的可閱讀性,我們先用c語言來編寫):
#include
#define uint unsigned int
#define uchar unsigned char
#define SOUNDER P0_BIT2 //用宏定義端口,直觀.如以后更改,方便
#define S1 P2_BIT4
#define S2 P2_BIT5
#define S3 P2_BIT6
#define S4 P2_BIT7
#define YES 0
#define NO 1
int YIN[7][2]; //定義一個音階數(shù)組,存放計數(shù)器的計數(shù)初始值.
int Dir="3",i;
void TimerInit() //計數(shù)器初始化函數(shù).
{
TMOD="0x21";
TL0=0;
TH0=0;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR0=1;
TR1=1;
SCON=0x50;
}
void main()
{
// 261 1 //低音叨 頻率261
YIN[0][0]= (65536-10000/261/2*100)%256;
YIN[0][1]= (65536-10000/261/2*100)/256;
// 294 2
YIN[1][0]= (65536-10000/294/2*100)%256;
YIN[1][1]= (65536-10000/294/2*100)/256;
// 330 3
YIN[2][0]= (65536-10000/330/2*100)%256;
YIN[2][1]= (65536-10000/330/2*100)/256;
// 349 4
YIN[3][0]= (65536-10000/349/2*100)%256;
YIN[3][1]= (65536-10000/349/2*100)/256;
// 392 5
YIN[4][0]= (65536-10000/392/2*100)%256;
YIN[4][1]= (65536-10000/392/2*100)/256;
// 440 6
YIN[5][0]= (65536-10000/440/2*100)%256;
YIN[5][1]= (65536-10000/440/2*100)/256;
// 494 7
YIN[6][0]= (65536-10000/492/2*100)%256;
YIN[6][1]= (65536-10000/492/2*100)/256;
EA="1"; //開CPU中斷
ET0=1; //開定時計數(shù)器中斷
TimerInit(); //調(diào)用初始化計數(shù)器函數(shù)
for(;;){}
/////////////////////////////////////////////////////////////////////////////////////////////
void TimerOverFlow () interrupt 1 //定時器中段函數(shù)
{
if(S1= =YES)
{
SOUNDER=!SOUNDER;
TL0=YIN[0][0];
TH0=YIN[0][1];
}
if(S2= = YES)
{
SOUNDER=!SOUNDER;
TL0=YIN[1][0];
TH0=YIN[1][1];
}
if(S3= =YES)
{
SOUNDER=!SOUNDER;
TL0=YIN[2][0];
TH0=YIN[2][1];
}
if(S4= =YES)
{
SOUNDER=!SOUNDER;
TL0=YIN[3][0];
TH0=YIN[3][1];
}
// Clear the flag
TF0=0;
}
相信大家看得明白程序,很簡單.下載到單片機上以后,按S1鍵,蜂鳴器發(fā)出低音1(叨)的聲音.按S2發(fā)2(ruan)的聲音...
基于單片機的數(shù)字PID實現(xiàn)直流電機調(diào)速(智能車)
發(fā)表于 2008/11/12 9:45:33
現(xiàn)在做很多的智能車,都需要對車速進行控制.或勻速或變速,在調(diào)速算法中,PID的經(jīng)典永垂不朽.
其實,簡單的51單片機尚能輕易的實現(xiàn)平滑良好的調(diào)速,更不用說性能優(yōu)良的單片機.然而,要做到最好,是需要很高的專業(yè)水平和動手能力.但是,工程上能達到我們的目標即可.
抱著"夠用就好"的思想,我們來開始我們的調(diào)速旅程:
所謂的PID是肯定基于一個閉環(huán)系統(tǒng)而言的,什么是閉環(huán)系統(tǒng)呢,我簡單的介紹一下:
看上面的這個系統(tǒng),就不是一個閉環(huán)系統(tǒng),而是一個開環(huán)系統(tǒng).再看下面的這個就是閉環(huán)系統(tǒng):
上圖這個系統(tǒng)就是典型的閉環(huán)系統(tǒng).大家也許看出來了,"開環(huán)"系統(tǒng),就是系統(tǒng)沒有反饋,是個"打開的環(huán)",而閉環(huán)系統(tǒng),是有反饋的,是一個完整的環(huán)形.
正是這個反饋,就可以將當前電機的轉速傳遞給系統(tǒng)控制端,如果電機轉速快了,控制器就讓它慢點(比如可以降低電機兩端的電壓),同樣,如果速度傳感器檢測到轉速低了,就應該讓電機兩端的電壓提高一點.就是在這樣的不斷矯正中,電機的速度會保持恒定.當然,這個矯正的周期是非常短的,矯正的速度是很快的.
有人說,不就是多了就少點,少了就多點嘛,干嘛使用什么玄乎的PID?
對,你說對了,"多了就少點,少了就多點"這本身就是PID里面的一種:P控制--只使用了P算法.
接下來我們就看看到底什么是PID,為什么要使用PID,怎么樣使用PID:
P--比例
I--積分
D--微分
我們來一條一條的講解P,I,D的含義及其意義:
P--比例部分
這個很好理解.比如說,速度傳感器發(fā)現(xiàn),當前速度是1200(每分鐘).而我們設定的速度值為1000,那么就差別了200,這時,如果我設定P為0.1,如果輸入的電壓就應該是Uo-0.1x200.看到了沒有,這里的比例的意思就是"倍數(shù)",就是你要把這個偏差放大多少倍."放大"本身就是一個比例嘛.知道了這個,你就可以寫一個PID控制里面的P控制了.很多時候,不需要I和D控制,單單一個P控制就足夠了.到了這里你就可以控制電機的速度了.
I--積分部分.
這個積分其實也很好理解.它是一個積分運算.有的時候偏差不是很大,所以繼續(xù)運行下去,會使系統(tǒng)存在一個偏差.但是你如果使用I運算將這個偏差累加起來,到了一定大小的時候就進行處理.這樣就能防止系統(tǒng)的誤差累計.其實,在程序中,這個過程就是對一個小偏差的連續(xù)累加罷了.
D--微分部分.
這個部分也比較好理解.所謂的微分就是對變量求導唄,意思就是一個量的變化率唄.所以,微分部分就是能夠?qū)⒆兞孔兓史湃胗嬎阒?這個量在邊城中其實就是求上次的偏差和這次的偏差的差罷了.
其實,在溫度控制中PID還是比較有效的,但是在于電機控制這種速度經(jīng)常變化的場合,一個參數(shù)整定好的P控制就能完成任務.為了便于大家的理解,我給大家舉一個例子吧:
關于對51單片機端口上拉電阻的討論
發(fā)表于 2008/11/11 22:28:33
前一段時間,看到實驗室有個學弟設計了一個電路,其中還有一個鍵盤電路,取其原理是這樣子的:
據(jù)這位師弟的意思是:在沒有按下按鍵的時候,端口上是低電平,按下按鍵的時候端口上接上了高電平.
事實上,電路是不工作的.
問題比較多:
首先,將電源直接接到端口上是絕對不可以的.當按下按鍵的時候,會有很大的電流進入單片機.在工程上,這種往往應該加限流電阻的.一般選擇1K的就可以.如果選擇太大的電阻也不好,因為電阻上面壓降太大,造成輸入比應有的高電平低,造成錯誤.
其次,就算加了限流,這個電路也是不能工作的.檢查AT89C51的DataSheet就會發(fā)現(xiàn).技術手冊中說:P0口是沒有上拉電阻的端口;P1,P2,P3口帶有上拉電阻.問題就出在這里,什么是上拉電阻,來看看圖:
上面這個圖,是紅外線接收的電路圖,看上面的這個電阻,就是上拉電阻.我們可以試圖理解一下51單片機P2口的這個上拉電阻為這種形式:
其中的R就是上拉電阻.如果像我的那個師弟那樣設計電路,電路就成了以下這種形式了:
看,從這個電路上,我們可以清晰的看出,不管你按鍵是否按下,IO端口上都是高電平.問題就在這里,我讓我的這個師弟測測IO端口的電平在按下按鍵前后的變化,結果果然不出所料:不管他是否按下按鍵,都是高電平!!
從這里我們可以看出:DataSheet還是有用的,在設計的時候,有很多細節(jié),需要注意,否則,可能功虧一簣.
基于或門的超級簡單的液位傳感器
發(fā)表于 2008/11/11 16:29:04
前一陣子,在實驗室,看到一個朋友在那里拿著一個盒子鉆,敲,打...滿頭大汗,嘴里還嘀咕著...
"你在做什么呢?"
"我在做一個液位傳感器,這個杠桿浮漂真不好弄!"
"你最近不是做液位控制,你如果用機械杠桿,你怎么采集數(shù)字信號到單片機?"
"我會在杠桿上安裝一個角度傳感器...".
看來真是個麻煩的事情...
回頭突然想起,我小學的時候,給我媽媽做了一個檢測下雨的東西.好像是五年級的時候,就是那種平板,下上雨了以后,就會觸發(fā)相關的電路(當年我是接上了一張生日賀卡里面的音樂芯片).
要說,當初,我還記得,書上好像是叫那種電路為"或門",當初我怎么都不理解,但是現(xiàn)在看來,原理是多么的簡單.
看看電路:
當年的電路是這樣子的,就是在板子上有水,就會接通兩端的電路.很好理解,只有有一處接通,整個電路就是通的,是一個邏輯上"或"的關系,所以叫或門.當然除了或門,肯定還有"與門".
既然能夠檢測到雨水,那怎么就不能檢測液位呢(這里的液體也是水.),當然我們需要的是要將電路進行些許的改裝.我就為我這個朋友設計了一個:
你看,我分開處理,大不了我挨著掃描一次看看1到11的引腳,哪里檢測到了水位(檢測到電壓),我不就可以方便的檢測到液位了.
你可能要說:這個占用IO口也太多了吧...不要緊!來,實用一個138譯碼器不就可以了,有選擇的讀取其中的某個引腳.
就這么小的一個小東西,做出來,拿到現(xiàn)場一試--"屢試不爽",試驗多次,沒有出現(xiàn)過一次誤報,簡單但是好用.
由這個問題我們看出來了:小學教育是多么的重要啊...
基于反射式紅外線的測距傳感器
發(fā)表于 2008/11/9 23:14:13
如果我寫得好,請頂我一下,我將再接再厲!
前陣子做個小車玩,是走迷宮的那種.苦于沒有所謂的距離傳感器,就自己做個吧.結果也犯了不少錯誤.現(xiàn)和大家分享.
買了幾個兩毛錢一個的發(fā)射管(注意,不是發(fā)光二極管,雖然長得一樣,但是這個是發(fā)射紅外線,你可能肉眼看不出它再發(fā)光,但是你若是用手機或數(shù)碼相機的攝像頭看,你就會看到它的光).
(發(fā)射管) (接收管)
看來比較簡單,一個發(fā)射,一個接受.發(fā)射管發(fā)射紅外線,遇到遮擋就會反射回來(遮擋是黑色的除外,因為黑色吸收了紅外線),接收管接收到紅外線以后阻值發(fā)生了變化,因此可以利用電阻分壓改變輸出電壓.看看電路:
發(fā)射電路,一開始我就是這樣,一個限流電阻直接發(fā)射管(紅外線發(fā)光管).后來發(fā)現(xiàn)一個隨之而來的問題,就是多個傳感器工作時電流比較的大,達到0.5A左右.而且傳感器發(fā)熱嚴重.要知道,發(fā)熱嚴重,性能就會嚴重的降低.于是想到,是不是可以在需要的時候開通,不需要的時候關閉.形成這種掃描式的.結果衍生出了以下的電路:
這個電路的原理也是一目了然的:當單片機的IO口輸出高電平時,R1所在的支路有電流I1,因此R2所在的支路就有I1*E(E為三極管的放大倍數(shù),比如我用的是30).這樣,三極管就相當于一個電子開關.單片機輸出1的時候,發(fā)光管接通,單片機輸出0的時候,發(fā)光管截止.這樣就起到了用單片機來控制發(fā)光管關閉的效果.
經(jīng)過實驗,發(fā)現(xiàn)該電路效果非常的明顯.在大多數(shù)情況下,電流表幾乎檢測不到電流的所在.用精密的電流表,發(fā)現(xiàn)電流在5MA左右.而且整個電路的檢測距離更遠,更準確.具體分析其原因是:長時間處于發(fā)光狀態(tài),發(fā)熱嚴重,發(fā)光管效率降低,電阻增大,發(fā)射功率降低.而間歇發(fā)射,發(fā)光管發(fā)光效率更高,更省電.
至于接受電路,我使用的就比較的簡單.
其中,Sout為信號的輸出.其實這個電路就太簡單了,你看.紅外線使著接收管的電阻發(fā)生了很大的變化,所以兩個電阻的比值就發(fā)生了變化,根據(jù)分壓原理,輸出的電壓值也就改變了.
接下來的問題就是對現(xiàn)在的這個高電壓和低電壓進行處理.有人說,直接接到單片機上進行編程不就可以了?不是的!注意,這里的輸出電壓雖然也有高和低,但是這里的電壓是個"模擬量",不是標準的TTL電平.舉個例子,我測得有反射(前方有障礙物)的時候,電壓是4V,沒有發(fā)射(前方?jīng)]有障礙物)的時候,電壓是2.1V.顯然,你如果直接接到單片機上,單片機收到的都是高電平.
處理的辦法有兩個:使用AD轉換或是使用電壓比較器.
這兩個方法各有各自的優(yōu)缺點,我們來分析一下:
一.AD轉換
大家都知道,就是將輸出的電壓值,用AD芯片進行數(shù)字化,比如5V轉換成了1200.等等...這樣做的好處是顯而易見的,我們能夠方便的對數(shù)據(jù)進行處理.比如,我們令數(shù)值小于300的表示沒有檢測到障礙物或是障礙物比較的遠.數(shù)值大于300的表示檢測到障礙物.而且硬件上也比較的簡單,直接將輸出接到AD的輸入引腳即可(現(xiàn)在的許多MCU內(nèi)部都自帶ADC,所以根本就不需要外圍電路,直接接上即可).這樣做的不足也有,就是你需要編寫AD檢測的程序,而且占用CPU時間.
二.比較器
所謂的比較器,就是電壓比較器,看電路:
看,就是這么個簡單的電路,當Ui>U時,Uo一直是低電平;當Ui20000?20000:SumErr;
}
Else SumErr=0; //清除積分累加。
Uk=KP*E[k]+SumErr/KI; //計算比例+積分。其實1/KI才是積分常數(shù)。
Turn(Uk); //輸出。
如上面的組圖所示,積分作用有助于消除系統(tǒng)誤差,但是過大或過小的積分系數(shù)都將使系統(tǒng)品質(zhì)降低。經(jīng)過反復試湊,最終選取積分常數(shù)KI=0.003。
(4)微分項的整定
以上的PI控制器,從圖3.9的響應曲線上來看,已經(jīng)達到了令人滿意的效果。系統(tǒng)的靜差已經(jīng)基本消除,系統(tǒng)運行已經(jīng)基本滿足要求。但是系統(tǒng)仍然存在不能忽略的超調(diào),有時候這種超調(diào)會讓機器人手臂的定位感覺非常的僵硬,因此需要進一步將其去掉。
PID控制源代碼:
#define k 1
E[k]=TargetValue-ADValue; //計算當前偏差。
if(abs(E[k])<50) //在一定范圍內(nèi)才投入積分
{
SumErr+=E[k];
SumErr=SumErr>20000?20000:SumErr;
}
Else SumErr=0; //清除積分累加。
Uk=KP*E[k]+E[k]/KI+KD*(E[k]-E[k-1]); //計算比例+積分+微分。
Turn(Uk); //輸出。
E[k-1]=E[k]; //更新E[k-1]
從圖3.11中的圖像對比中,可以發(fā)現(xiàn)微分作用避免了被控量的嚴重超調(diào),合適的微分項使得系統(tǒng)超調(diào)變小,改善了系統(tǒng)在調(diào)節(jié)過程中的動態(tài)特性。經(jīng)過多次試湊,確定PID的參數(shù)為KP=3,KI=0.003,KD=40。
單片機基礎教程(AT89C51)--串行通信
發(fā)表于 2008/12/1 21:35:24
今天我們來開始單片機的通信實驗。我們知道,單片機的通信接口是RXD(接收端)和TXD(發(fā)送端),要實現(xiàn)兩個單片機的通信,只要將兩個單片機的RXD和TXD交叉連接就可以了(一個單片機的RXD接另一個單片機的TXD,TXD接另一個單片機的RXD)。
好了,硬件連接就這么簡單?,F(xiàn)在我們開始寫程序吧。要完成個什么任務呢?就用一個單片機做主機向另一個單片機發(fā)信息,用主機單片機控制從機的發(fā)光二極管亮吧。
首先必須規(guī)定一下:當主機的按鍵1按下的時候,發(fā)送0x41給從機(剛然,你愛規(guī)定成什么就規(guī)定成什么),而從機呢,只要收到0x41就讓第一個發(fā)光二極管亮;當主機的按鍵2按下是,就發(fā)送0x42給從機,從機只要收到0x42就使第二個放光二極管亮;以此類推,總共四個按鍵,控制從機的四個二極管。
下面開始編程吧,先寫主機(發(fā)送方)的程序,當然也是從查詢開始:
#include
#define S1 P2^4
#defin
鏈接地址:http://m.italysoccerbets.com/p-6616605.html