之前我们讲到了串口的收发数据,我们使用到了数据结构的环形对列,就是一个追赶模型,前面一个人在放数据,后面一个人在捡数据,定义两个变量来存储这两个人所走的步数,在定义一个库存变量,也就是用来表示前面一个人放数据的量减去后面一个人捡数据的量;

我们在接收中断里面判断是否满了库存,没满就可以放,放数据的意思就是定义一个数据从接收缓冲区里面拿就可以,拿完之后这个人的步数加加,然后定义一个接收函数,对后面一个捡数据的人进行处理,也就是需要拿到第二个人拿到的真实数据长度,问什么叫真实数据长度,因为可能用户提供第二个人走的步数会大于库存数,所以就需要一个真实长度设置为库存数,不可能只有这么多库存你可以那更多;

上一期内容就回顾到这,这一期我们来讲讲数模转换,首先我们要清楚一个问题,什么是模拟信号,什么是数字信号,日常生活中会用到很多的传感器,其实传感器检测的都是模拟信号,比如温度、湿度、光照度等,这些数据有一个特点就是无限个,但数字信号只有两个,我们知道现在的电子设备用到的是二极管,只具有导通和不导通两个信号,所以想要检测到温度、湿度这些数据就需要用到数模转换,而毕竟是转换,没有办法避免失真的问题,多多少少有一点;

了解了数模转换,我们就开始这期的代码编写:

1、创建ADC模块,创建模块相信大家都会:

在驱动模块中创建就可以了,然后打开IRA进行编写;

2、初始化模块,编写初始化函数:

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*函数名:AdcInit*参数:void*返回:none*描述:adc初始化函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/void AdcInit(void)
{//1.1 初始化gpioP0SEL |= 0x01;//打开P0的外设功能P0DIR &= ~0x01;//设置P0.1 的引脚为输入模式,因为采集信息是读取APCFG |= 0x01;//使能adc的通道0
}

之前我们就讲到过,要初始化一个功能,首先要想到大概需要初始化那些设备,比如gpio、中断、还有本身功能,反正gpio是都需要的,不过今天我们就不使用中断了,我们就初始化gpio和adc本身就可以,在做一个功能的时候一定要读一下芯片手册,不然的话会无从下手;

这里提到了一个触发问题,因为我们使用的是单个通道,所以需要设置单个adc转换的寄存器ADCCON3,说道设置了这个寄存器的话就会触发一次采集,所以我们后面写驱动函数的时候就配置这个寄存器在进行数据处理就可以;

说道通道,cc2530一共有8个ADC通道也就是我们可以连接8个传感器,但并不是同时可以测得8个传感器数据 ,而是通过轮询的方式,效率低下,但不这样成本太高,所以我们使用单个就行,如果要是用多个就需要配置ADCCON2:

这里提到一个注意点,我们需要配置APCFG寄存器,它的作用就是覆盖gpio,我们使用的通道是P0.0:

意思就是配置这个寄存器为0x01的话就不需要配置io口了,但是我们为了保险起见还是在初始化函数里面配置了io口,我还是建议大家配一下;

2、编写获取adc数值函数

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*函数名:AdcGetValue*参数:void*返回:float*描述:adc数据采集函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/float  AdcGetValue(void)
{//2.4 定义两个变量,一个用来存储位数据,一个用来存储转换数据unsigned short result;//接收的数据有效只有12位,使用16位float ret;//2.1 需要产生一次触发信号进行采集ADCCON3 = 0x30;//2.2 等待数据的采集while(!(ADCCON1 & 0X80));//2.3 拿到采集到的数据并且进行转换result = (unsigned short)(ADCH<<8) + (unsigned short)ADCL;result = result >> 4;//因为是14位的单片机,而又只有12位有效,拿到的确实16位的数据,所以我们干脆移去四位ret = result * 3.3 / 4096;//毕竟是当做12位来算,所以我们转换的时候就除以12位的分割数,3.3是参考电压//2.4 返回采集并且转换的结果return ret;
}

我们定义一个返回值为float的函数来获取采集的数据,毕竟一般采集到的数据会是一个小数,而在转换数据的时候需要一个参考电压,毕竟是数模转换,我们模拟信号无限,而数字信号只有两个,所以就设置一个参考电压进行转换,我们将参考电压根据单片机的精度进行划分,cc2530是14位,但却只有12位有效,所以我们将参考电压分成4096份,然后乘以寄存器拿到的数据,就得到数字信号了,当然是很难达到这个参考电压的;

可以看到数值非常的小,那么采集信号之后 :

读取到上面连个数据寄存器的值相加就拿到位数据了,因为是8个位,高八位移位相加之后也就只有16个位,所以我们新建一个short类型的变量存储就可以,而且处于编辑器的优化问题,我们需要对为数据进行强转一下;后面移四位的原因就是只有12位数据有效的原因:

3、那么获取到数据之后就需要通过串口显示到pc上了,我们回到main函数,导入ADC模块:


//创建一个存储单个数据的数组
static unsigned char TestBuf[100];
void main(void)
{LEDInit();//KeyInit();//KeyCallBackRegister(&ShowNumber);TimerInit();static unsigned long ledtime = 0;TimeSetCallBack(500,TimeLed,1);UartInit(9600,'n');AdcInit();//1.3定义一个需要发送数据的长度和采集数据的存储变量unsigned char len = 0;float ret = 0;//1.1 通过传感器产生的数据,发送到pc端显示,while(1){//1.2 我们利用定时器1s中采集一次显示即可if(TimerCheck(ledtime)){ledtime = TimerSet(1000);//1.5 通过adc模块拿到采集到的数据ret = AdcGetValue();//1.4 进行数据的格式化处理len = sprintf(TestBuf,"The value of ADC is %f",ret);UartSend((char *)TestBuf,len);}
}

这里我们使用多模块,利用定时器模块的定时功能,每隔1s就进行采集一次然后发送一次,这里我们使用到了sprintf(字符数组,"格式化的数据",数据)格式化字符串函数,这个函数的作用就是将数据按照我们想要的格式进行转换,并且返回一个长度,然后接口这个长度通过串口发送就可以了;

好了,那么这期就到这。

cc2530:<3>ADC采集光照度案例相关推荐

  1. zigbee协议栈ADC采集外部电压

    ADC 由于最近在做一个项目,其中一个步骤是需要CC2530片内ADC采集外设的电压值,三天反思不得其解,终于解决了这个问题. zigbee协议栈是有错误的,稍后我会写出来 ADC支持14位模数转换, ...

  2. TMS320VC5509片内ADC采集

    1. ADC采集比较简单,内部的10位的ADC,AIN0-AIN3的输入,主要是用的CSL的库函数#include <csl_adc.h> Uint32 adc_sample_value ...

  3. (80)ADC采集方法(基于LVDS采集方法)

    1.1 ADC采集方法(基于LVDS采集方法) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ADC采集方法(基于LVDS采集方法): 5)结束语. 1.1.2 本节引 ...

  4. LPC1768 双通道ADC采集数据并发送

    实验需要用到两个ADC同时采集电压信号.LPC1768有8个通道的ADC,这次实验中使用了P0.23引脚的AD0[0]和P0.26引脚的AD0[3].在实验中用的是uCOS-II操作系统,设计了两个任 ...

  5. STM32G473CBT6关于ADC采集的总结

    STM32G473CBT6单片机在浮点运算,信号采集.数据处理方面有很大的用途.因相关的资料较少,特此做一下笔记,方便后期使用.STM32CubeMX软件比较强大,兼容IAR和keil方便直接生成代码 ...

  6. STM32F103C8T6多通道adc采集(3通道)

    本程序采用STM32F103C8T6的3通道adc采集,其中为PA1(ADC1,ch,1,),PA2(ADC1,ch,2,),PA3(ADC1,ch,1,) adc.c文件 #include &quo ...

  7. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效

    基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...

  8. 基于STM32F407使用ADC采集电压实验

    核心板:STM32F407 实验目的:使用ADC采集电压值将其打印在串口助手上 目录 ADC简介 STM32F407 ADC通道对应的引脚 STM32F407中的数据寄存器 ADC 规则数据寄存器 ( ...

  9. STM32 F446RET6多通道ADC采集

    本次配置是根据STM32CUBEIDE去开发的 DMA搬运数据规则 使用DMA搬运数据的时候我们会先建立一个数据缓冲区,将DMA采集的数据存放到数据缓冲区内.采集到的ADC的值根据通道的顺序一个一个的 ...

  10. STM32L0系列之ADC采集

    STM32L0开发系列--01 ADC采集 前言 使用芯片:STM32L051C8T6 软件平台:KEIL V5.STM32CubeL0 库函数:HAL 一.原理图 本文介绍在STM32上使用ADC1 ...

最新文章

  1. Spark集群搭建中的问题
  2. JS:javaweb——a标签实现跳转并打开新窗口
  3. u8系统更改了服务器,u8修改服务器配置文件
  4. 《移动应用开发》实验报告——轮播图
  5. 【leetcode】521. Longest Uncommon Subsequence I
  6. oracle修改用户的登录密码
  7. 【系统安装】MediaCreationTool工具制作U盘安装win10系统
  8. Swift learning part 18 - 类型转换
  9. 游戏建模:21个人脑壳雕刻小小技巧,非常有用
  10. 232串口测试方法介绍
  11. 一文了解什么是财务RPA机器人
  12. 国产下的netcore
  13. 自动化测试之MercuryTours订票系统
  14. 光电自动避障小车_AGV系统助力工厂物流自动化【agv小车吧】
  15. Java web 服务器 搭建_搭建一个java web服务端
  16. FTP服务器和NFS服务器
  17. Unity 第一人称、第三人称、漫游视角 控制器.
  18. 分布式 | Paxos 共识算法
  19. 立创eda专业版学习笔记(6)(pcb板移动节点)
  20. 数字图像处理(第二章)笔记

热门文章

  1. Electron安装报错解决办法
  2. sql语句之delete
  3. 3D游戏中镜头的运用
  4. 使用IIS发布ASP.NET网页
  5. 银河帝国----基地边缘
  6. android 来电播放铃声,android 播放来电铃声
  7. VC++6.0如何找到“丢失”的对话框控件工具箱
  8. 怎样用VR看分频视频?
  9. Python超详细学员管理系统【面向对象实现】
  10. 最稳定的工作,是你认可的那份