完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
智能小车的超声波避障实现过程
在硬件综合训练这门课程中,我们以小组的形式完成了基于stm32f103vc的智能小车的制作,实现的主要功能有:遥控、避障、语音控制、人脸识别以及舵机控制摄像头旋转。其中我主要负责的是stm32板的开发,以下是超声波避障的实现过程。
void iniTim() { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitStructer.TIM_Period=9999;// 定时周期 .1s 100ms overflow TIM_TimeBaseInitStructer.TIM_Prescaler=71; // 72 000 000 1mhz 1us TIM_TimeBaseInitStructer.TIM_ClockDivision=0; TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStructer.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer); TIM_Cmd(TIM2,ENABLE); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM2,DISABLE);// 关闭定时器使能 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*TRIG 信号 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /*ECOH 信号 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_9);//关闭距离过远led } 测距函数: double get_length(void) { GPIO_SetBits(GPIOB,GPIO_Pin_8); Delay_us(11); GPIO_ResetBits(GPIOB,GPIO_Pin_8); while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6) == RESET); TIM2->CNT = 0;//清零计时器 TIM_Cmd(TIM2,ENABLE);// 回响信号到来,开启定时器计数 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==SET); TIM_Cmd(TIM2,DISABLE);// 关闭定时器 if(!toofar) //没有完成一次计数周期,即距离不是很远 { t=TIM_GetCounter(TIM2);// 获取 TIM2 寄存器中的计数值 time = (double)t/(double)1000000; //往返时间,单位s length = 340*time/2; //单程长度,单位m TIM2->CNT=0; // 将 TIM2 计数寄存器的计数值清零 } else { toofar = 0; length =99; //足够远,不用考虑 TIM2->CNT=0; // 将 TIM2 计数寄存器的计数值清零 } return length; } 设置中断: void TIM2_IRQHandler(void) // 中断,当距离足够远时,设置toofar = 1,不必再计算 { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);// 清除中断标志 toofar = 1; GPIO_ResetBits(GPIOB,GPIO_Pin_9); } } 主函数: int main(void) { SysTick_Init(); iniTim(); while(1) { double len = 0; len = get_length(); if ( len < 0.5 ) //如果距离够近 { GPIO_SetBits(GPIOB,GPIO_Pin_7);//点亮距离过近led GPIO_ResetBits(GPIOB,GPIO_Pin_9);//复位距离过远led } else { if(toofar)//距离长到tim溢出,> 17m { GPIO_SetBits(GPIOB,GPIO_Pin_9);//点亮距离过远led GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led } else { GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led GPIO_ResetBits(GPIOB,GPIO_Pin_7);//复位距离过近led } } } } 注:我添加了两个led灯来判断超声波测距功能的实现,其中 PB7引脚上连接的是距离过近led,如果近距离内出现障碍,它会亮起; PB9引脚上连接的是距离过远led,如果在很远的距离范围里都没有障碍,它会亮起。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1767 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1069 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 02:34 , Processed in 0.633994 second(s), Total 73, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号