电容触摸按键的反常情况(16F722)

2020-02-08 09:30发布

我现在写电容触摸按键、用的是16F722的触摸按键模块
使用TMR2作为时基、TMR1计数(TMR2门控)
按照正常的状态,手指按下时、从TMR1读出来的计数值应该是下降的,但是读出来的值居然有上升的。
读数没有经过处理、是直接显示出来的。
请问按键这里有什么问题要注意的?

比如没有按下时读数是6580、
        按下时读数是6302、
        异常时读数是6650、
        还有更离谱的是读数是6610、基本没有变化

程序如下
按键模块的配置:
const unsigned char table_CPS[5]={0,1,9,11,10};  //5个CPS通道对应的选择


void init_timer2() //用于产生时基、TMR2的溢出周期可调
{
    PR2=255;    //TMR2的溢出周期
    TMR2=0;
    T2CKPS1=1;  //预分频比1:16******************************************
    T2CKPS0=1;
    TOUTPS3=1;  //后分频比1:16
    TOUTPS2=1;
    TOUTPS1=1;
    TOUTPS0=1;
    TMR2IF=0;
    TMR2IE=1;
    TMR2ON=1;   //启动Timer2
}

void init_timer1()
{
    TMR1CS1=1;    //CPS计数
    TMR1CS0=1;
    T1CKPS1=0;    //预分频比1:1
    T1CKPS0=0;
    T1SYNC=0;     //与内部时钟同步-使用内部时钟源时是无关位
    TMR1H=0;
    TMR1L=0;
    TMR1GE=1;     //开启门控
    T1GSPM=0;     //禁止单脉冲采集模式
    T1GTM=0;      //禁止门控反转模式
    T1GPOL=0;     //门控低电平有效
    T1GSS1=1;     //门控源TMR2匹配PR2
    T1GSS0=0;

    TMR1IF=0;
    TMR1IE=1;
    TMR1ON=1;
}

void init_CPS()
{
    CPSCON1=0;    //CPS通道、初始时选择通道0
    CPSRNG1=1;    //CPS量程-中量程***********************************************
    CPSRNG0=0;
    RB0=0;        //将相应引脚设为模拟输入引脚
    RB1=0;
    ANSB0=1;
    ANSB1=1;
    TRISB0=1;
    TRISB1=1;
    RD1=0;
    RD2=0;
    RD3=0;
    ANSD1=1;
    ANSD2=1;
    ANSD3=1;
    TRISD1=1;
    TRISD2=1;
    TRISD3=1;
    CPSON=1;       // 启动CPS模块

    init_timer2(); //用于产生时基
    init_timer1(); //用于计数CPS周期
}

在中断中读取按键计数值:
// ================ interrupt ============== //
void interrupt ISR()
{
    if(T0IF && T0IE)     //255us自由计数、作为公用时基
    {
        time1++;
        T0IF=0;
    }

    if(TMR1IF && TMR1IE) //计数CPS周期
    {
        over++;          //记录溢出事件
        while(1) ;       //拦截溢出事件
        TMR1IF=0;
    }

    if(TMR2IF && TMR2IE) //作为CPS的时基
    {
        TMR1ON=0;

        average[i_CPS]=(TMR1H<<8)+TMR1L;

        i_CPS++;
        if(i_CPS>4) { i_CPS=0; }  //紧跟着检测i_CPS的值是否越界
        CPSCON1=table_CPS[i_CPS]; //切换通道

        TMR1H=0;
        TMR1L=0;
        TMR1ON=1;
        TMR2IF=0;
    }
}

程序打包:
按键程序ourdev_696427TXV0WG.zip(文件大小:159K) (原文件名:CPS-keys.zip)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
cc3000c
1楼-- · 2020-02-08 10:41
找到了一个官方的代码、不是很全。里面的一个头文件没搜到、但是该有的都有了(Google代码搜索).
Cap_Touch727.c :
Cap_Touch727.c(txt版)ourdev_696591A9Q5JM.txt(文件大小:19K) (原文件名:Cap_Touch727.txt)

继续调试中...
zheng_wei339
2楼-- · 2020-02-08 13:39
是不是线路有自激
cc3000c
3楼-- · 2020-02-08 13:44
 精彩回答 2  元偷偷看……
cc3000c
4楼-- · 2020-02-08 14:53
今天得知偶采用的这种CSM模式的触摸方案很难做、要得到稳定的软件算法有些难。
看来是CVD的常见。
偶觉得有建模达人帮忙就好了
cc3000c
5楼-- · 2020-02-08 18:11
今天得知偶采用的这种CSM模式的触摸方案很难做、要得到稳定的软件算法有些难。
看来是CVD的常见。
偶觉得有建模达人帮忙就好了
super3
6楼-- · 2020-02-08 22:38
回复【5楼】cc3000c  
-----------------------------------------------------------------------

你要什么建模。如果要用CVD建模可以参考microchip上的AN1298应用笔记。如果你直接用microchip免费提供的CVD framework程序,可能你要自己改一改程序(不建议),或者换一个目前framework支持的芯片(16F772目前不支持,framwrok目前主要支持enhanced-midrange. 就是PIC16F1XXX系列),或者等到明年2月,会有新版本的framework支持pic16f722。你想要framework,我可以发给你。

一周热门 更多>