#include "zadc.hpp" #ifdef HAL_ADC_MODULE_ENABLED using namespace iflytop; #define TAG "ADC" void ZADC::initialize(const char* name, ADC_HandleTypeDef* hadc1, int32_t channel, int32_t samplingTime) { if (!hadc1) return; m_hadc1 = hadc1; m_channel = channel; m_samplingTime = samplingTime; inited = true; m_name = name; m_mutex.init(); } int32_t ZADC::get_adc_value() { if (!inited) return 0; ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = m_channel; /* 通道 */ sConfig.Rank = 1; sConfig.SamplingTime = m_samplingTime; /* 采样时间 */ if (HAL_ADC_ConfigChannel(m_hadc1, &sConfig) != HAL_OK) { return -1; } HAL_ADC_Start(m_hadc1); HAL_ADC_PollForConversion(m_hadc1, HAL_MAX_DELAY); uint16_t adcv = HAL_ADC_GetValue(m_hadc1); HAL_ADC_Stop(m_hadc1); // ZLOGI(TAG, "%s ADC Value: %d", m_name, adcv); return adcv; } int32_t ZADC::get_adc_af_filter() { if (!inited) return 0; int32_t adc_value[14] = {0}; for (int i = 0; i < 14; i++) { adc_value[i] = get_adc_value(); osDelay(1); } // 排序 for (int i = 0; i < 14; i++) { for (int j = 0; j < 14 - i - 1; j++) { if (adc_value[j] > adc_value[j + 1]) { int temp = adc_value[j]; adc_value[j] = adc_value[j + 1]; adc_value[j + 1] = temp; } } } // 求平均 int sum = 0; for (int i = 2; i < 12; i++) { sum += adc_value[i]; } return sum / 10; } void ZADC::setCacheVal(int32_t val) { if (!inited) return; { zlock_guard lck(m_mutex); m_cacheVal = val; } } int32_t ZADC::getCacheVal() { if (!inited) return 0; { zlock_guard lck(m_mutex); return m_cacheVal; } } void ZADC::updateAdcValToCache() { if (!inited) return; setCacheVal(get_adc_af_filter()); } #endif