分選機是一種利用空氣懸浮原理將混合粉狀物料分離為輕、重兩部分的分選設(shè)備,應(yīng)用非常廣泛。例如:這次分享的主要應(yīng)用于大理石加工的分選機用振動給料機,用來分選大理石顆粒的。
基于分選機的PLC控制,傳統(tǒng)做法是用PLC來控制,例如三菱的,采用梯形圖做程序設(shè)計,用組態(tài)軟件做界面和控制菜單等,PC機和PLC通訊采用網(wǎng)絡(luò)協(xié)議。
而這次我們采用迪文的DGUS屏和普通的單片機來實現(xiàn)這個功能。程序設(shè)計采用C語言,界面控制采用DGUS軟件,與PC機的通訊采用以太網(wǎng)控制器芯片W5500,用單片機來做驅(qū)動。
總體來說,對于我們?nèi)昵暗?object>觸摸屏開發(fā)者來說,DGUS屏的使用率還是非常高的,至少我周圍的同事和朋友都還在用這種屏,說著說著暴露了年齡。
1、系統(tǒng)硬件
:迪文DGUS屏
單片機:stm32F103RBT6
通訊方式:以太網(wǎng)控制器芯片W5500,232通訊
其它:24C02存儲,傾角傳感器模塊,24V電源輸入
電路設(shè)計參數(shù)和原理圖
2、程序設(shè)計
程序設(shè)計
上電初始化的程序,每次要把存儲的配方數(shù)據(jù)上傳給DGUS屏,并在相應(yīng)的地址寫數(shù)據(jù):
2.1單片機驅(qū)動W5500
我們來看看如何用單片機驅(qū)動W5500??梢詤⒖歼@方面的驅(qū)動庫來看看如何配置,也就是SPI驅(qū)動:
(1) 重置W5500
也就是復(fù)位W5500。低電平有效,至少保持500us以上。
(2) 注冊臨界區(qū)函數(shù)、片選函數(shù)、讀寫函數(shù)
(3) SPI初始化
SPI肯定要初始化了,初始化socket,設(shè)置為TCP模式。
(4) Ethernet的通訊配置初始化
通訊配置初始化主要依次執(zhí)行以下3個函數(shù):
注冊TCP通訊相關(guān)的回調(diào)函數(shù)RegisterFunction();
初始化芯片參數(shù)ChipParametersConfiguration();
初始化網(wǎng)絡(luò)通訊參數(shù)NetworkParameterConfiguration()。
這樣就移植完成了,可以采用串口助手,輸入屏,測試一下,沒問題的。
這是驅(qū)動源碼:
2.2軟件定時器
定時器分為硬件定時器和軟件定時器,幾乎所有的微控制器上都配備了數(shù)量有限的硬件定時器,即控制器本身有專門實現(xiàn)定時的模塊。而幾乎所有的硬件定時器的工作原理也都是一樣的:定時器在外部時鐘提供的周期脈沖下進行計數(shù)工作,當(dāng)計數(shù)到用戶指定的次數(shù)時,就產(chǎn)生一次中斷。這個過程完全由微控制器內(nèi)部的定時器硬件電路實現(xiàn),不需要CPU干預(yù)。
相比之下,軟件定時器則需要CPU的介入來實現(xiàn)了。實現(xiàn)軟件定時器一般有兩種方法:一種是純粹依賴CPU指令的堆積來實現(xiàn);另一種是以硬件定時器產(chǎn)生的時間片為基準(zhǔn)單位,CPU基于這個基準(zhǔn)單位進行累積來實現(xiàn)。
顯然,硬件定時器的精度取決于驅(qū)動的時鐘脈沖,一般情況下可以達(dá)到很高的精度(納秒級);而軟件定時器的實現(xiàn)由于引入了非硬件因素,精度必然有所下降。
在嵌入式應(yīng)用中,經(jīng)常使用定時器進行定時,當(dāng)定時時間到達(dá)之后執(zhí)行預(yù)定的操作。一個具體的嵌入式系統(tǒng)可能有幾個甚至數(shù)十個定時應(yīng)用,而這些應(yīng)用對定時器的精度、最大周期等要求往往都是不同的,例如:使用定時器產(chǎn)生一個準(zhǔn)確頻率的方波,是對定時精度比較高的應(yīng)用;而使用定時器定時翻轉(zhuǎn)一個用戶指示燈以表示當(dāng)前設(shè)備的工作狀態(tài),則對定時器精度的要求大為下降,這時如果啟用硬件定時器無疑是一種資源的浪費。所以,在一個具體的嵌入式系統(tǒng)中,硬件定時器和軟件定時器配合使用,是提高性能和降低成本的有效方法。
那么,在STM32中如何利用一個硬件定時器構(gòu)建多個軟件定時器呢?
我們來分析軟件定時器的基本需求:在嵌入式應(yīng)用中,對定時器的使用模式一般是“定時時間到達(dá)后執(zhí)行預(yù)定的操作”。所以,需要解決如下一些問題:
定時多久?——定時時間必須是可配置修改的;
定時時間到達(dá)后做什么?——需要指定執(zhí)行函數(shù);
定時器如何工作?——可以選擇單次執(zhí)行或循環(huán)執(zhí)行。
我們看看程序是中怎么實現(xiàn)的:(采用滴答定時器1ms中斷作為心跳或者時基)
(1) 初始化軟件定時器
/*軟件定時器初始化,清零定時器隊列(8個結(jié)構(gòu)體數(shù)組對應(yīng)8個定時器)*/#ifdefZL_USING_SOFT_TIMER
bsp_soft_timer_init();
#endif
下面是軟件定時器的成員typedefstruct{
uint32_t wTimer; /* 定時時間計數(shù)器*/
uint16_t hwCtrl; /* 定時器開關(guān)控制*/
uint32_t wRunCnt; /* 運行計數(shù)器*/
zlfn_st_tfn_call_back; /* 回調(diào)函數(shù)*/
} zl_SoftTimer_t, *ptSoftTimer;/*
ZL _ S O F T _ T I M E R _ I N I T *//*-------------------------------------------------------------------------
* 功能:初始化軟件定時器模塊。
* 參數(shù):無
* 返回:無
* 備注:OK.
-----------------------------------------------------------------------*/voidbsp_soft_timer_init(void){ s_wSoftTimerInitOK = 0; zl_memory_clear((uint8_t*)s_tSoftTimer, sizeof(s_tSoftTimer));//s_tSoftTimer為軟件定時器隊列并清0操作 s_wSoftTimerInitOK= 1;}
(2) 如何啟動軟件定時器
static void _mcu_run_led_init (void){
st_gpio_out_pp_init(_MCU_RUNLED_PORT,_MCU_RUNLED_PIN);
/* 啟動定時器編號5任務(wù)函數(shù)*/
zl_soft_timer_set(SFTIMER_ID_runled,1 * 1000, &_mcu_run_led_cb);
}
形參有定時器編號、定時時間、回調(diào)函數(shù)(就是執(zhí)行的任務(wù)函數(shù))。
(3) 滴答定時器中斷,對每個定時器時間減一操作
/*-------------------------------------------------------------------------
*功能:APP時標(biāo)心跳服務(wù),由心跳中斷調(diào)用。
*參數(shù):無
*返回:無
*備注:ok.
-----------------------------------------------------------------------*/voidapp_tick(void){
/*每隔1ms進來一次(僅用于滴答延時)*/
st_systick_delay_tick();
/*軟件定時器任務(wù)對每個定時器的定時時間減1操作*/
#ifdef ZL_USING_SOFT_TIMER
zl_soft_timer_tick();
#endif
/*一個延時模塊的驅(qū)動任務(wù)*/#ifdef ZL_USING_POLL_DELAY
zl_poll_delay_tick();
#endif
/* 調(diào)用所有用戶相關(guān)的時標(biāo)*/
app_user_tick();
}
*功能:軟件定時器任務(wù),在心跳中斷里運行。
* 參數(shù):無
* 返回:無
* 備注:OK.
該函數(shù)的運行周期決定定時器的時基。-----------------------------------------------------------------------*/voidzl_soft_timer_tick(void){
uint16_t i;
if(!s_wSoftTimerInitOK)
{
return;
}
for (i = 0; i <ZL_SOFT_TIMER_MAX_NUM; i++)
{
if(s_tSoftTimer.hwCtrl)/*判斷定時開關(guān)*/
{
if (0 ==s_tSoftTimer.wTimer)/*判斷定時時間到?jīng)]*/ {
s_tSoftTimer.hwCtrl= STIMER_STOP; /* 定時時間到就停掉定時器*/
s_tSoftTimer.wRunCnt++; /*更新運行計數(shù)器,定時時間到以后加1操作*/
}
else
{
s_tSoftTimer.wTimer--;
}
}
}}
(4) 超級循環(huán)執(zhí)行多個定時器任務(wù)函數(shù)
/*-------------------------------------------------------------------------
*功能:軟件定時器服務(wù),在超級循環(huán)里運行。
* 參數(shù):無
* 返回:無
* 備注:OK.
-----------------------------------------------------------------------*/voidzl_soft_timer_service(void){
uint16_t i;
if(!s_wSoftTimerInitOK)
{
return;
}
/*對軟件定時器個數(shù)加1操作*/
for (i = 0; i <ZL_SOFT_TIMER_MAX_NUM; i++)
{
if(s_tSoftTimer.wRunCnt)
{
s_tSoftTimer.fn_call_back(); /*執(zhí)行回調(diào)函數(shù)*/
s_tSoftTimer.wRunCnt--; /* 對每個定時器中的運行計數(shù)器減1操作*/
}
}}
3、文件下載
Ethernet通訊配置初始化文件下載地址:
從上述程序演示可以看出,用迪文DGUS智能屏進行分選機PLC控制開發(fā)設(shè)計,簡單又便捷,十分容易上手。
(原文標(biāo)題:【開源】分選機的PLC單片機控制。作者:lihui163。來源:迪文開發(fā)者論壇。系統(tǒng)設(shè)計未經(jīng)許可,禁止商用)