超声波测距
输入捕获
原理
测定时器输入引脚(TIMx_CHx)上的边沿信号(如上升沿、下降沿或双边沿)来实现。
当边沿信号发生跳变时,定时器当前的计数器值(TIMx_CNT)会被锁存到对应的捕获/比较寄存器(TIMx_CCRx)中,从而完成一次捕获。
功能
- 输入捕获模式:可以配置为上升沿捕获、下降沿捕获或双边沿捕获,以适应不同的信号测量需求。
- 多通道支持:每个高级定时器和通用定时器都配备了多个输入捕获通道(通常为4个),允许同时监测多个输入信号。
- PWM输入模式:在PWM输入模式下,可以同时测量信号的频率和占空比,提供更全面的信号分析。
- 主从触发模式:结合主从触发模式,可以实现硬件全自动测量,简化编程和调试过程
超声波测距仪工程代码示例
main.c
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "oled.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int upEdge = 0;
int downEdge = 0;
float s = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if (htim == &htim1 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){
upEdge = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
downEdge = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
s = ((downEdge - upEdge) * 0.034) / 2;
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_Delay(20);
OLED_Init();
HAL_TIM_Base_Start(&htim1);
HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_4);
char message[20] = "";
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin, GPIO_PIN_RESET);
__HAL_TIM_SET_COUNTER(&htim1,0);
HAL_Delay(300);
OLED_NewFrame();
sprintf(message, "S: %.2f",s);
OLED_PrintString(0, 0, message, &font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}