打印
[STM8]

STM8S的输入捕获做超声波测距,为何CCR2中的值与距离成.反比

[复制链接]
465|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2021-12-6 22:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8S的输入捕获做超声波测距,为何CCR2中的值与距离成.反比

使用特权

评论回复
沙发
huangchui| | 2021-12-6 22:54 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
zhanghqi|  楼主 | 2021-12-6 22:57 | 只看该作者
即距离越近,CCR2中的值越大。实际情况应该是成正比的。使用逻辑分析仪检测发现输入的脉冲宽度是和时间成正比的。

使用特权

评论回复
地板
juventus9554| | 2021-12-6 22:59 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
zhanghqi|  楼主 | 2021-12-6 23:01 | 只看该作者


/*硬件接线说明

PC1接ECHO

PI0接TRIG

*/



#include "iostm8s208mb.h"//主控芯片的头文件

#include "ptctr.h"

#include "lcd1602.h"

#include "stdbool.h"

#include "stdio.h"



#define  TRIG           PI_ODR_ODR0    //输出给超声波一个触发信号的引脚



u16 pw1=0,pw2=0;

u16 tmp=0;

_Bool  pw_Flag=false;





int main(void)

{

  Clock_Config();

  Delay_ms(10);//延时等待稳定

  GPIO_Config();//初始化相关GPIO引脚配置

  TIM1_init();//TIM1相关功能配置初始化

  asm("rim");   



  while(1)

  {

    TRIG =1;//保证最短10us的高电平

    Delay_us(15);

    TRIG =0;

    Delay_ms(100);//保持100ms的延时以等待回波

   

    if(pw_Flag==true)

    {



      tmp=(float)pw2*0.017;//0.017是声速340m/s除以2的值。

      pw_Flag=false;

      

    }

  }

}



/*TIM1捕获/比较中断*/

#pragma vector=TIM1_CAPCOM_CC1IF_vector

__interrupt void TIM1_CAPCOM_CC1IF_ISR(void)

{

   if(TIM1_SR1_CC1IF==1)

   {

     TIM1_SR1_CC1IF=0;//清除中断标志位

   }

   if(TIM1_SR1_CC2IF==1)

   {

     TIM1_SR1_CC2IF=0;//清除中断标志位

     pw2=TIM1_CCR2H;

     pw2<<=8;

     pw2+=TIM1_CCR2L;

     pw_Flag=true;

   }

}



/*TIM1初始配置*/

void TIM1_init(void){



  CLK_PCKENR1=0x80;//打开定时器1时钟



  TIM1_PSCRH=0;//16M不分频

  TIM1_PSCRL=0;



  TIM1_CR1_ARPE =0;//不通过预装载寄存器

  TIM1_CR1_URS=1;//仅当计数器溢出时才发生中断请求

  TIM1_CR1_UDIS=1;//禁止更新事件//计数器溢出属于更新事件

  TIM1_CR1_DIR=0;//向上计数

  

  TIM1_CCMR1=0;

  TIM1_CCMR1 |=0x01;

  TIM1_CCMR2=0;      

  TIM1_CCMR2|=0x02;



  TIM1_CCER1_CC1P=0;//上升沿时发生捕获

  TIM1_CCER1_CC2P=1;//下降沿时发生捕获



  TIM1_CCER1_CC1E=1;//使能捕获功能

  TIM1_CCER1_CC2E=1;//使能捕获功能



  TIM1_SMCR=0x54;//



  TIM1_CCER1_CC1E=1;//使能捕获功能

  TIM1_CCER1_CC2E=1;//使能捕获功能



  TIM1_IER_CC1IE=1;//开启捕获中断

  TIM1_IER_CC2IE=1;//开启捕获中断

  TIM1_CR1_CEN=1;//开启计数

}



/*时钟初始配置*/

void Clock_Config(void){

  

    //==启用外部晶振.不分频。

    CLK_CKDIVR =0x02;//四分频

    CLK_ECKR=0x01;//HSE开

    CLK_ICKR=0x00;

    while(CLK_ECKR!=0x03);//等待HSE准备就绪

    CLK_SWR=0xb4;//设置HSE为主时钟源

    CLK_SWCR=0x03;//使能时钟切换,禁止时钟中断

    while(!(CLK_SWCR &0x08));    // 等待切换至HSE完成

}



/*GPIO初始配置*/

void GPIO_Config(void){

  

    PI_DDR_DDR0=1; //配置PI0端口为输出模式

    PI_CR1_C10=1;  //配置PI0端口为推挽输出模式

    PI_CR2_C20=1;  //配置PI0端口高速输出

    PI_ODR_ODR0=0;  //输出低电平

   

    PC_DDR_DDR1 =0;//PC1输入

    PC_CR1_C11  =0;//浮空输入

    PC_CR2_C21  =0;//禁止外部中断功能

}

使用特权

评论回复
6
zhenykun| | 2021-12-6 23:05 | 只看该作者
TIM1的初始化

使用特权

评论回复
7
zhenykun| | 2021-12-6 23:08 | 只看该作者
/*TIM1初始配置*/

void TIM1_init(void){



   TIM1_PSCRH=0;

  TIM1_PSCRL=15;





  TIM1_CCMR1=0;

  TIM1_CCMR1 |=0x01;

  TIM1_CCMR2=0;      

  TIM1_CCMR2|=0x02;



  TIM1_CCER1_CC1P=0;//上升沿时发生捕获

  TIM1_CCER1_CC2P=1;//下降沿时发生捕获



  TIM1_CCER1_CC1E=1;//使能捕获功能

  TIM1_CCER1_CC2E=1;//使能捕获功能



  TIM1_SMCR=0x54;//



  TIM1_CCER1_CC1E=1;//使能捕获功能

  TIM1_CCER1_CC2E=1;//使能捕获功能



  TIM1_IER_CC1IE=1;//开启捕获中断

  TIM1_IER_CC2IE=1;//开启捕获中断

  TIM1_CR1=0x01;//开启计数

}

使用特权

评论回复
8
zwll| | 2021-12-6 23:11 | 只看该作者
是不是捕获极性反了?

使用特权

评论回复
9
zhanghqi|  楼主 | 2021-12-6 23:13 | 只看该作者
重新检查了一遍,捕捉极性按照下面的设置来看,应该是没错的

使用特权

评论回复
10
tpgf| | 2022-1-3 17:41 | 只看该作者
是不是寄存器设置的问题啊

使用特权

评论回复
11
wakayi| | 2022-1-3 17:55 | 只看该作者
反过来设置看看

使用特权

评论回复
12
wowu| | 2022-1-3 17:58 | 只看该作者
估计是细节没有把握好

使用特权

评论回复
13
xiaoqizi| | 2022-1-3 18:01 | 只看该作者
跟传感器有关系吧

使用特权

评论回复
14
木木guainv| | 2022-1-3 18:01 | 只看该作者
是不是触发方式的问题啊

使用特权

评论回复
15
磨砂| | 2022-1-3 18:02 | 只看该作者
成反比是默认的吗

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝