求助,怎样让ad采样不会影响程序的继续执行,即可以多线程-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

123
返回列表 发新帖
楼主: peter1999516

[未解决] 求助,怎样让ad采样不会影响程序的继续执行,即可以多线程

[复制链接]
发表于 2022-4-21 00:40 | 显示全部楼层
从 AVR 原理上说,AD 可以做到后台采样,但 analogRead 没有设计成后台采样的样子。

首先是 AD 采样开始:
analogRead 设计为 ADCSRA.ADSC=1 进行单次采样,这就导致每次采样都需要主动调用 analogRead;
若要实现后台采样,可能要考虑 AD 自动触发结构,即 ADCSRA.ADATE=1,之后选择合适的触发源(例如 PWM 走到某个特定时刻)。

其次是 AD 采样完成:
analogRead 设计为等待 ADCSRA.ADSC 复位,这样导致 CPU 有死等时间,即无法后台采样;
若要实现后台采样,可以考虑使用中断处理 AD 完成事件,这样可以释放 CPU 运算时间。

上述都需要你在代码一级放弃 analogRead 函数,转为 ADC 寄存器操作,另外需要重写 ADC 中断函数。

发表于 2022-4-21 08:35 | 显示全部楼层
看了你的视频, 你看是否可以这样做:
1.        只需一个中断函数,中断函数中只设置一个Flag表明收到了中断请求。快速从中断返回。
2.        所有其他的函数都在loop()中调用。
3.        loop()和loop()调用的所有函数中不要用任何delay(),使loop()以最快的速度循环。
4.        用micros()计时,根据中断函数中设置的Flag和不同的计时,进行方波输出和AD采样。
例如,在loop()中检查到中断Flag为True,输出方波。过一小段时间进行AD采样。AD采样后,Flag置False。这样在AD采样期间方波还在正常输出。这样做就看你的loop()有多快,是否能满足你的中断响应时间。
 楼主| 发表于 2022-4-21 12:14 来自手机 | 显示全部楼层
t3486784401 发表于 2022-4-21 00:40
从 AVR 原理上说,AD 可以做到后台采样,但 analogRead 没有设计成后台采样的样子。

首先是 AD 采样开始: ...

感谢回复
 楼主| 发表于 2022-4-21 12:22 来自手机 | 显示全部楼层
ifeue 发表于 2022-4-21 08:35
看了你的视频, 你看是否可以这样做:
1.        只需一个中断函数,中断函数中只设置一个Flag表明收到了中断请求 ...

感谢大佬的回复,你的意思我理解了,就是把中断函数仅仅用于标志位的设定,把方波输出程序和ad采样都放置在loop中,不过我的设计中要求的不是发出一次方波,而是在中断指令发出后,根据ad采样得到的数值源源不断的经过大小判定,从而从对应脚发出方波。但是你的这个方案只能发一次方波,下一次发出必须经过中断触发(改标志位)。不过还是感谢大佬提供的思路
 楼主| 发表于 2022-4-21 12:26 来自手机 | 显示全部楼层
t3486784401 发表于 2022-4-21 00:40
从 AVR 原理上说,AD 可以做到后台采样,但 analogRead 没有设计成后台采样的样子。

首先是 AD 采样开始: ...

我去研究一下,芯片的数据手册,估计是要放弃用analog函数了。和pic相比,ardunio确实简单,但是简单的代价就是可操作空间小。
发表于 2022-4-21 13:32 | 显示全部楼层
peter1999516 发表于 2022-4-21 12:22
感谢大佬的回复,你的意思我理解了,就是把中断函数仅仅用于标志位的设定,把方波输出程序和ad采样都放置 ...

方波并不是一定经过中断触发。在loop() 中你可以根据你的需求在任意时刻改变它。
发表于 2022-4-21 17:18 | 显示全部楼层
peter1999516 发表于 2022-4-21 12:26
我去研究一下,芯片的数据手册,估计是要放弃用analog函数了。和pic相比,ardunio确实简单,但是简单的代 ...

AVR 的 AD 有自动触发的,可以设置定时器事件、跳变沿事件,也可以一直 Free-Run,相当于一直触发。
无论怎么触发,采集完成了都会有一个 ADIF 的中断请求。

目测 LZ 用 Free-Run 就可以实现连续采样/响应

 楼主| 发表于 2022-4-21 18:10 来自手机 | 显示全部楼层
ifeue 发表于 2022-4-21 13:32
方波并不是一定经过中断触发。在loop() 中你可以根据你的需求在任意时刻改变它。 ...

我理解你的意思,把所有的函数除了标志位都放在loop里循环,但是这解决不了analogread函数必须占有一段时间。
 楼主| 发表于 2022-4-22 19:17 来自手机 | 显示全部楼层
目前成品,下周进行实物测试。
1650626192085.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:44 , Processed in 0.259681 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表