534 lines
12 KiB
C
Raw Normal View History

2025-05-21 11:31:07 +08:00
/*
* fml_adc.c
*
* Created on: 202547
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"
#include "fml_public.h"
typedef enum BSP_ADC_OPS_TYPE
2025-05-21 11:31:07 +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
#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
#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
}
}
/*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
/*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
}
/*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)
cola_device_open(g_pDevadc, 0);
2025-05-21 11:31:07 +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
{
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;
}