#if 0 #include "bsp_V8M_adc.h" #include "stm32f4xx.h" /* AD 采样值平均个数 */ #define AD_VALUE_AVERAGE_NUM 50 /* AD 采样的通道个数 */ #define AD_CHANNEL_NUM 3 /* ad 采样值存储 Buffer */ static uint16_t adValueBuffer[AD_VALUE_AVERAGE_NUM][AD_CHANNEL_NUM]; /* 换算后的未经过校准的电压 */ static float adVoltage_BeforCalib[AD_CHANNEL_NUM] = {0.0f}; /** * @brief AD 初始化 */ void V8M_ADC1_Init(void) { /**ADC1 GPIO Configuration PC2 ------> ADC1_IN12 PC3 ------> ADC1_IN13 PA4 ------> ADC1_IN4 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitTypeDef gpioInit; gpioInit.GPIO_Mode = GPIO_Mode_AN; gpioInit.GPIO_Speed = GPIO_Speed_25MHz; gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; gpioInit.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOC, &gpioInit); gpioInit.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOA, &gpioInit); DMA_InitTypeDef dmaInit; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); DMA_DeInit(DMA2_Stream0); dmaInit.DMA_Channel = DMA_Channel_0; dmaInit.DMA_DIR = DMA_DIR_PeripheralToMemory; dmaInit.DMA_MemoryInc = DMA_MemoryInc_Enable; dmaInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dmaInit.DMA_Mode = DMA_Mode_Circular; dmaInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dmaInit.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; dmaInit.DMA_Priority = DMA_Priority_Low; dmaInit.DMA_FIFOMode = DMA_FIFOMode_Disable; dmaInit.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; dmaInit.DMA_MemoryBurst = DMA_MemoryBurst_Single; dmaInit.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; dmaInit.DMA_Memory0BaseAddr = (uint32_t)&adValueBuffer; dmaInit.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR)); dmaInit.DMA_BufferSize = AD_VALUE_AVERAGE_NUM * AD_CHANNEL_NUM; DMA_Init(DMA2_Stream0, &dmaInit); DMA_Cmd(DMA2_Stream0, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitTypeDef adcInit; ADC_StructInit(&adcInit); ADC_DeInit(); adcInit.ADC_ContinuousConvMode = ENABLE; adcInit.ADC_ScanConvMode = ENABLE; adcInit.ADC_NbrOfConversion = 3; adcInit.ADC_Resolution = ADC_Resolution_12b; ADC_Init(ADC1, &adcInit); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_480Cycles); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); } /** * @brief 更新电压值,采用 50 个 ad 平均的方法,轮询调用 */ void V8M_ADC_UpdateVoltage(void) { float adAverageValue[AD_CHANNEL_NUM] = {0.0f}; /* 计算平均 ad 值 */ for (uint8_t i = 0; i < AD_CHANNEL_NUM; ++i) { for (uint8_t j = 0; j < AD_VALUE_AVERAGE_NUM; ++j) adAverageValue[i] += (float)adValueBuffer[j][i] / (float)AD_VALUE_AVERAGE_NUM; } /* 分压电路的倍数是 22, 基准电源 2.5V */ adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN] = 2.50f; /* 计算校准前的电压原始值 */ adVoltage_BeforCalib[V8M_AD_CHANNEL_MC] = (adAverageValue[V8M_AD_CHANNEL_MC] / adAverageValue[V8M_AD_CHANNEL_25_REFIN]) * 22 * adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN]; adVoltage_BeforCalib[V8M_AD_CHANNEL_ADINPUT] = (adAverageValue[V8M_AD_CHANNEL_ADINPUT] / adAverageValue[V8M_AD_CHANNEL_25_REFIN]) * 22 * adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN]; } /** * @breif 获取电压值 1v * @param voltageChannel 电压通道 * @arg V8M_ADC_ChannelType */ float V8M_Voltage_GetVolt(V8M_ADC_ChannelType voltageChannel) { float voltage = 0.0f; switch (voltageChannel) { case V8M_AD_CHANNEL_MC: voltage = adVoltage_BeforCalib[0]; break; case V8M_AD_CHANNEL_ADINPUT: voltage = adVoltage_BeforCalib[1]; break; case V8M_AD_CHANNEL_25_REFIN: voltage = adVoltage_BeforCalib[2]; break; default: break; } return voltage; } #endif