經(jīng)典款嵌入式智能小車(chē)的設計技巧,提供硬件選型
- 前言
傳統智能小車(chē),特別是嵌入式系統,一般都是基于單片機或者ARM的嵌入式系統,基本上都由軟件系統和硬件系統組成的,硬件系統方面,跟傳統的搭建硬件環(huán)境一樣,只能做相對裁剪和功能拓展,但是,本項目的課題是通過(guò)xilinx的FPGA開(kāi)發(fā)板搭建嵌入式的硬件環(huán)境,從最小系統到IP核的添加,都是根據需要進(jìn)行拓展的,實(shí)現一對一的拓展,不浪費資源,而且基于FPGA的嵌入式系統的最大有優(yōu)點(diǎn)是,既有PFGA的并行執行效率,又有嵌入式軟件的邏輯過(guò)程分析控制。
本文引用地址:http://dyxdggzs.com/article/201706/346849.htm- 總體方案設計
圖1 系統硬件結構框圖
使用Spartan-6的XC6SLX16 CSQ234 作為主控制器,傳感器使用攝像頭ov6620圖像采集模塊(兼測路徑),使用超聲波模塊(HCSR04)測距,由于兩者具有互補特性,所以能夠很好的控制小車(chē)的運行狀態(tài),采用模糊算法計算出電機所需要的轉速,和舵機的轉角,從而實(shí)現穩步漸進(jìn)。
- 1主控制器的選擇
解決方案:采用可編程邏輯器件FPGA作為控制器。FPGA可以實(shí)現復雜的邏輯功能,規模大,密度高,體積小,穩定性高,IO資源豐富,易于外圍功能擴展,隨著(zhù)FPGA的成本逐步降低,而且基于FPGA的嵌入式系統的搭建也成為可行,既有傳統嵌入式的軟件靈活性,也有FPGA的并行快速執行效率。
綜上所述,我們選用的Nexys3 Spartan-6作為系統的主控制器。
- 2電源穩壓芯片的選擇
本系統中,Spartan-6主控制器。
解決方案:由于直流電機的功耗大,決定采用7.2V,2000mAh的電池為供電源,采用LM25xx系列單片集成開(kāi)關(guān)電源作為降壓芯片,可以提供大功率的輸出,轉換效率高,性能穩定。
- 3電機驅動(dòng)選擇
解決方案:采用BTS7960B搭建全橋驅動(dòng),可以滿(mǎn)足大功率的輸出,分別驅動(dòng)兩個(gè)電機。
驅動(dòng)模塊電路
- 攝像頭模塊的選擇
方案:采用數字攝像頭ov6620,控制簡(jiǎn)單,價(jià)格合適,信號穩定。
- 系統硬件設計
- 1車(chē)體模型
實(shí)物如下圖所示。
圖2 車(chē)體實(shí)際模型
攝像頭尋找黑線(xiàn),指引小車(chē)循跡,超聲波測距,指引小車(chē)自控速度。
- 2電源
其原理圖如圖三所示:
7.2V的輸入,穩定輸出5V
- 3Ov6620攝像頭傳感器模塊
OV6620 時(shí)序分析
OV6620的同步信號時(shí)序如下:場(chǎng)同步信號VSYN 為兩個(gè)正脈沖之間掃描一幀的定時(shí),即
完整的一幀圖像在兩個(gè)正脈沖之間;行同步信號HREF 掃描該幀圖像中各行像素的定時(shí),
即高電平時(shí)為掃描一行像素的有效時(shí)間;像素同步信號 PCLK為讀取有效像素值提供同步信
號,高電平時(shí)輸出有效圖像數據。下圖為OV6620 VSYN、HREF、PCLK三個(gè)同步信號之
間的時(shí)序關(guān)系:
VYNSC是判斷是否一幅圖像開(kāi)始,周期是 20ms, 其中高電平持續時(shí)間很短;HREF 是判
斷是否一行圖像的開(kāi)始,周期是 63us 左右,其中高電平持續時(shí)間為 40US,低電平持續
時(shí)間 23US,那么我們對照時(shí)序圖可以計算一下 OV6620 的分辨率:20ms/63us=317,
當然實(shí)際上沒(méi)有這么多,消隱和無(wú)效信號去掉之后只有 292行;有效的灰度數據是在行中
斷之后的上升沿內,所以不要在行中斷后的 23US 后采集。計算一下一行 OV6620 有多
少個(gè)點(diǎn): 40us/110ns=363, 消隱和無(wú)效信號去掉之后只有 356 個(gè)點(diǎn)。足以證明
OV6620的分辨率為 356*292。通過(guò)示波器觀(guān)察,PCLK 的周期只有 150ns,依照單片
機的總線(xiàn),根本無(wú)法捕捉到這個(gè)信號,此時(shí)PCLK 的波形已經(jīng)變?yōu)榧獠?,完全沒(méi)有意義捕捉
這個(gè)信號,采集圖像時(shí)盡快地一個(gè)點(diǎn)一個(gè)點(diǎn)的取就行了。
- 4直流電機驅動(dòng)
系統中采用了BTS7960B搭建全橋驅動(dòng),可以滿(mǎn)足大功率的輸出,分別驅動(dòng)兩個(gè)電機。
BTS7960B 的芯片內部為一個(gè)半橋。INH引腳為高電平,使能BTS7960。IN引腳用于確定哪個(gè)MOSFET 導通。IN=1 且INH=1 時(shí),高邊MOSFET 導通,OUT 引腳輸出高電平;IN=0 且INH=1 時(shí),低邊MOSFET 導通,OUT 引腳輸出低電平。SR 引腳外接電阻的大小,可以調節M(mǎn)OS管導通和關(guān)斷的時(shí)間,具有防電磁干擾的功能。
3.5下圖是由FPGA構建的最小嵌入式系統,是根據xilinx官方的EDK要求搭建的。
最小系統
4系統軟件設計
軟件設計主要分為三部分,第一部分是最小系統的搭建(軟件初始化),第二部分是外部硬件的驅動(dòng),第三部分是核心算法。
- 1最小系統的搭建(軟件初始化):
利用EDK工具,搭建最小的嵌入式系統。
- 2外部硬件驅動(dòng):
外部硬件驅動(dòng),選擇以IP核的形式添加到最小系統歷來(lái),用硬件描述語(yǔ)言編寫(xiě)驅動(dòng)核心代碼,然后軟件通過(guò)寄存器驅動(dòng)外部硬件。
- 3核心算法:
這部分是整個(gè)系統的核心,它的結構框圖如下圖所示:
圖10 軟件結構框圖
5系統調試和測試
調試過(guò)程:
5.1硬件平臺的方案測試
在EDK設計中,可以新建測試代碼,自動(dòng)生成測試代碼,通過(guò)串口打印驗證結果。
5.2 超聲波模塊的使用
在增加IP核過(guò)程中,需要根據超聲波的時(shí)序要求,用硬件描述語(yǔ)言描述驅動(dòng)的過(guò)程。
process(Bus2IP_Clk,slv_reg1,the_end)
begin
if slv_reg1=x00000000 then
counter=x00000000;
chao_out = 0;
div_clk=0;
elsif rising_edge(Bus2IP_Clk) then
if the_end = 1 then
chao_out = 1;
counter=counter+1;
if(counter=x1F4) then
counter=x00000000;
chao_out = 0;
div_clk=1;
end if;
end if;
end if;
end process;
-- implement slave model software accessible register(s) read mux
SLAVE_REG_READ_PROC : process( Bus2IP_Resetn,slv_reg_read_sel, slv_reg0, slv_reg1,Bus2IP_Clk,div_clk ) is
begin
case slv_reg_read_sel is
when 10 =>
if Bus2IP_Resetn = 0 then
timer_count = x00000000;
the_end = 0;
elsif div_clk=1 then
if slv_chao_in=1 then
the_end = 0;
timer_count = timer_count + 1;
else
slv_ip2bus_data = timer_count; --slv_reg0;
the_end = 1;
timer_count = x00000000;
end if;
else
slv_ip2bus_data = slv_reg0;
end if;
when 01 => slv_ip2bus_data = slv_reg1;
when others => slv_ip2bus_data = (others => 0);
end case;
end process SLAVE_REG_READ_PROC;
5.3 PWM模塊的調試
由于需要兩路的PWM來(lái)分別操作舵機和直流電機,所有PWM的調試時(shí)至關(guān)重要的。
代碼如下:
int main()
{
unsigned long i,j;
//close PWM
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_0_BASEADDR,0,0x00); //PWM0
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_1_BASEADDR,0,0x00); //PWM1
for(i=0;i=99999;i++);
PWM_deal(0x2E);
while(1)
{
PWM_deal(0x2E);
delay(60);
PWM_deal(0x38);
delay(60);
PWM_deal(0x2E);
delay(60);
PWM_deal(0x24);
delay(60);
}
return 0;
}
void PWM_deal(unsigned char reg0)
{
//PWM0 舵機
//PWM 頻率
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_0_BASEADDR,0,0x1F4);
//PWM 占空比
PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_0_BASEADDR,0,reg0);
//PWM1 直流電機
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_1_BASEADDR,0,0x1F4); //
PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_1_BASEADDR,0,reg0); //slv_reg0
}
評論