1赞

101回答

1收藏

[原创] 【PSoC4】+ 油箱液位传感器动态演示平台(纯手工打造)

 

英飞凌 英飞凌 35251 人阅读 | 101 人回复 | 2013-11-11

本帖最后由 mengyun2801 于 2013-11-19 00:49 编辑

    好久没露面了,最近一直在忙单位的项目,其实也是搞Psoc开发,只不过是Psoc3的开发。为了准备产品展示会,所以既要把产品调的稳定,又要把自己的产品摆弄的光鲜一点,以此来吸引一下客户的眼球~~~
    为了将产品的功能展露给大家,真是耗尽脑汁呀,简单的一个油箱液位传感器也要做的像个样呀。我选的油位传感器是干簧管类型的,靠的是浮子上的磁铁来确定浮子的位置。还好,手里的Psoc4给我帮了大忙,正好用它作为控制器。更巧合的是,我的产品采用的是Psoc3系列作为控制器,这也是这几个月来的成果,为此说这次既是机会又是挑战。同时也为了验证Psoc4的功能,于是我用了Psoc4作为油箱液位传感器动态演示平台的控制器,这也让Psoc3和Psoc4来个大团圆。因为演示平台并非产品,所以和大家分享一下这个小小的设计,但是下文的介绍中,更多的可能是其他也些琐碎的工作,比如机械和硬件也提到一些~~~
    此设计平台的功能是通过电机带动轮带传动的磁铁,通过磁铁来吸住浮子在传感器上来回往复运动;通过模拟点火信号和传感器线路连接方式的改变,为数据采集器提供模拟信号;并接收采集器发出的报警指令,通过解读指令进行声光报警。

        此平台主要是通过其验证在汽车熄火后若油量降低进行偷油报警,在点火后进行传感器的开路和短路检测。
        为了让大家先睹为快,请大家先看我录制的视频演示,下面是一个完整的演示视频,此视频录制于实验室,也是最后一次测试的视频,具体演示的功能请看视频中的提示牌:

        偷油报警演示视频:
        
       多功能演示视频:
        
        下面从硬件设计、机械设计和软件设计三方面介绍一下:
一、硬件设计:
  硬件结构框图如下所示:
   

    通过结构框图可以看出,在原有的Psoc4的开发板的基础之上,增加了以下功能模块:
    1、电机正反转驱动电路
(原理图设计软件是pads,为了方便大家,已将其输出成pdf,在附件中,如需源文件,可与我联系)
   

    2、远端近端
(相对于电机位置而言)开关、4路LED(24V)驱动和蜂鸣器电路;
   

   
二、机械设计:
    为了能够将外形做的基本过得去,本来想用CATIA制作三维图的,后来时间来不及了,就直接用的autoCAD,平台比较简单主要是箱体表面开孔位置(LED,开关和传感器卡口)和内部固定方式(带有电机的轮带机构与箱体固定方法)。
    1.首先展示一下工具:手锯、锉刀、钳子、手钻及各型号钻头。
   

        
        PS:这些原料都是一次次从电子城买回来的,还有好些没有拍上呢,纯手工打造就是如此,从每个零件设计开始~~~
        

    2.下面是利用autoCAD设计的面板图和内部轮带机构尺寸图,因为箱体采用的是室内装修的下脚料(PVC),用手锯简单修理了一下,然后将机械图纸按照1:1尺寸打印,贴到面板上,然后用钻头和手锉开孔。面板还是比较厚的,于是采用沉头螺钉与双母头的铜柱搭配进行固定,在轮带板上对应位置打孔。铜柱高度取决于在轮带上的磁铁与面板下表面有一定空间的基础上,同时也要保证电机不与面板内侧不干涉。
    3.各重要器件的安装位置图
    (1)电机和电机驱动板的位置(利用木制板做支架,将电机架起来,防止由于电机过重而影响轮带固定)


   


    (2)卡口与微动开关安装

        PS:这个铝合金的小卡口设计了好几种方案,就这个效果最好了
   


    (3)LED、控制开关和蜂鸣器的位置


   


       PS:线束有些乱,影响美观了,请见谅,不过后来都扎好了~~~
   


    PS:左右两个微动开关固定方式
        


   


    (4)面板与轮带安装方式(设计的机械图,此图中标示了干涉与安装需要注意的关键点,以及面板的尺寸参数,具体机械尺寸图请见附件,本人也是随着自己所想绘制的,不太符合要求,请见谅,为阅览方便,输出为pdf格式)


   


    (5)面本内侧结构图(加入木板,以保证机械稳固性,但是看起来不太美观了)

   
   

        PS:这就是电机正反转的驱动器,是老大以前用的,改造了一下,又派上大用场了~~~

        


       PS:开关电源正好安装到侧壁的木板上,一点不浪费  
        


   
  

      
   

   


       (6)下面该是主角登场的时候了-----装上我们的核心板Psoc4,硬件和机械全部搞定,下面就是软件的介绍了~~~


   


三、软件设计:

    正所谓麻雀虽小五脏俱全,小小的一个演示平台动用了很多资源,如PWM实现电机调速,定时器实现定时闪烁,中断实现开关的及时响应等,这些工作对于Psoc4而言,实现起来很是方便~~~
    1.软件设计流程图:


   

  2.软件功能:
    (1)状态指示灯
    Work Status:2S为周期的闪烁,作为平台正常工作的指示灯。此功能利用定时器来实现,程序代码如下所示:

       (a)中断程序

        CY_ISR(ISR1min_INTERRUPT)
        {
                /* Clear Inerrupt */
         //          Timer_ClearInterrupt(Timer_INTR_MASK_CC_MATCH);
                 TMR1min_Flag = 1;        //60s定时器
                Timer_1_STATUS;    //注意此处的标志位清零操作


                /* Increment the Counter to indicate the keep track of the number of
             * interrupts received */
        //    InterruptCnt++;   
        }


        (b)工作状态指示灯闪烁程序
           if(TMR1min_Flag)    //检测定时器中断标志位,并对工作指示灯变量取反赋给接口,实现周期为2S的闪烁        {
                TMR1min_Flag = 0;   //清标志位
                if(Work_Status)
                {Work_Status = 0;}
                else
                {Work_Status = 1;}
                Status_Work_Write(Work_Status);
        }

    Fuel Theft Warning、Open Circuit Warning和Short Circuit Warning:接收到报警信号后,对应指示灯点亮,在检测到点火信号变化后,更新指示灯状态。

        此功能程序代码如下,在检测到接收数据包成功后,根据接收包的状态执行报警:


             if(REC_suc == 1) //检查Uart接收标志位

                {        
                        REC_suc = 0;      //清标志位
                        switch(REC_Ptcdata[2])    //对接收到的报警码执行操作
                        {
                        case 0x01:                                //偷油报警,点亮偷油报警灯,蜂鸣三次
                                TheftFuel_Write(1);     
                                ShortWarning_Write(0);
                                OpenWarning_Write(0);


                                for(i=0;i<3;i++)
                                {
                                        FR_CTRL_Write(1);
                                        Delay(100);                        
                                        FR_CTRL_Write(0);
                                        Delay(100);
                                }


/*                                for(i=0;i<3;i++)        //led闪烁,蜂鸣随着同时动作
                                {
                                        TheftFuel_Write(1);
                                        FR_CTRL_Write(1);
                                        Delay(50);                        
                                        TheftFuel_Write(0);
                                        FR_CTRL_Write(0);
                                        Delay(50);
                                }
*/
/*
                                        TheftFuel_Write(1);        //led点亮3S,蜂鸣响三次


                        for(i = 0; i< 3; i++)
                        {
                                FR_CTRL_Write(1);
                                Delay(50);
                                FR_CTRL_Write(0);
                                Delay(50);
                        }


                                        Delay(200);                        
                                        TheftFuel_Write(0);
*/
                                break;
                        
                        case 0x02:                                //传感器短路报警,点亮短路报警灯,蜂鸣三次
                                ShortWarning_Write(1);
                                TheftFuel_Write(0);
                                OpenWarning_Write(0);
                                for(i=0;i<3;i++)
                                {
                                        FR_CTRL_Write(1);
                                        Delay(100);                        
                                        FR_CTRL_Write(0);
                                        Delay(100);
                                }
                                break;
                        
                        case 0x03:                                //传感器开路报警(拆除报警),点亮偷油报警灯,蜂鸣三次


                                OpenWarning_Write(1);
                                TheftFuel_Write(0);
                                ShortWarning_Write(0);
                                for(i=0;i<3;i++)
                                {
                                        FR_CTRL_Write(1);
                                        Delay(100);                        
                                        FR_CTRL_Write(0);
                                        Delay(100);
                                }
                                break;
                        case 0x04:                                //清状态灯,在接收到On(点火信号)变化指令后清除报警状态,并蜂鸣2s。
                                ShortWarning_Write(0);
                                TheftFuel_Write(0);
                                OpenWarning_Write(0);


                                        FR_CTRL_Write(1);
                                        Delay(200);                        
                                        FR_CTRL_Write(0);
                                break;
                                
                        default:
                                break;
                        }
                }

    (2)远端近端微动开关
    起初采用扫描方式进行开关状态采集,后来发现一个主要问题,在进入到LED的闪烁延时中,如果此刻卡口接近或接触微动开关时,会出现卡口冲出微动开关囊括的区域,为此将其触发条件改为中断方式,提高其触发的时时检测性。程序代码如下:

/*******************************************************************************
* Function Name: isr_far_Interrupt
********************************************************************************
* Summary:
*   The default Interrupt Service Routine for isr_far.
*
*   Add custom code between the coments to keep the next version of this file
*   from over writting your code.
*
* Parameters:  
*   None
*
* Return:
*   None
*
*******************************************************************************/
CY_ISR(far_Interrupt)
{
    /*  Place your Interrupt code here. */
    /* `#START isr_far_Interrupt` */




        PWM_WriteCompare1(0);
        PWM_WriteCompare1(0);
        PWM_WriteCompare1(0);   //防止正反向mos管同时导通导致烧坏,先关闭后打开,错开时间
                        
        PWM_WriteCompare2(110);
    /* `#END` */


}
/*******************************************************************************
* Function Name: isr_near_Interrupt
********************************************************************************
* Summary:
*   The default Interrupt Service Routine for isr_near.
*
*   Add custom code between the coments to keep the next version of this file
*   from over writting your code.
*
* Parameters:  
*   None
*
* Return:
*   None
*
*******************************************************************************/
CY_ISR(near_Interrupt)
{
    /*  Place your Interrupt code here. */
    /* `#START isr_near_Interrupt` */
        PWM_WriteCompare2(0);
        PWM_WriteCompare2(0);
        PWM_WriteCompare2(0);       //防止正反向mos管同时导通导致烧坏,先关闭后打开,错开时间
                        
        PWM_WriteCompare1(110);     //将速度调慢,使传送带上磁铁慢速移动,从而带动油浮子


    /* `#END` */


}
    (3)数据包接收程序
        数据包格式为:0xa5 0xa5 warning 0x5a CRC16H CRC16L,共六个字节,warning为报警信息。首字节为包头,第四字节为包尾,第5和第6字节为16位CRC校验
/*

******************************************************************************
* Function Name  : uint8        REC_Ptc(void)


* Description    : 接收数据包
* Input          : None
*                  
* Output         : None
* Return         : REC_CorrectFlag
******************************************************************************
*/
void        REC_Ptc(void)
{
        uint8         REC_data;
        static        uint8        PtcHead_Ture;
        static        uint16 cnt = 0;


        
        if(Uart_1_RX_flag == 1)
        {        
                Uart_1_RX_flag = 0;
                REC_data = UART_1_GetChar();


                if(REC_data == 0xa5)                //检测包头
                {        
                        if(cnt < 6)                        //检测到包头后,防止在收到“数据长度”之前的数据与包头一致,而误当作包头。
                        {
                                PtcHead_Ture = 1;
                        }
                        else
                        {
                                cnt = 0;
                        }
                }
                if( PtcHead_Ture && (cnt < 6) )
                {
                        REC_Ptcdata[cnt] = REC_data;    //保存数据包到REC_Ptcdata中
                        cnt++;
                        if(cnt == 5)                                  //计数结束,采集一包数据后置标志位REC_CorrectFlag = 1;
                        {
                                REC_CorrectFlag = 1;
                        }
            else         REC_CorrectFlag = 0;
                }
        }
}


/*
******************************************************************************
* Function Name  : uint8        Analyze_Ptc(uint8 *pucFrame,uint16 Len)


* Description    : 拆解校验数据包
* Input          : --pucFrame:接收数据包起始位置的指针
*                  --Len:接收数据包的长度                 
* Output         : None
* Return         : None
******************************************************************************
*/
void Analyze_Ptc(uint8 *PtcFrame,uint16 Len)
{        
    uint16        CRC16 = 0x0000;
    uint8   CRC16H,CRC16L;
        if( REC_CorrectFlag )
        {
                REC_CorrectFlag = 0;
        if((REC_Ptcdata[2]==0xa5) && (REC_Ptcdata[4]=0x5a))         //包尾检测
        {
            CRC16 = MB_CRC16(REC_Ptcdata,4);                        //对接收数据包进行CRC校验
            CRC16H = (CRC16>8)&0xff;
            CRC16L = CRC16&0xff;
            if(REC_Ptcdata[4]==CRC16H && REC_Ptcdata[5]==CRC16L)    //CRC校验验证
            {  REC_suc = 1; }
            else REC_suc = 0;
        }
    }
}

    (4)上面在介绍正反转时,大家应该注意到了,我采用的是PWM输出的功能,由于Posc4中硬件hdl的资源不是很多,就采用一个PWM模块,设置成双输出的模式即可满足。具体详见附件资料。

    其他一些函数,比如开机自检以及16位CRC校验函数都在源文件中,如有需要请参考源程序。下面再贴上一些这次展会上的照片。
       下面这张照片是我们的经理在向国外客户介绍水泥车平台和油箱液位演示平台的功能,好多人都被这个浮子悬浮移动吸引过来的~~~


        


       PS:其实下图中的水泥车驱动也是用的Psoc4作为控制器,通过PWM调速驱动直流电机,只不过操作简便,实现定时工作,模拟水泥车的正常工作状态。也是在下的拙作。以后大家需要改个什么东东,可以跟我说下~~~
   

        PS:报警数据平台显示,这是我同事做的工作,纯软件很羡慕~~~
        

        

       下面是源文件和一些硬件及机械的设计文档,希望大家多多指教,多提问题~~~

        
MOTO_DRIVER.pdf (9.31 KB, 下载次数: 40)

        
fuel warning test platform.rar (2.87 MB, 下载次数: 83)

        
传感器平台-Model.rar (331.32 KB, 下载次数: 40)


        终于赶完了,好几天了,一直都忙得要死,晚上回来做晚饭就想睡觉,电脑都懒得开了。但是“飞飞”、“xinxin”以及这次活动的组织者们的面子不能不给,于是大晚上的,务必把租子交上,请检查是否够数,记得算上之前的那份租子,呵呵~~~
【PSoC4】+  利用触摸滑条调节无刷直流电机转速
https://www.cirmall.com/bbs/forum ... =17339&fromuid=6672


评分

参与人数 6声望 +21 与非币 +50 收起 理由
翔宇 + 10 赞一个!
小菜儿 + 5 + 10 很给力!
┗SKY┛ + 3 + 5
GY@艳 + 5 + 10 很给力!
zada小明 + 3 + 5 赞一个!
西门吹猫 + 5 + 10 很给力!

查看全部评分

分享到:
回复

使用道具 举报

回答|共 101 个

倒序浏览

沙发

mengyun2801

发表于 2013-11-19 00:39:51 | 只看该作者

终于算是大功告成,整理起来真挺费劲的,料太多,就得写的详细一些~~~
板凳

GY@艳

发表于 2013-11-19 08:21:00 | 只看该作者

mengyun2801 发表于 2013-11-19 00:39
终于算是大功告成,整理起来真挺费劲的,料太多,就得写的详细一些~~~

绝对赞   就知道你棒!!!辛苦了啊!  对一切事儿都要Fighting!!!
爱板  爱板  爱板     https://www.cirmall.com
地板

糖悦之果飞

发表于 2013-11-19 08:31:00 | 只看该作者

mengyun2801 发表于 2013-11-19 00:39
终于算是大功告成,整理起来真挺费劲的,料太多,就得写的详细一些~~~

哇哇哇,太牛啦,必须赞一个的哇!!!
5#

mengyun2801

发表于 2013-11-19 09:16:00 | 只看该作者

GY@艳 发表于 2013-11-19 08:21
绝对赞   就知道你棒!!!辛苦了啊!  对一切事儿都要Fighting!!! ...

谢谢啊,质量一般,尽量写的好点~~~
做事要认真,结果搞得有些晚了,值得~~~
6#

mengyun2801

发表于 2013-11-19 09:16:57 | 只看该作者

tyzhgf 发表于 2013-11-19 08:31
哇哇哇,太牛啦,必须赞一个的哇!!!

谢谢,过奖了,不会做饭的钳工不是好工程师~~~
7#

西门吹猫

发表于 2013-11-19 09:23:53 | 只看该作者

好东西,赞一个!!!!!
8#

小菜儿

发表于 2013-11-19 09:28:47 | 只看该作者

帅气,牛!
9#

mengyun2801

发表于 2013-11-19 09:30:42 | 只看该作者

cat3902982 发表于 2013-11-19 09:23
好东西,赞一个!!!!!

谢谢阿,有机会大家一起搞点啥玩呀~~~
10#

mengyun2801

发表于 2013-11-19 09:32:12 | 只看该作者

xinxincaijq 发表于 2013-11-19 09:28
帅气,牛!

谢谢提点,过奖了,最近太忙,终于腾出时间了,夜战上传成果,要对得起爱板的称号,虽然质量一般~~~~~~~
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条