[其他ST产品] STM32G474 Nucleo-64 评测之一 adc例程赏析

[复制链接]
2331|0
 楼主| BinWin 发表于 2020-8-3 22:35 | 显示全部楼层 |阅读模式
本帖最后由 BinWin 于 2020-8-3 22:36 编辑

       由于F091库存原因,收到了管理员发来的STM32G474,在此也感谢管理员的协调,有幸体验到G系列芯片。
       这块板卡比较抢眼的可谓是板载的STLINK V3E调试器了,核心处理器是高性能系列stm32f723,是不是比G474更有意思呢
       首次连接到MDK下载时会提示更新固件,选择是就好了。然后就是flash烧录算法要选dualxxx,这也是看了例程才知道的,用CUBEMX建好的工程默认会下载失败。转入正题,来看下配套的例程之ADC。ST提供了两套,一是使用增益补偿功能实现结果自动转换(mV电压),二是使用ADC失调补偿功能直接转换来自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_MultiModeTypeDef multimode = {0};
  6.   ADC_ChannelConfTypeDef sConfig = {0};

  7.   /* USER CODE BEGIN ADC1_Init 1 */

  8.   /* USER CODE END ADC1_Init 1 */
  9.   /** Common config
  10.   */
  11.   hadc1.Instance = ADC1;
  12.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  13.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  14.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  15.   hadc1.Init.GainCompensation = VDDA_APPLI * GAIN_COMPENSATION_X1_FACTOR / DIGITAL_SCALE_12BITS; //敲黑板
  16.   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  17.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  18.   hadc1.Init.LowPowerAutoWait = DISABLE;
  19.   hadc1.Init.ContinuousConvMode = DISABLE;
  20.   hadc1.Init.NbrOfConversion = 1;
  21.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  22.   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
  23.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  24.   hadc1.Init.DMAContinuousRequests = ENABLE;
  25.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  26.   hadc1.Init.OversamplingMode = DISABLE;
  27.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   /** Configure the ADC multi-mode
  32.   */
  33.   multimode.Mode = ADC_MODE_INDEPENDENT;
  34.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  35.   {
  36.     Error_Handler();
  37.   }
  38.   /** Configure Regular Channel
  39.   */
  40.   sConfig.Channel = ADC_CHANNEL_6;
  41.   sConfig.Rank = ADC_REGULAR_RANK_1;
  42.   sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
  43.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  44.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  45.   sConfig.Offset = 0;
  46.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  47.   {
  48.     Error_Handler();
  49.   }
  50.   /* USER CODE BEGIN ADC1_Init 2 */

  51.   /* USER CODE END ADC1_Init 2 */

  52. }
         ADC主要配置如以上代码,实则就是3300 * 1000 / 0xFFF,转换结果就是直接经过运算的mV电压值,自己以前没有用过,感觉挺方便。仿真效果如下          a.png         接下来看另一套例程,讲的是利用失调补偿来实现偏置设置,达到改变范围的效果,测试如下:         c.png          d.png       输入恒定为0~3.3V的情况下,可以将转换结果扩展到-2048---2047,也可以将0-1.65V定为2048-4095等,应用比较灵活,主要代码如下
  1. modeIndex++;
  2.     if (modeIndex >= sizeof(modeString)/sizeof(modeString[0])) modeIndex = 0;
  3.    
  4.     /* Reconfigure offset */
  5.     sConfig.Channel = ADC_CHANNEL_6;
  6.     sConfig.Rank = ADC_REGULAR_RANK_1;
  7.     sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
  8.     sConfig.SingleDiff = ADC_SINGLE_ENDED;
  9.     sConfig.OffsetNumber = modeString[modeIndex].number;
  10.     sConfig.Offset = modeString[modeIndex].offset;
  11.     sConfig.OffsetSign = modeString[modeIndex].sign;
  12.     sConfig.OffsetSaturation = modeString[modeIndex].satur;
  13.     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  14.     {
  15.       Error_Handler();
  16.     }
  17. //设置的参数表如下
  18. <div class="blockcode"><blockquote>uint16_t modeIndex = 0;
  19. const t_offsetcfg modeString[5] = {
  20.   {ADC_OFFSET_NONE,     0, ADC_OFFSET_SIGN_NEGATIVE, DISABLE, "Cfg #0: Offset disabled"},
  21.   {ADC_OFFSET_1,    0x800, ADC_OFFSET_SIGN_NEGATIVE, DISABLE, "Cfg #1: Offset enabled, sign is negative & saturation disabled"},
  22.   {ADC_OFFSET_1,    0x800, ADC_OFFSET_SIGN_POSITIVE, DISABLE, "Cfg #2: Offset enabled, sign is positive & saturation disabled"},
  23.   {ADC_OFFSET_1,    0x800, ADC_OFFSET_SIGN_NEGATIVE, ENABLE,  "Cfg #3: Offset enabled, sign is negative & saturation enabled"},
  24.   {ADC_OFFSET_1,    0x800, ADC_OFFSET_SIGN_POSITIVE, ENABLE,  "Cfg #4: Offset enabled, sign is positive & saturation enabled"},
  25. };


      第一次接触HAL库还是18年初的时候,经过这么久的迭代,包括CubeMX工具的更新以及CubeIDE的诞生,代码移植性越来越好,开发效率也提高了很多。基于CubeMX的HAL实现,在不同芯片间的代码复用率显著提升。手里这块G474更是应运而生,提升了F系列的性能,更具性价比。接下来继续体验Nucleo G4的其他优势功能。        
      

您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

65

帖子

0

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