【CW32模块使用】红外测距传感器
GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(position sensitive detector)和IRED(infrared emitting diode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电压值对应探测的距离。通过测量电压值就可以得出所探测物体的距离,所以这款传感器可以用于距离测量、避障等场合。
01 模块来源
模块实物展示:
02 规格参数
工作电压:3.3-5V
工作电流:33MA
模块尺寸:37 x 21.6mm
输出方式: 模拟量输出
读取方式:ADC
管脚数量:3 Pin
03 移植过程
我们的目标是将例程移植至立创·CW32F030C8T6开发板上【能够判断前方障碍物的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
3.1查看资料
红外测距传感器的输出是非线性的。每个型号的输出曲线都不同。所以,在实际使用前,最好能对所使用的传感器进行一下校正。对每个型号的传感器创建一张曲线图,以便在实际使用中获得真实有效的测量数据。下图是测距距离为20-150CM型号的输出曲线图。
从上图中,可以看到,当被探测物体的距离小于大约 15cm 的时候,输出电压急剧下降,也就是说从电压读数来看,物体的距离应该是越来越远了。但是实际上并不是这样的,想象一下,你的机器人本来正在慢慢的 靠近障碍物,突然发现障碍物消失了,一般来说,你的控制程序会让你的机器人以全速移动,结果是,"砰"的一声。当然了,解决这个方法也不是没有,这里有个小技巧。只需要改变一下传感器的安装位置,使它到机器人的外围的距离大于最小探测距离就可以了。
可以避免免探测误差的安装
红外测距传感器的输出数据线是通过电压的变化来确定距离,我们可以使用ADC功能获取传感器的电压变化,将其转换为实际距离即可。
3.2引脚选择
想要使用ADC,需要确定使用的引脚是否有ADC外设功能。可以通过手册进行查看。在用户手册439页。
这里选择使用PA5的附加ADC功能。
有ADC功能的引脚
接线表
3.3移植至工程
移植步骤中的导入.c和.h文件与第二章的第1小节【DHT11温湿度传感器】相同,只是将.c和.h文件更改为bsp_IRdistance.c与bsp_IRdistance.h。这里不再过多讲述,移植完成后面修改相关代码。
在文件bsp_IRdistance.c中,编写如下代码。
/*
* Change Logs:
* Date Author Notes
* 2024-06-19 LCKFB-LP first version
*/
#include "bsp_IRdistance.h"
#include "stdio.h"
#include "math.h"
/**********************************************************
* 函 数 名 称:IRdistance_GPIO_Init
* 函 数 功 能:初始化ADC
* 传 入 参 数:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:LP
**********************************************************/
void IRdistance_GPIO_Init(void)
{
RCC_IRDISTANCE_GPIO_ENABLE(); // 使能GPIO时钟
RCC_IRDISTANCE_ADC_ENABLE(); // 使能ADC时钟
GPIO_ANALOG_ENABLE(); // PA05设定为模拟输入
/* ADC配置 */
ADC_InitTypeDef ADC_InitStructure; // ADC初始化结构体
ADC_WdtTypeDef ADC_WdtStructure; // ADC看门狗结构体
ADC_SingleChTypeDef ADC_SingleChStructure; // ADC单通道转换结构体
// 配置ADC初始化结构体
ADC_InitStructure.ADC_OpMode = ADC_SingleChOneMode; //单通道单次转换模式
ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4; // 时钟频率 = PCLK / 4 = 64MHz / 4 = 16MHz
ADC_InitStructure.ADC_SampleTime = ADC_SampTime5Clk; //5个ADC时钟周期
ADC_InitStructure.ADC_VrefSel = ADC_Vref_VDDA; //VDDA参考电压
ADC_InitStructure.ADC_InBufEn = ADC_BufDisable; //关闭跟随器
ADC_InitStructure.ADC_TsEn = ADC_TsDisable; //关闭内置温度传感器
ADC_InitStructure.ADC_DMAEn = ADC_DmaDisable; //不触发DMA
ADC_InitStructure.ADC_Align = ADC_AlignRight; //ADC转换结果右对齐
ADC_InitStructure.ADC_AccEn = ADC_AccDisable; //转换结果累加不使能
//ADC模拟看门狗通道初始化
ADC_WdtInit(&ADC_WdtStructure);
//配置单通道转换模式
ADC_SingleChStructure.ADC_DiscardEn = ADC_DiscardNull; // 单通道ADC转换结果溢出保存
ADC_SingleChStructure.ADC_Chmux = IRDISTANCE_ADC_CHANNEL; // 选择ADC转换通道
ADC_SingleChStructure.ADC_InitStruct = ADC_InitStructure; // ADC初始化结构体
ADC_SingleChStructure.ADC_WdtStruct = ADC_WdtStructure; // ADC看门狗结构体
ADC_SingleChOneModeCfg(&ADC_SingleChStructure); // 初始化配置
ADC_Enable(); //ADC使能
ADC_SoftwareStartConvCmd(ENABLE); //启动ADC转换
}
/**********************************************************
* 函 数 名 称:ADC_GET
* 函 数 功 能:读取一次ADC值
* 传 入 参 数:无
* 函 数 返 回:测量到的值
* 作 者:LCKFB
* 备 注:
**********************************************************/
uint32_t ADC_GET(void)
{
ADC_SoftwareStartConvCmd(ENABLE); //启动ADC转换
uint32_t adcValue = ADC_GetConversionValue(); // 获取数据
return adcValue;
}
/**********************************************************
* 函 数 名 称:Get_Adc_Value
* 函 数 功 能:获得某个通道的值
* 传 入 参 数:Count:采集次数
* 函 数 返 回:无
* 作 者:LC
* 备 注:LP
**********************************************************/
float Get_Adc_Value(uint8_t Count)
{
uint32_t adcValue = 0;
double ret = 0;
// 因为采集 SAMPLES 次,故循环 SAMPLES 次
for(int i = 0; i < Count; i++)
{
adcValue += ADC_GET();
}
// 求平均值
ret = (double)adcValue / Count;
ret = (((double)ret / 4095) * 3.5);
return ret;
}
/******************************************************************
* 函 数 名 称:Get_illume_Percentage_value
* 函 数 说 明:计算红外测距的测量距离
* 函 数 形 参:无
* 函 数 返 回:返回测量距离
* 作 者:LC
* 备 注:无
******************************************************************/
double Get_IRdistance_Distance(void)
{
double adc_new = 0;
double Distance = 0;
adc_new = Get_Adc_Value(10);
// 根据官方代码库链接:https://github.com/zoubworldArduino/ZSharpIR
// 得到距离换算公式:
// 【GP2Y0A02YK0F:Using MS Excel, we can calculate function (For distance > 15cm) :
// Distance = 60.374 X POW(Volt , -1.16)】
Distance = 60.374 * pow(adc_new,-1.16);
return Distance;
}
在文件bsp_encoder.h中,编写如下代码。
/*
* Change Logs:
* Date Author Notes
* 2024-06-19 LCKFB-LP first version
*/
#ifndef _BSP_IRDISTANCE_H_
#define _BSP_IRDISTANCE_H_
#include "board.h"
#define RCC_IRDISTANCE_GPIO_ENABLE() __RCC_GPIOA_CLK_ENABLE()
#define RCC_IRDISTANCE_ADC_ENABLE() __RCC_ADC_CLK_ENABLE()
#define GPIO_ANALOG_ENABLE() PA05_ANALOG_ENABLE() // PA05设定为模拟输入
#define IRDISTANCE_ADC_CHANNEL ADC_ExInputCH5
#define PORT_IRDISTANCE CW_GPIOA
#define GPIO_IRDISTANCE_AO GPIO_PIN_5
void IRdistance_GPIO_Init(void);
float Get_Adc_Value(uint8_t Count) ;
double Get_IRdistance_Distance(void);
#endif
04 移植验证
/*
* Change Logs:
* Date Author Notes
* 2024-06-19 LCKFB-LP first version
*/
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_IRdistance.h"
int32_t main(void)
{
board_init(); // 开发板初始化
uart1_init(115200); // 串口1波特率115200
IRdistance_GPIO_Init();
printf("ADC demo start\r\n");
while(1)
{
printf("Distance = %.2f\r\n", Get_IRdistance_Distance() );
delay_ms(1000);
}
}
上电现象(障碍物距离20CM):
- |
- +1 赞 0
- 收藏
- 评论 0
本文由莫子若转载自武汉芯源(CW32生态社区公众号),原文标题为:【CW32模块使用】红外测距传感器,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
基于CW32的MPU6050姿态传感器的应用开发配置教程
MPU6050是一种常用的六轴姿态传感器模块,结合了三轴陀螺仪和三轴加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。MPU6050 对陀螺仪和加速度计分别用了三个16 位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。
基于CW32F030C8T6开发板的MQ-2烟雾检测传感器例程移植案例
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。本文的目标是将例程移植至CW32F030C8T6开发板上【判断当前环境状况的功能】。
【经验】基于CW32的AS608指纹模块的应用
AS608是一款集成了指纹图像采集和指纹比对算法的指纹识别模块。它采用了高质量的光学传感器,能够实时采集人体指纹图像,并通过指纹比对算法进行指纹识别。AS608具有高精度、快速、可靠的特点,广泛应用于各种指纹识别场景,如门禁系统、安防系统、考勤系统等。本实验用到了CW32-48F大学计划板、0.96寸OLED显示屏模块、AS608指纹模块及Keil5开发环境。
【应用】基于国产32位MCU芯片CW32F030C8T6的智能门锁方案,主频64MHz,具备低功耗多功能优势
智能门锁集成3D识别算法、接近检测、指纹输入模块,低功耗计算芯片等于一体,解锁快、功耗低、续航久,现武汉芯源推出一款MCU芯片CW32F030C8T6助力于智能门锁设计。
2023年电赛A题——国奖开源分享
根据题目要求,本项目拟设计制作一个单相逆变器并联运行系统,本系统以CW32F030C8T6核心板为控制核心,由直流电源、隔离变压器、全桥逆变电路、采集电路、驱动电路、LC低通滤波电路和辅助电源组成。从机采用DQ锁相环进行相位追踪,通过生成双极性SPWM波对全桥逆变电路调制,产生正弦交流电。利用PID算法进行电流、电压闭环控制,逆变器实现稳流,稳压来实现并联,并网运行。
DHT11温湿度传感器基于CW32F030C8T6开发板上实现读取温湿度的功能操作示例
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。本文的目标是在CW32F030C8T6开发板上实现读取温湿度的功能。
基于CW32F030C8T6芯片通过智能控制技术完成智能小车项目代码和功能说明
本文介绍了使用CW32F030C8T6芯片完成的全国电子竞赛H题智能小车项目。项目核心是利用CW32F030C8T6芯片的强大处理能力和丰富外设支持实现智能控制。硬件方面,包括PWM电机控制、五路循迹模块、OLED显示和角度传感器。软件部分采用结构化编程,涵盖底层驱动、外设控制和主程序逻辑。主程序包含变量定义、任务执行、硬件初始化等,支持模式切换以应对不同竞赛场景。
使用通用串口模块下载CW32F030芯片的方法
在常见的客户技术支持中,常有需要串口下载CW32芯片的问题,现整理一份文档供参考。
US-016超声波测距传感器移植至CW32F030C8T6开发板上能够判断前方障碍物距离的功能实例
介绍了US-016超声波测距模块的特性和在CW32F030C8T6开发板上的应用。本文移植目标是将例程移植至CW32F030C8T6开发板上【能够判断前方障碍物距离的功能】。
【经验】CW32F030C8T6单片机如何通过看手册配置时钟树
本章简单展示了如何查找手册来配置寄存器,且再次强调库函数的本质就是操作寄存器。单片机都会有一个时钟树,时钟树的图可以在编程手册(不是数据表和内核手册)中找到。部分单片机想要工作在高工作频率下,需要设置flash等待时间并打开缓存和预取指令使能。
【经验】武汉芯源半导体CW32系列微控制器如何进入ISP模式以及ISP协议详解
武汉芯源半导体CW32系列微控制器片上FLASH存储器有一部分区域用于存储BootLoader启动程序,用户可利用BootLoader启动程序提供的ISP模式,通过UART串口方便地实现对CW32微控制器片上FLASH主存储器的擦除和烧写。
【CW32模块使用】雨滴传感器
文章介绍了雨滴传感器的工作原理和在汽车智能灯光系统、自动雨刷系统、智能车窗系统中的应用。传感器通过检测水滴的导电性来判断是否下雨,利用电极间的电导性变化来测量水滴存在。文章还提供了传感器模块的移植过程和代码示例,展示了如何将传感器数据读取和处理集成到CW32F030C8T6开发板上。
基于CW32的RC522刷卡模块的应用实验分享
RC522刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片。
【经验】如何使用32位MCU CW32F030C8T6设计CW-W88水泵通用控制板?
武汉芯源推出的CW32F030系列产品,已全面实现-40℃ 至 105℃超宽温度范围和 1.65V~5.5V 超宽工作电压,面向最广泛的各种基础应用。用户可以根据自己的需求自行更改代码功能。
CW32F030C8T6 from Wuhan Core Source is Used in Combustible Gas Detector, Ensures Safe Operation in Harsh Electromagnetic Interference Environments
With the advancement of electronic science and technology, the combustible gas detector has become an essential tool for safety protection. This detector converts the concentration of leaked combustible gases into electrical signals and issues alarm signals to remind staff to take safety measures. The CW32F030C8T6, as the main control chip, provides excellent system protection with its high-precision ADC, fast conversion speed, high reliability, strong ESD protection, and strong anti-interference characteristics, ensuring safe operation in harsh electromagnetic interference environments.
电子商城
现货市场
服务
可定制高压电源模块的输入电压100VDC-2000VDC、功率范围5W-500W/4W-60W; 高压输出电源模块的输出电压100VDC-2000VDC。功率范围:4W-60W。
提交需求>
提供蓝牙BLE芯片协议、蓝牙模块、蓝牙成品测试认证服务;测试内容分Host主机层,Controller控制器层,Profile应用层测试。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳 提交需求>
登录 | 立即注册
提交评论