蠢蠢的痒 发表于 2020-4-28 18:23:44

求教各路大佬,关于使用两路 ADC 看门狗

在采集ADC 数据时,我需要尽可能用最短的时间确定ADC 数据中波形的起始和结束位置。由于一帧 ADC 数据有1000多个点,用软件查找速度比较慢,所以想到使用两个看门狗,设置不同的上下阈值,确定波形的起始和结束位置。现在的情况是 两路ADC 看门狗采集到的 位置有误差,一个单峰的波形有两个起始结束位置。

代码如下:
void ADC1_2_IRQHandler(void)
{

      NVIC_DisableIRQ(ADC1_2_IRQn);
        if((ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD2) != RESET) )
       {

                wave.wave_up_index = EPC_PIX_Number - DMA_GetCurrDataCounter(PixData_AD_DMAChannel); //触发看门狗的位置
                ADC_ITConfig(ADC1, ADC_IT_AWD2, DISABLE);//提前关闭中断,避免重复进入
               
                AWD2_count++;
                AWD2_count = AWD2_count % 4;

                ADC_ClearITPendingBit(ADC1, ADC_IT_AWD2);
                ADC_ITConfig(ADC1, ADC_IT_AWD3, ENABLE);//开启看门狗3
      }

      if((ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD3) != RESET) )
        {
                NVIC_DisableIRQ(ADC1_2_IRQn);
                wave.wave_down_index = EPC_PIX_Number - DMA_GetCurrDataCounter(PixData_AD_DMAChannel); //触发看门狗的位置
                AWD3_count++;
                AWD3_count = AWD3_count % 4;
                       
                ADC_ITConfig(ADC1, ADC_IT_AWD3, DISABLE);//提前关闭中断,避免重复进入
               
                ADC_ClearITPendingBit(ADC1, ADC_IT_AWD3);
                ADC_ITConfig(ADC1, ADC_IT_AWD2, ENABLE);
    }
NVIC_EnableIRQ(ADC1_2_IRQn);
}

wenyangzeng 发表于 2020-4-28 21:12:10

STM32的ADC内核实际上只有1个,分时采样方式来转换超过1通道的数据。

大概应该采用这种方式:





likang1202 发表于 2020-4-29 09:44:03

wenyangzeng 发表于 2020-4-28 21:12
STM32的ADC内核实际上只有1个,分时采样方式来转换超过1通道的数据。

大概应该采用这种方式:


大佬,冒昧地问一下,ADC的看门狗一般什么时候用

wenyangzeng 发表于 2020-4-29 10:45:35

likang1202 发表于 2020-4-29 09:44
大佬,冒昧地问一下,ADC的看门狗一般什么时候用

ST手册里有介绍





蠢蠢的痒 发表于 2020-4-29 14:55:07

wenyangzeng 发表于 2020-4-28 21:12
STM32的ADC内核实际上只有1个,分时采样方式来转换超过1通道的数据。

大概应该采用这种方式:


大佬,可以说的详细点吗? 这个和看门狗有什么关系呢?

wenyangzeng 发表于 2020-4-29 17:23:15

蠢蠢的痒 发表于 2020-4-29 14:55
大佬,可以说的详细点吗? 这个和看门狗有什么关系呢?
楼主在一楼说明了要使用ADC看门狗功能的。所以图中在ADC采样值不在保护区就触发中断。
页: [1]
查看完整版本: 求教各路大佬,关于使用两路 ADC 看门狗