1 使用nordic库实现 nRF52832ADC采集的一个例子

https://www.cnblogs.com/zzu-liulei/p/6519141.html

2 用nRF52840自带的ADC采集camera内部的温度

 原理图:

3 思路:

1).camera内部的热敏电阻与上拉电阻分压1.8V

2). 通过nRF52840自带ADC采集电压

3). 根据分压关系及热敏电阻与温度的关系,得到camera内部温度

4 公式推导

两个公式,一个可以从热敏电阻规格书中得到(热敏电阻与温度的关系),另一个是分压关系,

从而得到温度与电压的关系

5 代码实现(五个camera)

1) 初始化:初始化ADC,并对每路ADC初始化对应的pin脚及给出参考电压

在源码中给了7路ADC,而我们只用到其中5路,源码pin脚定义涉及到所以pin脚,而我们只关心ADC对应的pin脚,

这样可以使用定义数组的方式来定义专门针对ADC

源码ADC定义
typedef enum {NRF52_ADC_0,NRF52_ADC_1,NRF52_ADC_2,NRF52_ADC_3,NRF52_ADC_4,NRF52_ADC_5,NRF52_ADC_6,NRF52_ADC_7,NUM_NRF52_ADCS
} adc_t;源码pin脚定义
typedef enum {NRF52_GPIO_PIN_0_0,NRF52_GPIO_PIN_0_1,NRF52_GPIO_PIN_0_2,NRF52_GPIO_PIN_0_3,。。。NRF52_GPIO_PIN_0_28,NRF52_GPIO_PIN_0_29,NRF52_GPIO_PIN_0_30,NRF52_GPIO_PIN_0_31,
#if defined(NRF52840_XXAA) || defined(NRF52840_XXBB)NRF52_GPIO_PIN_1_0,NRF52_GPIO_PIN_1_1,NRF52_GPIO_PIN_1_2,。。。NRF52_GPIO_PIN_1_14,NRF52_GPIO_PIN_1_15,
#endifNUM_NRF52_GPIO_PINS,NRF52_GPIO_PIN_UNUSED
} gpio_pin_t;

自定义数组如下:

const adc_t TEMP_ADCS[CAMERA_NUM_SENSORS] = {CAM0_TEMP_ADC,CAM1_TEMP_ADC,CAM2_TEMP_ADC,CAM3_TEMP_ADC,CAM4_TEMP_ADC,
};const gpio_pin_t TEMP_PINS[CAMERA_NUM_SENSORS] = {GPIO_PIN_CAM0_TEMP,GPIO_PIN_CAM1_TEMP,GPIO_PIN_CAM2_TEMP,GPIO_PIN_CAM3_TEMP,GPIO_PIN_CAM4_TEMP,
};

其中

#define CAMERA_NUM_SENSORS                  5
#define CAM0_TEMP_ADC               NRF52_ADC_0
#define CAM1_TEMP_ADC               NRF52_ADC_1
#define CAM2_TEMP_ADC               NRF52_ADC_5
#define CAM3_TEMP_ADC               NRF52_ADC_6
#define CAM4_TEMP_ADC               NRF52_ADC_7
#define GPIO_PIN_CAM0_TEMP          NRF52_GPIO_PIN_0_2
#define GPIO_PIN_CAM1_TEMP          NRF52_GPIO_PIN_0_3
#define GPIO_PIN_CAM2_TEMP          NRF52_GPIO_PIN_0_29
#define GPIO_PIN_CAM3_TEMP          NRF52_GPIO_PIN_0_30
#define GPIO_PIN_CAM4_TEMP          NRF52_GPIO_PIN_0_31

初始化:

void camera_temp_init(void)
{// initialize the ADC for each camera temperature sensorfor (int i = 0; i < CAMERA_NUM_SENSORS; i++) {const adc_init_t init_adc = {.gpio_pin = TEMP_PINS[i],.reference_voltage_mv = 1800,};adc_init(TEMP_ADCS[i], &init_adc);}
}adc_init_t init_adc = {.gpio_pin = TEMP_PINS[i],.reference_voltage_mv = 1800,};adc_init(TEMP_ADCS[i], &init_adc);}
}

其中:

typedef struct {//! \brief The GPIO pin to connect to the ADCgpio_pin_t gpio_pin;//! \brief The reference (max) voltage for the ADC in mVuint32_t reference_voltage_mv;
} adc_init_t;adc_init_t;

2)电压采集:根据采集到的ADC数据值,换算成电压

比如MCU是12位,然后参考电压是1800mv,那么,当MCU采出来的ADC值是2^12时,对应的电压是1800mv,

则,当MCU采出的ADC值为 X 时,对应的电压为 X*1800/(2^12)

uint32_t adc_get_value(adc_t adc)
{static nrf_saadc_value_t sample;APP_ERROR_CHECK(nrf_drv_saadc_sample_convert(adc, &sample));uint32_t result = (sample < 0) ? 0 : sample;// convert result into mVreturn result * MAX_VOLTAGE_MV/ ADC_MAX_VALUE;
}

其中:

#define ADC_MAX_VALUE               (1 << 12)
#define MAX_VOLTAGE_MV              1800

3)根据电压,得到五个camera温度

即将上面推导的电压与温度的关系写成代码实现

static int16_t temp_mv_to_deg_c(uint32_t value_mv)
{float temp_sample = 0;temp_sample = (RESISTENCEUP * 1.0) / RESISTENCENORMAL; //R/R0temp_sample = temp_sample * value_mv / (REFERENCEVOLTAGE - value_mv);//* V/(VDD-V)temp_sample = log(temp_sample);temp_sample /= BCOEFFICIENT;  //  /Btemp_sample *= TEMPERATURENOMINAL;  // *(T0+273.15)temp_sample = TEMPERATURENOMINAL / (temp_sample+1); //Ttemp_sample -= ABSOLUTEZERO;  //  -273.15return temp_sample + 0.5;
}

其中:

#define TEMPERATURENOMINAL      (25+273.15)
#define RESISTENCENORMAL        (100)
#define RESISTENCEUP            (51)
#define REFERENCEVOLTAGE        (1800)
#define BCOEFFICIENT            (4250)
#define ABSOLUTEZERO            (273.15)

注意点:

1  上面代码紫色部分必须要乘以1.0,才能得到浮点数0.51,否则得到的数值为0

因为:整型/整型=整型,而无法得到浮点型

即 51/100 = 0 ; 而51*1.0/100 = 0.51

2  最后标蓝色部分对最后温度值进行四舍五入,因为要得到一个整型的温度值

4)更新camera温度

static int16_t read_temp_sensor(uint8_t camera_id)
{UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");const uint32_t value_mv = adc_get_value(TEMP_ADCS[camera_id]);return temp_mv_to_deg_c(value_mv);
}
void camera_temp_update(void)
{for (int i = 0; i < CAMERA_NUM_SENSORS; ++i) {int16_t t = read_temp_sensor(i);__atomic_store_n(&m_cached_temps[i], &t, __ATOMIC_RELAXED);}}

其中:

static int16_t m_cached_temps[CAMERA_NUM_SENSORS] = {0};

__atomic_store_n是原子队列,将获取的温度值t,依次存到缓存区数组中,相当于一个缓存区存储,如果用这个温度值的时候,从这个缓存区中将温度值取出来

int16_t camera_temp_get(uint8_t camera_id)
{UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");return __atomic_load_n(&m_cached_temps[camera_id], __ATOMIC_RELAXED);}

ADC采集实现温度检测相关推荐

  1. STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)

    STM32 ADC采集板载温度 STM32 ADC简介 ​ STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用, 也可以使用双重模 ...

  2. 基于单片机双路温度检测报警系统设计-基于单片机声光控智能开关控制灯设计-基于单片机热电偶智能体温检测设计-基于单片机小型家用燃气锅炉控制系统设计-基于单片机一氧化碳有毒气体采集报警系统设计

    1628基于单片机双路温度检测报警系统设计(串口上位机控制) 基于pcf8591 tlc2543的双路温度检测报警系统 带串口上位机控制带仿真 源程序 温度传感器是 LM35 两路测温通道所用的ad芯 ...

  3. 基于二极管的温度检测电路

    (本人为电子学生小白,以下是个人学习过程中的归纳总结) 最近看过一篇文章了解到二极管1N4148的平均灵敏度是-2mV/℃,可以理解为每升高1摄氏度1N4148两端正向导通电压降低2mV,图1中有3个 ...

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

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

  5. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  6. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析

    本文为明德扬原创文章,转载请注明出处! 很多朋友在学习FPGA的时候会发现模块划分很令人头大,今天我就通过明德扬温度检测工程来与大家分享一下本人的划分思路. 明德扬温度检测工程是基于FPGA的一个实用 ...

  7. 烟雾检测电路c语言程序,基于51单片机火灾报警器系统烟雾检测温度检测设计(原理图+程序仿真+论文)...

    课题题目基于单片机的火灾自动报警系统 课题的目的.意义以及和本课题有关的国内外现状分析:1.目的:本系统以单片机为主控单元,能够及时监测到系统故障和环境中有无火灾,火灾一旦发生将实现声光报警,并采取有 ...

  8. ADC采集数据求平均

    利用C语言的位移功能可以快速对采集2N次方数据取平均数 例: /******************************************************************** ...

  9. STM32F103RC 2路ADC 采集显示,水位传感器、MQ2

    DMA 2路ADC采集 1.水位传感器和MQ2简介 1.1.水位传感器: 1.2.MQ2 2.使用代码   自己做小项目的时候需要测量水位和MQ2空气质量,使用的是DMA配合ADC进行采集,虽然我只是 ...

最新文章

  1. 秋招必备:斩获腾讯offer的简历分享!
  2. java 注解 payload_spring – 如何使用注释配置PayloadValidatingInterceptor
  3. Windows 10 全新开始屏幕曝光
  4. android广告页白屏_android 白屏
  5. php5的mysqli函数第二个参数,关于php:我应该将$ mysqli变量传递给每个函数吗?
  6. 转《浅谈数据库设计技巧》
  7. Java中int和short的取值范围_我的处理器上C中的int,short和其他数据类型的范围?...
  8. 第二章导数与微分思维导图_线性代数第二章 矩阵 思维导图
  9. 【C++自我精讲】基础系列三 重载
  10. Rust 多久更新一次?
  11. VUE引入阿里icon
  12. TypeScript转JavaScript的方法。
  13. R语言将两个矩阵数据进行相乘
  14. 部署程序出现Failed to instantiate com.octo.captcha.service.image.DefaultManageableImageCaptchaService...
  15. 多人如何通过小程序上传照片、视频、素材、文章,然后点赞投票评选?
  16. ICPC 2015 北京 Today Is a Rainy Day
  17. 把编程当小葵花妈妈课堂
  18. 树莓派+PHP+Mairadb数据库读取DHT11
  19. 查看服务器的ip地址
  20. python通讯录管理系统姓名年龄号码_基于互联网的移动通讯录管理系统的制作方法...

热门文章

  1. 计算机组成原理实验5模型机设计与实验
  2. 移动APP测试--手工测试要点总结
  3. 生活记录-常见水果清洗方法
  4. php中一级标题和二级标题,写论文中大标题,一级标题,二级标题分别指什么啊?...
  5. amd显卡关闭垂直同步 linux,A卡、N卡通用,教你如何真正的关闭垂直同步
  6. 高龄白菜java学习第八十九天(java数据结构和算法(10))
  7. DUKE/DLBS-600使用说明
  8. 遗传算法 python 简书_【算法】超详细的遗传算法(Genetic Algorithm)解析
  9. 书旗小说发布2020年度阅读报告,赘婿、系统、脑洞、年代成四大年度小说热词
  10. cocosd-x 下 2D 骨骼动画编辑器选择的闲聊