王飛 杜向陽



摘 ?要: 針對低壓斷路器產(chǎn)品生產(chǎn)效率低、可操作性差等系列問題,提出了基于keil軟件的一體化螺絲刀控制器設計?;贙eil5(Keil uVision5)的軟件平臺及STM32f10x封裝函數(shù)包,在搭建好實物裝置的基礎上,建立控制模型及編寫控制系統(tǒng)的運行程序。編寫的程序主要是在一體化螺絲刀裝置上的各個傳感器等設備的監(jiān)測下,完成以STM32f103ZET6為主控芯片的控制器來控制相應步進電機的運行及電磁閥的開斷配合,完成一個完整的軌跡運行。并將設計的程序進行仿真、實驗調(diào)試。實驗最終表明:該裝置可以實現(xiàn)低壓斷路器高效率的生產(chǎn)且該設計的控制器可操作性強。
關鍵詞:?Keil5;控制模型;STM32f103ZET6;仿真模擬;實驗調(diào)試
中圖分類號: TP319????文獻標識碼:?A????DOI:10.3969/j.issn.1003-6970.2019.09.017
本文著錄格式:王飛,杜向陽. 基于keil軟件的一體化螺絲刀控制器設計[J]. 軟件,2019,40(9):75-80
Design of Integrated Screwdriver Controller Based on Keil Software
WANG Fei, DU Xiang-Yang
(School of Mechanical and Automotive Engineering, Shanghai University of Engineering and Technology, Shanghai 201620, China)
【Abstract】: For the series of low-voltage circuit breaker products with low production efficiency and poor operability, an integrated screwdriver controller design based on leil software is proposed. Based on Keil (Keil uVision5) software platform and STM32f10x package function package, based on the physical device, the control model and the running program of the control system are established. The main task of the prepared control program code is to complete the control of the corresponding stepper motor with STM32f103ZET6 as the main control chip under the monitoring of various sensors and other devices on the integrated screwdriver device (one angle control motor, two displacement control motors), a control of the torque nut motor), the designed program running code for simulation, experimental debugging. The experiment finally shows that the device can achieve high-efficiency production of low-voltage circuit breakers and the controller of the design is operability.
【Key words】: Keil5; Control model; STM32f103ZET6; Simulation; Experimental debugging
ARM公司[1]在2005年收購keil公司后,于2013年10月推出了最新的開發(fā)環(huán)境Keil5。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部分組合在一起。Keil官網(wǎng)雖然沒有發(fā)布中文版本,但是Keil系列軟件[2-3]卻被中國80%以上的軟硬件工程師使用,說明該系統(tǒng)軟件的強大,以及它的發(fā)展前景。
此軟件開發(fā)系統(tǒng)的優(yōu)點:Keil5生成的目標代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用。因此,借助集成開發(fā)環(huán)境Keil5,在以STM32f103ZET6為主控芯片的控制器[4-6]硬件平臺來控制一體化螺絲刀裝置運行,提高裝置的工作
該裝置控制器是對塑殼斷路器生產(chǎn)設備控制方式的改進。系統(tǒng)指令實現(xiàn)的載體,是控制系統(tǒng)功能得以實現(xiàn)的執(zhí)行者,硬件的執(zhí)行方式?jīng)Q定了程序控制的設計。首先,了解一體化螺絲刀裝置的組成。然后,分析該裝置主要執(zhí)行部分,如驅動電機、電磁閥及傳感器等,知道各個構件的運行規(guī)律,選擇與控制器相連接的IO口。一體化螺絲刀裝置的控制裝置結構:4個步進電機(一個角度控制電機,兩個位移控制電機,一個控制扭螺母電機)、兩個電磁離合器、扭矩[7]傳感器、移動框架、組合套筒等。Driver代表步進電機驅動器,SEN1~3是傳感器和離合器的驅動模塊,UART串口通信,與PC機相連接。其電路原理[8]圖如圖1所示。
裝置運行原理。為了使塑殼斷路器內(nèi)部核心器件跳閘金屬片都能在某一設定的時間內(nèi)頂跳觸頭,斷開電路完成任務。由此,設計了一體化螺絲刀旋緊裝置。我們先假定一個頂跳時間,給跳閘金屬片通電,隨著溫度升高,金屬片變形。這時通過CCD相機對
金屬片上的特定位置進行數(shù)據(jù)采集,經(jīng)過AD轉換及通訊總線傳輸給下位機,讀取指令到處理器[9],通過MCU輸出指令傳遞給各個輸出引腳和驅動器模塊。圖2為一體化螺絲刀控制器的硬件執(zhí)行過程與聯(lián)系。
2.1工程建立與分組關系
先在Keil5項目欄里新建工程模板。由于STM32[10-11]這種級別的MCU包含數(shù)百個寄存器,如果通過操作每個寄存器來設計一個控制系統(tǒng),即困難又浪費時間,因此,我們借助ST(意法半導體)推出的官方固件庫[12],建立自己的工程模板,然后按照自己的意愿設計自己的控制代碼。打開MDK新建工程文件夾YTHLSD(一體化螺絲刀英文所寫),然后在此文件夾下建立文件夾USER、HARDWARE、SYSTEM、CORE、FWLIB和README等。
USER分組負責存放代碼工程文件,如USER分組下的main.c主要存放主函數(shù),其中包含ST提供的stm32f10x_it.c用來定義中斷函數(shù),System_?stm32f10x.c用來初始化時鐘函數(shù)等。HARDWARE分組存放外部硬件驅動函數(shù),該設計包含了led.c、key.c、driver.c三個硬件驅動函數(shù),如driver.c中調(diào)用stm32f10x_gpio.c中的函數(shù)對driver進行初始化,每一個.c源文件對應一個.h頭文件。SYSTEM分組存放了一些ST提供的公用代碼,包括:延時函數(shù),IO口位操作、寄存器操作及串口相關函數(shù),方便我們調(diào)用這些函數(shù)。CORE分組放置固件庫啟動文件和核心文件,通常不需要改動。FWLIB分組下存放著ST官方提供的外設固件庫原文件和頭文件,根據(jù)各自設計需求添加或刪除,同樣每個.c源文件對應一個.h頭文件。README分組是整理程序設計過程中的一些注意事項,方便他人使用及問題查找。這些分組之間的結構聯(lián)系如圖3所示。
以該裝置控制系統(tǒng)的執(zhí)行器件的控制過程與電路原理圖為依據(jù),如圖3代碼層次結構,Keil5開發(fā)軟件為平臺及STM32f10x封裝函數(shù)包,設計程序[13]驅動代碼。設計過程包括主函數(shù)的設計,子函數(shù)的調(diào)用等。設計過程:
(1)打開YTHLSD下USER分組內(nèi)的main.c主函數(shù)。首先將ST提供的存放在SYSTEM分組下的底層驅動函數(shù)包含進來。其中包含的頭文件:#include "sys.h"(定義了I/O口的輸入和輸出宏定義)、#include "usart.h"(串口初始化和中斷的接收)、#include "delay.h"(實現(xiàn)系統(tǒng)延時功能)。然后,將HARDWARE分組下的外部硬件驅動函數(shù)包含進來。其中包含的頭文件:#include "key.h"(外設按鍵驅動代碼)、#include "led.h"(外設led驅動代碼)、#include "drivers"(外設步進電機驅動代碼)。最后,將USMART分組下的串口調(diào)試函數(shù)#include "usmart.h"(串口調(diào)試組件)包含進來。
(2)寫主函數(shù)(int main?(void))。主函數(shù)內(nèi)包含的初始化函數(shù)有:延時(delaine())、中斷設置(NVIC_?PriorityGroupConfig?(NVIC_PriorityGroup_2))、串口(uart_init?(115200))、USMART?(usmart_dev.init(72))、按鍵(KEY_Init())、傳感SEN_Init();LED端口(LED_?Init())、高級定時器(TIM8_OPM_RCR_Init?(999, 72-?1))和步進電機驅動函數(shù)(Driver_Init())、兩個關鍵字(u8 I; u8 keyval)。步進電機驅動器端口與控制板引腳的連接如表1。
(3)在while()循環(huán)里面設定函數(shù)之間的邏輯關系,首先按下WKUP_PRES,調(diào)用絕對定位函數(shù)Locate_Abs(0,?10000);電機回初始設定點,SEN1_?ACT和SEN2_ACT是調(diào)用電磁閥和步進電機的函數(shù),Locate_Rle(100000,?10000,?CW/CCW)為相對運動函數(shù),代表頻率設定值是10kHz,當?shù)谌齻€參數(shù)選CW時,順時針發(fā)出100K個脈沖,選為CCW時逆時針發(fā)出100K個脈沖,驅動步進電機轉動確定的角度。
完整的主程序為:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "usmart.h"
#include "driver.h"
上面部分為程序設計的第一部分,宏定義的聲明。
int main(void)
{
u8 i;
u8 keyval;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
usmart_dev.init(72);
LED_Init();
KEY_Init();
SEN_Init();
Driver_Init();
TIM8_OPM_RCR_Init(999,?72-1);
中間部分為程序設計的第二部分,定義關鍵字i、keyval,延時、中斷、串口通信、串口調(diào)試、led燈、按鍵、傳感外設、步進電機驅動、高級計數(shù)器TIM8等函數(shù)初始化,中斷優(yōu)先級分組設為2位搶占優(yōu)先級2位相應優(yōu)先級,串口波特率設為115200,usmart設晶振設為72MHz;TIM8初始化計數(shù)器向上計數(shù),自動重裝載值arr設為999,預分頻值pos設為72-1。
while(1)
{
keyval=KEY_Scan(0);
if(keyval==WKUP_PRES)
{
Locate_Abs(0,?10000);
} ???else if(keyval==SEN1_ACT)
{
Locate_Rle(100000,?10000,?CW);
}
else if(keyval==SEN2_ACT)
{
Locate_Rle(100000,?10000,?CCW);
}
delay_ms(10);
i++;
if(i==50)
{
i=0;
LED1=!LED1;
}
}
}
最后部分為程序設計的邏輯部分,在while()循環(huán)中,通過if語句來判斷當前應該執(zhí)行的函數(shù)語句,來控制電磁閥和步進電機動作。其中主要的子函數(shù)設計為步進電機的端口初始、中斷及相關參數(shù)設置,其中核心部分為步進電機的驅動程序設計[14],包含相對運動和絕對運動。相對運動對應相對定位函數(shù):
void Locate_Rle(long num,?u32 frequency,?DIR_?Type dir)
{
if(num<=0)
{
printf("\r\nThe num should be greater than zero?。。躵\n");
return;
}
if(TIM8->CR1&0x01)
{
printf("\r\nThe last time pulses is not send finished,?wait please?。躵\n");
return;
}
if((frequency<20)||(frequency>100000))
{
printf("\r\nThe frequency is out of range! please reset it?。。╮ange:20Hz~100KHz)\r\n");
return;
}
motor_dir=dir;
DRIVER_DIR=motor_dir;
if(motor_dir==CW)
target_pos=current_pos+num;
else if(motor_dir==CCW)
target_pos=current_pos-num;//
rcr_integer=num/(RCR_VAL+1);
rcr_remainder=num%(RCR_VAL+1);
is_rcr_finish=0;
TIM8_Startup(frequency);
}
相對定位函數(shù)中語句if(num<=0)表示沒有脈沖產(chǎn)生,不執(zhí)行下列程序語句,直接返回。if(TIM8->?CR1&0x01),代表上一次脈沖還未發(fā)送完成時,程序將直接返回初始位置。語句if((frequency<20)||?(frequency>100000))為脈沖頻率不在20Hz~100KHz范圍內(nèi)時,直接返回初始狀態(tài)。motor_dir=dir;和DRIVER_DIR=motor_dir;為得到和設置電機旋轉方向。然后通過if-else判斷步進電機正傳還是反轉,if(motor_dir==CW)則表示正傳,將目標位置加上num的值作為步進電機的目標值,否則else if?(motor_dir==CCW)反轉,將目標位置減去num的值作為步進電機的目標值,rcr_integer和rcr_remainder分別為重復計數(shù)的整數(shù)部分和余數(shù)部分,其中每計數(shù)(RCR_VAL+1)次,中斷一次。由于重復計數(shù),所以要通過語句is_rcr_finish=0;聲明一下計數(shù)未結束,并在最后開啟高級定時器TIM8。
絕對定位函數(shù)設計如下:
void Locate_Abs(long num,?u32 frequency)
{
if(TIM8->CR1&0x01)
{
printf("\r\nThe last time pulses is not send finished,?wait please!\r\n");
return;
}
if((frequency<20)||(frequency>100000))
{
printf("\r\nThe frequency is out of range! please reset it?。。╮ange:20Hz~100KHz)\r\n");
return;
}
target_pos=num;
if(target_pos!=current_pos)
{
if(target_pos>current_pos)
motor_dir=CW;
else
motor_dir=CCW;
DRIVER_DIR=motor_dir;
rcr_integer=abs(target_pos-current_pos)/(RCR_VAL+1);
rcr_remainder=abs(target_pos-current_pos)%(RCR_VAL+1);
is_rcr_finish=0;
TIM8_Startup(frequency);
}
}
絕對定位函數(shù)與相對定位函數(shù)基本相同。其中不同點為:target_pos=num;該語句是步進電機經(jīng)過num個計數(shù)后的目標位置。接下來通過if(target_?pos!=current_pos),判斷當前位置和目標位置是否相同。如果當前位置沒有達到目標位置,即if(target_?pos>current_pos),則步進電機順時針轉動;否則else,步進電機逆時針轉動。DRIVER_DIR=motor_?dir;作用為設定步進電機旋轉方向,在頭文件driver.h中定義為#define DRIVER_DIR PCout(0),表示選用的控制板引腳是PC0,輸出PC0的狀態(tài)。
Keil5具備軟件仿真[15]的強大功能,該功能的優(yōu)點是能檢查程序的正確性與可行性。通過debug工具欄里的邏輯分析窗口,進行IO口的仿真與實驗分析。仿真之前,需要設置Options for Target窗口下的Target欄里的參數(shù)(芯片型號和晶振頻率)。然后選擇debug欄里的Use Simulator開啟仿真器,選擇Run to mian(),即直接從主函數(shù)開始運行仿真。Dialog DLL和Parameter設置如圖4。
設置完畢后點擊仿真按鈕,選擇邏輯分析,并在其仿真界面中建立信號。根據(jù)電路原理圖,設置邏輯分析信號PA0、PE2、PE3、PB5、PE5、PC0、PC2和PC7,選擇信號的輸出方式為Bit,如PORTC&?0x00000004為基地址與第五位求與,只取第2位PORTC_2,其他全為0。然后右移2為,如果結果為低電平0則0x00000000,結果為高電平1則為0x00000001。其它端口分析同理。下圖5以步進電機的IO接口信號為示例。
完成上述設置后。在功能區(qū)Peripherals下的通用輸入輸出接口下,設置PA.0為下拉輸入,其電平狀態(tài)對應復位按鈕動作狀態(tài);設置PB.5和PE.5為推挽輸出,作用為控制led;設置PE.2和PE.3為上拉輸入,代表傳感器的響應電平;設置PC.0為推挽輸出,其輸出電平控制電機的觸發(fā)脈沖方向;設置PC.2為推挽輸出,作用是使能驅動器;設置PC.7為復用推挽輸出,輸出高級定時器TIM8_CH2的PWM脈沖。
最后運行仿真,雖然上面我們設置了各個選定IO口的輸出輸入模式,但Keil5不會自動設置外部硬件的響應狀態(tài),因此需要手動設置相應的輸入IO口狀態(tài)來模仿外部硬件的狀態(tài)。為模仿復位功能,
需手動設置PA.0為高電平,進行間隔為0.2秒的仿真。同時PC.2使能driver函數(shù),板載led燈的綠燈開始閃爍,表示程序正常運行。PB.5一直為高電平,處于滅的狀態(tài),代表系統(tǒng)運行正常。然后,設置PE.2位高電平,代表外部傳感器一(SEN1)動作。同PC.7開產(chǎn)生方波脈沖,當PE.2的電平恢復后,PC.7口的脈沖停止產(chǎn)生;設置PE.3為高電平,代表外部傳感器二(SEN2)動作。PC.7產(chǎn)生的方波形式,原理同上,但方向發(fā)生改變。最后PE.2和PE.3電平均為低電平,方波停止產(chǎn)生系統(tǒng)運行完畢??刂葡到y(tǒng)仿真如圖6。
設計根據(jù)電路原理圖,以Keil5環(huán)境為主要平臺,設計了一體化螺絲刀控制器。其中先建立工程模板,在建立的工程下設計自己的外設及內(nèi)部系統(tǒng)的相關函數(shù)塊,通過設置輸入IO的電平狀態(tài),來模擬外部硬件的實際工作情況,證明了控制器可以完成指定的運動。并且自己所建立的工程,可以根據(jù)自己的需要添加自己需要的外部驅動函數(shù),其靈活性、移植性強,節(jié)省了資源。對其外部指定函數(shù)做一定改動就可以應用到相類似的控制系統(tǒng)中,將提高產(chǎn)品的生產(chǎn)效益。
參考文獻
[1]?王偉, 持續(xù)創(chuàng)新的ARM&中國的技術創(chuàng)新專訪ARM公司中國區(qū)總裁譚軍先生[J].?電子技術應用,?2008(8).
[2]?馬得秀,?韓佳奇,?趙銘,?逯玉蘭.?基于51單片機的溫室自動灌溉系統(tǒng)設計[J].?軟件,?2019,?40(05):?30-32.
[3]?張英梅,?傅仕杰.?STM32的智能溫室控制系統(tǒng)[J].?軟件,?2010,?31(12):?14-18.
[4]?陳玉樓,?單片機原理與應用技術[M].?北京:?科學出版社,?2015.
[5]?李寧,?基于MDK的STM32處理器應用開發(fā)[M].?北京:?北京航空航天大學出版社,?2008.
[6]?意法半導體,?STM32中文參考手冊,?第10版.?意法半導體(中國)投資公司,?2010.
[7]?劉汝斌,?程武山.?扭矩傳感器在步進電機控制系統(tǒng)中的應用[J].?儀表技術與傳感器,?2012,?(7):?1-3.
[8]?王波,?鞠飛.?電子電路仿真技術在電子應用開發(fā)中的運用[J].?電子技術與軟件工程,?2019(13):?74.
[9]?王燕東,?基于嵌入式實時系統(tǒng)的步進電機協(xié)同運動控制系統(tǒng)設計與實現(xiàn)[D],?河北工業(yè)大學,?2016.
[10]?常文泰,?張冉,?王利華,?張雷剛.?虛擬樣機技術及虛擬樣機試驗[J].?軟件,?2016,?37(07):?84-88.
[11]?沈紅衛(wèi),?任沙浦,?朱敏杰,?楊亦紅,?盧雪萍,STM32單片機應用與全案例實踐[M].?電子工業(yè)出版社,?2017,?6(1):?62-70.
[12]?意法半導體,?STM32F1開發(fā)指南庫函數(shù)版V1.1.?意法半導體(中國)投資公司,?2010.
[13]?彭治國,?劉海浪,?陳輝金.?基于“卓越計劃”C語言程序設計實驗教學研究[J].?裝備制造技術,?2012(7).
[14]?譚浩強,?C程序設計第四版[M].?清華大學出版社,?2010,?6(4):?87-89,?115-120.
[15]?張玲,?晏伯武.?時序仿真和驅動編寫在數(shù)字電路實踐教學中的應用研究[J].?軟件,?2016,?37(03):?107-109.