| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #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
|