当前位置:   article > 正文

STM32F373 SDADC+DMA

sdadc

SDADC为 Sigma-delta AD转换器。Sigma-delta 转换器又称过采样转换器,它包含两个基本电路:调制器和数字滤波器。 在调制器中,输入信号被加至数模转换器 (DAC)输出的负反馈信号。通过集成电路之后, 信号的差值到达比较器的输入 (1 位 ADC),在此与参考电压比较 (比较器作为 1 位量化器 工作)。比较器的输入信号 (1 位 ADC)控制着 1 位转换器,到达数字滤波器的输入。数字 滤波器降低流速,将 1 位的流转换为 16 位的字。使用的滤波器拓扑确保了低通的阶为 Sinc3。

SDADC总体框架如下所示,可以看出以下特性:

(1).时钟6M或1.5M,最小500kHz

(2).可编程增益:x0.5、 x1、 x2、 x4、 x8、 x16 及 x32

(3).可选参考电压:VDDSD、 1.22 V、 1.8 V 及 VREF

(4).可设置偏移量offset

SDADC有三种输入模式:(1)差分模式,(2)单端偏移模式,(3)单端零参考模式

在差分模式中,SDADC 转换的是 SDADCx_AINyP 和 SDADCx_AINyM 的差值。结果可能是 正值或负值,取决于5个输入电压更高。SDADC 无法测量负电压,并且每个通道的输入电压都必须在器件的电气极限之内。 输入范围为 [-Vref/(2*gain), + Vref/(2*gain)],转换值范围为 [-32767, +32767]。

Vin = SDADCxAINyP - SDADCxAINyM = ReadData * Vref/(2 * gain*32767)

在单端偏移模式中,通过将负输入内部连至 0 V 进行转换,负输入的相应引脚(SDADCx_AINyM) 可用作其它用处。要测量的信号施加于正输入 SDADCx_AINyP。此工作模式与差分模式类 似,只是输出数据范围仅为 0 到 +32767,而不是 –32767 到 +32767,因此有一半的动态范 围损失,导致 SNR 下降。

Vin = SDADCxAINyP = ReadData * Vref/(2 * gain * 32767)

单端零参考模式中,信号施加于正输入 SDADCx_AINyP,负输入设为信号参考 (一般为 0 V)。此模式将一半标 度的输入共模注入 ADC,以此保持了与差分模式一样的动态范围 (-32767 到 +32767)。在 此模式中,注入的共模取决于增益变化。

Vin = SDADCxAINyP = (ReadData + 32767) * Vref/( gain * 65535)

以差分模式的SDADC的通道6,配合DMA采集为例:

  1. static void MX_SDADC1_Init(void)
  2. {
  3. SDADC_ConfParamTypeDef ConfParamStruct = {0};
  4. hsdadc1.Instance = SDADC1;
  5. hsdadc1.Init.IdleLowPowerMode = SDADC_LOWPOWER_NONE;
  6. hsdadc1.Init.FastConversionMode = SDADC_FAST_CONV_ENABLE;
  7. hsdadc1.Init.SlowClockMode = SDADC_SLOW_CLOCK_DISABLE;
  8. hsdadc1.Init.ReferenceVoltage = SDADC_VREF_VDDA;
  9. if (HAL_SDADC_Init(&hsdadc1) != HAL_OK)
  10. {
  11. Error_Handler();
  12. }
  13. ConfParamStruct.InputMode = SDADC_INPUT_MODE_DIFF;
  14. ConfParamStruct.Gain = SDADC_GAIN_1;
  15. ConfParamStruct.CommonMode = SDADC_COMMON_MODE_VDDA;
  16. ConfParamStruct.Offset = 0;
  17. if(HAL_SDADC_PrepareChannelConfig(&hsdadc1, SDADC_CONF_INDEX_0, &ConfParamStruct) != HAL_OK)
  18. {
  19. Error_Handler();
  20. }
  21. if(HAL_SDADC_AssociateChannelConfig(&hsdadc1,SDADC_CHANNEL_6, SDADC_CONF_INDEX_0) != HAL_OK)
  22. {
  23. Error_Handler();
  24. }
  25. HAL_SDADC_CalibrationStart(&hsdadc1, SDADC_CALIBRATION_SEQ_1);
  26. if (HAL_SDADC_PollForCalibEvent(&hsdadc1, 50) != HAL_OK)
  27. {
  28. Error_Handler();
  29. }
  30. if(HAL_SDADC_SelectRegularTrigger(&hsdadc1, SDADC_SOFTWARE_TRIGGER) != HAL_OK)
  31. {
  32. Error_Handler();
  33. }
  34. if(HAL_SDADC_ConfigChannel(&hsdadc1,SDADC_CHANNEL_6,SDADC_CONTINUOUS_CONV_ON) != HAL_OK)
  35. {
  36. Error_Handler();
  37. }
  38. HAL_SDADC_Start_DMA(&hsdadc1, (uint32_t *)sdadc1_sample_value, MAX_SAMPLE_COUNT);
  39. }
  40. void HAL_SDADC_MspInit(SDADC_HandleTypeDef* hsdadc)
  41. {
  42. GPIO_InitTypeDef GPIO_InitStruct = {0};
  43. if(hsdadc->Instance==SDADC1)
  44. {
  45. /* USER CODE BEGIN SDADC1_MspInit 0 */
  46. /* USER CODE END SDADC1_MspInit 0 */
  47. /* Peripheral clock enable */
  48. __HAL_RCC_SDADC1_CLK_ENABLE();
  49. __HAL_RCC_GPIOB_CLK_ENABLE();
  50. /**SDADC1 GPIO Configuration
  51. PB0 ------> SDADC1_AIN6P
  52. PB1 ------> SDADC1_AIN6M
  53. */
  54. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  55. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  56. GPIO_InitStruct.Pull = GPIO_NOPULL;
  57. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  58. /* SDADC1 DMA Init */
  59. /* SDADC1 Init */
  60. hdma_sdadc1.Instance = DMA2_Channel3;
  61. hdma_sdadc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  62. hdma_sdadc1.Init.PeriphInc = DMA_PINC_DISABLE;
  63. hdma_sdadc1.Init.MemInc = DMA_MINC_ENABLE;
  64. hdma_sdadc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  65. hdma_sdadc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  66. hdma_sdadc1.Init.Mode = DMA_CIRCULAR;
  67. hdma_sdadc1.Init.Priority = DMA_PRIORITY_LOW;
  68. if (HAL_DMA_Init(&hdma_sdadc1) != HAL_OK)
  69. {
  70. Error_Handler();
  71. }
  72. __HAL_LINKDMA(hsdadc,hdma,hdma_sdadc1);
  73. /* USER CODE BEGIN SDADC1_MspInit 1 */
  74. /* USER CODE END SDADC1_MspInit 1 */
  75. }
  76. }
  77. static void MX_DMA_Init(void)
  78. {
  79. /* DMA controller clock enable */
  80. __HAL_RCC_DMA2_CLK_ENABLE();
  81. /* DMA interrupt init */
  82. /* DMA2_Channel3_IRQn interrupt configuration */
  83. HAL_NVIC_SetPriority(DMA2_Channel3_IRQn, 0, 0);
  84. HAL_NVIC_EnableIRQ(DMA2_Channel3_IRQn);
  85. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/1021944
推荐阅读
相关标签
  

闽ICP备14008679号