[STM32WB] 【STM32WB09KE测评】+ADC数据采用及应用

[复制链接]
1642|2
 楼主| jinglixixi 发表于 2024-11-8 23:11 | 显示全部楼层 |阅读模式
STM32WB09KE内部配有8A/D数据通道及一个VBAT检测通道和一个内部温度检测通道。
借助例程可实现内部温度检测和通道4的检测。其中通道4所使用的引脚为PB3,可从接口CN6pin 6来连接,也可口CN4pin 11来连接。
对这2个检测通道的初始化函数为:
  1. static void MX_ADC1_Init(void)
  2. {
  3.   ADC_ChannelConfTypeDef ConfigChannel = {0};
  4.   hadc1.Instance = ADC1;
  5.   hadc1.Init.ConversionType = ADC_CONVERSION_WITH_DS;
  6.   hadc1.Init.SequenceLength = 2;
  7.   hadc1.Init.SamplingMode = ADC_SAMPLING_AT_START;
  8.   hadc1.Init.SampleRate = ADC_SAMPLE_RATE_16;
  9.   hadc1.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
  10.   hadc1.Init.Overrun = ADC_NEW_DATA_IS_LOST;
  11.   hadc1.Init.ContinuousConvMode = DISABLE;
  12.   hadc1.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
  13.   hadc1.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_1;
  14.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  15.   {
  16.     Error_Handler();
  17.   }
  18.   ConfigChannel.Channel = ADC_CHANNEL_TEMPSENSOR;
  19.   ConfigChannel.Rank = ADC_RANK_1;
  20.   ConfigChannel.VoltRange = ADC_VIN_RANGE_1V2;
  21.   ConfigChannel.CalibrationPoint.Number = ADC_CALIB_POINT_1;
  22.   ConfigChannel.CalibrationPoint.Gain = 0x0;
  23.   ConfigChannel.CalibrationPoint.Offset = 0x0;
  24.   if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  25.   {
  26.     Error_Handler();
  27.   }
  28.   ConfigChannel.Channel = ADC_CHANNEL_VINP0;
  29.   ConfigChannel.Rank = ADC_RANK_2;
  30.   ConfigChannel.CalibrationPoint.Number = ADC_CALIB_NONE;
  31.   ConfigChannel.CalibrationPoint.Gain = 0x00;
  32.   ConfigChannel.CalibrationPoint.Offset = 0x00;
  33.   if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  34.   {
  35.     Error_Handler();
  36.   }
  37. }

由于该例程没有配置串口,因此对A/D的检测值是无法打印输出的。为此,需要配合相应的显示器件来显示。
前面曾介绍过彩色LCD屏的显示驱动,由于在A/D检测中会与LCD的引脚产生冲突,故改变引脚后的高低电平输出语句定义为:
#define OLED_SCLK_Set   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET)  // CLK
#define OLED_SCLK_Clr   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
#define OLED_SDIN_Set   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)  // DIN
#define OLED_SDIN_Clr   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define OLED_RST_Set    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET)  // RES
#define OLED_RST_Clr    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET)
#define OLED_DC_Set     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)  // DC
#define OLED_DC_Clr     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)
#define OLED_CS_Set     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET)  //CS
#define OLED_CS_Clr     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET)
相应的引脚功能配置函数为:
  1. static void LCD_GPIO(void)
  2. {
  3. __HAL_RCC_GPIOB_CLK_ENABLE();
  4. GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  5.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  6.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7. GPIO_InitStruct.Pin = GPIO_PIN_6;
  8.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  9.   GPIO_InitStruct.Pin = GPIO_PIN_7;
  10.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  11. GPIO_InitStruct.Pin = GPIO_PIN_3;
  12.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  13. __HAL_RCC_GPIOA_CLK_ENABLE();
  14.   GPIO_InitStruct.Pin = GPIO_PIN_8;
  15.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  16.   GPIO_InitStruct.Pin = GPIO_PIN_11;
  17.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       
  18. GPIO_InitStruct.Pin = GPIO_PIN_9;
  19.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       
  20. }

用于2个通道检测与显示的主程序为:
  1. int main(void)
  2. {
  3.   uint32_t u,V;
  4.   uint32_t tmp_index;
  5.   for (tmp_index = 0; tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++)
  6.   {
  7.     uhADCxConvertedData[tmp_index] = VAR_CONVERTED_DATA_INIT_VALUE;
  8.   }
  9.   HAL_Init();
  10.   SystemClock_Config();
  11.   PeriphCommonClock_Config();
  12.   MX_GPIO_Init();
  13.   MX_DMA_Init();
  14.   MX_ADC1_Init();
  15.   BSP_LED_Init(LD1);
  16. GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  17.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  18.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  19.   GPIO_InitStruct.Pin = LD1_PIN;
  20.   HAL_GPIO_Init(LD1_GPIO_PORT, &GPIO_InitStruct);
  21.   GPIO_InitStruct.Pin = LD2_PIN;
  22.   HAL_GPIO_Init(LD2_GPIO_PORT, &GPIO_InitStruct);
  23. LCD_GPIO();
  24. Lcd_Init();
  25.   LCD_Clear(RED);
  26.   LCD_ShowString(10,10,"STM32WB09KE",YELLOW);
  27.   LCD_ShowString(10,30,"jinglixixi",YELLOW);
  28.   HAL_Delay(1000);
  29.   LCD_Clear(RED);
  30. LCD_ShowString(10,10,"Tempe: ",YELLOW);
  31.   LCD_ShowString(10,30,"ADC:   ",YELLOW);
  32.   if (HAL_ADC_Start_DMA(&hadc1,
  33.                         (uint32_t *)uhADCxConvertedData,
  34.                         ADC_CONVERTED_DATA_BUFFER_SIZE
  35.                        ) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   BSP_LED_On(LD1);
  40.   HAL_Delay(LED_BLINK_SLOW);
  41.   BSP_LED_Off(LD1);
  42.   HAL_Delay(LED_BLINK_SLOW);
  43.   while (1)
  44.   {
  45.     if (HAL_ADC_Start(&hadc1) != HAL_OK)
  46.     {
  47.       Error_Handler();
  48.     }
  49.     BSP_LED_On(LD1);
  50.     HAL_Delay(LED_BLINK_SLOW);
  51.     BSP_LED_Off(LD1);
  52.     HAL_Delay(LED_BLINK_SLOW);
  53.     if(ubDmaTransferStatus == 1)
  54.     {
  55.       uhADCxConvertedData_VoltageGPIO_mVolt        = __LL_ADC_CALC_DATA_TO_VOLTAGE(LL_ADC_VIN_RANGE_3V6, uhADCxConvertedData[1], LL_ADC_DS_DATA_WIDTH_12_BIT);
  56.       hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE( uhADCxConvertedData[0], LL_ADC_DS_DATA_WIDTH_12_BIT);
  57.       LCD_ShowNum(66,10,hADCxConvertedData_Temperature_DegreeCelsius,3,YELLOW);
  58. LCD_ShowNum(66,30,uhADCxConvertedData_VoltageGPIO_mVolt,4,YELLOW);
  59.       ubDmaTransferStatus = 0;
  60.       tmp_index = 4*2;
  61.       while(tmp_index != 0)
  62.       {
  63.           BSP_LED_Toggle(LD1);
  64.           HAL_Delay(LED_BLINK_FAST);
  65.           tmp_index--;
  66.       }
  67.       HAL_Delay(500);
  68.     }
  69.   }
  70. }

经程序的编译与下载,其检测效果如图1和图2所示,说明检测有效。
71975672e29a0e41ae.png
1  连接与显示

40626672e29b90dd80.png
2 显示效果
在搭建外部NTC温度检测电路的情况下,需在主程序中添加相应的NTC温度变换处理程序,其具体的内容如下:
  1. LCD_ShowString(10,10,"Tempe1: ",YELLOW);
  2.         LCD_ShowString(10,30,"Tempe2: ",YELLOW);

  3.           u=uhADCxConvertedData_VoltageGPIO_mVolt        = __LL_ADC_CALC_DATA_TO_VOLTAGE(LL_ADC_VIN_RANGE_3V6, uhADCxConvertedData[1], LL_ADC_DS_DATA_WIDTH_12_BIT);
  4.       u=u*33/36;
  5.       ...
  6.       if((u<=1644) && (u>1268))
  7.          V=10+(1644-u)/37;
  8.       if((u<=1268) && (u>947))
  9.          V=20+(1268-u)/32;
  10.       if((u<=947) && (u>692))
  11.          V=30+(947-u)/25;
  12.       ...
  13.       LCD_ShowNum(76,30,V,4,YELLOW);

这样,在图3和图4的情况下即可进行室温和升温的测试。
82717672e29f14558d.png
3 室温检测

99386672e2a0400878.png
4  触摸升温



yangjiaxu 发表于 2024-11-29 14:09 | 显示全部楼层
老师可以试试用蓝牙上报数据了,其实效果应该更炫酷一些吧
 楼主| jinglixixi 发表于 2024-11-29 16:39 | 显示全部楼层
yangjiaxu 发表于 2024-11-29 14:09
老师可以试试用蓝牙上报数据了,其实效果应该更炫酷一些吧

目前在自行设计APP小程序上还十分薄弱,能在手机上实现实时数据接收并绘制数据曲线就更具应用价值了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

525

主题

2963

帖子

39

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