OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2846|回复: 3

电容触摸按键实验的计数频率的问题

[复制链接]

11

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2017-7-12
在线时间
68 小时
发表于 2017-7-24 15:37:13 | 显示全部楼层 |阅读模式
int main(void)
{                                          
        u8 t=0;         
        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        TPAD_Init(6);                        //初始化触摸按键
           while(1)
        {                                                                                                             
                if(TPAD_Scan(0))        //成功捕获到了一次上升沿(此函数执行时间至少15ms)
                {
                        LED1=!LED1;                //LED1取反
                }
                t++;
                if(t==15)                 
                {
                        t=0;
                        LED0=!LED0;                //LED0取反,提示程序正在运行
                }
                delay_ms(10);
        }
}

u8 TPAD_Init(u8 psc)
{
        u16 buf[10];
        u16 temp;
        u8 j,i;
        TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,psc-1);//以1Mhz的频率计数
        for(i=0;i<10;i++)//连续读取10次
        {                                 
                buf=TPAD_Get_Val();
                delay_ms(10);            
        }                                    
        for(i=0;i<9;i++)//排序
        {
                for(j=i+1;j<10;j++)
                {
                        if(buf>buf[j])//升序排列
                        {
                                temp=buf;
                                buf=buf[j];
                                buf[j]=temp;
                        }
                }
        }
        temp=0;
        for(i=2;i<8;i++)temp+=buf;//取中间的8个数据进行平均
        tpad_default_val=temp/6;
        printf("tpad_default_val:%d\r\n",tpad_default_val);       
        if(tpad_default_val>TPAD_ARR_MAX_VAL/2)return 1;//初始化遇到超过TPAD_ARR_MAX_VAL/2的数值,不正常!
        return 0;                                                                           
}



void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
        //此部分需手动修改 IO口设置  
        RCC->APB1ENR|=1<<3;           //TIM5 时钟使能
        RCC->APB2ENR|=1<<2;            //使能PORTA时钟

        GPIOA->CRL&=0XFFFFFF0F;        //PA1  输入  
        GPIOA->CRL|=0X00000040;        //浮空输入               
          
        TIM5->ARR=arr;                  //设定计数器自动重装值//刚好1ms   
        TIM5->PSC=psc;                  //预分频器,1M的计数频率         

        TIM5->CCMR1|=1<<8;                //CC2S=01         选择输入端 IC2映射到TI2上
        TIM5->CCMR1|=0<<12;         //IC2F=0011 配置输入滤波器 8个定时器时钟周期滤波
        TIM5->CCMR1|=0<<10;         //IC2PS=00         配置输入分频,不分频

        TIM5->CCER|=0<<5;                 //CC2P=0        上升沿捕获
        TIM5->CCER|=1<<4;                 //CC2E=1         允许捕获计数器的值到捕获寄存器中
                                                                                                                                 
        TIM5->CR1|=0x01;            //使能定时器5
}

为什么会是1Mhz的计数频率,望各位大哥大姐赐教


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-1-31
在线时间
3 小时
发表于 2019-2-11 16:51:39 | 显示全部楼层
注释错了,按照代码是12M, 对于定时器频率越高按键的灵敏度越高
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-9-24
在线时间
26 小时
发表于 2019-11-29 11:44:19 来自手机 | 显示全部楼层
同问,为什么是输出1m呢,还是程式注释有问题
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-22
在线时间
14 小时
发表于 2020-4-14 08:58:08 | 显示全部楼层
总算有个认真看程序的人了,我也是觉得奇怪,pdf电子书里面是空,视频里是72,给的事例上面是6,虽然不影响结果,因为是看阈值的大小,不过我是真的服了原子这种为了完成任务似的书写。串口实验里也不讲一下printf的重定位。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 05:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表