/* * fml_adc.c * * Created on: 2025年4月7日 * Author: 22332 */ #include #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 { 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采集到的电压值 #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 #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; ipBuf[j]) { temp = pBuf[i]; pBuf[i] = pBuf[j]; pBuf[j] = temp; } } } } /*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; } /*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; } /*FUNCTION********************************************************************** * * Function Name : fml_adc_init * Description : 初始化ADC采集任务 * *END**************************************************************************/ void fml_adc_init(void) { g_pDevadc = cola_device_find("DEVICE_ADC"); if(g_pDevadc) cola_device_open(g_pDevadc, 0); } /*FUNCTION********************************************************************** * * Function Name : fml_convert_ntc_ad_to_temp * Description : 将NTC AD值按协议0x0F命令规则转换成实际温度值给到主机 * *END**************************************************************************/ uint8_t fml_convert_ntc_ad_to_temp(void) { uint16_t adc_temp = g_iNTCAd; 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; }