qihao74 发表于 2016-1-25 16:24:06

关于STM32L052采样AD问题

用STM32L052采样AD,两个通道,其中一个通道要用过采样技术,通道的切换是在AD中断进行。请问是否每次都要校准HAL_ADCEx_Calibration_Start()?而每次AD中断中,参数设置的时候,是否都要关中断HAL_ADC_Stop_IT() ,参数设置完在开中断HAL_ADC_Start_IT()?


/* ADC2 init function */
void MX_ADC2_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    */
hadc.Instance = ADC1;
hadc.Init.OversamplingMode = DISABLE;
hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION12b;
hadc.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = ENABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = EOC_SINGLE_CONV;
hadc.Init.Overrun = OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = ENABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);
    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
/* ADC7 init function */
void MX_ADC7_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    */
hadc.Instance = ADC1;
hadc.Init.OversamplingMode = ENABLE;
hadc.Init.Oversample.Ratio = ADC_OVERSAMPLING_RATIO_128;
hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_3;
hadc.Init.Oversample.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION12b;
hadc.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = ENABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = EOC_SINGLE_CONV;
hadc.Init.Overrun = OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = ENABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);
    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}

安臣 发表于 2016-1-26 12:59:00

校准 只需要开机校准

设置 的时候必须关掉中断   设置完成才开启中断。运行ad转换

xmshao 发表于 2016-1-26 16:07:38

每次ADC从关闭到开启时校准一次就OK.
至于你中断处理时是否要关闭相关中断不该有什么硬性规定,你自己最清楚,关于不关会带来什么影响或后果。

qihao74 发表于 2016-1-27 14:54:41

安臣 发表于 2016-1-26 12:59
校准 只需要开机校准

设置 的时候必须关掉中断   设置完成才开启中断。运行ad转换 ...

设置 的时候必须关掉中断   
设置完成才开启中断。
运行ad转换
现在是通道7,可以切到通道2
但通道2,切不到通道7

qihao74 发表于 2016-1-28 09:11:37

uint8_tCH_dp=0;
/* ADC init function */
void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
   
hadc.Instance = ADC1;

hadc.Init.OversamplingMode = ENABLE;
hadc.Init.Oversample.Ratio = ADC_OVERSAMPLING_RATIO_128;
hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_3;
hadc.Init.Oversample.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;

hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION12b;
hadc.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = EOC_SINGLE_CONV;
hadc.Init.Overrun = OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = ENABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);

    /* USER CODE BEGIN 7 */
if (HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE END 7 */
    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}

/* ADC2 init function */
void MX_ADC2_Init(void)
{
ADC_ChannelConfTypeDef sConfig;

hadc.Instance = ADC1;

hadc.Init.OversamplingMode = ENABLE;
hadc.Init.Oversample.Ratio = ADC_OVERSAMPLING_RATIO_128;
hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_3;
hadc.Init.Oversample.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;

hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION12b;
hadc.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;//轮流对各个通道进行采集
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐方式
hadc.Init.ContinuousConvMode = ENABLE;//连续转换模式
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;//控制触发模式
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = EOC_SINGLE_CONV;
hadc.Init.Overrun = OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = ENABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);

    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
/* ADC7 init function */
void MX_ADC7_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
   
hadc.Instance = ADC1;

hadc.Init.OversamplingMode = ENABLE;
hadc.Init.Oversample.Ratio = ADC_OVERSAMPLING_RATIO_128;
hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_3;
hadc.Init.Oversample.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;

hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION12b;
hadc.Init.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = EOC_SINGLE_CONV;
hadc.Init.Overrun = OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = ENABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);

    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
/* Get the converted value of regular channel */

uwADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);

HAL_ADC_Stop_IT(&hadc);
        if(CH_dp==0)
        {
                CH_dp=1;
                MX_ADC2_Init();
        }
        else
        {
                CH_dp=0;
                MX_ADC7_Init();                               
        }
                      
        HAL_ADC_Start_IT(&hadc);
       
HAL_UART_Transmit_IT(&huart1, (uint8_t*)uwADCxConvertedValue, 4);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
}

int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC_Init();
MX_COMP1_Init();
MX_TIM21_Init();
MX_USART1_UART_Init();

/* USER CODE BEGIN 2 */
HAL_COMP_Start(&hcomp1);
HAL_ADC_Start_IT(&hadc);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}

/* USER CODE END 3 */
}

qihao74 发表于 2016-1-28 12:35:11

感谢,安大师的例程。。
可以了
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
/* Get the converted value of regular channel */

uwADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);

HAL_ADC_Stop_IT(&hadc);
      if(CH_dp==0)
      {
                CH_dp=1;
                ADC1->CHSELR = ADC_CHANNEL_2;
      }
      else
      {
                CH_dp=0;
                ADC1->CHSELR = ADC_CHANNEL_7;                              
      }
                        
      HAL_ADC_Start_IT(&hadc);
      
HAL_UART_Transmit_IT(&huart1, (uint8_t*)uwADCxConvertedValue, 4);
}

安臣 发表于 2016-1-29 11:29:09

:):):):):):):):)

yangwang98k 发表于 2019-2-11 11:34:12

感觉没有这种方便。。。
页: [1]
查看完整版本: 关于STM32L052采样AD问题