先月からArduinoを始めた超初心者ですが、外部のハードウエアを制御を勉強中です。
ArduinoのdigitalPin#5に入力された信号を周波数カウンタのスケッチで処理し、6段階に制御を割り振るスケッチを
書いてますが、切替にもたつきが出てしまい苦労してます。(周波数を変数として扱い、if構文で割り振り)
周波数カウンタのライブラリはこちらを使用させて貰ってます。
http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/
http://interface.khm.de/wp-content/uploads/2009/01/FreqCounter_1_12.zip
外部のハードウエア制御の関係上、if構文の各ループ切替時のみ極力ループさせず1回だけさせたい処理(外部のICを標準SPIライブラリでシリアルで送り、2byteでイニシャライズ)ありますが、いいアイデアが無く、今のところ、外部から負のワンショットパルスに近い信号(といっても0.5sec.程度?)を貰い、別のdigitalpin#6に入れ、Hレベルになった際、処理を力技で止めさせてますが、外部のワンショットパルスの設定幅に
自由度が無く、切替時に相当もたつき感があり、レスポンスがよろしく無いです。(切替時のイニシャライズは1回だけでも可)
変数(frq)は若干ふらつきますが(±2%程度)、変数(frq)がダイナミックに切り替わる際のみ、ソフト上でflagを立てて
スマートに制御できないか?と考えてますが、いいアイデアが思いつきません。
(boolean isFirst = true; を用い記述したところ、起動最初のループだけ上手く行き、リセットボタンを押さない限り、各ループ切替後の処理は無視されてしまいました・・・)
現行の外部からワンショットパルスを貰い制御しているスケッチを記述しますので、お知恵をお借りしたくアドバイスお願いします。
#include <FreqCounter.h>
#include <SPI.h>
#define SS_PIN 10
SPISettings mySPISettings = SPISettings(500000, MSBFIRST, SPI_MODE0);
int val = 0;
long int frq;
void setup() {
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, INPUT);
SPI.begin(); //SPI有効
pinMode(SS_PIN, OUTPUT);
}
void loop(){
FreqCounter::f_comp = 8; // Set compensation to 12
FreqCounter::start(100); // Start counting with gatetime of 100ms
while (FreqCounter::f_ready == 0); // wait until counter ready
frq = FreqCounter::f_freq; // read result
val = digitalRead(6);
if(frq < 10000){
if (val == 0) {
SPI.beginTransaction(mySPISettings);//ここから
digitalWrite(10, HIGH);//
SPI.transfer(B01001000);//
SPI.transfer(B11001111);//
digitalWrite(10, LOW);//ここまでが極力ループさせず1回だけさせたい処理です
}
//通常LOOP処理1
}
else if(frq < 20000){
if (val == 0) {
SPI.beginTransaction(mySPISettings);
digitalWrite(10, HIGH);
SPI.transfer(B01001010);
SPI.transfer(B11001111);
digitalWrite(10, LOW);
}
//通常LOOP処理2
}
else if(frq < 30000){
if (val == 0) {
SPI.beginTransaction(mySPISettings);
digitalWrite(10, HIGH);
SPI.transfer(B01011010);
SPI.transfer(B11001111);
digitalWrite(10, LOW);
}
//通常LOOP処理3
}
else if(frq < 40000){
if (val == 0) {
SPI.beginTransaction(mySPISettings);
digitalWrite(10, HIGH);
SPI.transfer(B01011010);
SPI.transfer(B11001111);
digitalWrite(10, LOW);
}
//通常LOOP処理4
}
else if(frq < 50000){
if (val == 0) {
SPI.beginTransaction(mySPISettings);
digitalWrite(10, HIGH);
SPI.transfer(B01011110);
SPI.transfer(B11001111);
digitalWrite(10, LOW);
}
//通常LOOP処理5
}
else{
if (val == 0) {
SPI.beginTransaction(mySPISettings);
digitalWrite(10, HIGH);
SPI.transfer(B11011010);
SPI.transfer(B11001111);
digitalWrite(10, LOW);
}
//通常LOOP処理6
}
delay(100);
}
回答2件
あなたの回答
tips
プレビュー