打印
[STM32L0]

关于STM32L052采样AD双通道切换问题

[复制链接]
3886|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自民|  楼主 | 2016-1-26 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32L052采样AD,两个通道,双通道切换在AD中断中完成,要怎么设置,试了1天,都无法解决!!!
沙发
ccw1986| | 2016-1-26 20:29 | 只看该作者
是要同时用两个通道还是在中断中两个通道互相切换?

使用特权

评论回复
板凳
自民|  楼主 | 2016-1-27 08:22 | 只看该作者
ccw1986 发表于 2016-1-26 20:29
是要同时用两个通道还是在中断中两个通道互相切换?

中断中两个通道互相切换

我还怀疑是设置问题

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);

使用特权

评论回复
地板
自民|  楼主 | 2016-1-27 08:23 | 只看该作者
用到通道2 通道7
中断中两个通道互相切换


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);

使用特权

评论回复
5
豆腐块| | 2016-1-27 11:19 | 只看该作者
现在是是什么问题,是就不能切换还是只切了一次

使用特权

评论回复
6
gejigeji521| | 2016-1-27 14:39 | 只看该作者
全部使用DMA,转换完成自动存储到指定位置。

使用特权

评论回复
7
自民|  楼主 | 2016-1-27 14:53 | 只看该作者
豆腐块 发表于 2016-1-27 11:19
现在是是什么问题,是就不能切换还是只切了一次

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

使用特权

评论回复
8
309030106| | 2016-1-27 17:10 | 只看该作者
这个切换需不需要时间延迟

使用特权

评论回复
9
自民|  楼主 | 2016-1-28 09:10 | 只看该作者
uint8_t  CH_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 */
}

使用特权

评论回复
10
自民|  楼主 | 2016-1-28 12:35 | 只看该作者
感谢,安大师的例程。。
可以了
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);
}

使用特权

评论回复
11
Beckham_Owen| | 2016-1-29 10:26 | 只看该作者
在中断中先把数据读出来,再重新初始化adc

使用特权

评论回复
12
Rooney30| | 2016-1-31 11:27 | 只看该作者
楼主你最好先把你的程序贴出来看看
应该是在中断中再初始化一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

195

帖子

2

粉丝