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 */
}
完成以上步骤,就可以在串口调试助手中看见超声波测试的距离啦
输入捕获教程
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 */
}
完成以上步骤,就可以在串口调试助手中看见超声波测试的距离啦
输入捕获教程
举报