|
实验器材:
NANO STM32F103开发板V1版本,US-015避障模块
实验目的:
超声波避障测试程序
硬件资源:
1.Trig连接PA8
2.Echo连接PC8
实验现象:
本实验利用PA8产生20us高电平触发信号,周期10ms;
利用TIM3_CH3来做输入捕获,我们将捕获PC8上的高电平脉宽,并将脉宽时间通过串
口打印出来,
注意事项:
硬件连接在电源关闭的状态下进行.
**编程时PC8底层程序要使能其复用功能。
#include "us015timer.h"
// PC8---Echo TIM3 CH3
//TIM3 捕获初始化
TIM_HandleTypeDef TIM33_Handler; //定时器3句柄
//定时器2通道1输入捕获配置
//arr:自动重装值(TIM3是16位的!!)
//psc:时钟预分频数
void TIM3_CH3_Cap_Init(u32 arr,u16 psc)
{
TIM_IC_InitTypeDef TIM3_CH3Config;
TIM33_Handler.Instance=TIM3; //通用定时器3
TIM33_Handler.Init.Prescaler=psc; //分频系数
TIM33_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM33_Handler.Init.Period=arr; //自动装载值
TIM33_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
TIM33_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
HAL_TIM_IC_Init(&TIM33_Handler); //初始化输入捕获时基参数
TIM3_CH3Config.ICPolarity=TIM_ICPOLARITY_RISING; //上升沿捕获
TIM3_CH3Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上
TIM3_CH3Config.ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM3_CH3Config.ICFilter=0; //配置输入滤波器,不滤波
HAL_TIM_IC_ConfigChannel(&TIM33_Handler,&TIM3_CH3Config,TIM_CHANNEL_3);//配置TIM3通道3
HAL_TIM_IC_Start_IT(&TIM33_Handler,TIM_CHANNEL_3); //开启TIM3的捕获通道3,并且开启捕获中断
__HAL_TIM_ENABLE_IT(&TIM33_Handler,TIM_IT_UPDATE); //使能更新中断
HAL_NVIC_SetPriority(TIM3_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断通道
}
//定时器2底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器2句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
__HAL_AFIO_REMAP_TIM3_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
GPIO_Initure.Pin=GPIO_PIN_8; //PC8
GPIO_Initure.Mode=GPIO_MODE_AF_INPUT; //复用推挽输入
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
HAL_NVIC_SetPriority(TIM3_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断通道
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8 TIM3CH3_CAPTURE_STA=0; //输入捕获状态
u16 TIM3CH3_CAPTURE_VAL; //输入捕获值(TIM3是16位)
//定时器2中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM33_Handler); //定时器共用处理函数
}
//定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用,实现多个计数器满装载的计数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
{
if((TIM3CH3_CAPTURE_STA&0X80)==0) //还未成功捕获上升沿
{
if(TIM3CH3_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM3CH3_CAPTURE_STA|=0X80; //标记成功捕获了一次
TIM3CH3_CAPTURE_VAL=0XFFFF;
}else TIM3CH3_CAPTURE_STA++;
}
}
}
//定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{
if((TIM3CH3_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if(TIM3CH3_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM3CH3_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM3CH3_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM33_Handler,TIM_CHANNEL_3);//获取当前的捕获值.
TIM_RESET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3,TIM_ICPOLARITY_RISING);//配置TIM3通道3上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM3CH3_CAPTURE_STA=0; //清空
TIM3CH3_CAPTURE_VAL=0;
TIM3CH3_CAPTURE_STA|=0X40; //标记捕获到了上升沿
__HAL_TIM_DISABLE(&TIM33_Handler); //关闭定时器3
__HAL_TIM_SET_COUNTER(&TIM33_Handler,0);
TIM_RESET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM33_Handler,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING);//定时器3通道3设置为下降沿捕获
__HAL_TIM_ENABLE(&TIM33_Handler); //使能定时器3
}
}
}
|
-
-
避障停车.7z
548.44 KB, 下载次数: 22, 下载积分: 黑币 -5
能正常运行
|