いろいろあって投稿できていませんが進捗を報告します。
タコですが前回とほぼ同じ回路とスケッチで問題なく動きました。
10周期分の時間を計ることで平均化していますが、アイドリング付近では回転数の変動が激しいので値の平均は有用でした。4000rpm以上では変動は少なく1周期分で計算しても問題なかったです。
ソレノイドを動作させる回転数では問題ないので平均化しないか10回ではなく2~3回の平均で十分かもしれません。
ソレノイドの方も周波数とデューティ比が制御できるようになりました。
周波数とデューティ比を変更するにはレジスタの操作等必要ですが、このあたりの話はまだ100%理解できていないのでネットで拾ったプログラムを 丸パクリ 参考にさせてもらってます。
20Hz デューティ比0.1~0.9ぐらいがちょうどいいと思いました。
できるだけ早く完成させます。
スケッチを載せておきます。回路図はスケッチから想像してください(笑)(そのうち回路図CADを使えるようにする予定なので後で追記します。)
#include <avr/io.h>
#define PWMPin 10
unsigned int frq; //周波数16Hz – 1MHz
float duty=0 ; //デューティー比
void setup() {
pinMode(PWMPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
frq=analogRead(0);
duty=analogRead(5);
frq=map(frq,0,1023,16,200);
duty=duty/1023;
Serial.print("duty=");
Serial.print(duty);
Serial.print("\t");
Serial.print("frq=");
Serial.print(frq);
Serial.print("\n");
Serial.flush();
// モード指定
TCCR1A = 0b00100001;
TCCR1B = 0b00010010;
// TOP値指定
OCR1A = (unsigned int)(1000000 / frq);
// Duty比指定
OCR1B = (unsigned int)(1000000 / frq * duty);
}