请教,用HAL库定时采集ADC数据的标准方法是怎样的?谢谢

2019-07-20 09:54发布

比如我想1秒采集一次ADC数据,我试过的方法是 在TIM的更新中断中加了GetADC(),这个GetADC()用的是阿波罗例程72里的代码。
问题是 执行程序时只读了一次ADC就死循环在while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))),ADC_FLAG_EOC一直是0。


请教大家,用HAL库定时采集ADC数据的标准方法是怎样的?谢谢!

相关代码:
//读取ADC值
uint16_t GetADC()
{
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1,100);
  return HAL_ADC_GetValue(&hadc1);
}

//定时器更新中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{          
        printf("%d ",GetADC());                //返回adc值       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
Noctis
1楼-- · 2019-07-20 15:00
 精彩回答 2  元偷偷看……
练皮境
2楼-- · 2019-07-20 20:12
Noctis 发表于 2018-1-20 09:39
不要在中断里执行阻塞式的函数,你定时器设一个标记,到时间就将该标记置1,主循环检测到该标记为1再执行Ge ...

首先谢谢解答!
1)如果不要在中断里执行阻塞式的函数,你定时器设一个标记,到时间就将该标记置1,主循环检测到该标记为1再执行GetADC()并将其清0就可以了。
这种获取ADC值没问题,不太好的是GetADC()内容的执行要受到main的while(1)里其他代码的干扰,比如要执行完其他代码才能GetADC(),采样快了有可能存在延时。所以我觉得最好还能放在TIM的中断里,代码也规整。
2)又或者修改Get_ADC()函数,不要用HAL_ADC_Start(),改用 HAL_ADC_Start_IT() ,然后在回调函数里获取数据。
我试的结果是改为 HAL_ADC_Start_IT(),同样是在判断EOC那死循环。而且原子哥的例程GetADC()里用的就是 HAL_ADC_Start_IT() 。
练皮境
3楼-- · 2019-07-21 02:09
 精彩回答 2  元偷偷看……
Noctis
4楼-- · 2019-07-21 06:33
 精彩回答 2  元偷偷看……
练皮境
5楼-- · 2019-07-21 10:34
在中断里获得了数据,对该数据的处理可以不放在主循环。比如在中断里比较ADC值大小后,直接发送到外设
第2种,我试了用 HAL_ADC_Start_IT(),不用HAL_ADC_PollForConversion(),程序不卡死,但得到的ADC值怎么都是0。原因应该是上一次ADC采用一直没有完成。
Noctis
6楼-- · 2019-07-21 15:22
练皮境 发表于 2018-1-21 08:28
在中断里获得了数据,对该数据的处理可以不放在主循环。比如在中断里比较ADC值大小后,直接发送到外设
第2 ...

用了HAL_ADC_Start_IT就不需要用HAL_ADC_PollForConversion()的,自己看看源文件,开头的注释里有写用法的

一周热门 更多>