基于CH32V103实现HC

您所在的位置:网站首页 GPIO端口计算 基于CH32V103实现HC

基于CH32V103实现HC

#基于CH32V103实现HC| 来源: 网络整理| 查看: 265

首页 论坛 外包 下载 专栏 专栏首页 通信技术 显示光电 单片机 测试测量 智能硬件 汽车电子 消费电子 工业控制 医疗电子 电路图 物联网 模拟 专访 电源 芯闻号 嵌入式 技术学院 公众号精选 厂商动态 新基建 中国芯 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