[STM32WB] 【STM32WB09KE测评】-基础任务4-ADC外设驱动

[复制链接]
1057|2
 楼主| YangTwo 发表于 2024-11-9 17:33 | 显示全部楼层 |阅读模式
本帖最后由 YangTwo 于 2024-11-9 17:33 编辑

ADC简介
STM32WB09系列的ADC有16中工作模式组合:
• External signals through ADC_VINPx and ADC_VINMx, where x=0,1,2 or 3
– Up to 4 differential inputs
– Up to 8 single-ended inputs one single ended input to interface with a temperature sensor in a range up to 1.2 V
• one single ended input connected to VBAT for battery level detector in a range up to 3.6 V
• two single ended inputs connected to GND for calibration
• two single ended inputs connected to 1.2 V for calibration
• one single ended input connected to Temperature Sensor



1.png
本次体验自带的温度传感器与一路外部模拟输入模式。其中外部输入采集到是DFROBOT的模拟声音传感器。
模拟声音传感器简介
MIC声音传感器是一款基于麦克风为声音检测的传感器,可用来对周围环境中的声音强度进行检测,具有300倍的放大器,输出模拟信号能使用3.3V和5V为基准AD采集,可以用来实现根据声音大小进行互动的效果、制作声控机器人、声控开关、声控报警等。
产品参数
  • 工作电压:5V
  • 工作电流:<10mA
  • 最长相应时间:220ms
引脚说明
  • 蓝色:模拟信号输出
  • 红色:电源正
  • 灰色:电源地

传感器电路图:
6.png


与STM32WB09连接实物图:
7.png


在CubeMX里面配置ADC参数与DMA传输。
2.png

3.png


本次不少STM32的芯片都自带了可以测量芯片内部结温的温度传感器,精度不是很高,通常±5V的误差都是标配。
4.png
自动生成代码,查看ADC初始化:
  1. static void MX_ADC1_Init(void)
  2. {

  3.   /* USER CODE BEGIN ADC1_Init 0 */

  4.   /* USER CODE END ADC1_Init 0 */

  5.   ADC_ChannelConfTypeDef ConfigChannel = {0};

  6.   /* USER CODE BEGIN ADC1_Init 1 */

  7.   /* USER CODE END ADC1_Init 1 */

  8.   /** Common config
  9.   */
  10.   hadc1.Instance = ADC1;
  11.   hadc1.Init.ConversionType = ADC_CONVERSION_WITH_DS;
  12.   hadc1.Init.SequenceLength = 2;
  13.   hadc1.Init.SamplingMode = ADC_SAMPLING_AT_START;
  14.   hadc1.Init.SampleRate = ADC_SAMPLE_RATE_16;
  15.   hadc1.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
  16.   hadc1.Init.Overrun = ADC_NEW_DATA_IS_LOST;
  17.   hadc1.Init.ContinuousConvMode = DISABLE;
  18.   hadc1.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
  19.   hadc1.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_1;
  20.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }

  24.   /** Configure Regular Channel
  25.   */
  26.   ConfigChannel.Channel = ADC_CHANNEL_TEMPSENSOR;
  27.   ConfigChannel.Rank = ADC_RANK_1;
  28.   ConfigChannel.VoltRange = ADC_VIN_RANGE_1V2;
  29.   ConfigChannel.CalibrationPoint.Number = ADC_CALIB_POINT_1;
  30.   ConfigChannel.CalibrationPoint.Gain = 0x0;
  31.   ConfigChannel.CalibrationPoint.Offset = 0x0;
  32.   if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  33.   {
  34.     Error_Handler();
  35.   }

  36.   /** Configure Regular Channel
  37.   */
  38.   ConfigChannel.Channel = ADC_CHANNEL_VINP0;
  39.   ConfigChannel.Rank = ADC_RANK_2;
  40.   ConfigChannel.CalibrationPoint.Number = ADC_CALIB_NONE;
  41.   ConfigChannel.CalibrationPoint.Gain = 0x00;
  42.   ConfigChannel.CalibrationPoint.Offset = 0x00;
  43.   if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   /* USER CODE BEGIN ADC1_Init 2 */

  48.   /* USER CODE END ADC1_Init 2 */

  49. }

主函数:
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.   uint32_t tmp_index;

  5.   /* Initialize ADC group regular data buffer values */
  6.   for (tmp_index = 0; tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++)
  7.   {
  8.     uhADCxConvertedData[tmp_index] = VAR_CONVERTED_DATA_INIT_VALUE;
  9.   }

  10.   /* USER CODE END 1 */

  11.   /* MCU Configuration--------------------------------------------------------*/

  12.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  13.   HAL_Init();

  14.   /* USER CODE BEGIN Init */

  15.   /* USER CODE END Init */

  16.   /* Configure the system clock */
  17.   SystemClock_Config();

  18.   /* Configure the peripherals common clocks */
  19.   PeriphCommonClock_Config();

  20.   /* USER CODE BEGIN SysInit */

  21.   /* USER CODE END SysInit */

  22.   /* Initialize all configured peripherals */
  23.   MX_GPIO_Init();
  24.   MX_DMA_Init();
  25.   MX_ADC1_Init();
  26.   MX_USART1_UART_Init();
  27.   /* USER CODE BEGIN 2 */

  28.   /* Initialize LED on board */
  29.   BSP_LED_Init(LD1);

  30.   /* Start ADC group regular conversion */
  31.   /* Note: First start with DMA transfer initialization, following ones
  32.            with basic ADC start. */
  33.   if (HAL_ADC_Start_DMA(&hadc1,
  34.                         (uint32_t *)uhADCxConvertedData,
  35.                         ADC_CONVERTED_DATA_BUFFER_SIZE
  36.                        ) != HAL_OK)
  37.   {
  38.     /* Error: ADC conversion start could not be performed */
  39.     Error_Handler();
  40.   }

  41.   /* Toggle LED at each ADC conversion */
  42.   BSP_LED_On(LD1);
  43.   HAL_Delay(LED_BLINK_SLOW);
  44.   BSP_LED_Off(LD1);
  45.   HAL_Delay(LED_BLINK_SLOW);

  46.   /* USER CODE END 2 */

  47.   /* Infinite loop */
  48.   /* USER CODE BEGIN WHILE */
  49.   while (1)
  50.   {
  51.     /* Start ADC group regular conversion */
  52.     if (HAL_ADC_Start(&hadc1) != HAL_OK)
  53.     {
  54.       /* Error: ADC conversion start could not be performed */
  55.       Error_Handler();
  56.     }

  57.     /* Toggle LED at each ADC conversion */
  58.     BSP_LED_On(LD1);
  59.     HAL_Delay(LED_BLINK_SLOW);
  60.     BSP_LED_Off(LD1);
  61.     HAL_Delay(LED_BLINK_SLOW);
  62.    
  63.     /* Note: ADC group regular conversions data are stored into array         */
  64.     /*       "uhADCxConvertedData"                                            */
  65.     /*       (for debug: see variable content into watch window).             */
  66.     /*       - uhADCxConvertedData[0]: ADC channel set on sequence rank 1     */
  67.     /*                                 (ADC1 internal channel temper. sensor) */
  68.     /*       - uhADCxConvertedData[1]: ADC channel set on sequence rank 2     */
  69.     /*                                 (ADC1 channel 4))        */

  70.     /* If ADC conversions and DMA transfer are completed, then process data */
  71.     if(ubDmaTransferStatus == 1)
  72.     {

  73.       /* Computation of ADC conversions raw data to physical values           */
  74.       /* using LL ADC driver helper macro.                                    */
  75.       
  76.       uhADCxConvertedData_VoltageGPIO_mVolt        = __LL_ADC_CALC_DATA_TO_VOLTAGE(LL_ADC_VIN_RANGE_3V6, uhADCxConvertedData[1], LL_ADC_DS_DATA_WIDTH_12_BIT);
  77.       hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE( uhADCxConvertedData[0], LL_ADC_DS_DATA_WIDTH_12_BIT);

  78.       printf("\r\n Internal Temp Sensor:  %d Celsius", hADCxConvertedData_Temperature_DegreeCelsius);
  79.       printf("\r\n External Voice Sensor: %d mVolt", uhADCxConvertedData_VoltageGPIO_mVolt);
  80.       /* Update status variable of DMA transfer */
  81.       ubDmaTransferStatus = 0;

  82.       /* Toggle LED 4 times */
  83.       tmp_index = 4*2;
  84.       while(tmp_index != 0)
  85.       {
  86.         BSP_LED_Toggle(LD1);
  87.         HAL_Delay(LED_BLINK_FAST);
  88.         tmp_index--;
  89.       }
  90.       HAL_Delay(500); /* Delay to highlight toggle sequence */
  91.     }

  92.     /* USER CODE END WHILE */

  93.     /* USER CODE BEGIN 3 */
  94.   }
  95.   /* USER CODE END 3 */
  96. }



串口输出:
5.png


在有音乐播放的时候,采集到的电压值会变化:
8.png


不过总感觉内部温度传感器采集到温度才2℃,有点不太符合通常25°左右的测量值,目前正常排查潜在的配置问题。

AdaMaYun 发表于 2024-11-11 19:05 | 显示全部楼层
ADC外设驱动
chenjun89 发表于 2024-11-11 22:54 来自手机 | 显示全部楼层
ST的ADC外设工作模式做的比较全
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部