【CW32F030CxTx StartKit开发板】利用超声波传感器实现智能灯控

news2024/12/29 10:39:01

目录

1、超声波传感器

2、硬件连线

3. 程序开发

3.1 超声波测距

3.2 LED控制

4. 演示视频


本文首发于21ic。

感谢21ic和武汉芯源提供的测试机会。
在上一篇帖子中介绍了CW32F030CxTxStartKit 评估板的环境构建。本次介绍如何利用超声波传感器实现人来灯亮,人走灯灭的智能灯控。

1、超声波传感器

HC-SR04是一款广泛使用的超声波测距模块,特别适用于机器人、无人车等领域。它利用超声波的发射和接收原理,通过测量超声波从发射到接收的时间来计算物体与传感器之间的距离。
HC-SR04的工作原理基于超声波的发射和接收。它主要由两个压电陶瓷片组成,其中一个用于发射超声波(T),另一个用于接收反射回来的超声波信号(R)。工作时,Trig引脚(触发端)发送一个10us的高电平信号,模块内部随后发出8个40KHZ的周期电平信号,并自动检测是否有信号返回。当有信号返回时,Echo引脚(接收端)会输出一个高电平信号,其脉冲宽度与所测距离成正比。

2、硬件连线

CW32F030CxTxStartKit 评估板把所有I/O口都引出来了,有个好处就是可以方便地进行接口之间的连接,做各种测试。我们把PA01连接到Trig引脚,将PA02连接到Echo引脚。同时将HC-SR04的VCC和GND引导开发板的VDD和GND上。

3. 程序开发

3.1 超声波测距

使用HC-SR04时,只需提供一个10uS以上的脉冲触发信号,模块内部将自动发出超声波并检测回波。通过测量Echo引脚高电平持续的时间,结合声速(340m/s),即可计算出物体与传感器之间的距离。具体计算公式为:距离 = (高电平时间 * 声速) / 2。
在程序中我们开启了BTIM1定时器,并在其中断函数中进行计时,从而用于测量Echo引脚高电平持续的时间。主要的程序代码如下:

//UARTx
#define  DEBUG_USARTx                   CW_UART1
#define  DEBUG_USART_CLK                RCC_APB2_PERIPH_UART1
#define  DEBUG_USART_APBClkENx          RCC_APBPeriphClk_Enable2
#define  DEBUG_USART_BaudRate           9600
#define  DEBUG_USART_UclkFreq           8000000

//UARTx GPIO
#define  DEBUG_USART_GPIO_CLK           RCC_AHB_PERIPH_GPIOA
#define  DEBUG_USART_TX_GPIO_PORT       CW_GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_PIN_8
#define  DEBUG_USART_RX_GPIO_PORT       CW_GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_PIN_9

//GPIO AF
#define  DEBUG_USART_AFTX               PA08_AFx_UART1TXD()
#define  DEBUG_USART_AFRX               PA09_AFx_UART1RXD()

#define LED_GPIO_PORT CW_GPIOB
#define LED_GPIO_PINS GPIO_PIN_8 | GPIO_PIN_9

#define SetTrig()    PA01_SETHIGH()
#define ResetTrig()  PA01_SETLOW()
#define ReadEcho()   GPIO_ReadPin(CW_GPIOA, GPIO_PIN_2)

/******************************************************************************
 * Global variable definitions (declared in header file with 'extern')
 ******************************************************************************/
extern unsigned int time;

/******************************************************************************
 * Local type definitions ('typedef')
 ******************************************************************************/

/******************************************************************************
 * Local function prototypes ('static')
 ******************************************************************************/

/******************************************************************************
 * Local variable definitions ('static')                                      *
 ******************************************************************************/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void UART_Configuration(void);
unsigned int Measure_Distance(void);

#ifdef __GNUC__
    /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    set to 'Yes') calls __io_putchar() */
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;
                
/******************************************************************************
 * Local pre-processor symbols/macros ('#define')
 ******************************************************************************/

/*****************************************************************************
 * Function implementation - global ('extern') and local ('static')
 ******************************************************************************/


void BTIM_Init(void)
{
        RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM, ENABLE);  //使能APB外设时钟
        
        BTIM_TimeBaseInitTypeDef BTIM_Initstruct;
        BTIM_Initstruct.BTIM_Mode = BTIM_Mode_TIMER;  //工作模式-->定时模式
        BTIM_Initstruct.BTIM_OPMode = BTIM_OPMode_Repetitive;//连续计数模式
        BTIM_Initstruct.BTIM_Period = 80-1;  //计数重载周期,16bit自动重载寄存器ARR,ARR的值最大为65535
        BTIM_Initstruct.BTIM_Prescaler = BTIM_PRS_DIV8;        //预分频
        BTIM_TimeBaseInit(CW_BTIM1, &BTIM_Initstruct);
        //定时时长=预分频/计数器时钟源频率*(计数重载周期+1),即T=8/64000000*800s=10us
        BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); //设置ARR溢出引发中断
        BTIM_Cmd(CW_BTIM1, ENABLE); //BTIM使能
        NVIC_EnableIRQ(BTIM1_IRQn);//中断使能
}

/**
 * [url=home.php?mod=space&uid=247401]@brief[/url] 配置RCC
 *
 */
void RCC_Configuration(void)
{
        //SYSCLK = HSI = 8MHz = HCLK = PCLK
    RCC_HSI_Enable(RCC_HSIOSC_DIV6);
    //外设时钟使能
    RCC_AHBPeriphClk_Enable(DEBUG_USART_GPIO_CLK, ENABLE);
    __RCC_BTIM_CLK_ENABLE();
                DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
}


/**
 * [url=home.php?mod=space&uid=247401]@brief[/url] 配置GPIO
 *
 */
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_HSI_Enable(RCC_HSIOSC_DIV6);
    __RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = LED_GPIO_PINS;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

    __RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = GPIO_PIN_1; // Trig引脚初始化
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(CW_GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pins = GPIO_PIN_2; // Echo引脚初始化
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLDOWN;
    GPIO_InitStruct.IT   = GPIO_IT_NONE;
    GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
        
           GPIO_InitTypeDef GPIO_InitStructure;
    //UART TX RX 复用
    DEBUG_USART_AFTX;
    DEBUG_USART_AFRX;
    GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
}

unsigned int Measure_Distance(void) //测距
{
        unsigned int distance=0;
        
        SetTrig();     //10us的脉冲触发信号
        delay10us(1);
        ResetTrig();
        while(ReadEcho() == 0); //等待Echo输出高电平
        time = 0;               //开始记录回波信号脉宽
        while(ReadEcho() == 1); //等待Echo输出低电平           
        distance = time * 1.7;//根据声速和时间计算距离,即distance=time*340/2/100
        /*
                        关于分辨力(mm):
                                        定时器每次对time加1是10us,10us=0.01ms,340m/s=340mm/ms
                                        计算距离时,最小分辨力为:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm)
                                        小于模块标准精度3mm,故测距结果十分精准
        */
        return distance; //返回距离,单位mm
}

在interrupts_cw32f030.c中加入如下代码:

unsigned int time = 0;

/**
 * [url=home.php?mod=space&uid=247401]@brief[/url] This funcation handles BTIM1
 */
void BTIM1_IRQHandler(void)
{
    /* USER CODE BEGIN */
                if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV))  
                {
                        BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除标志位
                        time++;
                }
                /* USER CODE END */
}

3.2 LED控制

我们在while循环中不断进行测距工作,当发现测量的距离值小于100mm,就认为有人靠近,从而打开LED灯,否则就关闭LED灯。
代码如下:

  unsigned int distance;
    while (1)
    {
                                distance = Measure_Distance();
                                printf("Distance is : %dmm\r\n", distance);
                          if(distance > 100)
                                {
                                                GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Pin_RESET);
                                }
                                else
                                {
                                                GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Pin_SET);
                                }
                                delay1ms(500);
    }

 完整的代码可以点此下载:  hrsr04.zip (1.49 MB)


4. 演示视频

演示视频已经发在B站了:【CW32+超声波传感器实现智能灯控】

CW32+超声波传感器实现智能灯控

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端开发过程中经常遇到的问题以及对应解决方法 (持续更新)

我的朋友已经工作了 3 年,他过去一直担任前端工程师。 不幸的是,他被老板批评了,因为他在工作中犯了一个错误,这是一个非常简单但容易忽视的问题,我想也是很多朋友容易忽视的一个问题。 今天我把它分享出来&#xff…

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性,它使两个PCIe设备之间可以直接传输数据,而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下: 1. 打开EP1的dma控制器;--client侧 …

微调LLMs : 介绍,方法和最佳实践

来自Turing的LLMs的Fine-Tuning的最佳实践。 大型语言模型(LLMs)凭借其先进的功能和高度精密的解决方案,已经彻底改变了自然语言处理领域。这些模型在海量文本数据集上接受训练,执行诸如文本生成、翻译、摘要和问题回答等多种任务…

Linux安装Jmeter及简单使用教程

Linux安装Jmeter 首先需要java环境 java --version官网 下载二进制包 #创建文件夹 sudo mkdir /usr/local/jmeter #解压 sudo tar zxvf apache-jmeter-5.6.3.tgz -C /usr/local/jmeter编辑配置文件 sudo vim /etc/profile,添加以下内容 export JMETER_HOME/usr/l…

【Python_GUI】tkinter常用组件——文本类组件

文本时窗口中必不可少的一部分,tkinter模块中,有3种常用的文本类组件,通过这3种组件,可以在窗口中显示以及输入单行文本、多行文本、图片等。 Label标签组件 Label组件的基本使用 Label组件是窗口中比较常用的组件,…

spring mvc学习

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架, 是Spring Framework生态中的一个独立模块,它基于 Spring 实现了Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级Web框架&am…

Java面试八股之MySQL和postgresql的区别有哪些

MySQL和postgresql的区别有哪些 MySQL和PostgreSQL是两种非常流行的关系型数据库管理系统(RDBMS),它们各自拥有独特的特性和优势,适用于不同的场景。以下是它们之间的一些主要区别: SQL标准遵守程度 PostgreSQL 更严…

IDEA启动tomcat之后控制台出现中文乱码问题

方法1: 第一步:file--setting--Editor--File Encodings 注意页面中全部改为UTF-8,然后apply再ok 第二步:Run--Edit Configuration,将VM options输入以下值: -Dfile.encodingUTF-8 还是一样先apply再ok …

Linux走进网络

走进网络之网络解析 目录 走进网络之网络解析 一、认识计算机 1.计算机的发展 2.传输介质 3.客户端与服务器端的概念 交换机 路由器 二、计算机通信与协议 1. 协议的标准化 2. 数据包的传输过程 OSI 协议 ARP协议 3. TCP/IP:四层模型 4. TCP三次握手和四次挥手…

exel带单位求和,统计元素个数

如果exel表格中,如果数据有单位,无法直接用 自动求和 直接求和。如下图所示,求和结果为0,显然不是我们想要的。 用下面的公式求和,单位不是“个”的时候记得替换单位。统计范围不是“C1:C7”也记得换一下啊&#xff01…

MyBatis的底层机制

手写MyBatis底层机制 读取配置文件,得到数据库连接 思路 引入必要的依赖需要写一个自己的config.xml文件,在里面配置一些信息,driver,url ,password,username需要编写Configuration类,对 自己…

继 承

为什么要有继承,继承的作用? 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。 …

如何使用Python脚本实现SSH登录

调试IDE:PyCharm Python库:Paramiko 首先安装Paramiko包到PyCharm,具体步骤为:在打开的PyCharm工具中,选择顶部菜单栏中“File”下的“Settings”,在设置对话框中,选择“Project”下的“Proje…

三星强劲财报,Q2营业利润同比增长1452%!

KlipC报道:7月5日,全球最大的内存芯片和智能手机制造商三星电子公布了初步的第二季度财报,其营业利润同比增长1452.24%,达到10.4万亿韩元(约合人民币548亿元),销售额74万亿韩元,同比…

shell脚本编程的练习

字符测试方法: 双目测试 比较两个字符串: :等于,等值比较 !:不等 单目测试: -n $stringVar:字符串是否为空,不空为真,空则为假 -z $stringVar:字符串是否为空,空则为…

新闻第一线|随身WiFi市场乱象与破局者:格行以品质重塑行业信任、随身WiFi行业标杆!

在快速发展的移动互联网时代,随身WiFi凭借用网方便性价比高也随之爆火。然而,近年来,随身WiFi市场却陷入了“内卷”与“信任危机”的双重困境,消费者在选择时往往面临质量问题。在此背景下,格行以其独特的品牌理念和扎…

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…

Ai Native应用开发(一)--数字人

背景 刚参加完24年世界人工智能大会&#xff08;WAIC&#xff09;&#xff0c;聊聊自己的一些感受。这次会明显比去年多很多人&#xff0c;用人山人海来形容应该也不为过。根据我自己粗浅观察参会的人员也比去年更多样化。去年更多还是从业者或者是这块研究人员。今年每个论坛…

最新简约美观的网址网站引导页HTML源码

简介&#xff1a; 最新简约美观的网址网站引导页HTML源码 带一言 随机大图 图片&#xff1a;

边缘计算网关如何在实际应用中发挥作用-天拓四方

随着物联网技术的快速发展&#xff0c;物联网时代已经悄然来临。在这个时代&#xff0c;数以亿计的设备相互连接&#xff0c;共享数据&#xff0c;共同构建智慧的世界。边缘计算网关通过将计算能力和数据存储推向网络的边缘&#xff0c;实现了对海量数据的实时处理&#xff0c;…