void ADC_init(){
ADC1_DeInit();
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);//初始化adc3
ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);//adc4关闭施密特触发器(逻辑代码会切换adc3到adc4)
ADC1_Cmd(ENABLE);
}
FlagStatus flag_status;
void ADC3_read(){
ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE);//关闭ADC中断
ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM, DISABLE);//关闭tim1触发adc
ADC1_ClearFlag(ADC1_FLAG_EOC);//清除转换结束标志位(如果不写这一条清除的话,直接执行下面这条获得指定的标志状态有时候会返回SET(不是每次),不知道为什么)
flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);//获得指定的标志状态(不写上面那条清除的话有时会返回SET,很奇怪)
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_ALIGN_RIGHT);//切换通道为3
ADC1_StartConversion();//开始转换
while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)==RESET);//等待结束
ADC1_ClearFlag(ADC1_FLAG_EOC); / /清除转换结束标志位
Potentiometer_value = ADC1_GetConversionValue();//获取adc3转换结果
}
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)//定时器2(2ms)
{
ADC3_read();
/*逻辑控制*/
。。。。。
。。。。。
。。。。。
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_4, ADC1_ALIGN_RIGHT);//切换通道为4
ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM, ENABLE);//打开tim1触发adc
ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);打开ADC中断
}
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
ADC1_ClearFlag(ADC1_FLAG_EOC);/ /清除转换结束标志位
ADC1_ClearITPendingBit(ADC1_IT_EOC);/ /清除中断标志位
ADC4value = ADC1_GetConversionValue();获取adc4转换结果}
请教各位师傅是我代码哪里写错了吗?现在是adc3和adc4读取都很正常,就是很奇怪,为什么不写清除有时候会返回SET,我的理解是在那个位置不写清除应该也是RESET才对啊 |
所以是在执行ADC3_read() 前触发才有这个可能的。
这是个概率问题,因此才不会每次都有。
如果timer1 触发了ADC, 而接着又执行ADC3_read() 就会发现EOC标志在。
前辈您好,但是我进ADC3_read()最开始两句就已经关掉了啊,已经关闭了ADC中断和tim1触发adc
void ADC3_read(){
ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE);//关闭ADC中断 ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM, DISABLE);//关闭tim1触发adc
ADC1_ClearFlag(ADC1_FLAG_EOC);//清除转换结束标志位(如果不写这一条的话,直接执行下面这条获得指定的标志状态会返回SET,不知道为什么) flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);//获得指定的标志状态 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_ALIGN_RIGHT);//切换通道为3 ADC1_StartConversion();//开始转换 while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)==RESET);//等待结束 ADC1_ClearFlag(ADC1_FLAG_EOC); / /清除转换结束标志位 Potentiometer_value = ADC1_GetConversionValue();//获取adc3转换结果 }
[md]不是每次都返回SET,4次中有一次SET和三次RESET
哦哦,明白了,那我就这样写吧,在关闭中断后清除一下。
您看我整体逻辑可以吗?有什么需要修改的吗?请您指导
不清楚tim1 和 tim2 的运行逻辑。
个人觉得能早点关闭ADC 或 停止TIM1对ADC的触发,逻辑上会更好一些。