C++ 以 CLK 频率的速度读取 ADC

问题描述

我使用的是 Hamamatsu (C12880MA) 的高光谱传感器。到目前为止,我已经完成了适合 Atmega328p 的固件,时序等运行良好。

但现在,我遇到了一些关于读取 ADC 测量值的问题。

根据我的时钟信号生成(在 0.5 和 5 MHz 之间的变量 f),我需要读取精确“标志”值的 ADC 值。 我正在使用内部 TC1 定时器来生成时钟。在 CLK 信号的每次切换时,我通过 ISR 设置一个标志来为其他信号计时/重新启动程序。

现在问题来了:我知道(参考数据表),传感器的视频信号将按照生成的 CLK 的速度出现在标志“ADC_start”和“ADC_End”之间。我必须通过内部 Arduino ADC 在正确的标志上读取值,以便稍后与正确的底层波长匹配。

以下是代码的基本片段:

volatile uint16_t flag = 0;
uint16_t data[288]; // define 1d matrix for data storage
  
uint16_t ST_Start = 2; // starter flag for the programm
uint16_t ST_End = 134; // end flag for ST signal
uint16_t ADC_Start = 310; //starter flag for ADC readout
uint16_t ADC_End = 886; //end flag for ADC readout
uint16_t index; //index used for data storage
  
volatile uint16_t End = 1000; // end flag for programm restart and clearing cache

ISR 处理在每个 cpu 时钟上增加标志..

ISR(TIMER1_COMPA_vect){

if  (flag <= End){

    flag = flag+1;    
} else
{
    flag = 0;
   
    //delayMicroseconds(2000);
}

这是我的 readData 函数。不幸的是,我还没有找到在所需的确切标志处读取 ADC 值的正确方法。假设我需要读取标志 300、302、304、...、900 处的值(每隔一个标志,在设置的间隔之间;ADC_Start 到 ADC_End)

void readData() {

    if (flag >= ADC_Start && flag <= ADC_End ){

        for (uint16_t i = ADC_Start; i < ADC_End; i = i+2)
        {
          index  = i - ADC_Start;
          data[index] = analogRead(VID);
        }
                
    } else { }  

}

这是数据表:https://www.hamamatsu.com/resources/pdf/ssd/c12880ma_kacc1226e.pdf 有关时间安排,请参阅第 7 页。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)