智能車競賽技術報告 |單車拉力組 - 大理工大學- 基於串級控制的智能循迹自形成研究

卓晴 2021-09-01 02:40:54 阅读数:615

智能 拉力 大理 理工大 理工

學 校:大連理工大學 
隊伍名稱:銀龍隊  
參賽隊員:朱煬爽  
鬱東輝  
張婧宜  
帶隊教師:吳振宇 李勝銘

 

§引 言


隨著電子科技的不斷發展,越來越多的自動化設備開始進入到人們的生產生活中,嵌入式的迅猛發展為智能研究提供了更廣闊的平臺。在工業生產、科學探索、救灾搶險、軍事等方面,人工智能發揮著越來越重要的作用,在此背景下,智能控制策略變得尤為重要。

全國大學生杯智能汽車競賽是國家教學質量與教學改革工程資助項目,以恩智浦半導體公司生產的16、32比特單片機為核心控制模塊,通過增加道路傳感器、電機驅動電路以及編寫相應程序,制作一個能够自主識別道路的汽車模型。因而該競賽是涵蓋了智能控制、模式識別、傳感技術、汽車電子、電氣、計算機、機械等多個學科的比賽,對學生的知識融合和實踐能力的提高,具有良好的推動作用。

本文采用第十六届全國大學生智能車競賽的汽車模型作為研究平臺,以16比特單片機STC16F40K128作為主控制單元,運用Keil軟件作為開發工具進行智能控制策略研究。
道路信息檢測模塊普遍采用電感線圈和矯正電容組成電磁傳感器。本届車模為電單車,前後輪縱向布置,前輪通過舵機控制轉向,後輪通過電機提供動力。

在電源模塊設計中,采用TI公司開關電源芯片TPS5430和線性穩壓電源芯片TPS7350分別產生6v5v電壓,5v為編碼器供電;采用TPS7333作為穩壓3.3V輸出,為單片機、模數轉換、串口通信模塊供電。單片機軟件算法部分為本文論述的重點,主要體現了智能車的串級PID控制策略,完成對單車的平衡及轉向控制,取得靜態指標和動態性能的雙贏。

本篇技術報告將從智能車機械結構、硬件電路、軟件算法和調試方法等方面詳細介紹整個准備過程。

 

第一章 案設計


本章主要介紹智能汽車系統總體方案的選定和總體設計思路。

1.1 系統總體方案的選定

本届智能汽車比賽,我隊為單車拉力組別。在循迹傳感器方面,選用了電磁傳感器,電磁放大電路使用了TI公司的軌到軌運算放大器OPA2350。在速度控制方面,用AS5040磁性傳感器進行測速,進行速度閉環反饋,具有噪聲小的優點。陀螺儀使用ICM42605采集三軸角速度、加速度數據,通過互補濾波解算得到角度信息。

1.2 系統總體方案的設計

系統的硬件電路采用一體板的設計方式,小巧、緊密,保證單車機械結構的輕巧。設計上使用四層板設計,並對電源地進行合理分割,保證硬件電路的整體穩定性以及各功能模塊的性能。

主控部分:

包括一片STC16F40K128核心控制器和一片AD7606模數轉換芯片以及用於輔助操作調試的按鍵、OLED、撥碼器件,調試接口預留串口接口,外接HC-25 wifi模塊,方便調試與接受數據。

輔助調試器件包括一個蜂鳴器,一個0.96OLED屏,四個按鍵和一個四聯撥碼,用於指示工作狀態、GUI菜單操作修改參數以及選擇預制檔比特等功能。

電機驅動部分:

電機驅動器采用mos管搭建H橋電路,具有電路簡單、驅動電流大、響應快的特點,可靠耐用。使用栅極驅動器IR2184驅動,控制信號通過74HC02D進行信號變換輸出給IR2184驅動H橋工作。測速留出6Pin 正交信號磁編碼器接口,通過D觸發器74HC74對AB相信號處理得到方向信息。

電源部分

主要包括8.4V6V降壓、5V穩壓電路、外設和MCU3.3V穩壓電路和舵機電源電路。其中由於舵機擺角時瞬時功率較大同時對電源紋波要求並不嚴格,選用TPS5450開關電源供電。外設和單片機選用線性電源供電,所有5V外設均采用TI公司的高性能線性穩壓器TPS7350進行供電,而3.3V使用一片TPS7333穩壓。

電磁信號采集放大板部分:

系統采用6.8nF電容和10mH電感配對采集電磁導引信號,經過TI公司高性能軌到軌放大器OPA2350放大後,進行倍壓整流,得到波動較小的直流電壓信號,並通過AD7606進行5通道同步采樣進行adc采集,使用SPI通信方式與MCU通信。

 

第二章 械結構調整與優化


智能汽車各系統的控制都是在機械結構的基礎上實現的,因此在設計整個軟件架構和算法之前一定要對整個模型車的機械結構有一個全面清晰的認識,然後建立相應的數學模型,從而再針對具體的設計方案來調整賽車的機械結構,並在實際的調試過程中不斷的改進優化和提高結構的穩定性。本章將主要介紹K車模的機械結構和調整方案。

2.1 智能汽車車模的選擇

本届比賽單車拉力組我們使用K車模。

▲ 圖2.1 智能車K車模

▲ 圖2.1 智能車K車模

2.2 智能汽車傳感器的安裝

車模中的傳感器包括有:速度傳感器(霍爾測速),電磁傳感器。下面分別介紹這些傳感器的安裝。

2.2.1 速度傳感器的安裝

速度編碼器我們采用了AS5040磁性傳感器,安裝方法如下:

將後車車輪軸處用AB膠沾上磁鐵,將磁性傳感器對准磁鐵,當車軸帶動磁鐵轉動時,磁性傳感器會切割磁力線產生方波用於測速。

安裝時應注意調整好齒輪間隙。同樣的,電機齒輪與車輪的咬合也很重要。齒輪傳動機構對車模的驅動能力有很大的影響。齒輪傳動部分安裝比特置的不恰當,會大大增加電機驅動後輪的負載,會嚴重影響行駛。調整的原則是:兩傳動齒輪軸保持平行, 齒輪間的配合間隙要合適,過松容易打壞齒輪,過緊又會增加傳動阻力,浪費動力;傳動部分要輕松、順暢,不能有遲滯或周期性振動的現象。判斷齒輪傳動是否良好的依據是,聽一下電機帶動後輪空轉時的聲音。聲音刺耳響亮,說明齒輪間的配合間隙過大,傳動中有撞齒現象;聲音悶而且有遲滯,則說明齒輪間的配合間隙過小,或者兩齒輪軸不平行,電機負載變大。調整好的齒輪傳動噪音很小,並且不會有碰撞類的雜音,後輪减速齒輪機構就基本上調整好了,動力傳遞十分流暢。

2.2.2電磁傳感器的安裝

為了采集到更多的賽道信息,電磁傳感器擺放比特置為車頭5個電磁傳感器,3個橫放,2個豎放。將電磁前瞻固定於單車前方20cm遠、15cm高的比特置。 。2.3.1 電路板的安裝
為了使智能車具有較好的穩定性,我們在搭建智能車時將一體板放到了K車的後座上,並用熱熔膠和尼龍柱牢固地固定到了車體上。

2.3.2 電池安放

為了方便,將電池放到了K車電池倉內。

2.4 其他機械結構的調整

另外,在模型車的機械結構方面還有很多可以改進的地方,其中最重要的是機械重心的調整。K車設計上質量分布不均勻,左邊要重於右邊。我們通過不斷嘗試,使左右質量分布接近一致,取得了較為接近的左右轉性能。

2.5 小結

模型車的性能與機械結構有著非常密切的聯系。良好的機械結構是模型車提高速度的關鍵基礎。在同等的控制環境下,機械機構的好壞對其速度的影響十分顯著。我們非常重視對智能汽車的機械結構的改進,經過大量的理論研究和實踐,我們小車的左右質量分布均勻,重心集中車模低比特,達到左右轉性能接近的效果,在高低速下均能取得不錯的控制,從而提高了小車整體的穩定性和可靠性。

 

第三章 件電路方案設計


本系統的硬件電路采用模塊化設計方式。主要包括單片機最小系統模塊、電源模塊、電磁信息采集模塊、測速模塊、顯示模塊等部分。

3.1 單片機最小系統模塊

本設計的核心控制器為宏晶公司生產的16比特單片機STC16F40K128,該單片機具有64引脚,具有豐富的系統資源和方便的外部電路接口,其中包括UART模塊,定時中斷模塊,IIC模塊,RAM存儲器,FLASH存儲器,EEPROM存儲器、PWM 模塊。

3.2 電源模塊

3.2.1 電池使用

電源模塊是系統穩定工作的基礎,因此,電源模塊輸出電壓和電流的穩定性在整個智能車系統中起著非常重要的作用。

電池采用3300mah 2s航模電池,該類型電池具有高效的利用率和穩定的性能,一直被作為各種航模、電動車等的供電設備。為了獲得最高的性能和最長的壽命,該充電電池必須以正確的方法來使用。

電池通常電流高,電池的爆發力會强些,但未必如電流低時飽滿。同時我們也
必須注意充電電流不能過高,當電流過高時,不僅不能提高電池性能,反而會損壞電池,嚴重時會導致電池起火、爆炸。電池充滿電時,電壓大約為8.4V。在電池壓小於7.2V時,應注意及時充電,電池過放會對其造成不可逆轉的損害,電壓低於7.2V會對電池造成毀滅性傷害。

3.2.2 穩6V電源模塊

使用TI公司開關電源TPS5430降壓到6V供舵機使用。電路原理圖如3.1所示。

▲ 圖3.1 6V穩壓電路圖

▲ 圖3.1 6V穩壓電路圖

3.2.3 穩5V電源模塊

由於霍爾傳感器的額定工作電壓為5VTPS7350TI公司生產的高性能線性穩壓芯片,其使用方便,電路的設計原理如圖3.2所示。
▲ 圖3.2 5V穩壓電路圖

▲ 圖3.2 5V穩壓電路圖

3.2.4 穩3.3V電源模塊

由於單片機的額定電壓為3.3V,串口通信也均為3.3V,因此,將電壓穩定在3.3V並給各模塊供電是必不可少的。電路的設計原理如圖3.3所示。

▲ 圖3.3 3.3V穩壓電路圖

▲ 圖3.3 3.3V穩壓電路圖

3.3 電機驅動模塊

本智能車系統車模的電機型號較小,對電機驅動的輸出電流的要求並不苛刻,因此本設計的驅動電路由4mos管構成H橋。通過控制4MOS管的導通和關斷來實現正反轉,並通過控制輸入的PWM波的占空比來調節電機兩端的平均電壓,達到控制電機的轉速的目的,具體電路圖如圖3.4所示。

▲ 圖3.4 電機驅動MOS管驅動H電路

▲ 圖3.4 電機驅動MOS管驅動H電路

▲ 圖3.5 信號變換與隔離電路

▲ 圖3.5 信號變換與隔離電路

3.4 電磁檢波模塊

使用軌至軌運算放大器對電感電容對諧振得到的電磁信號進行放大檢波處理。具體電路圖如圖3.5所示。

▲ 圖3.6 串口通信電路

▲ 圖3.6 串口通信電路

3.5 AD7606 模數轉換

AD7606數模轉換芯片最高采樣頻率200Khz8通道同步采樣,同時還可以設置2倍、4倍、8倍、16倍、32倍、64倍過采樣,相當於做了硬件上的平滑濾波。AD7606通過SPI接口與單片機通信。

▲ 圖3.7 AD7606模數轉換電路圖

▲ 圖3.7 AD7606模數轉換電路圖

 

第四章 車的控制方法


類比於直立車直立環、速度環和方向環的三環控制,單車采用角速度環和角度環串級作為直立環,並且將循迹環疊加到角速度環中控制單車的轉向,這樣的控制方法內環角速度環可保證轉彎的及時,外環角度環又能保持車的直立姿態讓其不倒。

單車的運動控制是一個欠驅動系統,按照單車的運動模型,後輪電機速度對單車的直立環也會產生影響,速度越快,則向心力越大,所以不同速度下單車傾角所對應的前輪舵機打角也不同。假設在勻速狀態下的參數正好適合,我們想到可以配合加减速來輔助直立環,在單車過彎道時减速,過彎後及時加速使單車回正,這樣的策略可以讓單車在過彎時起到壓彎的效果。

4.1 PID控制

【通用原理部分,此處省略3000字...】

4.2 單車平衡與轉向控制

4.2.1 單車平衡原理

將自行車機器人看成由前輪、後輪以及車架所組成,並假設系統所有的質量都集中於質心上,根據質點系相對於動軸的動量矩定理,建立起自行車機器人的動力學方程,得到其單輸入單輸出系統的線性化模型。

▲ 圖4.2 自行車機器人系統簡化結構示意圖

▲ 圖4.2 自行車機器人系統簡化結構示意圖

自行車機器人系統的結構參數如圖4.2所示。將自行車的前後輪與地面的接觸點記為 P 2 P_2 P2 P 1 P_1 P1,兩觸點間形成一條接觸線 P 2 P 1 P_2 P_1 P2P1 P 2 P 1 P_2 P_1 P2P1與x軸之間的夾角定義為偏航角Ψ, P 2 P 1 P_2 P_1 P2P1的距離記為w。假定質心高度為h,質心在水平面上的投影點與 P 1 P_1 P1的距離記為b。車體與z軸的夾角記為傾斜角Φ,前輪的擺角記為操縱角δ。

▲ 圖4.3 自行車機器人結構俯視圖

▲ 圖4.3 自行車機器人結構俯視圖

自行車機器人結構的俯視圖如圖4.3所示。設自行車機器人在水平面內作平面運動,分別作點P1和P2的速度垂線並相交於Q點,Q點即為接觸線在水平面內作平面運動時的速度瞬心。設車體質量為m,自行車相對於接觸線P2P1的轉動慣量為J,後輪的速度為V。由此,得到自行車機器人做平面運動時的角速度和加速度分別為


自行車機器人的質心在水平面的投影點繞點Q轉動,得到其速度Va,切向加速度ar,法向加速度an的錶達式分別為


系統所受的牽引慣性力為切向牽引慣性力和法向牽引慣性力的矢量和,其大小為


依據剛體繞定軸轉動微分方程 J ∗ α = ∑ M i J * \alpha = \sum\limits_{}^{} {M_i } Jα=Mi,得到系統動力學方程為

當車體豎直時,可以認為各角度均為小量,即可得到系統的線性化模型為

4.2.2 單車平衡的穩定性分析與仿真

由4.2.1推導得出的系統線性化模型進一步分析,其開環傳遞函數為


可知系統的零點為 − V / b - V/b V/b,極點為 ± g / h \pm \sqrt {g/h} ±g/h ,在s域的右半平面始終存在一個極點,故開環系統不穩定。對該系統構造簡單比例反饋閉環系統,令 δ = − k ϕ \delta = - k\phi δ=kϕ,得到此時閉環系統的特征方程為

計算得出閉環系統特征根為

由此得到使得特征根比特於s平面左側時的反饋系數k與車速V的關系不等式為

依據上式,定性得到了車速越大時閉環系統所需反饋系數越小的規律,反映在控制過程中,即車速越大時為了保持車身直立所需要的車把轉動角度就越小。

進一步對控制模型進行修正與完善,將車體看成由四個剛體即車架、前輪、後輪、車把組成,考慮後輪轉速、前輪轉角對自行車平衡控制過程中的貢獻,即後輪車速、前輪轉角與車體橫滾角之前的定量關系。利用matlab對所建立的動力學方程進行仿真分析如下

▲ 圖4.4 車身橫滾角度一定時後輪轉速與前輪轉角的關系

▲ 圖4.4 車身橫滾角度一定時後輪轉速與前輪轉角的關系

保持車身橫滾角一定時,後輪轉速與前輪轉角的關系如圖4.4所示。車速越慢,保持一定車身橫滾角所需要的前輪轉角就越大,反之則越小。並且,車速越慢,所能維持穩定動平衡的車身橫滾角就越小。

▲ 圖4.5 後輪轉速一定時車身橫滾角度與前輪角度的關系

▲ 圖4.5 後輪轉速一定時車身橫滾角度與前輪角度的關系

保持後輪轉速一定時,車身橫滾角度與前輪轉角的關系如圖4.5所示。一定範圍內,車身橫滾角越大,所需要的前輪轉角就越大。且隨著車速的提高,維持相同的車身橫滾角所需要的前輪轉角就越小。

4.2.3 單車平衡與轉彎

自行車機器人的轉向控制通過改變目標平衡傾角從而改變車身動態平衡時的平衡姿態,做平面圓周運動。其轉彎半徑值由舵機打角、目標平衡傾角來决定。後輪轉速則影響了最大的平衡傾角以及一定平衡傾角下舵機打角值從而改變了轉彎半徑大小。而後輪速度、舵機打角、車身傾角與轉彎半徑之間的關系為一個比較複雜的非線性關系。

實際調試中發現,在小傾角情况下,平衡控制效果。但是在左右轉向時呈現出了一個極為明顯的左右轉不對稱性,分析為自行車機器人的自身質量分布不均勻引起的。觀察發現,龍邱汽車電子提供的K車模自身結構存在一個不對稱的設計,即後輪電機沒有居中放置而是偏右,從而使得車的重心偏右,引起轉彎性能不對稱的現象。

▲ 圖4.6 車速一定,不同傾角下對應轉彎曲率關系

▲ 圖4.6 車速一定,不同傾角下對應轉彎曲率關系

如圖4.6所示,保持車速一定,改變車身目標傾角時記錄車做穩定圓周運動時的半徑的倒數即曲率大小。車身機械中值為3.7,左轉時目標傾角正向增大,右轉時目標傾角反向减小。分析發現,目前車身質量分布具有較大的不對稱性,錶現為左轉時轉彎半徑的變化率是右轉時的兩倍左右,即相對於車身機械中值左右偏離相同傾角下,左轉的轉彎半徑較右轉時的要更小。

通過添加配重塊可以一定程度上改善由車模本身質量分布不均勻引起的左右轉彎性能不對稱的問題。

除了左右轉彎性能不對稱的問題,單車的直立控制只采用PD控制,不引入I項,便會存在一個靜態誤差,實際傾角往往會大於目標傾角,但是由於I項的慣性,在高速時便容易引起單車直立環發散,對此我們先采集數據,得到單車實際傾角與舵機打角的關系,然後在最終控制器的輸出值疊加上這個擬合值,基本可以實現實際傾角與目標傾角相貼合,並且單車的直立環不會發散。

單車的直立控制配合上電機速度的加减速便可輔助單車的轉向,單車的加减速同樣采用PID控制器,輸入單車的實際傾角與目標傾角的差值,若實際傾角小於目標傾角則减速,反之則加速,這樣不但可以輔助單車的平衡,而且實際循迹的過程中可以達到入彎减速,出彎加速,達到過彎壓彎的效果。

4.3 單車循迹

實現車模方向控制是保證車模沿著競賽道路比賽的關鍵,這裏采用PD控制,單車是采用電磁循迹,我們使用兩個水平電感的差比和作為單車距離賽道的偏差值,但是實際發現當車遠離賽道一定比特置時,差比和會出現先增大後减小的現象,於是我們通過中間的水平電感找到差比和突變的臨界點,並且在這個比特置保持差只能增大,這樣就對差比和做了一個矯正,保持單車遠離賽道時差比和只會越來越大。

再將得到的差比和值代入PD控制器,得到單車轉向的大小。將循迹環的輸出放到轉向環的輸入,即疊加到角速度環的目標值,即可實現單車循迹。

4.4 單車慢速運動控制

單車拉力組今年除了要競速以外,還增加了慢賽道,這個時候需要以慢取勝,單車與其他組別不同,當速度减慢時,單車的平衡便成了一個棘手的問題。與高速時所采用的內外環PD控制加上角度與舵機打角的擬合的策略不同,這個時候利用擬合便不能調節得那麼精細,所以我們慢速時內外環都采用PID控制器,此時單車轉彎的傾角只能限制在一個小範圍內。在循迹時單車容易出現抖動,而且會有一個低頻的晃動,容易發散,循迹時則需要給一個很小的P項配合一個相對較大的D項,這樣便可抑制單車的抖動。

 

第五章 發調試


5.1 開發工具

我隊成員自主設計開發適合攝像頭、光電組別的上比特機。大體功能如下:

5.1.1 串口功能

▲ 圖5.1 串口功能界面圖

▲ 圖5.1 串口功能界面圖

1、普通查看接收功能

選擇串口號,和波特率。默認串口號比特所有可以使用的串口中號碼最小的,默認波特率比特115200(考慮速度和誤碼率確定為115200),然後選擇"打開串口"。

2、普通發送功能

必須打開串口此功能才能用。有"顯示發送了多少字節"功能,“清空顯示"功能,還可選擇"包含換行符”,"16進制發送"功能。

3、直接發送字節功能

4、藍牙調試功能

使用此功能必須打開串口,然後"使能藍牙調試"框勾選。
注意:

  • AT+BAUD:後邊是1,2,3,4,5,6,7等。4代錶9600bps,8代錶115200bps
  • AT+NAME:可以是英文或者數字組合。
  • AT+NAME:可以是英文或者數字組合。
  • AT+ROLE:後邊是0,1。0是從機,連接單片機,1是主機,連接電腦。

5.1.2 畫圖功能

▲ 圖5.2 畫圖功能界面

▲ 圖5.2 畫圖功能界面

單片機程序:

//K60程序:
//1.所用數據
static unsigned char i,j; //循環需要
static unsigned short int send_data[3][8]={
{
0},{
0},{
0}};
//上比特機可以接收三組八條曲線,每條曲線代錶一個16比特的變量。
static unsigned char send_num[3]={
3,0,0};
//2.將想發的數據賦值給send_data,正負均可,只要把代碼中10,20,30,40-10-20-30-40變成想發送的全局變量即可,不發的數據要注釋。
send_data[0][0]=(unsigned short int)(10);
send_data[0][1]=(unsigned short int)(20);
send_data[0][2]=(unsigned short int)(30);
send_data[0][3]=(unsigned short int)(40);
send_data[0][4]=(unsigned short int)(-10);
send_data[0][5]=(unsigned short int)(-20);
send_data[0][6]=(unsigned short int)(-30);
send_data[0][7]=(unsigned short int)(-40);
send_data[1][0]=(unsigned short int)(100);
send_data[1][1]=(unsigned short int)(200);
send_data[1][2]=(unsigned short int)(300);
send_data[1][3]=(unsigned short int)(400);
send_data[1][4]=(unsigned short int)(-100);
send_data[1][5]=(unsigned short int)(-200);
send_data[1][6]=(unsigned short int)(-300);
send_data[1][7]=(unsigned short int)(-400);
send_data[2][0]=(unsigned short int)(10000);
send_data[2][1]=(unsigned short int)(20000);
send_data[2][2]=(unsigned short int)(30000);
send_data[2][3]=(unsigned short int)(40000);
send_data[2][4]=(unsigned short int)(-10000);
send_data[2][5]=(unsigned short int)(-20000);
send_data[2][6]=(unsigned short int)(-30000);
send_data[2][7]=(unsigned short int)(-40000);
//3.以下不用改了,這三幅圖的字頭,start的前兩個字母
uart_putchar(uratn,'S');
uart_putchar(uratn,'T');
//4.發送數據
for(i=0;i < 3;i++)
for(j=0;j < send_num[i];j++)
{

uart_putchar(uratn,send_data[i][j]);
uart_putchar(uratn,send_data[i][j]>>8u);
}
}

 

第六章 模主要參數


6.1 智能汽車外形參數

經過改裝後,智能汽車的外形參數為:

  • 車A:
  • 車長:300mm;車寬:200mm;車高:150mm;車重:1kg

6.2 智能汽車技術參數

智能汽車相關技術參數如錶6.1所示:

項目 參數
車模軸距 輪距(毫米) 200 140
車模平均電流(勻速行駛)(毫安) 300
電路電容總量(微法) 800
傳感器種類及個數 測速編碼器 一個
LC電磁傳感器 五個
陀螺儀 一個
新增加伺服電機個數 0
賽道信息檢測空間精度(毫米) 10
賽道信息檢測頻率(次 秒) 150

 


在這份報告中,我們主要從智能車機械結構、硬件電路、控制算法等方面介紹准備比賽的整個過程,針對單車拉力組別做出了很多改進,創新之處大體歸為以下兩點:

1、ADC采集方案的改進:我隊並未使用單片機自帶的ADC模塊,而是使用一款高性能的模數轉換芯片AD7606,同時制作穩定的參考電壓,實現多通道高精度同步采樣,同時這款芯片還可以設置不同倍數的過采樣實現硬件均值濾波,這樣减少了軟件上的工作量,同時更加可靠,采樣精度更高。。

2、直立算法上將原先的單級PID改進為串級PID,內環為角速度環,外環為角度環,在高速和低速下均取得了較好的控制效果。
智能車是培養大學生綜合動手能力的一個很好的且成熟的平臺,在這裏每個人都會學有所得,做有所獲,懂得團隊的重要性,學會合作分工,找到自己擅長的一面,彌補自己的不足,在歡笑與痛苦中與隊友一同成長。

希望這篇技術文檔會對未來參與智能車這項比賽的同學有所幫助!

 

考 文 獻


[1] 童詩白,華成英.模擬電子技術基礎[M].北京. 高等教育出版社.2000
[2] 邵貝貝. 嵌入式實時操作系統[LC/OS-Ⅱ(第2版)[M]. 北京.清華大學出版社.2004
[3] 閻石.數字電子技術基礎[M].北京:高等教育出版社,1998.
[4] 雷霏霖,梁志毅.基於CMOS傳感器 OV7620 采集系統設計[J].電子測量技術,2008,12(31):110-112.
[5] 譚浩强.C程序設計[M].北京:清華大學出版社,2005.
[6] 郭芳,曹桂琴.數據結構基礎[M].大連:大連理工大學出版社,1994.
[7] 邵貝貝.單片機嵌入式應用的在線開發方法[M].北京:清華大學出版社,2004.
[8] 胡壽松.自動控制原理(第六版)[M].科學出版社,2014.
[9] 張文春.汽車理論[M].北京.機械工業出版社.2005
[10] YUAN Quan,ZHANG YunZhou,WU Hao,et al. Fuzzy Control Research In The Courses Of Smart Car[C]. Machine Vision and Human-Machine Interface (MVHI), Kaifeng,China, 2010: 764-767.
[11] 侯虹.采用模糊PID控制律的舵機系統設計[J].航空兵器,2006,2(1):7-9.
[12] 孫浩,程磊,黃衛華,等.基於HCS12的小車智能控制系統設計[J].單片機與嵌入式系統應用,2007,03(16):51-54.
[13] LU Zhenlin,LI Jingjiao,Zhang Minghui.Intelligent Control Research based on the Smart Car[C]. Advanced Computer Control (ICACC),Shenyang,2010:292-297.

 

錄 ※


附錄A:程序源代碼

//直立環
#define I_COUNT_MAX 500
//int motor_target_add=0;
#define motor_P 40
#define motor_I 1
#define motor_D 0
#define motor_balance_P_l 2
#define motor_balance_P_l_dec 1
#define motor_balance_P_r -2
#define motor_balance_P_r_dec -1
#define motor_add_max 6
#define motor_add_min -4
struct PID idata pid;
float idata speed;
//struct PID gyro0;
//初始化直立環模糊PID結構體
//struct FUZZY_PID_t fuzzy_pid0;
void balance_pid(float turn)
{

float idata servo_bias,gyro_bias;
static float idata last_output=0,last_g_output=0;
// static int idata ms50_count=0;
static float servo_bias_last,gyro_bias_last;
static float servo_integration;
static float gyro_integration;
float actual;
// ms50_count++;
//servo_bias = ACC_GYRO_Ang_Y - pid.balance_init0-turn;
servo_bias = Pitch - pid.balance_init0-turn;
servo_integration+=servo_bias;
// if(turn>4&& turn-Pitch>2.5)
// pid.balance_P=-16;
// else
// pid.balance_P=-10;
if(servo_integration>600)
servo_integration=600;
else if(servo_integration<-600)
servo_integration=-600;
// if(ms50_count>=5)
// {

pid.output= pid.balance_P * servo_bias + pid.balance_I * servo_integration + pid.balance_D * (float)gyro[0]/16.4+center.result;
// if(pid.output-last_output>50)pid.output=last_output+50;
// else if(pid.output-last_output<-50)pid.output=last_output-50;
//
// last_output=pid.output;
// ms50_count=0;
// }
// else
// pid.output= pid.balance_P * servo_bias + pid.balance_I * servo_integration + pid.balance_D * (float)gyro[0]/16.4;
gyro_bias = pid.output - (float)gyro[0]/16.4;
// if(Pitch>2.5)
// actual=40*(Pitch-2.5)+10;
// else if(Pitch<0.5)
// actual=27*(Pitch-0.5)-10; //; 1.52*Pitch*Pitch*Pitch
// else
// actual=10*Pitch - 15;
// if(Pitch>2.2)actual=50*Pitch-110; //; 1.52*Pitch*Pitch*Pitch
// else actual=23.3*Pitch-47.9;
// if(Pitch>0.7)actual=20*Pitch-14; //; 1.52*Pitch*Pitch*Pitch
// else
//actual=20*Pitch;
// if(Pitch>3)actual=8*Pitch-24; //; 1.52*Pitch*Pitch*Pitch
// else actual=8*Pitch-24;
// //actual=30.337*Pitch-24.154;
// if(actual>300)actual=300;
gyro_integration+=gyro_bias;
if(gyro_integration>600)
gyro_integration=600;
else if(gyro_integration<-600)
gyro_integration=-600;
key.servo_pwm = pid.outside_P * gyro_bias +pid.outsise_I*gyro_integration+ pid.outside_D * (gyro_bias - gyro_bias_last);
gyro_bias_last = gyro_bias;
// if(key.servo_pwm-last_g_output>20)key.servo_pwm=last_g_output+20;
// else if(key.servo_pwm-last_g_output<-20)key.servo_pwm=last_g_output-20;
// last_g_output = key.servo_pwm;
servo_duty((unsigned short)((short)key.servo_pwm+970));
}
int motor_balance_pid(float turn)
{

int motor_target_add=0;
float motor_bias;
motor_bias = Pitch - pid.balance_init0-turn/15;
if(turn>0.0)
{
 //大於0,左轉
if(motor_bias<0)
motor_target_add =(int) motor_balance_P_l_dec * motor_bias ;
else
motor_target_add =(int) motor_balance_P_l * motor_bias ;
}
else if(turn<0.0) //小於0,右轉
{

if(motor_bias<0)
motor_target_add =(int) motor_balance_P_r * motor_bias;
else
motor_target_add =(int) motor_balance_P_r_dec * motor_bias;
}
else //等於0,直行
motor_target_add=0;
//加减速限幅
if(motor_target_add > motor_add_max)
motor_target_add = motor_add_max;
if(motor_target_add < motor_add_min)
motor_target_add = motor_add_min;
return motor_target_add;
}
//轉向環
float get_center()
{

/*差比和邊緣補救*/
if(ADC_3<11000) //當至少一個電感進入差比和曲線誤差區時進入過濾程序
{

if(abs(ADC_5-ADC_4)>fabs(center.diff)) //濾掉電感差值開始减小時的情况
{

if((ADC_5-ADC_4)*center.diff>=0) //濾掉電感差值正負的突變
{

center.diff=(float)ADC_5-(float)ADC_4; //以上條件均符合才更新差項,否則差項仍保持上次的值
}
}
}
else
{

center.diff=(float)ADC_5-(float)ADC_4; //正常情况下正常更新差項
}
center.sum=(float)ADC_5+(float)ADC_4;
center.error_bias=100*center.diff/(center.sum+1);
// center.error_bias=(float)(30000-ADC_3)/100;
// if(ADC_5-ADC_4>0)
// center.error_bias*=-1;
center.result=center.center_P*center.error_bias+center.center_D*(center.error_bias-center.error_bias_last);
if(center.result>150)
center.result=150;
else if(center.result<-150)
center.result=-150;
center.error_bias_last=center.error_bias;
return center.result;
}

附錄B:原理圖總圖




● 相關圖錶鏈接:

版权声明:本文为[卓晴]所创,转载请带上原文链接,感谢。 https://car.inotgo.com/2021/09/20210901004140289N.html