你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8s003 adc中断和通道切换的问题

[复制链接]
你是我会笑醒的梦 提问时间:2024-9-20 09:09 / 已解决


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才对啊

收藏 评论6 发布时间:2024-9-20 09:09

举报

6个回答
butterflyspring 最优答案 回答时间:7 天前
ADC触发后,需要一段时间采样转换后才能置位EOC


所以是在执行ADC3_read() 前触发才有这个可能的。

这是个概率问题,因此才不会每次都有。

butterflyspring 回答时间:7 天前
注意到在TIM2的中断里打开了 tim1 触发ADC。

如果timer1 触发了ADC, 而接着又执行ADC3_read() 就会发现EOC标志在。
你是我会笑醒的梦 回答时间:7 天前

butterflyspring 发表于 2024-9-20 10:11
注意到在TIM2的中断里打开了 tim1 触发ADC。</p>
<p>如果timer1 触发了ADC, 而接着又执行ADC3_read() 就会发现EO ...

前辈您好,但是我进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转换结果 }

你是我会笑醒的梦 回答时间:7 天前

你是我会笑醒的梦 发表于 2024-9-20 10:27
前辈您好,但是我进ADC3_read()最开始两句就已经关掉了啊,已经关闭了ADC中断和tim1触发adc</p>
<p>void AD ...

[md]不是每次都返回SET,4次中有一次SET和三次RESET

你是我会笑醒的梦 回答时间:7 天前

butterflyspring 发表于 2024-9-20 11:17
ADC触发后,需要一段时间采样转换后才能置位EOC</p>
<p>

哦哦,明白了,那我就这样写吧,在关闭中断后清除一下。

您看我整体逻辑可以吗?有什么需要修改的吗?请您指导

butterflyspring 回答时间:7 天前
你是我会笑醒的梦 发表于 2024-9-20 12:17
[md]哦哦,明白了,那我就这样写吧,在关闭中断后清除一下。

您看我整体逻辑可以吗?有什么需要修改的吗 ...

不清楚tim1 和 tim2 的运行逻辑。

个人觉得能早点关闭ADC 或 停止TIM1对ADC的触发,逻辑上会更好一些。




关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版