在采集ADC 数据时,我需要尽可能用最短的时间确定ADC 数据中波形的起始和结束位置。由于一帧 ADC 数据有1000多个点,用软件查找速度比较慢,所以想到使用两个看门狗,设置不同的上下阈值,确定波形的起始和结束位置。现在的情况是 两路ADC 看门狗采集到的 位置有误差,一个单峰的波形有两个起始结束位置。 代码如下: void ADC1_2_IRQHandler(void) { NVIC_DisableIRQ(ADC1_2_IRQn); if((ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD2) != RESET) ) { wave[AWD2_count].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[AWD3_count].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); } |
大概应该采用这种方式:
评分
查看全部评分
大佬,冒昧地问一下,ADC的看门狗一般什么时候用
ST手册里有介绍
大佬,可以说的详细点吗? 这个和看门狗有什么关系呢?
楼主在一楼说明了要使用ADC看门狗功能的。所以图中在ADC采样值不在保护区就触发中断。