目前,我正在使用我从亚马逊购买的DDS模块输出正弦波信号。我下载了一个库来使用Arduino uno运行DDS模块。我想测量两个不同频率的DDS输出的最大值和最小值。如何读取循环中的最大值和最小值?我得到一个单一的值模拟读取,这是没有帮助的。
#include <AD9850SPI.h>
#include <SPI.h>
const int W_CLK_PIN = 13;
const int FQ_UD_PIN = 8;
const int RESET_PIN = 9;
double freq = 10000000;
double trimFreq = 124999500;
int phase = 0;
void setup(){
DDS.begin(W_CLK_PIN, FQ_UD_PIN, RESET_PIN);
DDS.calibrate(trimFreq);
}
void loop(){
DDS.setfreq(freq, phase);
double num = analogRead(A0); // Measure max and min ?
DDS.setfreq(freq + 500, phase);
double num1 = analogRead(A0); // Measure max and min ?
DDS.down();
}发布于 2021-03-04 02:55:00
您应该能够做一些额外的设置,然后根据需要替换min/max值,如下所示:
// To store/calc minima/maxima.
double minNum, maxNum, minNum1, maxNum1;
bool first = true;
void loop(){
DDS.setfreq(freq, phase);
double num = analogRead(A0);
DDS.setfreq(freq + 500, phase);
double num1 = analogRead(A0);
if (first) {
// First reading is min/max by definition.
minNum = maxNum = num;
minNum1 = maxNum1 = num1;
first = false;
} else {
// Otherwise set min/max based on comparisons.
if (num < minNum) minNum = num;
else if (num > maxNum) maxNum = num;
if (num1 < minNum1) minNum1 = num1;
else if (num1 > maxNum1) maxNum1 = num1;
}
// At this point, you have to (up-to-date) min/max for each variable,
// process it as you see fit.
DDS.down();
}如果您需要在每个频率上进行大量的采样,这是一个稍微修改过的版本,可以使用loop函数中的状态机来完成:
// Samples for each frequency and things for state machine.
#define SAMPLES 10000
#define ST_INIT 0
#define ST_FREQ_1 1
#define ST_FREQ_2 2
#define ST_DONE 3
double minNum, maxNum;
int samples, state = ST_INIT;
void loop () {
switch (state) {
case ST_INIT:
// Initial setup for state FREQ_1.
samples = SAMPLES;
DDS.setfreq(freq, phase);
minNum = maxNum = analogRead(A0);
state = ST_FREQ_1;
break;
case ST_FREQ_1:
// Collect samples until done, then output and set up for FREQ_2.
if (--samples < 1) {
process("Freq # 1", minNum, maxNum);
samples = SAMPLES;
DDS.setfreq(freq + 500, phase);
minNum = maxNum = analogRead(A0);
state = ST_FREQ_2;
} else {
double num = analogRead(A0);
if (num < minNum)
minNum = num;
else if (num > maxNum)
maxNum = num;
}
break;
}
case ST_FREQ_2:
// Collect samples until done, then output and stop.
if (--samples < 1) {
process("Freq # 2", minNum, maxNum);
DDS.down();
state = ST_DONE;
} else {
double num = analogRead(A0);
if (num < minNum)
minNum = num;
else if (num > maxNum)
maxNum = num;
}
break;
case ST_DONE:
default:
// Infinite looping with no action when all samples collected
// for both frequencies.
break;
}
}只需将process(const char *freq, double minVal, double maxVal)函数添加到输出结果即可。
为了更好地描述代码,请考虑loop函数是由Arduino处理循环连续调用的,它在功能上是:
int main() {
setup();
while (true) {
loop();
}
}还请考虑在loop (和setup)之外定义的变量在后续调用loop时维护其上一次设置的值。
因此,当第一次调用loop时,状态是ST_INIT,它将执行switch语句的这一部分。这将:
ST_FREQ_1;以及随后对loop的调用具有状态ST_FREQ_1,因此将执行switch的第二部分。这是:
ST_FREQ_2。同样的情况发生在采样的第二个频率,除了,在最后,我们只是改变状态为ST_DONE,而不需要设置任何第三个频率(所以我们关闭直接数字频率)。
loop函数将继续被调用,但在最终状态下,它只会返回。
https://stackoverflow.com/questions/66467882
复制相似问题