/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file adc.c * @brief This file provides code for the configuration * of the ADC instances. ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "adc.h" /* USER CODE BEGIN 0 */ uint16_t ADC_ConvertedValue[3] = {0};//ADC数据 //温度数据临时储存 uint16_t adc_temp[10] = {0}; uint32_t temp_sum = 0; //AO1反馈数据临时储存 uint16_t adc_ao1[10] = {0}; uint32_t ao1_sum = 0; //AO2反馈数据临时储存 uint16_t adc_ao2[10] = {0}; uint32_t ao2_sum = 0; //ADC采样计数 int adc_count = 0; uint8_t ADC_TC_Flag = 0;//ADC数据转换标志 /* USER CODE END 0 */ /* ADC1 init function */ void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ LL_ADC_InitTypeDef ADC_InitStruct = {0}; LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0}; LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Peripheral clock enable */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1); LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); /**ADC1 GPIO Configuration PA0-WKUP ------> ADC1_IN0 PA1 ------> ADC1_IN1 PA2 ------> ADC1_IN2 */ GPIO_InitStruct.Pin = ADC_IN0_AO1_Pin|ADC_IN1_A02_Pin|ADC_IN2_RT_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* ADC1 DMA Init */ /* ADC1 Init */ LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_0, LL_DMA_CHANNEL_0); LL_DMA_SetDataTransferDirection(DMA2, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); LL_DMA_SetStreamPriorityLevel(DMA2, LL_DMA_STREAM_0, LL_DMA_PRIORITY_LOW); LL_DMA_SetMode(DMA2, LL_DMA_STREAM_0, LL_DMA_MODE_CIRCULAR); LL_DMA_SetPeriphIncMode(DMA2, LL_DMA_STREAM_0, LL_DMA_PERIPH_NOINCREMENT); LL_DMA_SetMemoryIncMode(DMA2, LL_DMA_STREAM_0, LL_DMA_MEMORY_INCREMENT); LL_DMA_SetPeriphSize(DMA2, LL_DMA_STREAM_0, LL_DMA_PDATAALIGN_HALFWORD); LL_DMA_SetMemorySize(DMA2, LL_DMA_STREAM_0, LL_DMA_MDATAALIGN_HALFWORD); LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_0); /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Common config */ ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B; ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE; LL_ADC_Init(ADC1, &ADC_InitStruct); ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS; ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE; ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED; LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct); LL_ADC_REG_SetFlagEndOfConversion(ADC1, LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV); ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV4; ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT; LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct); /** Configure Regular Channel */ LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_0, LL_ADC_SAMPLINGTIME_480CYCLES); /** Configure Regular Channel */ LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_480CYCLES); /** Configure Regular Channel */ LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3, LL_ADC_CHANNEL_2); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_2, LL_ADC_SAMPLINGTIME_480CYCLES); /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /* USER CODE BEGIN 1 */ void adc1_start_dma(void) { LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_0,3); LL_DMA_SetPeriphAddress(DMA2,LL_DMA_STREAM_0,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA)); LL_DMA_SetMemoryAddress(DMA2,LL_DMA_STREAM_0,(uint32_t)ADC_ConvertedValue); LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_0); LL_DMA_ClearFlag_TC0(DMA2); LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_0); LL_ADC_Enable(ADC1); LL_ADC_REG_StartConversionSWStart(ADC1); LL_ADC_REG_SetDMATransfer(ADC1,LL_ADC_REG_DMA_TRANSFER_UNLIMITED); } void get_adc_value(void) { if(ADC_TC_Flag == 1) { adc_ao2[adc_count] = ADC_ConvertedValue[0]; ao2_sum += adc_ao2[adc_count]; adc_ao1[adc_count] = ADC_ConvertedValue[1]; ao1_sum += adc_ao1[adc_count]; adc_temp[adc_count] = ADC_ConvertedValue[2]; temp_sum += adc_temp[adc_count]; adc_count ++; if(adc_count > 9) { adc_count = 0; InputReg[0] = temp_sum / 10;//环境温度 temp_sum = 0; //InputReg[1] = (ao1_sum / 50) * 3300 / 4096;//AO反馈 InputReg[1] = (uint16_t)(((ao1_sum / 10) * 3300 / 4096 - 1500) / 0.082); ao1_sum = 0; //InputReg[9] = (ao2_sum / 50) * 3300 / 4096;//AO反馈备用(0-25000uA) InputReg[10] = (uint16_t)((((ao2_sum / 10) * 3300 / 4096) - 1500) / 0.082); ao2_sum = 0; } ADC_TC_Flag = 0; } } /* USER CODE END 1 */