STM32
直播中

china

16年用户 984经验值
擅长:14230
私信 关注
[问答]

怎样做才能在串口调试助手中看见STM32超声波测距模块测试的距离呢

怎样做才能在串口调试助手中看见STM32超声波测距模块测试的距离呢?

回帖(1)

陈博朴

2021-12-2 09:41:57
STM32超声波测距模块
非输入捕获教程

定时器的配置







同样的操作你们试试TIM3





每1us,CNT++;CNT加到65535就会溢出,产生中断。
所以可以将PSC ARR当作两次时钟分频,两次分频乘积/72MHZ 就是
每隔这么多时间定时器就中断一次
但arr中设置的count可以检测出来。因此,我们就将预分频系数设为72-1,此时为1us一个时钟周期,再设置arr为65535,这样我们最多可以计数65535us,完全够超声波的计时了。并且中断次数少,不会太影响程序进程。
串口printf准备工作




在 USER CODE BEGIN 4 中写
(注意还要添加头文件stdio.h)

int fputc(int ch, FILE *f)
{
        HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
        //采用轮询方式发送一个字节的数据,没有发送成功就一直等待
        return ch;
}
int fgetc(FILE *f)
//int fgetc(int ch, FILE *F)
{
        uint8_t ch;
        HAL_UART_Receive (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
        return ch;
}
此后,就可以在主函数中使用printf函数打印数据用串口显示啦,
生成代码后main.c的工作
us级定时
us级定时的三种方法

/* USER CODE BEGIN 4 */
void user_delaynus_tim(uint32_t nus)
{


uint16_t  differ = 0xffff-nus-5;
//设置定时器2的技术初始值
  __HAL_TIM_SetCounter(&htim3,differ);
  //开启定时器
  HAL_TIM_Base_Start(&htim3);


  while( differ<0xffff-5)
{
  differ = __HAL_TIM_GetCounter(&htim3);
};
//关闭定时器
  HAL_TIM_Base_Stop(&htim3);
}


/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define Trig_H          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET );   
#define Trig_L          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET );   
   


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint16_t count;
uint16_t distance;
uint16_t  time;
uint16_t i;
/* USER CODE END PM */


while (1)
  {
                printf("准备中rn");
                HAL_Delay (500);
                Trig_H ;
                user_delaynus_tim(12);
                Trig_L ;
                  //开启定时器
        HAL_TIM_Base_Start(&htim3);
                while( HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_2) != GPIO_PIN_SET)
                        ;
                __HAL_TIM_SetCounter(&htim3,0);
        //        printf("准备完毕开始测试rn");
                /* 打开中断,对Echo高电平时间计时 */
                while(HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_2) == GPIO_PIN_SET)
                        ;
                //关闭定时器
                count = __HAL_TIM_GetCounter(&htim3);
        HAL_TIM_Base_Stop(&htim3);
          /* 关闭中断,通过参数time来取得距离参数 */
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
                 distance = (uint16_t )count*0.017;
                 i++;
                 printf("第%d次的距离为 %d nr",i,distance);
  }
  /* USER CODE END 3 */
}
完成以上步骤,就可以在串口调试助手中看见超声波测试的距离啦





输入捕获教程
举报

更多回帖

发帖
×
20
完善资料,
赚取积分