实验要求
效果图
超声波模块
STM32发出trig信号给模块,模块被驱动发出超声波,接受返回超声波时处于高电平状态。高电平持续时间t1,待测距离为S. 则 V声 * t1 / 2 = S (声速可以取340m/s)
外部中断
- 开启复用的GPIO口和复用时钟
- 配置GPIO输入模式,输入速度,初始化
配置外部中断(使用上下沿同时触发因为要测高电平持续时间)
void exti() { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
配置中断优先级,选线路
void nvic() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
- 中断服务函数
程序思路
- while循环里设置一个45μs的脉冲触发trig,让超声波模块工作
- echo接到中断线路上,触发中断判断高电平计时开始,低电平计时结束。计时的数值在TIM3->CNT寄存器里.
- 把计时的数据换单位后换成距离输出到数码管上.
- 数码管一次只能片选一个管子,所以扫描输出欺骗眼睛.