172 lines
5.5 KiB
C
172 lines
5.5 KiB
C
/* 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 */
|