bsp_V8M_adc.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #if 0
  2. #include "bsp_V8M_adc.h"
  3. #include "stm32f4xx.h"
  4. /* AD 采样值平均个数 */
  5. #define AD_VALUE_AVERAGE_NUM 50
  6. /* AD 采样的通道个数 */
  7. #define AD_CHANNEL_NUM 3
  8. /* ad 采样值存储 Buffer */
  9. static uint16_t adValueBuffer[AD_VALUE_AVERAGE_NUM][AD_CHANNEL_NUM];
  10. /* 换算后的未经过校准的电压 */
  11. static float adVoltage_BeforCalib[AD_CHANNEL_NUM] = {0.0f};
  12. /**
  13. * @brief AD 初始化
  14. */
  15. void V8M_ADC1_Init(void)
  16. {
  17. /**ADC1 GPIO Configuration
  18. PC2 ------> ADC1_IN12
  19. PC3 ------> ADC1_IN13
  20. PA4 ------> ADC1_IN4
  21. */
  22. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  23. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  24. GPIO_InitTypeDef gpioInit;
  25. gpioInit.GPIO_Mode = GPIO_Mode_AN;
  26. gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
  27. gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
  28. gpioInit.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  29. GPIO_Init(GPIOC, &gpioInit);
  30. gpioInit.GPIO_Pin = GPIO_Pin_4;
  31. GPIO_Init(GPIOA, &gpioInit);
  32. DMA_InitTypeDef dmaInit;
  33. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  34. DMA_DeInit(DMA2_Stream0);
  35. dmaInit.DMA_Channel = DMA_Channel_0;
  36. dmaInit.DMA_DIR = DMA_DIR_PeripheralToMemory;
  37. dmaInit.DMA_MemoryInc = DMA_MemoryInc_Enable;
  38. dmaInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  39. dmaInit.DMA_Mode = DMA_Mode_Circular;
  40. dmaInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  41. dmaInit.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
  42. dmaInit.DMA_Priority = DMA_Priority_Low;
  43. dmaInit.DMA_FIFOMode = DMA_FIFOMode_Disable;
  44. dmaInit.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  45. dmaInit.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  46. dmaInit.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  47. dmaInit.DMA_Memory0BaseAddr = (uint32_t)&adValueBuffer;
  48. dmaInit.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
  49. dmaInit.DMA_BufferSize = AD_VALUE_AVERAGE_NUM * AD_CHANNEL_NUM;
  50. DMA_Init(DMA2_Stream0, &dmaInit);
  51. DMA_Cmd(DMA2_Stream0, ENABLE);
  52. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  53. ADC_InitTypeDef adcInit;
  54. ADC_StructInit(&adcInit);
  55. ADC_DeInit();
  56. adcInit.ADC_ContinuousConvMode = ENABLE;
  57. adcInit.ADC_ScanConvMode = ENABLE;
  58. adcInit.ADC_NbrOfConversion = 3;
  59. adcInit.ADC_Resolution = ADC_Resolution_12b;
  60. ADC_Init(ADC1, &adcInit);
  61. ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles);
  62. ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_480Cycles);
  63. ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_480Cycles);
  64. ADC_DMACmd(ADC1, ENABLE);
  65. ADC_Cmd(ADC1, ENABLE);
  66. ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
  67. ADC_SoftwareStartConv(ADC1);
  68. }
  69. /**
  70. * @brief 更新电压值,采用 50 个 ad 平均的方法,轮询调用
  71. */
  72. void V8M_ADC_UpdateVoltage(void)
  73. {
  74. float adAverageValue[AD_CHANNEL_NUM] = {0.0f};
  75. /* 计算平均 ad 值 */
  76. for (uint8_t i = 0; i < AD_CHANNEL_NUM; ++i)
  77. {
  78. for (uint8_t j = 0; j < AD_VALUE_AVERAGE_NUM; ++j)
  79. adAverageValue[i] +=
  80. (float)adValueBuffer[j][i] / (float)AD_VALUE_AVERAGE_NUM;
  81. }
  82. /* 分压电路的倍数是 22, 基准电源 2.5V */
  83. adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN] = 2.50f;
  84. /* 计算校准前的电压原始值 */
  85. adVoltage_BeforCalib[V8M_AD_CHANNEL_MC] =
  86. (adAverageValue[V8M_AD_CHANNEL_MC] /
  87. adAverageValue[V8M_AD_CHANNEL_25_REFIN]) *
  88. 22 * adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN];
  89. adVoltage_BeforCalib[V8M_AD_CHANNEL_ADINPUT] =
  90. (adAverageValue[V8M_AD_CHANNEL_ADINPUT] /
  91. adAverageValue[V8M_AD_CHANNEL_25_REFIN]) *
  92. 22 * adVoltage_BeforCalib[V8M_AD_CHANNEL_25_REFIN];
  93. }
  94. /**
  95. * @breif 获取电压值 1v
  96. * @param voltageChannel 电压通道
  97. * @arg V8M_ADC_ChannelType
  98. */
  99. float V8M_Voltage_GetVolt(V8M_ADC_ChannelType voltageChannel)
  100. {
  101. float voltage = 0.0f;
  102. switch (voltageChannel)
  103. {
  104. case V8M_AD_CHANNEL_MC:
  105. voltage = adVoltage_BeforCalib[0];
  106. break;
  107. case V8M_AD_CHANNEL_ADINPUT:
  108. voltage = adVoltage_BeforCalib[1];
  109. break;
  110. case V8M_AD_CHANNEL_25_REFIN:
  111. voltage = adVoltage_BeforCalib[2];
  112. break;
  113. default:
  114. break;
  115. }
  116. return voltage;
  117. }
  118. #endif