首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取Arduino中DDS模块的最大值和最小值?

如何读取Arduino中DDS模块的最大值和最小值?
EN

Stack Overflow用户
提问于 2021-03-04 02:48:47
回答 1查看 244关注 0票数 0

目前,我正在使用我从亚马逊购买的DDS模块输出正弦波信号。我下载了一个库来使用Arduino uno运行DDS模块。我想测量两个不同频率的DDS输出的最大值和最小值。如何读取循环中的最大值和最小值?我得到一个单一的值模拟读取,这是没有帮助的。

代码语言:javascript
复制
#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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 02:55:00

您应该能够做一些额外的设置,然后根据需要替换min/max值,如下所示:

代码语言:javascript
复制
// 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函数中的状态机来完成:

代码语言:javascript
复制
// 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处理循环连续调用的,它在功能上是:

代码语言:javascript
复制
int main() {
    setup();
    while (true) {
        loop();
    }
}

还请考虑在loop (和setup)之外定义的变量在后续调用loop时维护其上一次设置的值。

因此,当第一次调用loop时,状态是ST_INIT,它将执行switch语句的这一部分。这将:

  • 设置为使用第一频率;
  • 将样本计数初始化到所需的值;
  • 读取第一个值,将其分配到最小值和最大值;
  • 将状态更改为ST_FREQ_1;以及
  • 中断,导致函数最终退出。

随后对loop的调用具有状态ST_FREQ_1,因此将执行switch的第二部分。这是:

  • 减少样本数量。如果这已经达到零,那么它:
    • 输出第一组样本的结果;
    • 设置它来使用第二频率;
    • 将样本计数初始化为所需的值;
    • 读取第一个值,将其分配到最小值和最大值;以及
    • 将状态更改为ST_FREQ_2

  • 如果没有达到零,它只需读取另一个示例,并在此基础上调整当前的min/max。
  • 无论哪种方式,它都会中断,从而最终退出该函数。

同样的情况发生在采样的第二个频率,除了,在最后,我们只是改变状态为ST_DONE,而不需要设置任何第三个频率(所以我们关闭直接数字频率)。

loop函数将继续被调用,但在最终状态下,它只会返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66467882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档