令狐昌偉
(湖南汽車工程職業學院,湖南 株洲 412000)
近年來,隨著汽車保有量的提高,汽車行駛安全越來越受大家的關注,車外后視鏡所反饋的信息對駕駛員駕駛汽車的安全性也越來越重要。據統計,中國因汽車后視鏡反饋信息不準確而造成的交通事故占交通事故總數的30%,因此,車外后視鏡角度調節成為了汽車必不可少的裝置之一,隨著汽車行業的不斷發展,后視鏡角度調節從最初的手動到現在的電動控制,給駕駛員對車外信息的捕捉帶來了很大的便利。
本設計主要由信號輸入裝置、控制裝置、執行裝置三大部分組成。信號輸入裝置主要是通過搖桿電位器、LM393組成的信號檢測裝置組成,控制裝置是采用了STM32F103做為主控芯片,主要是將輸入信號進行數據處理,從而控制執行裝置中的兩個電機實現正轉與反轉功能。系統結構框圖如圖1所示。

圖1 設計框圖
STM32F103C8T6單片機最小系統電路包括系統供電電路、系統復位電路、時鐘電路等,它是保證單片機能夠正常工作的基本電路,電路如圖2所示,時鐘電路由晶振Y1和起振電容C1、C2組成的系統待機低功耗時鐘,另外由Y2、C3、C4和R2晶振電阻組成,該時鐘主要用于外部高頻,PLL倍頻等。復位電路由電阻R3、電容C5和按鍵S1組成,按下S1鍵時可以實現手動復位。

圖2 最小系統圖
搖桿是作為用戶輸入操作的元器件,但其本身只是個電位器,所以需要配合外部電路組合成一個比較電路,從而獲得用戶輸入的行為值。在本設計的搖桿輸入模塊里,采用的是LM393和可調電位器組成的比較輸出電路,具有靈敏度可調性和輸出準確性。搖桿電位器的電壓值與調整好的比較電壓值進行比較,檢測出目前搖桿所處的具體位置,根據OUT1和OUT2來決定步進電機1的動作,OUT3和OUT4來決定步進電機2動作,如此即可根據兩個步進電機的正反轉來控制汽車外后視鏡的旋轉角度。信號比較檢測電路如圖3所示。

圖3 信號比較檢測電路
ULN2003是集成達林頓管IC,內部還集成了消線圈反電動勢的二極管,是一個雙列直插式16腳封裝IC,最大驅動電壓可達50V,電流可達500mA,輸入電壓為5V,適用于TTL、COMS電路,它具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應于各類要求高束大功率驅動的系統。
步進電機,我采用了四相小步進電機來帶動后視鏡。主要是因為采用頻進電機的最大的好處是路程長度可以精確控制,而具不易出現打滑的現象。我們為電機提供了單極性直流電源,在控制時,只需對各相繞組按合適的時序通電,即可使步進電機按我們的需要轉動。步進電機驅動電路如圖4所示。

圖4 步進電機驅動電路
本設計主要包括了主程序、輸入檢測、輸出檢測和步進電機控制程序組成。通過控制步進電機1和步進電機2來完成對后視鏡的角度調節。步進電機1正轉時后視鏡向北偏轉,反轉時向南偏轉,步進電機2正轉時后視鏡向東偏轉,反轉時向西偏轉,當步進電機1和2同時正轉時,后視鏡可向東北方向偏轉,步進電機1正轉,2反轉時,即可向西北方向偏轉,以此類推,可以控制東南和西南方向的偏轉控制。要實現上述控制功能,需要進行如下程序設計,詳見圖5。

圖5 程序設計
主程序的基本設計思路是將搖桿電位器所傳來的電壓信號通過輸入信號檢測電路進行比較輸出,如果電位器處于中心位置時,搖桿電位器中心輸出電壓為2.35V,單片機將依據電壓信號對搖桿電位器置0信號進行檢測,判斷是否需要控制電機運轉,如得到搖桿電位器處在非0位置,則會將此時比較器輸出的電壓信號作為步進電機的驅動指令信號,該信號送入STM32單片機中進行處理,通過數據處理后將該指令經單片機輸出送給步進電機驅動電路,從而控制步進兩個步進電機實現正反轉,最終使得后視鏡的角度發生變化。如圖5所示。
通過不斷的對搖桿位置判斷直至檢測置0,步進電機停止。
輸入檢測所采用的是位帶操作,直接讀取寄存器狀態,代碼如下。
#define GPIOA_OOR_Addr (GPIOA_BASE+12)
#define GPIOB_OOR_Addr (GPIOB_BASE+12)
#define GPIOC_OOR_Addr (GPIOC_BASE+12)
#define GPIOD_OOR_Addr (GPIOD_BASE+12)
#define GPIOE_OOR_Addr (GPIOE_BASE+12)
#define GPIOF_OOR_Addr (GPIOF_BASE+12)
#define GPIOG_OOR_Addr (GPIOG_BASE+12)
#define GPIOA_OOR_Addr (GPIOA_BASE+8)
#define GPIOB_OOR_Addr (GPIOB_BASE+8)
#define GPIOC_OOR_Addr (GPIOC_BASE+8)
#define GPIOD_OOR_Addr (GPIOD_BASE+8)
#define GPIOE_OOR_Addr (GPIOE_BASE+8)
#define GPIOF_OOR_Addr (GPIOF_BASE+8)
#define GPIOG_OOR_Addr (GPIOG_BASE+8)
#define PAout(n)BIT_ADDR(GPIOA_OOR_Addr,n)
#define PAin(n) BIT_ADDR(GPIOA_IOR_Addr,n)
#define PBout(n)BIT_ADDR(GPIOB_OOR_Addr,n)
#define PBin(n) BIT_ADDR(GPIOB_IOR_Addr,n)
#define PCout(n)BIT_ADDR(GPIOC_OOR_Addr,n)
#define PCin(n) BIT_ADDR(GPIOC_IOR_Addr,n)
#define PDout(n)BIT_ADDR(GPIOD_OOR_Addr,n)
#define PDin(n) BIT_ADDR(GPIOD_IOR_Addr,n)
#define PEout(n)BIT_ADDR(GPIOE_OOR_Addr,n)
#define PEin(n) BIT_ADDR(GPIOE_IOR_Addr,n)
#define PFout(n)BIT_ADDR(GPIOF_OOR_Addr,n)
#define PFin(n) BIT_ADDR(GPIOF_IOR_Addr,n)
#define PGout(n)BIT_ADDR(GPIOG_OOR_Addr,n)
#define PGin(n) BIT_ADDR(GPIOG_IOR_Addr,n)
通過上述代碼對位帶操作讀取端口進行定義,需要調用時直接讀取類似“xflag”類似的寵定義即可檢測出當前端口狀態。代碼如下。
#include”H.h”
Int main()
{
SystemInit();
STEP_MOTOR_Init();
YG_GPIO_Config();
TIM2_Configuration();
While(1)
{
Auto_Kong(_xflag,_Yflag,Xflag,Yflag);
}}
輸出控制,我們采用的是ULN2003芯片,該芯片只是接收高電平或者低電平就會在相應的驅動輸出端給輸對應的驅動電壓信號,而在本產品中輸出控制我們只采用了GPIOB組的端口,因此,輸出端口的配置我們只需要進行普通配置即可。在配置端口的時候我們需要注意的是PB3和PB4兩個端口需要有JTAG和SW功能,需要將其重新映射才能作為普通GPIO功能使用。端口配置完成后,首先應該給端口賦值,使電機的狀態為停止運行狀態。爭對ULN2003芯片而言,我們只需將端口初始值賦予低電平即可。
設計時采用的是兩個四相八拍步進電機,在進行程序設計時將其封裝一個函數,然后進行電機控制程序設計,設計思路如下。
1)判斷X軸或Y軸電機的選取狀態。
2)判斷步進電機的旋轉狀態是正轉或反轉。
3)有效電機的狀態位增/減。
4)判斷狀態位是否高于7或者低于0,高于7則置0,低于0則置7。
5)輸入到電機控制函數。
本設計是基于STM32控制車外后視鏡調節模塊,由于設計中采用高精度、超強抗干擾的內部自帶AD轉換模塊的單片機作為主控制器,同時采用了搖桿控制,能夠更快更準地調節后視鏡的角度,使駕駛員的行車更安全可靠。