自学内容网 自学内容网

【BLE】CC2541之ADC

本文最后修改时间:2022年04月12日 23:00

一、本节简介

本文介绍如何通过P05口采集电压值。

二、实验平台

1)CC2541平台

①协议栈版本:BLE-CC254x-1.4.0

②编译软件:IAR 10.20.1

③硬件平台:香瓜CC2541开发板、USB Dongle

④仿真器:香瓜CC Debugger下载器

2)电脑平台

①软件:Btool

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)纠错/业务合作:897503845@qq.com

4)香瓜BLE之CC2541群:127442605

5)本文出处:原创连载资料《简单粗暴学蓝牙4.0(CC2541篇)》

6)完整开源资料下载地址(电脑端打开):

opengua.taobao.com

7)香瓜CC2541开发板套件购买:

opengua.taobao.com

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学蓝牙4.0(CC2541篇)》的“第一章至第三章”章节

2、在进行本文步骤前,请先实现以下章节:

1)《简单粗暴学蓝牙4.0(CC2541篇)》的“第三章 软件的安装及使用”章节。

五、基础知识

1、CC2541的ADC是怎么样的?

答:

1)14位的模拟数字转换

2)最多12位的有效位数,最高位是符号位。

3)8个独立通道,AIN0~AIN7。

4)四种参考电压可选:

如上图,分别是内部参考电压(1.25V)、外部AIN7脚的电压、AVDD5脚的电压(3.3V)、外部AIN6~AIN7的差值电压。

注意:采集的电压值不能高过参考电压。外部的参考电压测出来的数据,会比内部参考电压测出来的数据更准。

2、AIN0~AIN7是指哪些引脚?

答:

P00~P07平时是普通IO口,也可以复用成AIN0~AIN7(复用时就没有普通IO口功能,而只有ADC功能)

六、硬件原理

1、本文使用的ADC引脚,P05

由于P05被用于底板的串口电路中,会被拉高到3.3V。所以要想使用P05,就得将核心板单独接线出来使用。(嫌麻烦的话建议换其他引脚)

七、实验步骤

1、编写并添加自定义的驱动

1)写一个驱动GUA_ADC.c(存放在“……

\BLE-CC254x-1.4.0\Projects\ble\SimpleBLECentral\Source\GUA”路径下)

//**********************************************************************

//name:         GUA_ADC.c

//introduce:    香瓜自定义的ADC驱动

//author:       甜甜的大香瓜

//email:        897503845@qq.com

//QQ group:     香瓜BLE之CC2541(127442605)

//shop:         opengua.taobao.com

//changetime:   2022.04.11

//**********************************************************************

#include <ioCC2540.h>

#include "GUA_ADC.h"

//**********************************************************************

//name:         GUA_Read_Adc

//introduce:    读ADC

//parameter:    channel:0~7表示P00~P07通道

//return:       2个字节ADC值(实际12位,最高位为符号位)

//author:       甜甜的大香瓜

//email:        897503845@qq.com

//QQ group:     香瓜BLE之CC2541(127442605)

//shop:         opengua.taobao.com

//changetime:   2022.04.11

//**********************************************************************

GUA_U16 GUA_Read_Adc(GUA_U8 channel)

{

  GUA_U16 value;

  GUA_U8 tmpADCCON3 = ADCCON3;

  P0SEL |= 1 << channel ;               //设置该通道为Peripheral function

  APCFG |= 1 << channel ;               //设置该通道为Analog I/O enabled

  ADCIF = 0;

  ADCCON3  = (2 << 6| 3 << 4| channel); //AVDD5、12bit、AINx

  while(!ADCIF);                        //等待ADC转换完成

  //while(!(ADCCON1 & 0x80));             //等待ADC转换完成

  value =  ADCL >> 2;                   //ADCL寄存器低2位无效

  value |= ((GUA_U16)ADCH << 6);        //连接AD转换结果高位和低位

  value >>= 2;                          //分辨率是12位,因此14位结果去除2位,最高位是符号位

  ADCCON3 = tmpADCCON3;

 

  return (value);

}

2)写一个驱动头文件GUA_ADC.h(存放在“……

\BLE-CC254x-1.4.0\Projects\ble\SimpleBLECentral\Source\GUA”路径下)

//**********************************************************************

//name:         GUA_ADC.h

//introduce:    香瓜自定义的ADC驱动的头文件

//author:       甜甜的大香瓜

//email:        897503845@qq.com

//QQ group:     香瓜BLE之CC2541(127442605)

//shop:         opengua.taobao.com

//changetime:   2022.04.11

//**********************************************************************

#ifndef GUA_ADC_H

#define GUA_ADC_H

/*********************宏定义************************/

#ifndef GUA_C

typedef char GUA_C;

#endif

#ifndef GUA_U8

typedef unsigned char GUA_U8;

#endif

#ifndef GUA_8

typedef signed char GUA_8;

#endif

#ifndef GUA_U16

typedef unsigned short GUA_U16;

#endif

#ifndef GUA_16

typedef signed short GUA_16;

#endif

#ifndef GUA_U32

typedef unsigned long GUA_U32;

#endif

#ifndef GUA_32

typedef signed long GUA_32;

#endif

#ifndef GUA_U64

typedef unsigned long long GUA_U64;

#endif

#ifndef GUA_64

typedef signed long long GUA_64;

#endif

/*********************函数声明************************/

extern GUA_U16 GUA_Read_Adc(GUA_U8 channel);

#endif

3)工程中添加GUA_ADC.c

4)在IAR设置中添加按键驱动源文件路径

$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA

2、在应用层中使用

1)应用层代码中添加驱动头文件(SimpleBLEPeripheral.c中)

//GUA

#include "GUA_ADC.h"

//GUA

3)添加测试代码(SimpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)

//GUA

  uint16 nGUA_Adc_value = 0;

  nGUA_Adc_value = GUA_Read_Adc(5);

//GUA

为了方便仿真查看采集的电压变化,可以多复制几条来测试。

八、注意事项

1、P05用于底板的串口电路,不能直接接外部电路。要从底板跳线接GND\VCC\RESET\P21\P22五根线到核心板插针上。再将P05接到想测的外部电压上。

九、实验结果

设置断点在测试代码处,并仿真全速运行至断点处。

1、当P05脚接3.3V

0x7FF刚好是11位满量程,就是与参考电压一样,本文用的是3.3V参考电压,因此测得外部电压是3.3V。

2、当P05脚接1.63V时(通过两个10K电阻分压3.3V,得到万用表实际测量的1.63V)

采样到0x3E9(1001),通过公式3.3v/2048=x/1001,算得x=1.613V

所以实际1.63V,CC2541测得是1.613V,有0.017V的误差。如果想提高精度,可以使用外部参考电压。

3、当P05脚接GND

测试出现两种情况,一种是采集到0x0002(算得0.0033V),这种是正常的。另一种是测得0xFFFD,这种情况是最高位的符号位变负数,香瓜猜测是接线出来后有一点点压差导致,且香瓜不会算负数……出现这种情况时,也可以适时选择直接软件过滤成0来处理。


原文地址:https://blog.csdn.net/feilusia/article/details/145169359

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!