基于CH32V103实现HC |
您所在的位置:网站首页 › GPIO端口计算 › 基于CH32V103实现HC |
首页
论坛
外包
下载
专栏
专栏首页
通信技术
显示光电
单片机
测试测量
智能硬件
汽车电子
消费电子
工业控制
医疗电子
电路图
物联网
模拟
专访
电源
芯闻号
嵌入式
技术学院
公众号精选
厂商动态
新基建
中国芯
Datasheet
公开课
更多
阅读
21ic专访
编辑视点
专题
会展
高端访谈
新基建
技术
通信技术
显示光电
单片机
测试测量
智能硬件
汽车电子
消费电子
工业控制
医疗电子
开发板
物联网
模拟
电源
嵌入式
资讯
新品
应用
技术专访
基础知识
中国芯
互动
论坛
外包
博客
招聘
课程
公开课
在线研讨会
TI在线培训
资源
下载
电路图
Datasheet
在线计算器
厂商
登录|注册
首页
DSP
MCU
FPGA
拓展板
传感器
仪器
拆解
模拟
首页 > 评测 > 基于CH32V103实现HC-SR04 超声波测距模块轮询读取距离数据 基于CH32V103实现HC-SR04 超声波测距模块轮询读取距离数据 2023-05-05 赞 0评论 作者: 来源: [导读] 本帖最后由 lilijin1995 于 2023-3-17 23:13 编辑 一般的我自己学习单片机,为了更加了解硬件,我都会画了一块CH32V103最小系统板,然后外接其他功能模块实现一些应用,现在秀一秀自己画的板子,虽然设计得不 本帖最后由 lilijin1995 于 2023-3-17 23:13 编辑 一般的我自己学习单片机,为了更加了解硬件,我都会画了一块CH32V103最小系统板,然后外接其他功能模块实现一些应用,现在秀一秀自己画的板子,虽然设计得不怎样,哈哈哈!!!7466364147505af0e3.png (552.61 KB ) 下载附件 2023-3-17 22:11 上传 最近翻箱底有一款超声波测距,HC-SR04,7977641475bf1ac6f.png (437.73 KB ) 下载附件 2023-3-17 22:14 上传 那么现在就开始实现HC-SR04 超声波测距模块轮询读取距离数据 硬件接口:根据规格书可以看到接口定义如下图:25190641476e84e2ef.png (534.55 KB ) 下载附件 2023-3-17 22:19 上传 我们定义PA0映射TRIG,PA1-TIM2CH2映射ECHO,供电为5V。 软件说明: 超声波时序图如下:1205464147c5fe2a59.png (263.56 KB ) 下载附件 2023-3-17 22:42 上传 以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将 发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号 。 回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号 时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:距离= 高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对 回响信号的影响。 这里主要是ECHO配置TIMCH2输入捕获配置,如下代码: /********************************************************************* * @fn TIM2_ICapture_Init * * [url=home.php?mod=space&uid=247401]@brief[/url] Initializes TIM1 input capture. * * @param arr - the period value. * psc - the prescaler value. * ccp - the pulse value. * * [url=home.php?mod=space&uid=266161]@return[/url] none */ void TIM2_ICapture_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure = {0}; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0}; NVIC_InitTypeDef NVIC_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_1); TIM_TimeBaseInitStructure.TIM_Period = arr; TIM_TimeBaseInitStructure.TIM_Prescaler = psc; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM2,&TIM_ICInitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC2, ENABLE); TIM_Cmd(TIM2, ENABLE); }复制代码我们直接在中断里面计算高电平时间,这里面参考了正点原子的输入捕获实验 //TIM2CH2_CAPTURE_STA //bit7:捕获完成标志 //bit6:捕获到高电平标志 //bit5~0:捕获到高电平后定时器溢出的次数 u8 TIM2CH2_CAPTURE_STA=0; //输入捕获状态 u16 TIM2CH2_CAPTURE_VAL; //输入捕获值,用来记录捕获到下降沿的时候,TIM2_CNT的值 //定时器2中断服务程序 void TIM2_IRQHandler(void) { if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了 { if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 { TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM2CH2_CAPTURE_VAL=0XFFFF; }else TIM2CH2_CAPTURE_STA++; } } if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获2发生捕获事件 { if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2); TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC2P=0 设置为上升沿捕获 }else //还未开始,第一次捕获上升沿 { TIM2CH2_CAPTURE_STA=0; //清空 TIM2CH2_CAPTURE_VAL=0; TIM_SetCounter(TIM2,0); TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } } TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位 }复制代码 捕获了高电平时间,直接除以58就是距离值:我们直接看我们的SR04驱动:void SR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_0); //PB.5 输出高 TIM2_ICapture_Init(0xFFFF,71); TRIG(0); } u32 SR04_Handler(void) { u32 temp=0,Distance=0; //TRig Delay_Ms(1); TRIG(1); Delay_Ms(15); TRIG(0); //计算距离 if(TIM2CH2_CAPTURE_STA&0X80) //成功捕获到了一次高电平 { temp=TIM2CH2_CAPTURE_STA&0X3F; temp*=65536; //溢出时间总和 temp+=TIM2CH2_CAPTURE_VAL; //得到总的高电平时间 Distance=(temp/58); printf("Distance:%d cm\r\n",Distance); //打印总的高点平时间 TIM2CH2_CAPTURE_STA=0; //开启下一次捕获 return Distance; } return 0; }复制代码 下载验证:这些开发板你一定没玩过!来共享库免费借阅吧~ 本文系21ic原创,未经许可禁止转载! 点赞() 分享 网友评论 立 即 购 买 查看产品细节 更多相似方案 联系人:巧克力娃娃 邮箱:[email protected] 我要投稿欢迎入驻,开放投稿 行业新闻RAK831 Lite:基于树莓派3的LoRa网关... 2022-06-17 Imagination推出PowerVR AX2185和AX2145神经... 2022-06-17 ODROID-GO是一款兼容Arduino的基于ESP32的便... 2022-06-17 热门标签应用 LoRa FPGA 蓝牙 sub-G 电机控制 sbc WiFi品牌 Gecko NXP 开源 pic32 TI X86 PSoC 论坛活动 more+ ●【看视频赢好礼】贸泽电子视频课程大讲堂 ●叮咚~是德科技提醒您,您的“新年礼包”待签收! ●上传资源瓜分5000元现金奖励! ●大展鸿图庚子年 集新年签赢好礼 公开课 more+ ●嵌入式软件调试专题第01季:调试原理入门●野火F103开发板-MINI教学视频(提高篇)●PADS 9.5 pcb视频零基础入门实战教程●H5进阶-PS设计 项目外包 more+ 寻TMS320F2812系列DSP芯片预算:¥100006天前 调用蓝牙接口的微信小程序摇控器预算:¥100005小时前 HJ/T212-2005 HJ/T212-2017通信协议预算:¥600001天前 皮肤电阻抗测量仪预算:¥500001天前 CNYG稳定币上线whk交易所APP下载,香港数字资产交易所预算:¥100001天前 杰理蓝牙音频与串口透传预算:¥10003天前 本站介绍 欢迎投稿 隐私声明 广告业务 网站地图 联系我们 诚聘英才 21IC电子网 2000-2021 版权所有 京ICP备11013301号京公网安备 11010802024343号 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |