利用声音传感器控制led灯功能_【实验篇】FPGA驱动传感器:水位、巡线、振动传感器...

点击  蓝字  关注我们

FPGA驱动传感器

● 大部分FPGA入门的第一个实验是点亮LED灯和流水灯,我们不妨试试通过驱动传感器来学习FPGA,本系列文章通过驱动传感器做有趣的小实验来学习FPGA。与单片机驱动传感器相比,单片机需要一系列的库函数和库文件,而FPGA驱动传感器则更需要了解传感器的原理,而且在多传感器的使用时,FPGA可并行控制,使用效率高。

一、基础实验

传感器介绍

水位传感器:Water Sensor 模块通过测量电导率指示传感器是否干燥,潮湿或完全浸入水中。传感器走线使用 1MΩ 上拉电阻。电阻将拉高传感器的数值,直到水将传感器的信号线短接到地。裸导线上有水时,得到 LOW。否则,将是 HIGH。

巡线避障传感器:Grove-Line finder 为线跟随机器人设计,具有红外发射 LED 和红外敏感光电晶体管。它可以将数字信号输出到微控制器,检测到黑色时为高电平,检测到白色时为低电平,这样机器人可以稳定地跟随白色背景上的黑线,反之亦然。

振动传感器:Grove - Vibration Sensor是一个高敏感度的非定向的振动传感器。当模块处于稳定状态下,电路被打开且输出处于高电平状态。当出现移动或是振动时,电路会短暂地断开且输出变低。并且可根据需求将模块的灵敏度设置调高或者调低。

518abf2f961961f36fafa9cdf693869c.png

硬件连接:

Runber FPGA开发板与底板按照对应的接口连接,底板上的grove接口与传感器和LED灯连接,传感器的输出信号引脚为SIG引脚。查看Runber FPGA开发板与底板的原理图,找到传感器输出和LED灯所连接的FPGA引脚。FPGA模块通过引脚分配,使FPGA模块中的输入输出信号与硬件连接的引脚对应起来。

设计思路:

FPGA驱动水位、巡线、振动传感器等这一类数字传感器实验,主要是帮助初学者学习输入数字信号识别和控制信号输出。FPGA输入引脚与传感器连接后接收来自传感器的信号,通过判断输入信号电平的高低,控制与LED灯连接的输出引脚输出高电平或低电平信号。在本文中用到的水位传感器、巡线避障传感器和振动传感器的例程在FPGA代码设计原理上基本相同,通过FPGA识别传感器输出的电平,根据电平高低决定FPGA输出控制信号电平的高低,各传感器在不同条件下输出信号的高低电平情况可参考上表。

以水位传感器为例,FPGA识别传感器的输出信号,水位传感器裸导线干燥时传感器信号为高电平,FPGA输出低电平LED控制信号,LED灯处于熄灭状态;水位传感器裸导线遇水时传感器信号为低电平,FPGA输出高电平LED控制信号,LED灯被点亮。

8bbd3e0259a829ddda1e5acbadeddd46.png

实验源码

FPGA识别水位传感器的输出信号water的电平,通过判断water电平的高低来控制LED指示灯的点亮和熄灭。当water为高电平时LED点亮,当water为低电平时LED熄灭。(以下源码同样适用于水位、巡线、振动传感器)

1e920180fc5a04c3cb667eb10b9bf62d.png

实验效果展示:

1、 水位传感器

FPGA识别水位传感器的输出信号的电平,通过判断water电平的高低来决定输出信号的高低电平,控制LED指示灯的点亮和熄灭。当裸导线遇水,输出低电平时LED点亮,当裸导线干燥,输出高电平时LED熄灭。

2、 巡线避障传感器

FPGA识别巡线避障传感器的输出信号line的电平,通过判断line电平的高低来决定输出信号的高低电平,控制LED指示灯的点亮和熄灭。当检测到黑线输出高电平时LED点亮,当检测到白色背景输出为低电平时LED熄灭。

3、 振动传感器

FPGA识别振动传感器的输出信号line的电平,通过判断line电平的高低来决定输出信号的高低电平,控制LED指示灯的点亮和熄灭。振动传感器在稳定状态时输出高电平信号,LED熄灭,在发生振动时输出短暂低电平信号,LED灯短暂点亮。

8f3800c1bfa7cd3430ba612577009d28.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好,您的问题是关于灰度巡线传感器在STM32上的程序实现。 首先,您需要连接四个灰度传感器到STM32开发板。您可以使用ADC(模数转换器)读取每个传感器的电压值,并将其转换为数字值。然后,您可以使用这些数字值来判断小车在巡线时的位置和方向。 以下是一个简单的程序示例: ```c #include "stm32f10x.h" int main(void) { // 初始化ADC RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 4; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1, ENABLE); // 初始化GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); while (1) { // 读取传感器数据 uint16_t sensor1 = ADC_GetConversionValue(ADC1, ADC_Channel_0); uint16_t sensor2 = ADC_GetConversionValue(ADC1, ADC_Channel_1); uint16_t sensor3 = ADC_GetConversionValue(ADC1, ADC_Channel_2); uint16_t sensor4 = ADC_GetConversionValue(ADC1, ADC_Channel_3); // 判断小车位置和方向 if (sensor1 < 1000 && sensor2 > 1000 && sensor3 > 1000 && sensor4 < 1000) { // 直线 } else if (sensor1 < 1000 && sensor2 > 1000 && sensor3 < 1000 && sensor4 < 1000) { // 弧弯 } else if (sensor1 < 1000 && sensor2 < 1000 && sensor3 > 1000 && sensor4 < 1000) { // 钝角弯 } else if (sensor1 > 1000 && sensor2 < 1000 && sensor3 < 1000 && sensor4 < 1000) { // 直角弯 } else { // 未知状态 } } } ``` 这只是一个基本的示例,您需要根据您的具体需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值