硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2190|回复: 0
收起左侧

[运放/比较器] STM32H7运放增益模式测试

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2018-9-19 02:25:27 | 显示全部楼层 |阅读模式
测试例子:OPAMP_PGA_ExternalBias

实现了如下的运放工作方式(同相输入模式):
例子中的正向输入端是采用DAC输出的0.5V电压,反向输入端是采集的PC5引脚,而输出是用的PC4引脚。
99.png


备份代码:

  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. /* Private macro -------------------------------------------------------------*/
  4. /* Private variables ---------------------------------------------------------*/
  5. OPAMP_HandleTypeDef  OpampHandle;
  6. DAC_HandleTypeDef    DacHandle;

  7. __IO uint32_t UserButtonStatus = 0;  /* set to 1 after Wkup/Tamper push-button interrupt  */
  8. static DAC_ChannelConfTypeDef sConfig;
  9. /* Private function prototypes -----------------------------------------------*/
  10. void DAC_Config(void);
  11. void OPAMP_Config_Power(uint32_t powermode);
  12. static void CPU_CACHE_Enable(void);
  13. static void SystemClock_Config(void);
  14. void Error_Handler(void);

  15. /* Private functions ---------------------------------------------------------*/

  16. /**
  17.   * @brief  Main program.
  18.   * @param  None
  19.   * @retval None
  20.   */
  21. int main(void)
  22. {
  23.   uint32_t examplestate = 0;
  24.    
  25.   /* Enable the CPU Cache */
  26.   CPU_CACHE_Enable();

  27.   /* STM32H7xx HAL library initialization:
  28.        - Systick timer is configured by default as source of time base, but user
  29.          can eventually implement his proper time base source (a general purpose
  30.          timer for example or other time source), keeping in mind that Time base
  31.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  32.          handled in milliseconds basis.
  33.        - Set NVIC Group Priority to 4
  34.        - Low Level Initialization
  35.      */
  36.   HAL_Init();
  37.   
  38.   /* Configure the system clock  */
  39.   SystemClock_Config();

  40.   /* Configure LEDs */
  41.   BSP_LED_Init(LED1);
  42.   BSP_LED_Init(LED2);
  43.         BSP_LED_Init(LED3);
  44.   /* Initialize the Wkup/User push-button.
  45.      It is used for changing the gain */
  46.   BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);

  47.   /* Configure the DAC to set input voltage of OPAMP */
  48.         DAC_Config();
  49.        
  50.   /* Configure the OPAMP1 in PGA mode */

  51.   while (1)
  52.   {
  53.     /* Test if user an action occurred on the Wkup/User push-button */
  54.     if (UserButtonStatus == 1)
  55.     {
  56.       UserButtonStatus = 0;
  57.       /* Change the mode */
  58.       if (examplestate == 0)
  59.       {
  60.                                 /* Turn LED1 on */
  61.         BSP_LED_On(LED1);
  62.                                 /* Turn LED2 off */
  63.         BSP_LED_Off(LED2);
  64.         /* Select gain 2 */
  65.         OPAMP_Config_Power(OPAMP_PGA_GAIN_2_OR_MINUS_1);
  66.         examplestate= 1;
  67.                
  68.       }
  69.       else
  70.       {
  71.                                 /* Turn LED2 on */
  72.         BSP_LED_On(LED2);
  73.                                 /* Turn LED1 off */
  74.         BSP_LED_Off(LED1);
  75.         /* Select gain 4 */
  76.         OPAMP_Config_Power(OPAMP_PGA_GAIN_4_OR_MINUS_3);
  77.         examplestate= 0;
  78.                
  79.       }
  80.     }
  81.   }
  82. }

  83. /**
  84.   * @brief  System Clock Configuration
  85.   *         The system Clock is configured as follow :
  86.   *            System Clock source            = PLL (HSE BYPASS)
  87.   *            SYSCLK(Hz)                     = 400000000 (CPU Clock)
  88.   *            HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  89.   *            AHB Prescaler                  = 2
  90.   *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  91.   *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  92.   *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  93.   *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  94.   *            HSE Frequency(Hz)              = 8000000
  95.   *            PLL_M                          = 4
  96.   *            PLL_N                          = 400
  97.   *            PLL_P                          = 2
  98.   *            PLL_Q                          = 4
  99.   *            PLL_R                          = 2
  100.   *            VDD(V)                         = 3.3
  101.   *            Flash Latency(WS)              = 4
  102.   * @param  None
  103.   * @retval None
  104.   */
  105. static void SystemClock_Config(void)
  106. {
  107.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  108.   RCC_OscInitTypeDef RCC_OscInitStruct;
  109.   HAL_StatusTypeDef ret = HAL_OK;
  110.   
  111.   /*!< Supply configuration update enable */
  112.   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  113.   /* The voltage scaling allows optimizing the power consumption when the device is
  114.      clocked below the maximum system frequency, to update the voltage scaling value
  115.      regarding system frequency refer to product datasheet.  */
  116.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  117.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  118.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  119.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  120.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  121.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  122.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  123.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  124.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  125.   RCC_OscInitStruct.PLL.PLLM = 5;
  126.   RCC_OscInitStruct.PLL.PLLN = 160;
  127.   RCC_OscInitStruct.PLL.PLLP = 2;
  128.   RCC_OscInitStruct.PLL.PLLR = 2;
  129.   RCC_OscInitStruct.PLL.PLLQ = 4;

  130.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  131.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  132.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  133.   if(ret != HAL_OK)
  134.   {
  135.     while(1) { ; }
  136.   }
  137.   
  138.   /* Select PLL as system clock source and configure  bus clocks dividers */
  139.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  140.                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
  141.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  142.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  143.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  144.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  145.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  146.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  147.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  148.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  149.   if(ret != HAL_OK)
  150.   {
  151.     while(1) { ; }
  152.   }
  153. }


  154. /**
  155.   * @brief  This function is executed in case of error occurrence.
  156.   * @param  None
  157.   * @retval None
  158.   */
  159. void Error_Handler(void)
  160. {
  161.   /* Turn LED3 on */
  162.   BSP_LED_On(LED3);

  163.   while (1)
  164.   {
  165.   }
  166. }


  167. void DAC_Config(void)
  168. {
  169.   /* Configure the DAC peripheral instance */
  170.   DacHandle.Instance = DAC1;

  171.   /*##-1- Initialize the DAC peripheral ######################################*/
  172.   if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  173.   {
  174.     /* Initialization Error */
  175.     Error_Handler();
  176.   }

  177.   /*##-2- DAC channel Configuration ##########################################*/
  178.   /* Select normal power mode */
  179.   sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  180.   /* Select trigger none */
  181.   sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
  182.   /* Select DAC channel output buffer disabled */
  183.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
  184.   /* Connect DAC output to on chip peripheral */
  185.   sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
  186.   /* Select factory trimming */
  187.   sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  188.        
  189.   if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  190.   {
  191.     /* Channel configuration Error */
  192.     Error_Handler();
  193.   }
  194.   /* Set DAC output voltage */
  195.         HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_8B_R,0x26);
  196.        
  197.         /*##-3- Enable DAC Channel 1 ##########################################*/
  198.   if(HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK)
  199.   {
  200.    
  201.     Error_Handler();
  202.   }
  203. }
  204. /**            
  205.   * @brief  OPAMP Configuration
  206.   * @param  None
  207.   * @retval None
  208.   */
  209. void OPAMP_Config_Power(uint32_t pgagain)
  210. {
  211.   /* Set OPAMP instance */
  212.   OpampHandle.Instance = OPAMP1;

  213.   /*##-1- Deinit  OPAMP    ##################################################*/
  214.   HAL_OPAMP_DeInit(&OpampHandle);

  215.   /*##-2- Configure OPAMP    ##################################################*/
  216.   
  217.   /* Select power mode */  
  218.   OpampHandle.Init.PowerMode = OPAMP_POWERMODE_NORMAL;

  219.   /* Select PGA Mode */
  220.   OpampHandle.Init.Mode = OPAMP_PGA_MODE;
  221.   
  222.   /* Select VMx as bias voltage */
  223.   OpampHandle.Init.PgaConnect = OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0_BIAS;       
  224.   
  225.   /* Configure the gain */
  226.   if (pgagain == OPAMP_PGA_GAIN_2_OR_MINUS_1)
  227.   {
  228.      OpampHandle.Init.PgaGain = OPAMP_PGA_GAIN_2_OR_MINUS_1;
  229.         }
  230.         else
  231.         {
  232.                 OpampHandle.Init.PgaGain = OPAMP_PGA_GAIN_4_OR_MINUS_3;
  233.         }               
  234.   /* Select VPx as input for OPAMP */
  235.   OpampHandle.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_DAC_CH;
  236.    
  237.   /* Select the factory trimming */
  238.   OpampHandle.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;

  239.   /* Init */
  240.   if(HAL_OK != HAL_OPAMP_Init(&OpampHandle))
  241.   {
  242.     Error_Handler();
  243.   }

  244.   /*##-3- Start OPAMP    #####################################################*/
  245.   /* Enable OPAMP */
  246.   if(HAL_OK != HAL_OPAMP_Start(&OpampHandle))
  247.   {
  248.     Error_Handler();
  249.   }  
  250. }

  251. /**
  252.   * @brief  EXTI line detection callbacks.
  253.   * @param  GPIO_Pin: Specifies the pins connected EXTI line
  254.   * @retval None
  255.   */
  256. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  257. {
  258.   if (GPIO_Pin == USER_BUTTON_PIN)
  259.   {
  260.     UserButtonStatus = 1;
  261.   }
  262. }
复制代码





回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 03:48 , Processed in 0.163770 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表