Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC设备
RT-Thread Studio
温度采集
10
rtthread studio adc三通道采集ntc电阻出现问题
发布于 2021-09-04 13:36:22 浏览:1703
订阅该版
是这样配置的 三个通道采集三个ntc热敏电阻的值 比单个通道采集一个热敏电阻时 温度要低1度左右 ```c #include "temp_adc.h" #define ADC_DEV_NAME "adc1" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL_PA3 3 /* ADC 通道 */ #define ADC_DEV_CHANNEL_PA4 4 /* ADC 通道 */ #define ADC_DEV_CHANNEL_PA5 5 /* ADC 通道 */ #define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/ #define CONVERT_BITS (1 << 12) /* 转换位数为12位 */ rt_adc_device_t adc_dev; /**中位值平均滤波法 * (1)原理:采一组队列去掉最大值和最小值 * (2)特点:优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差,对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统; 缺点:测量速度慢; * */ #define N 8 static rt_uint32_t filter(rt_uint32_t ADC_DEV_CHANNEL) { rt_uint8_t i = 0, j = 0; rt_uint32_t value_buf[N]; rt_uint32_t temp = 0,sum = 0; for(i = 0; i < N; i++){ value_buf[i] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_thread_delay(5); } for(j = 0; j < N - 1; j++) { for(i = 0; i < N - j; i++) { if(value_buf[i] > value_buf[i + 1]) { temp = value_buf[i]; value_buf[i] = value_buf[i + 1]; value_buf[i + 1] = temp; } } } for(i = 1; i < N - 1; i++) { sum += value_buf[i]; } return (rt_uint32_t)(sum / (N - 2)); } /***********************************end***********************************/ //电压换算成温度 static float temp_data(rt_uint32_t ADC_DEV_CHANNEL) { float Rt=0; float Rp=10; float T2=273.15+25; float Bx=3435; float Ka=273.15; rt_uint32_t value=0; float temp=0,vol; /* 读取采样值 */ value = filter(ADC_DEV_CHANNEL); // rt_kprintf("ADC:%d \n", value); /* 转换为对应电压值 */ vol = (float)value * REFER_VOLTAGE / CONVERT_BITS; // rt_kprintf("the voltage is :%d.%02dV \n", (int)vol / 100, (int)vol % 100); Rt = vol * 10 / (REFER_VOLTAGE-vol);//求出当前温度阻值 (BaseVoltage-RV)/R16=RV/RT; // rt_kprintf("Rt :%d \n", (int)(Rt * 10000)); temp = 1 / (1 / T2 + (log(Rt / Rp) / Bx)) - Ka;//%RT = RN exp*B(1/T-1/TN)% // rt_kprintf("temp :%d.%02dC \n", (int)(temp * 100) / 100,(int)(temp * 100) % 100); return temp; } static float adc_vol(rt_uint32_t ADC_DEV_CHANNEL,float *temp) { rt_err_t ret = RT_EOK; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME); return RT_ERROR; } /* 使能设备 */ ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); *temp = temp_data(ADC_DEV_CHANNEL); /* 关闭通道 */ ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL); return ret; } ``` ```c static void temp_get_entry(void *parameter) { while(1) { float temp3=0,temp4=0,temp5=0,temp=0; adc_vol(ADC_DEV_CHANNEL_PA3,&temp3); rt_thread_delay(10); adc_vol(ADC_DEV_CHANNEL_PA4,&temp4); rt_thread_delay(10); adc_vol(ADC_DEV_CHANNEL_PA5,&temp5); rt_thread_delay(10); temp = (temp3 + temp4 + temp5)/3; rt_kprintf("temp :%dC %dC %dC temp:%dC\n", (int)(temp3 * 100),(int)(temp4 * 100),(int)(temp5 * 100),(int)(temp * 100)); } } rt_thread_t temp_get_adc=RT_NULL; int temp_get_adc_init(void) { //创建显示线程 优先级设置为31 temp_get_adc = rt_thread_create("temp_get_adc", temp_get_entry, RT_NULL, 2048, 8, 20); //启动显示线程 if(RT_NULL != temp_get_adc) { rt_thread_startup(temp_get_adc); // rt_kprintf("display_ok\n"); } return 0; } ```
查看更多
fubaojun2006
2021-12-02
哇(挖)~~坑~~~啊!
看你的程序,一次打开 读取8次,然后做了排序,后取 中位值平均滤波法 已经很完美了。 我觉得可以试试把 NTC 通道 安排在几个不同的PORT 的IO口上, 比如A口一个NTC , C口 一个NTC ,排除这种外部硬件引起的串扰问题。 或者是在`filter`函数做一下调整,先读取两次丢弃,然后先延时,然后再读取。 ```c static rt_uint32_t filter(rt_uint32_t ADC_DEV_CHANNEL) { rt_uint8_t i = 0, j = 0; rt_uint32_t value_buf[N]; rt_uint32_t temp = 0,sum = 0; _ rt_adc_read(adc_dev, ADC_DEV_CHANNEL); //丢弃1 rt_thread_delay(5); //延时 rt_adc_read(adc_dev, ADC_DEV_CHANNEL); //丢弃2_ for(i = 0; i < N; i++){ _rt_thread_delay(5); //调整顺序_ value_buf[i] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); } ``` 你写的程序代码,实在是挑不出毛病的。 再不然就是 像你这样对时间不敏感的,就降低ADC CLK频率,加大采样时间周期数。 再一个就是 在硬件引脚那里加入一个小的滤波电容。
5
个回答
默认排序
按发布时间排序
靖哥哥我滴神
2021-09-04
这家伙很懒,什么也没写!
使用的ADC设备 不知道为啥会出现这样的原因 编译环境是rtthread studio
红枫
认证专家
2021-09-04
这家伙很懒,什么也没写!
试试每个通道连续采集2次,取第二次采集值,这样可以消除通道间的影响
StackYuan
认证专家
2021-09-06
这家伙很懒,什么也没写!
这个要把实际的NTC电路拿出来看,ADC是名义上的IO高阻态吗,如果本身温感输出端阻抗就很高,IO的阻抗就需要注意到
Trank_飛飛
2021-09-16
行有不得者,皆反求诸己
你可以试试吧关闭通道的函数单独做一个线程,用条件或者命令关闭,然后多读几次数据看看后面的数据正常不正常,我之前用ADC发现第一次数据好像确实有点问题,但是后面的数据是OK的,根据例程读完之后立刻关闭通道,似乎你每一次都是第一次有问题的数据。。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
靖哥哥我滴神
这家伙很懒,什么也没写!
提问
7
回答
45
被采纳
9
关注TA
发私信
相关问题
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部