基于dgus屏的分选机plc单片机控制 -大奖官方网站手机版下载

分选机是一种利用空气悬浮原理将混合粉状物料分离为轻、重两部分的分选设备,应用非常广泛。例如:这次分享的主要应用于大理石加工的分选机用振动给料机,用来分选大理石颗粒的。

基于分选机的plc控制,传统做法是用plc来控制,例如三菱的,采用梯形图做程序设计,用组态软件做界面和控制菜单等,pc机和plc通讯采用网络协议。   

而这次我们采用迪文的dgus屏和普通的单片机来实现这个功能。程序设计采用c语言,界面控制采用dgus软件,与pc机的通讯采用以太网控制器芯片w5500,用单片机来做驱动。

总体来说,对于我们三年前的触摸屏开发者来说,dgus屏的使用率还是非常高的,至少我周围的同事和朋友都还在用这种屏,说着说着暴露了年龄。


1、系统硬件

智能屏:迪文dgus

单片机:stm32f103rbt6

通讯方式:以太网控制器芯片w5500,232通讯

其它:24c02存储,倾角传感器模块,24v电源输入


电路设计参数和原理图

2、程序设计



程序设计

 

上电初始化的程序,每次要把存储的配方数据上传给dgus屏,并在相应的地址写数据:




2.1单片机驱动w5500

我们来看看如何用单片机驱动w5500。可以参考这方面的驱动库来看看如何配置,也就是spi驱动:

(1) 重置w5500

也就是复位w5500。低电平有效,至少保持500us以上。

(2) 注册临界区函数、片选函数、读写函数


(3) spi初始化

spi肯定要初始化了,初始化socket,设置为tcp模式。 

(4) ethernet的通讯配置初始化

通讯配置初始化主要依次执行以下3个函数:

  • 注册tcp通讯相关的回调函数registerfunction();

  • 初始化芯片参数chipparametersconfiguration();

  • 初始化网络通讯参数networkparameterconfiguration()。


这样就移植完成了,可以采用串口助手,输入屏,测试一下,没问题的。

这是驱动源码:

2.2软件定时器

定时器分为硬件定时器和软件定时器,几乎所有的微控制器上都配备了数量有限的硬件定时器,即控制器本身有专门实现定时的模块。而几乎所有的硬件定时器的工作原理也都是一样的:定时器在外部时钟提供的周期脉冲下进行计数工作,当计数到用户指定的次数时,就产生一次中断。这个过程完全由微控制器内部的定时器硬件电路实现,不需要cpu干预。

相比之下,软件定时器则需要cpu的介入来实现了。实现软件定时器一般有两种方法:一种是纯粹依赖cpu指令的堆积来实现;另一种是以硬件定时器产生的时间片为基准单位,cpu基于这个基准单位进行累积来实现。

显然,硬件定时器的精度取决于驱动的时钟脉冲,一般情况下可以达到很高的精度(纳秒级);而软件定时器的实现由于引入了非硬件因素,精度必然有所下降。

在嵌入式应用中,经常使用定时器进行定时,当定时时间到达之后执行预定的操作。一个具体的嵌入式系统可能有几个甚至数十个定时应用,而这些应用对定时器的精度、最大周期等要求往往都是不同的,例如:使用定时器产生一个准确频率的方波,是对定时精度比较高的应用;而使用定时器定时翻转一个用户指示灯以表示当前设备的工作状态,则对定时器精度的要求大为下降,这时如果启用硬件定时器无疑是一种资源的浪费。所以,在一个具体的嵌入式系统中,硬件定时器和软件定时器配合使用,是提高性能和降低成本的有效方法。

那么,在stm32中如何利用一个硬件定时器构建多个软件定时器呢? 

我们来分析软件定时器的基本需求:在嵌入式应用中,对定时器的使用模式一般是“定时时间到达后执行预定的操作”。所以,需要解决如下一些问题:

  • 定时多久?——定时时间必须是可配置修改的;

  • 定时时间到达后做什么?——需要指定执行函数;

  • 定时器如何工作?——可以选择单次执行或循环执行。


我们看看程序是中怎么实现的:(采用滴答定时器1ms中断作为心跳或者时基)

(1) 初始化软件定时器


/*软件定时器初始化,清零定时器队列(8个结构体数组对应8个定时器)*/#ifdefzl_using_soft_timer        

bsp_soft_timer_init();

#endif
下面是软件定时器的成员typedefstruct{    

uint32_t wtimer;        /* 定时时间计数器*/    

uint16_t hwctrl;          /* 定时器开关控制*/    

uint32_t wruncnt;      /* 运行计数器*/    

zlfn_st_tfn_call_back;       /* 回调函数*/

} zl_softtimer_t, *ptsofttimer;/*  
zl _ s o f t _ t i m e r _ i n i t  *//*-------------------------------------------------------------------------   

* 功能:初始化软件定时器模块。  

* 参数:无   

* 返回:无   

* 备注: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任务函数*/       

zl_soft_timer_set(sftimer_id_runled,1 * 1000, &_mcu_run_led_cb);

}
形参有定时器编号、定时时间、回调函数(就是执行的任务函数)。

 

(3) 滴答定时器中断,对每个定时器时间减一操作


/*-------------------------------------------------------------------------

*功能:app时标心跳服务,由心跳中断调用。   

*参数:无   

*返回:无   

*备注:ok.

-----------------------------------------------------------------------*/voidapp_tick(void){   

/*每隔1ms进来一次(仅用于滴答延时)*/       

st_systick_delay_tick();         

/*软件定时器任务对每个定时器的定时时间减1操作*/

#ifdef zl_using_soft_timer       

zl_soft_timer_tick();

#endif  
/*一个延时模块的驱动任务*/#ifdef zl_using_poll_delay       

zl_poll_delay_tick();

#endif        

/* 调用所有用户相关的时标*/  

app_user_tick();

}    

*功能:软件定时器任务,在心跳中断里运行。   

* 参数:无   

* 返回:无   

* 备注:ok.   


该函数的运行周期决定定时器的时基。-----------------------------------------------------------------------*/voidzl_soft_timer_tick(void){    

uint16_t i;    



if(!s_wsofttimerinitok)    

{       

return;    

}    



for (i = 0; i

{       

if(s_tsofttimer.hwctrl)/*判断定时开关*/       

{           

if (0 ==s_tsofttimer.wtimer)/*判断定时时间到没*/           {               

 s_tsofttimer.hwctrl= stimer_stop;        /* 定时时间到就停掉定时器*/               

  s_tsofttimer.wruncnt ;               /*更新运行计数器,定时时间到以后加1操作*/           

}           

else           

{               

  s_tsofttimer.wtimer--;          

 }       

 }    

 }} 


(4) 超级循环执行多个定时器任务函数



/*-------------------------------------------------------------------------   

*功能:软件定时器服务,在超级循环里运行。   

* 参数:无   

* 返回:无   

* 备注:ok.

-----------------------------------------------------------------------*/voidzl_soft_timer_service(void){    

uint16_t i;   



if(!s_wsofttimerinitok)    

{       

  return;   

}     

/*对软件定时器个数加1操作*/   

for (i = 0; i

{       

   if(s_tsofttimer.wruncnt)        

{           

   s_tsofttimer.fn_call_back();                /*执行回调函数*/           

   s_tsofttimer.wruncnt--;                    /* 对每个定时器中的运行计数器减1操作*/   

 }    

  }}


3、文件下载


ethernet通讯配置初始化文件下载地址:

从上述程序演示可以看出,用迪文dgus智能屏进行分选机plc控制开发设计,简单又便捷,十分容易上手。



(原文标题:【开源】分选机的plc单片机控制。作者:lihui163。来源:迪文开发者论坛。系统设计未经许可,禁止商用)