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