/* * 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" static task_t gadcTask; extern void logWrite(const char *fmt, ...); static const cola_device_t *g_pDevadc = NULL; uint16_t adc_temp_value[10]; uint16_t adc_batt_value[10]; uint16_t V_battery_ad = 0; uint16_t adc_temp = 0; float V_battery_ad_3V3; uint16_t adc_filter(uint16_t *adc_values) { uint16_t sum = 0; uint16_t min, max; uint8_t i; // 1. 采集10次ADC值(这里需要替换为实际的ADC读取函数) // 2. 找出最大值和最小值 min = max = adc_values[0]; for (i = 1; i < 10; i++) { if (adc_values[i] < min) { min = adc_values[i]; } if (adc_values[i] > max) { max = adc_values[i]; } } // 3. 计算去掉最大最小值后的和 uint8_t count = 0; for (i = 0; i < 10; i++) { if (adc_values[i] != min && adc_values[i] != max) { sum += adc_values[i]; count++; } } // 处理所有值相同的情况(避免除以0) if (count == 0) { return adc_values[9]; // 如果所有值相同,直接返回平均值 } // 4. 计算平均值并返回 return sum / count; } void fml_adc_read_polling(void *arg, uint32_t event) { static uint8_t i,j; adc_batt_value[i++] = cola_device_read(g_pDevadc,2,0,0); adc_temp_value[j++] = cola_device_read(g_pDevadc,3,0,0); if((i==10) &&(j==10)) { V_battery_ad = adc_filter(adc_batt_value); adc_temp = adc_filter(adc_temp_value); i = j = 0; logWrite("V_battery_ad = %d\r\n",V_battery_ad); logWrite("adc_temp = %d\r\n",fml_adc_read_once_temp()); } } void fml_adc_init(void) { g_pDevadc = cola_device_find("DEVICE_ADC"); if(g_pDevadc) cola_device_open(g_pDevadc, 0); V_battery_ad = cola_device_read(g_pDevadc,2,0,0); adc_temp = cola_device_read(g_pDevadc,3,0,0); cola_timer_create(&gadcTask, fml_adc_read_polling, NULL); cola_timer_start(&gadcTask, EN_COLA_TIMER_ALWAYS, 100); } uint8_t fml_adc_read_once_temp(void) { //V_temp_ad = cola_device_read(g_pDevadc,3,0,0); 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; }