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