程式修改為一開始先計算400ms內共可執行幾次sampling(),用來設定sampleCountLimit,然後在 loop() 中每隔sampleCountLimit次送出取樣的最大與最小值。實測Arduino效能,可在400ms內取樣1723次。
// 測量A0對A1的空氣電壓
// 修改自地震預測研究所所長 林湧森 2016-07-28 04:29 UTC+8
// 修改者 : ghostyguo
// 使用最快取樣速度, 每隔400ms送出最大與最小值
// 修改時間 : 2016-08-20 22:30 UTC+8
int sampleCount;
int maxValue, minValue; //keep extreme value
int whoIsLast = 0; //-1=min, 1=max, 0=undefined;
int sampleCountLimit;
void setup()
{
Serial.begin(9600);
SetupRunningParameters();
startNewCycle();
}
void SetupRunningParameters()
{
// find sampleCountLimit in 400ms
unsigned long startMicros=micros();
startNewCycle();
while (micros()-startMicros<400000L) {
sampling();
}
sampleCountLimit = sampleCount;
// uncomment the following lines to see the sampleCountLimit
// Serial.print("#");
// Serial.println(sampleCountLimit);
}
void startNewCycle()
{
maxValue = -10000; //12bit ADC < -1024
minValue = 10000; //12bit ADC > 1024
whoIsLast = 0;
sampleCount = 0;
}
void loop()
{
sampling();
if (sampleCount>sampleCountLimit) {
if (whoIsLast == -1) {
Serial.println(maxValue);
Serial.println(minValue);
} else if (whoIsLast == 1) {
Serial.println(minValue);
Serial.println(maxValue);
} else {
Serial.println("Extreme Value Error");
}
startNewCycle();
}
}
void sampling()
{
int sampleValue = analogRead(A0) - analogRead(A1);
if (minValue > sampleValue) {
minValue = sampleValue;
whoIsLast = -1;
}
if (maxValue < sampleValue) {
maxValue = sampleValue;
whoIsLast = 1;
}
++sampleCount;
}
|
全站熱搜
留言列表