打印
[控制方法]

设计了一款使用STM8单片机C语言编程的工控小板

[复制链接]
1056|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
csaaa|  楼主 | 2018-2-8 14:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 csaaa 于 2018-2-8 14:59 编辑

最近一个项目需要驱动很多很多的辊台(动力滚筒),多个辊台之间还有很多生产机械,需要做大量的组态工作,为了使系统模块化,我尝试将不同的生产机器的辊**立开来处理,变成一个个的小系统,系统之间用电平的形式控制交通。这样可能会用到一堆的PLC,我这次尝试使用简单的单片机来解决这个问题,有人说我又回到了故过去,我不这么认为。过去的单片机可不比现在便宜,开发起来也很麻烦,现在的单片机开发环境可是好太多了,挑战主要在于抗干扰的问题,这个问题的本质还是做好隔离的问题。由于我对C语言的熟悉程度远高于那个梯形图,开发一个功能的时间我觉得比PLC还要快。这次以一款用于常见的动力传送滚筒所用的控制器为例介绍一下:
这个动画是这个辊台的运动形式,很简单吧。



设计的电路板PCB:


电路图,所有器件都与外面用光耦隔离,电源用隔离降压24v-5v电源

这个是模块的引脚定义:下面的一排是输入引脚,上面的是输出引脚
应用到电柜中


主程序:
//引脚定义
#define  KEEPOUT PA3_OUT
#define  Q1 PC6_OUT
#define  Q1N PC5_OUT
#define  Q2 PC4_OUT
#define  Q2N PC3_OUT
#define  Q3 PB4_OUT
#define  Q3N PB5_OUT

//#define OUT_DET PD6_IN                         //出检测
//#define IN_OK  PD5_IN                                //进完成
//#define IN_DET PD4_IN                                //进检测
#define EN     PD3_IN                                //使能
//#define KEEPOUT_IN PD2_IN                //前级忙检测
#define MRUN 1//motor run
#define MSTOP 0//motor stop
#define KEEP 1//给上一级低电平
#define NOKEEP 0
#define SW_ON 1//MOS开启导通
#define SW_OFF 0//MOS 截止
#define DEFTimeout 20//默认超时
#define MAXCNT 1
#define MaxAvgCnt 20  //滤波采样数
void restore(void){
                        KEEPOUT=NOKEEP;
                        Q1=MSTOP;
                        Q1N=!Q1;
                        Q2=MSTOP;
                        Q2N=!Q2;
                        Q3=MSTOP;
                        Q3N=SW_OFF;

}

//辊台A程序
void guntai(void){

          if (GET_IN_DET()==0){
                  IN_DET=0;
          }else{
                        IN_DET=1;
    }

        if (IN_DET==0){//进入光电有
                          //进入电机启动
          timeout=0; //每次进入或出检测到就清空一次
                Q1=MRUN;
        }else{//进入光电没有
                if (last_in!=IN_DET)prod_count++;
        }        
          last_in=IN_DET;
          if(GET_OUT_DET()==0){
                  OUT_DET=0;
           }else{
                         OUT_DET=1;
                }
                if(OUT_DET==0){//如果出口?
                  last_out=OUT_DET;
                  timeout=0;
      if (GET_KEEPOUT_IN()==0){
                                 Q1=MSTOP;
      }else{                        
                     Q1=MRUN;                        
                  }
                }else{
                         if ((last_out!= OUT_DET) && (prod_count > 0)){
                           prod_count--;
                           if (prod_count==0)Q1=MSTOP;
                   }
                         last_out=OUT_DET;
                }

if (prod_count>0){
         if(prod_count>=MAXCNT){//如果超过最大数量,直接输出阻止
           KEEPOUT=1;
   }else {                                                                //否则,给后级的信号取决于前级
            KEEPOUT=!KEEPOUT_IN;
   }
          OUT_DET=GET_OUT_DET();
         if (OUT_DET>0){//如果前级没有阻止 或者板还没到出口,都持续走
                 Q1=MRUN;
         }else{
                 if(GET_KEEPOUT_IN()==0){
                   //Q1=MRUN;
                         timeout=0;
           }else{
                   Q1=MRUN;
           }

         }
         if(timeout>DEFTimeout){
           Q1=MSTOP;
                 prod_count=0;
         }
}else{//没有物品,不阻止
         KEEPOUT=NOKEEP;//如果既没有板又没有进入则停止
         if(timeout>DEFTimeout/2){
           Q1=MSTOP;
                 prod_count=0;
         }
}

}
void main(void)
{

    init();
  restore();
   while(1)
    {
                        if (EN==0)
                        guntai();

                }//end while
}
由于权限问题,无法发视频和链接,有兴趣就看我主页吧




相关帖子

沙发
mmuuss586| | 2018-2-9 13:57 | 只看该作者
板子画成这样

使用特权

评论回复
板凳
csaaa|  楼主 | 2018-2-11 10:50 | 只看该作者

呵呵,用得急,先凑合去了。 从画到下PCB厂只有3小时, 全是用自动布线了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:店铺:2che.taobao.com

6

主题

32

帖子

1

粉丝