我使用的是五路模拟量灰度传感器,单片机是stm32f103c8t6.要注意灰度电源端最好接5v。其余A0、A1、A2、A3、A4我接的是单片机ADC1的PA0、PA1、PA2、PA3、PA5,(为什么不接PA4呢,那是由于PA4被占用了,那如何判断IO口是否被占用,我们可以不给灰度传感器供电,其他IO口都接上,然后与电脑通信,查看那个口有数据就说明他被占用了)还要注意,ADC1只能用DMA1进行搬运。

灰度传感器原理:每一组传感器均由一只发光二极管和一只灰度接收管组成;两个探 头安装在电路板同一面上,发光管发射的光会被检测面反射后由灰度 接收管进行回收。由于光线照射到不同颜色后一部分光被颜色吸收, 一部分则被反射出去,会得到不同颜色光反射强度的变化,灰度接收 管对被探测面颜色光反射的强弱不同进行采集回收,然后输出对应的 电压值信号(也叫做模拟信号);得到此种信号,我们就可配合单片 机编程控制,用于颜色识别、巡线智能小车机器人等领域。模拟量灰度传感器可对被探测面的多种任意颜色进行识别,在探测到 不同颜色时,输出不同的电压信号(俗称为一种状态值);输出的电 压值是随被探测面的颜色变化而变化的,所以也就可以识别出任意颜 色。使用时需要注意的是由于它的值是受到探头离地高度不同和被探 测面颜色变化而产生变化,所以在编程时需预先固定好传感器高度后 再对各种颜色进行取值,然后将对应的值作为条件判断进行识别控制 (一般取一定范围的值,防止环境光干扰产生波动。

我们需要注意,我们要先安装好灰度传感器再去进行采取参数。安装高度一般是5~20mm,个人建议最后15mm左右。

我们可以通过RCC_ADCCLKConfig(RCC_PCLK2_Div6);//对应APB272MHZ6分频与ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);来配置ADC采样时间。(ADC_RegularChannelConfig是规则组通道配置,第三个参数是配置序列位置,相当于是第几个传输出去)

要注意使用连续转换与连续扫描模式,这样可以不断进行采样(转换:就是指你需要将你采集的数据转换几次。扫描就是指你要接着转换下去吗。)

配置ADC:

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//对应APB272MHZ6分频GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_13Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_13Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_13Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_13Cycles5); ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式,ADC1和ADC2各自转换各自的ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//选用触发源(这里使用内部软件触发)ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//选择连续转换模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;//选用扫描模式ADC_InitStructure.ADC_NbrOfChannel = 5;//选择通道数目ADC_Init(ADC1, &ADC_InitStructure);

这里由于ADC寻址空间是32位的但是数据寄存器是16位的,而我们需要将他转成32位但是址需要他的低16位,采用半字(16位)进行传输就可以。

配置DMA:

 DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设站点起始地址DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//地址是否自增,不用因为ADC地址一定DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储器基地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据宽度DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址是否自增DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设站点是源端还是目的地DMA_InitStructure.DMA_BufferSize = 5;//传输几次DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//是否自动重装DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//是否用软件触发DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//指定通道优先级DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1); //开始指定ADC的校准状态 while (ADC_GetCalibrationStatus(ADC1) == SET);ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发ADC转换

IO口被占用现象:

链接:https://pan.baidu.com/s/123lAQETFVWAsMdA9Hp8VoA?pwd=yayl 
提取码:yayl

五路模拟量灰度传感器--ADC+DMA相关推荐

  1. 「雕爷学编程」Arduino动手做(35)——模拟量声音传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  2. hal库模拟量_无ADC采集模块的单片机对模拟信号的处理

    早期的单片机内部没有带ADC(模数转换)模块,比如我们以前常用的AT89C51/S51系列的8位单片机,在使用这种单片机进行模拟信号的处理时通常要在单片机外部增设ADC(模数转换)芯片比如常用的有AD ...

  3. 常用数字、模拟量输出传感器原理介绍

    哈喽,大家好,本期小飞哥带来的是常用的数字量输出传感器的原理与使用说明,希望能对伙伴们有帮助! 实现目标: 了解常用传感器的原理实现,达到举一反三的效果,学会如何操作: 硬件准备: 声音传感器(或者其 ...

  4. NTC温度以及模拟量湿度传感器计算公式

    温度计算 float CalTemp(float Vol) {float Rt = 0;float Rp = 10000;float T2 = 273.15 + 25;float Bx = 3950; ...

  5. STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)

    STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) ​ 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...

  6. adc0808温度换算公式_温湿度传感器的三种模拟量换算关系

    气候的变化常常会导致空气当中的湿度以及温度随之而产生相应的变化,如果想及时感知空气中温湿度的变化,那就需要温湿度传感器.在日常生活中,温湿度传感器种类有很多,按照数据上传方式分有RS485型温湿度传感 ...

  7. STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

    本章节主要讲解如何获取灰度传感器值以及如何使用灰度传感器循迹 灰度传感器简介 灰度传感器如图 1 所示: 灰度传感器 使用一对抗干扰较强的光电传感器,其中发射管的光源采用高亮白色聚光 LED,发射管端 ...

  8. 使用MSP430F5529的ADC测量,并用OLED显示传感器输出的模拟量

    导语 最近在用MSP430做i项目,用到了ADC模块(模数转换器). 在这里分享一下用CCS开发环境使用MSP430F5529中的ADC来读取灰度传感器输出的模拟量,然后读取电压并将其显示在OLED上 ...

  9. STM32F407 ADC+DMA+定时器 定时采样模拟量

    STM32F407 ADC+DMA+定时器 定时采样模拟量 文章目录 STM32F407 ADC+DMA+定时器 定时采样模拟量 前言 一.硬件原理 1.1 ADC 1.2 定时器 3. DMA 二. ...

最新文章

  1. 分区表与分区索引(一):范围分区表的操作
  2. python教学网站-python学习网站整理
  3. 如何做到免驱打印_道滘镇彩色打印机租赁公司,长安镇办公室绿植安装
  4. java 定时器delay_技术贴-java 定时器
  5. python seach_python 正则re.search
  6. linux 中 timeval结构体
  7. Hosts文件与钓鱼网站
  8. impala日期格式转换
  9. php城市切换,城市切换 - 网下淘
  10. 新手学编程的常见困惑
  11. Save Apply mechanism of luci
  12. IE设置每次打开时都清除缓存
  13. 【ARM开发】交叉编译Qt源码之(4)添加xcb支持
  14. Python入门:微博注销不了?python一键清空微博文章内容
  15. ReactNative Animated动画详解
  16. iOS 真机测试错误解决An App ID with Identifier ...is not available
  17. 下取整函数的含义_向上取整⌈⌉和向下取整⌊⌋符号含义及应用
  18. TL-WR941N路由器刷DD-WRT和OPENWRT教程及使用花生壳
  19. (转)ibatis Tips 之 java.util.Map作为parameterClass和resultClass
  20. 在.NET中操作XmlDocument,XmlReader的方法

热门文章

  1. 如何Mysql触发器中抛出一个异常
  2. nmap oracle,[转帖]如何使用nmap扫描工具
  3. 基于PCA主成分分析的BP神经网络回归预测MATLAB代码
  4. 夺命雷公狗—玩转SEO---65---黑阔手法秒杀dede提升权重
  5. SpringBoot2.7 核心源码解读
  6. photoshop插件-开发环境搭建
  7. Prometheus 官方记录片(中英双语),带你了解 Prometheus 的前世今生
  8. Vue向后端发生请求时出现xhr.js?ec6c:177 GET http://localhost:8989/vue/user/findOne?id=9 net::ERR_CONNECTION_REF
  9. 数据清洗:Numpy
  10. 安装SQL Serve