2025-05-21 11:31:07 +08:00
|
|
|
/*
|
|
|
|
* fml_adc.c
|
|
|
|
*
|
2025-05-30 14:10:31 +08:00
|
|
|
* Created on: 2025年4月7日
|
2025-05-21 11:31:07 +08:00
|
|
|
* Author: 22332
|
|
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "cola_init.h"
|
|
|
|
#include "cola_os.h"
|
|
|
|
#include "cola_device.h"
|
|
|
|
#include "fml_adc.h"
|
2025-05-30 14:10:31 +08:00
|
|
|
#include "fml_public.h"
|
|
|
|
|
|
|
|
typedef enum BSP_ADC_OPS_TYPE
|
2025-05-21 11:31:07 +08:00
|
|
|
{
|
2025-05-30 14:10:31 +08:00
|
|
|
EN_ADC_OPS_TYPE_MCU = 1, //MCU内部温度(暂未用)
|
|
|
|
EN_ADC_OPS_TYPE_BAT, //读取B+电压
|
|
|
|
EN_ADC_OPS_TYPE_NTC, //读取NTC温度值
|
|
|
|
} EN_ADC_OPS_TYPE;
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
//小数
|
|
|
|
#define BAT_Rp 37.4 //上拉电阻37.4K
|
|
|
|
#define BAT_R1 4.7 //分压电阻4.7k
|
|
|
|
#define BAT_LOSS 0.5 //二极管损耗0.5v
|
|
|
|
|
|
|
|
#define ADC_VREF (3.3) //ADC参考电压3.3v
|
|
|
|
#define ADC_ACCURACY (1UL << 12U) //12位采样ADC
|
|
|
|
#define ADC_CAL_VOL(adcVal) (float)(((float)(adcVal) * ADC_VREF) / ((float)ADC_ACCURACY))//ADC采集到的电压值
|
2025-05-21 11:31:07 +08:00
|
|
|
|
2025-05-30 14:10:31 +08:00
|
|
|
#define BAT_RATIO (((float)BAT_R1+(float)BAT_Rp)/(float)BAT_R1) //按电阻比例进行分压
|
|
|
|
#define BAT_GET(adcVal) ((BAT_RATIO*(float)ADC_CAL_VOL(adcVal))+BAT_LOSS) //计算板子这端的B+电压
|
|
|
|
#else
|
|
|
|
//整数
|
|
|
|
#define BAT_Rp 374 //上拉电阻37.4K
|
|
|
|
#define BAT_R1 47 //分压电阻4.7k
|
|
|
|
#define BAT_LOSS (500+400) //二极管损耗0.5v
|
2025-05-21 11:31:07 +08:00
|
|
|
|
2025-05-30 14:10:31 +08:00
|
|
|
#define ADC_VREF (3300) //ADC参考电压3.3v
|
|
|
|
#define ADC_ACCURACY (1UL << 12U) //12位采样ADC
|
|
|
|
#define ADC_CAL_VOL(adcVal) adcVal * ADC_VREF / ADC_ACCURACY//ADC采集到的电压值
|
|
|
|
|
|
|
|
#define BAT_RATIO (BAT_R1+BAT_Rp)/BAT_R1 //按电阻比例进行分压
|
|
|
|
#define BAT_GET(adcVal) ((BAT_R1+BAT_Rp)*(adcVal * ADC_VREF)/(BAT_R1*ADC_ACCURACY)+BAT_LOSS)//计算板子这端的B+电压
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static cola_device_t *g_pDevadc = NULL;
|
|
|
|
static uint16_t g_iNTCAd=0; //NTC温度ADC
|
|
|
|
|
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : sort
|
|
|
|
* Description : 将数组从小到大进行排序
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
static void sort(uint16_t *pBuf,int len)
|
|
|
|
{
|
|
|
|
uint16_t temp;
|
|
|
|
uint8_t i,j;
|
|
|
|
for(i=0; i<len-1; i++)
|
|
|
|
{
|
|
|
|
for(j=i+1; j<len; j++)
|
|
|
|
{
|
|
|
|
if(pBuf[i]>pBuf[j])
|
|
|
|
{
|
|
|
|
temp = pBuf[i];
|
|
|
|
pBuf[i] = pBuf[j];
|
|
|
|
pBuf[j] = temp;
|
|
|
|
}
|
|
|
|
}
|
2025-05-21 11:31:07 +08:00
|
|
|
}
|
2025-05-30 14:10:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_adc_filter
|
|
|
|
* Description : 将数组进行排序后,去掉一个最大和最小值,将剩下的值做平均
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
uint16_t fml_adc_filter(uint16_t *buf,int len)
|
|
|
|
{
|
|
|
|
int sum = 0;
|
|
|
|
sort(buf,len);
|
|
|
|
for(int i=1; i<(len-1); i++)
|
|
|
|
sum+= buf[i];
|
|
|
|
//sum = sum/(len-2);
|
|
|
|
sum = buf[len/2];
|
|
|
|
return sum;
|
|
|
|
}
|
2025-05-21 11:31:07 +08:00
|
|
|
|
2025-05-30 14:10:31 +08:00
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_adc_to_bat_voltage
|
|
|
|
* Description : 将采集的ADC值,根据电阻分压求出B+的电压值
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
uint16_t fml_adc_to_bat_voltage(uint16_t adc)
|
|
|
|
{
|
|
|
|
return BAT_GET(adc);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_adc_read_bat_ad
|
|
|
|
* Description : 读BAT检测AD值
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
uint16_t fml_adc_read_bat_ad(void)
|
|
|
|
{
|
|
|
|
uint16_t iBattAd = cola_device_read(g_pDevadc,EN_ADC_OPS_TYPE_BAT,0,0);
|
|
|
|
return iBattAd;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_adc_read_temp_ad
|
|
|
|
* Description : 读NTC检测AD值
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
uint16_t fml_adc_read_temp_ad(void)
|
|
|
|
{
|
|
|
|
uint16_t iBattAd = cola_device_read(g_pDevadc,EN_ADC_OPS_TYPE_NTC,0,0);
|
|
|
|
g_iNTCAd = iBattAd;
|
|
|
|
return iBattAd;
|
2025-05-21 11:31:07 +08:00
|
|
|
}
|
|
|
|
|
2025-05-30 14:10:31 +08:00
|
|
|
|
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_adc_init
|
|
|
|
* Description : 初始化ADC采集任务
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
2025-05-21 11:31:07 +08:00
|
|
|
void fml_adc_init(void)
|
|
|
|
{
|
|
|
|
g_pDevadc = cola_device_find("DEVICE_ADC");
|
|
|
|
if(g_pDevadc)
|
2025-05-30 14:10:31 +08:00
|
|
|
cola_device_open(g_pDevadc, 0);
|
2025-05-21 11:31:07 +08:00
|
|
|
}
|
|
|
|
|
2025-05-30 14:10:31 +08:00
|
|
|
/*FUNCTION**********************************************************************
|
|
|
|
*
|
|
|
|
* Function Name : fml_convert_ntc_ad_to_temp
|
|
|
|
* Description : 将NTC AD值按协议0x0F命令规则转换成实际温度值给到主机
|
|
|
|
*
|
|
|
|
*END**************************************************************************/
|
|
|
|
uint8_t fml_convert_ntc_ad_to_temp(void)
|
2025-05-21 11:31:07 +08:00
|
|
|
{
|
2025-05-30 14:10:31 +08:00
|
|
|
uint16_t adc_temp = g_iNTCAd;
|
2025-05-21 11:31:07 +08:00
|
|
|
if(adc_temp<252)
|
|
|
|
return 190;
|
|
|
|
else if(adc_temp<257)
|
|
|
|
return 189;
|
|
|
|
else if(adc_temp<262)
|
|
|
|
return 188;
|
|
|
|
else if(adc_temp<267)
|
|
|
|
return 187;
|
|
|
|
else if(adc_temp<273)
|
|
|
|
return 186;
|
|
|
|
else if(adc_temp<278)
|
|
|
|
return 185;
|
|
|
|
else if(adc_temp<284)
|
|
|
|
return 184;
|
|
|
|
else if(adc_temp<289)
|
|
|
|
return 183;
|
|
|
|
else if(adc_temp<295)
|
|
|
|
return 182;
|
|
|
|
else if(adc_temp<301)
|
|
|
|
return 181;
|
|
|
|
else if(adc_temp<307)
|
|
|
|
return 180;
|
|
|
|
else if(adc_temp<313)
|
|
|
|
return 179;
|
|
|
|
else if(adc_temp<319)
|
|
|
|
return 178;
|
|
|
|
else if(adc_temp<326)
|
|
|
|
return 177;
|
|
|
|
else if(adc_temp<332)
|
|
|
|
return 176;
|
|
|
|
else if(adc_temp<339)
|
|
|
|
return 175;
|
|
|
|
else if(adc_temp<346)
|
|
|
|
return 174;
|
|
|
|
else if(adc_temp<353)
|
|
|
|
return 173;
|
|
|
|
else if(adc_temp<360)
|
|
|
|
return 172;
|
|
|
|
else if(adc_temp<368)
|
|
|
|
return 171;
|
|
|
|
else if(adc_temp<375)
|
|
|
|
return 170;
|
|
|
|
else if(adc_temp<383)
|
|
|
|
return 169;
|
|
|
|
else if(adc_temp<391)
|
|
|
|
return 168;
|
|
|
|
else if(adc_temp<399)
|
|
|
|
return 167;
|
|
|
|
else if(adc_temp<407)
|
|
|
|
return 166;
|
|
|
|
else if(adc_temp<416)
|
|
|
|
return 165;
|
|
|
|
else if(adc_temp<425)
|
|
|
|
return 164;
|
|
|
|
else if(adc_temp<433)
|
|
|
|
return 163;
|
|
|
|
else if(adc_temp<442)
|
|
|
|
return 162;
|
|
|
|
else if(adc_temp<452)
|
|
|
|
return 161;
|
|
|
|
else if(adc_temp<461)
|
|
|
|
return 160;
|
|
|
|
else if(adc_temp<471)
|
|
|
|
return 159;
|
|
|
|
else if(adc_temp<481)
|
|
|
|
return 158;
|
|
|
|
else if(adc_temp<491)
|
|
|
|
return 157;
|
|
|
|
else if(adc_temp<501)
|
|
|
|
return 156;
|
|
|
|
else if(adc_temp<512)
|
|
|
|
return 155;
|
|
|
|
else if(adc_temp<523)
|
|
|
|
return 154;
|
|
|
|
else if(adc_temp<534)
|
|
|
|
return 153;
|
|
|
|
else if(adc_temp<545)
|
|
|
|
return 152;
|
|
|
|
else if(adc_temp<557)
|
|
|
|
return 151;
|
|
|
|
else if(adc_temp<569)
|
|
|
|
return 150;
|
|
|
|
else if(adc_temp<581)
|
|
|
|
return 149;
|
|
|
|
else if(adc_temp<593)
|
|
|
|
return 148;
|
|
|
|
else if(adc_temp<606)
|
|
|
|
return 147;
|
|
|
|
else if(adc_temp<619)
|
|
|
|
return 146;
|
|
|
|
else if(adc_temp<632)
|
|
|
|
return 145;
|
|
|
|
else if(adc_temp<646)
|
|
|
|
return 144;
|
|
|
|
else if(adc_temp<660)
|
|
|
|
return 143;
|
|
|
|
else if(adc_temp<674)
|
|
|
|
return 142;
|
|
|
|
else if(adc_temp<688)
|
|
|
|
return 141;
|
|
|
|
else if(adc_temp<703)
|
|
|
|
return 140;
|
|
|
|
else if(adc_temp<718)
|
|
|
|
return 139;
|
|
|
|
else if(adc_temp<734)
|
|
|
|
return 138;
|
|
|
|
else if(adc_temp<750)
|
|
|
|
return 137;
|
|
|
|
else if(adc_temp<766)
|
|
|
|
return 136;
|
|
|
|
else if(adc_temp<782)
|
|
|
|
return 135;
|
|
|
|
else if(adc_temp<799)
|
|
|
|
return 134;
|
|
|
|
else if(adc_temp<816)
|
|
|
|
return 133;
|
|
|
|
else if(adc_temp<834)
|
|
|
|
return 132;
|
|
|
|
else if(adc_temp<852)
|
|
|
|
return 131;
|
|
|
|
else if(adc_temp<870)
|
|
|
|
return 130;
|
|
|
|
else if(adc_temp<889)
|
|
|
|
return 129;
|
|
|
|
else if(adc_temp<908)
|
|
|
|
return 128;
|
|
|
|
else if(adc_temp<927)
|
|
|
|
return 127;
|
|
|
|
else if(adc_temp<947)
|
|
|
|
return 126;
|
|
|
|
else if(adc_temp<967)
|
|
|
|
return 125;
|
|
|
|
else if(adc_temp<987)
|
|
|
|
return 124;
|
|
|
|
else if(adc_temp<1008)
|
|
|
|
return 123;
|
|
|
|
else if(adc_temp<1029)
|
|
|
|
return 122;
|
|
|
|
else if(adc_temp<1051)
|
|
|
|
return 121;
|
|
|
|
else if(adc_temp<1073)
|
|
|
|
return 120;
|
|
|
|
else if(adc_temp<1096)
|
|
|
|
return 119;
|
|
|
|
else if(adc_temp<1119)
|
|
|
|
return 118;
|
|
|
|
else if(adc_temp<1142)
|
|
|
|
return 117;
|
|
|
|
else if(adc_temp<1166)
|
|
|
|
return 116;
|
|
|
|
else if(adc_temp<1190)
|
|
|
|
return 115;
|
|
|
|
else if(adc_temp<1215)
|
|
|
|
return 114;
|
|
|
|
else if(adc_temp<1240)
|
|
|
|
return 113;
|
|
|
|
else if(adc_temp<1265)
|
|
|
|
return 112;
|
|
|
|
else if(adc_temp<1291)
|
|
|
|
return 111;
|
|
|
|
else if(adc_temp<1317)
|
|
|
|
return 110;
|
|
|
|
else if(adc_temp<1344)
|
|
|
|
return 109;
|
|
|
|
else if(adc_temp<1371)
|
|
|
|
return 108;
|
|
|
|
else if(adc_temp<1398)
|
|
|
|
return 107;
|
|
|
|
else if(adc_temp<1426)
|
|
|
|
return 106;
|
|
|
|
else if(adc_temp<1454)
|
|
|
|
return 105;
|
|
|
|
else if(adc_temp<1482)
|
|
|
|
return 104;
|
|
|
|
else if(adc_temp<1511)
|
|
|
|
return 103;
|
|
|
|
else if(adc_temp<1541)
|
|
|
|
return 102;
|
|
|
|
else if(adc_temp<1570)
|
|
|
|
return 101;
|
|
|
|
else if(adc_temp<1600)
|
|
|
|
return 100;
|
|
|
|
else if(adc_temp<1631)
|
|
|
|
return 99;
|
|
|
|
else if(adc_temp<1663)
|
|
|
|
return 98;
|
|
|
|
else if(adc_temp<1694)
|
|
|
|
return 97;
|
|
|
|
else if(adc_temp<1726)
|
|
|
|
return 96;
|
|
|
|
else if(adc_temp<1758)
|
|
|
|
return 95;
|
|
|
|
else if(adc_temp<1791)
|
|
|
|
return 94;
|
|
|
|
else if(adc_temp<1824)
|
|
|
|
return 93;
|
|
|
|
else if(adc_temp<1857)
|
|
|
|
return 92;
|
|
|
|
else if(adc_temp<1890)
|
|
|
|
return 91;
|
|
|
|
else if(adc_temp<1923)
|
|
|
|
return 90;
|
|
|
|
else if(adc_temp<1957)
|
|
|
|
return 89;
|
|
|
|
else if(adc_temp<1991)
|
|
|
|
return 88;
|
|
|
|
else if(adc_temp<2025)
|
|
|
|
return 87;
|
|
|
|
else if(adc_temp<2060)
|
|
|
|
return 86;
|
|
|
|
else if(adc_temp<2094)
|
|
|
|
return 85;
|
|
|
|
else if(adc_temp<2129)
|
|
|
|
return 84;
|
|
|
|
else if(adc_temp<2164)
|
|
|
|
return 83;
|
|
|
|
else if(adc_temp<2198)
|
|
|
|
return 82;
|
|
|
|
else if(adc_temp<2233)
|
|
|
|
return 81;
|
|
|
|
else if(adc_temp<2268)
|
|
|
|
return 80;
|
|
|
|
else if(adc_temp<2303)
|
|
|
|
return 79;
|
|
|
|
else if(adc_temp<2338)
|
|
|
|
return 78;
|
|
|
|
else if(adc_temp<2373)
|
|
|
|
return 77;
|
|
|
|
else if(adc_temp<2408)
|
|
|
|
return 76;
|
|
|
|
else if(adc_temp<2443)
|
|
|
|
return 75;
|
|
|
|
else if(adc_temp<2478)
|
|
|
|
return 74;
|
|
|
|
else if(adc_temp<2513)
|
|
|
|
return 73;
|
|
|
|
else if(adc_temp<2548)
|
|
|
|
return 72;
|
|
|
|
else if(adc_temp<2582)
|
|
|
|
return 71;
|
|
|
|
else if(adc_temp<2617)
|
|
|
|
return 70;
|
|
|
|
else if(adc_temp<2651)
|
|
|
|
return 69;
|
|
|
|
else if(adc_temp<2685)
|
|
|
|
return 68;
|
|
|
|
else if(adc_temp<2719)
|
|
|
|
return 67;
|
|
|
|
else if(adc_temp<2753)
|
|
|
|
return 66;
|
|
|
|
else if(adc_temp<2786)
|
|
|
|
return 65;
|
|
|
|
else if(adc_temp<2820)
|
|
|
|
return 64;
|
|
|
|
else if(adc_temp<2852)
|
|
|
|
return 63;
|
|
|
|
else if(adc_temp<2885)
|
|
|
|
return 62;
|
|
|
|
else if(adc_temp<2917)
|
|
|
|
return 61;
|
|
|
|
else if(adc_temp<2949)
|
|
|
|
return 60;
|
|
|
|
else if(adc_temp<2980)
|
|
|
|
return 59;
|
|
|
|
else if(adc_temp<3011)
|
|
|
|
return 58;
|
|
|
|
else if(adc_temp<3042)
|
|
|
|
return 57;
|
|
|
|
else if(adc_temp<3072)
|
|
|
|
return 56;
|
|
|
|
else if(adc_temp<3102)
|
|
|
|
return 55;
|
|
|
|
else if(adc_temp<3132)
|
|
|
|
return 54;
|
|
|
|
else if(adc_temp<3161)
|
|
|
|
return 53;
|
|
|
|
else if(adc_temp<3189)
|
|
|
|
return 52;
|
|
|
|
else if(adc_temp<3218)
|
|
|
|
return 51;
|
|
|
|
else if(adc_temp<3245)
|
|
|
|
return 50;
|
|
|
|
else if(adc_temp<3272)
|
|
|
|
return 49;
|
|
|
|
else if(adc_temp<3299)
|
|
|
|
return 48;
|
|
|
|
else if(adc_temp<3325)
|
|
|
|
return 47;
|
|
|
|
else if(adc_temp<3350)
|
|
|
|
return 46;
|
|
|
|
else if(adc_temp<3376)
|
|
|
|
return 45;
|
|
|
|
else if(adc_temp<3400)
|
|
|
|
return 44;
|
|
|
|
else if(adc_temp<3424)
|
|
|
|
return 43;
|
|
|
|
else if(adc_temp<3448)
|
|
|
|
return 42;
|
|
|
|
else if(adc_temp<3470)
|
|
|
|
return 41;
|
|
|
|
else if(adc_temp<3493)
|
|
|
|
return 40;
|
|
|
|
else if(adc_temp<3515)
|
|
|
|
return 39;
|
|
|
|
else if(adc_temp<3536)
|
|
|
|
return 38;
|
|
|
|
else if(adc_temp<3557)
|
|
|
|
return 37;
|
|
|
|
else if(adc_temp<3597)
|
|
|
|
return 36;
|
|
|
|
else if(adc_temp<3616)
|
|
|
|
return 35;
|
|
|
|
else if(adc_temp<3635)
|
|
|
|
return 34;
|
|
|
|
else if(adc_temp<3653)
|
|
|
|
return 33;
|
|
|
|
else if(adc_temp<3671)
|
|
|
|
return 32;
|
|
|
|
else if(adc_temp<3688)
|
|
|
|
return 31;
|
|
|
|
else if(adc_temp<3705)
|
|
|
|
return 30;
|
|
|
|
else if(adc_temp<3721)
|
|
|
|
return 29;
|
|
|
|
else if(adc_temp<3736)
|
|
|
|
return 28;
|
|
|
|
else if(adc_temp<3751)
|
|
|
|
return 27;
|
|
|
|
else if(adc_temp<3766)
|
|
|
|
return 26;
|
|
|
|
else if(adc_temp<3780)
|
|
|
|
return 25;
|
|
|
|
else if(adc_temp<3794)
|
|
|
|
return 24;
|
|
|
|
else if(adc_temp<3807)
|
|
|
|
return 23;
|
|
|
|
else if(adc_temp<3820)
|
|
|
|
return 22;
|
|
|
|
else if(adc_temp<3832)
|
|
|
|
return 21;
|
|
|
|
else if(adc_temp<3844)
|
|
|
|
return 20;
|
|
|
|
else if(adc_temp<3855)
|
|
|
|
return 19;
|
|
|
|
else if(adc_temp<3866)
|
|
|
|
return 18;
|
|
|
|
else if(adc_temp<3877)
|
|
|
|
return 17;
|
|
|
|
else if(adc_temp<3887)
|
|
|
|
return 16;
|
|
|
|
else if(adc_temp<3897)
|
|
|
|
return 15;
|
|
|
|
else if(adc_temp<3907)
|
|
|
|
return 14;
|
|
|
|
else if(adc_temp<3916)
|
|
|
|
return 13;
|
|
|
|
else if(adc_temp<3925)
|
|
|
|
return 12;
|
|
|
|
else if(adc_temp<3933)
|
|
|
|
return 11;
|
|
|
|
else if(adc_temp<3941)
|
|
|
|
return 10;
|
|
|
|
else if(adc_temp<3949)
|
|
|
|
return 9;
|
|
|
|
else if(adc_temp<3956)
|
|
|
|
return 8;
|
|
|
|
else if(adc_temp<3963)
|
|
|
|
return 7;
|
|
|
|
else if(adc_temp<3970)
|
|
|
|
return 6;
|
|
|
|
else if(adc_temp<3977)
|
|
|
|
return 5;
|
|
|
|
else if(adc_temp<3983)
|
|
|
|
return 4;
|
|
|
|
else if(adc_temp<3989)
|
|
|
|
return 3;
|
|
|
|
else if(adc_temp<3994)
|
|
|
|
return 2;
|
|
|
|
else if(adc_temp<4000)
|
|
|
|
return 1;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|