Comments (4)
const char PULSE_PIN = 2;
const char ANALOG_READ_PIN = A5;
void setup()
{
Serial.begin(9600);
Serial.setTimeout(2^32-1); //no timeout
pinMode( PULSE_PIN , OUTPUT);
digitalWrite(PULSE_PIN, LOW);
// |-|ACME -> 0|-|-|-|ADTS2|ADTS1|ADTS0|
// ACME: PD6 の代わりに ADC を負入力に使う ->0
// ADTS: は 22.3.1 に記載なく不明。どうやら割込み処理で ADC を動作させるもののようだ -> 0
ADCSRB = 0;
// |ACD|ACBG|ACO|ACI|ACIE|ACIC|ACIS1|ACIS0|
// ACD: コンパレータ無効 -> 0
// ACBG: 正の入力に Vref を使う -> 0
// ACO: AIN0>AIN1 のときに 1 が書き込まれるのではないか。読み込み専用
// ACI: ACIS1, ACIS0 との組み合わせでの割込み用。とりあえず while で待ってみるので ->0
// ACIC: TIMER1 をうんぬんかんぬんした割込み用。とりあえず理解できないので -> 0
// A0IS: とりあえず割り込まないので -> 0
ACSR = 0;
// |-|-|-|-|-|-|AIN1D|AIN0D|
// AINxD: デジタル入力無効 -> 1
DIDR1= 0b00000011;
}
void discharge() {
digitalWrite(PULSE_PIN, LOW);
delay(1000);
}
unsigned long charge() {
digitalWrite(PULSE_PIN, HIGH);
return micros();
}
void loop() {
double _R;
_R=r_setup();
// TinkerCad では文字を送る必要があったが、実物では Enter で反応する
Serial.println("Enter to reset registor");
// TinkerCad では不要だったけど、これがないと Serial.available()>0 になってしまう。
Serial.end();
Serial.begin(9600);
while(Serial.available()==0){
discharge();
unsigned long time_start = charge();
// 電圧の逆転を待つ
// これでテストすると時定数 1e-2 sec で 25000カウント。1カウント 4e-7sec で analogRead() よりも一桁速い。
// i++ の影響は知らない
// int i = 0;
// while ( (ACSR&0b00100000) != 0b00100000 ){i++;};
while ( (ACSR&0b00100000) != 0b00100000 ){};
double T = micros() - time_start; // T: 時定数
//double c=T/_R; // [uF]
// c=-T/R/ln(1-Vc/Vtotal)
double c=-T/_R/log(0.33333333);
Serial.println(c,16);
digitalWrite(PULSE_PIN, LOW);
}
Serial.end();
Serial.begin(9600);
}
double r_setup()
{
double registor;
double x; // general purpose
short i; //
char a; // general purpose
Serial.println("Input the registor [Ohm]");
Serial.println("Scientific notation only (ex, 1.23e-4)");
while (Serial.available() == 0) {};
x=Serial.parseFloat();
a=Serial.read();
i=Serial.parseInt();
registor=x*pow(10.0,i);
Serial.print("Registor: ");
Serial.print(registor,16);
Serial.println(" Ohm");
return registor;
}
これでやれそう
from arduinodeasobu.
Arduino は 1サイクル = 1クロック (1/16MHz) で良いようだ。ここによると while は 12 サイクル
https://people.ece.ubc.ca/leos/pdf/e391/Project/ArduinoClockCycles.pdf
ここに割込みの例がある。
http://radiopench.blog96.fc2.com/?no=1245
ちなみに pic12f1840 は table 30-10 によると、コンパレータの遅延は 200ns ~ 400ns なので、あまり速くない。
from arduinodeasobu.
つかえる interrupt service routine はこちらにある
https://gammon.com.au/interrupts
こちらは sei() 関数で割込みを有効化しているけど、ラジオペンチ氏のは、レジスタ処理してるだけ。sei() 割込み可能なレジスタを一気に設定するとかそんなのなのかな。
ていうか cbi() とか sbi() とかビット指定できる関数あるんじゃん。 and と or で頑張ってたよ
from arduinodeasobu.
C=22pF, R=100kΩの τ = 2.2e-6sec で 73pF が出た。ずっとやってると値がおかしくなるので、時々リセットが必要。まあ十分では
#define cbi(addr, bit) addr &= ~(1 << bit) // addrのbit目を'0'にする
#define sbi(addr, bit) addr |= (1 << bit) // addrのbit目を'1'にする
#define _PULSE_PIN 2
double T_end;
ISR(ANALOG_COMP_vect) {
T_end = micros();
}
void setup()
{
Serial.begin(9600);
Serial.setTimeout(2^32-1); //no timeout
pinMode( _PULSE_PIN , OUTPUT);
digitalWrite(_PULSE_PIN, LOW);
// |-|ACME -> 0|-|-|-|ADTS2|ADTS1|ADTS0|
// ACME: PD6 の代わりに ADC を負入力に使う ->0
// ADTS: は 22.3.1 に記載なく不明。どうやら割込み処理で ADC を動作させるもののようだ -> 0
ADCSRB = 0;
// |ACD|ACBG|ACO|ACI|ACIE|ACIC|ACIS1|ACIS0|
// ACD: コンパレータ無効 -> 0
// ACBG: 正の入力に Vref を使う -> 0
// ACO: AIN0>AIN1 のときにマイコンが 1 を書き込む
// ACI: 割り込むときに、マイコンが 1 を書き込む
// ACIE: 割込み有孔 -> 1
// ACIC: TIMER1 をうんぬんかんぬんした割込み用。とりあえず理解できないので -> 0
// A0IS: rising で割り込む --> 11
ACSR = 0b00001011;
// |-|-|-|-|-|-|AIN1D|AIN0D|
// AINxD: デジタル入力無効 -> 1
DIDR1= 0b00000011;
}
void discharge() {
digitalWrite(_PULSE_PIN, LOW);
delay(1000);
}
unsigned long charge() {
sbi(PORTD, PORTD2);
return micros();
}
void loop() {
double _R;
_R=r_setup();
// TinkerCad では文字を送る必要があったが、実物では Enter で反応する
Serial.println("Enter to reset registor");
// TinkerCad では不要だったけど、これがないと Serial.available()>0 になってしまう。
Serial.end();
Serial.begin(9600);
while(Serial.available()==0){
discharge();
cbi(ACSR,ACIE); // 念のため 一旦割込み無効
cbi(PORTD,PORTD6); //念のためグランドに落とす
cbi(PORTD,PORTD7); //念のためグランドに落とす
delay(10); //念のため delay
sbi(ACSR,ACIE); // もう一度割込み有孔
unsigned long time_start = charge();
// 電圧の逆転を待つ
while ( (ACSR&0b00100000) != 0b00100000 ){};
double T = T_end - time_start; // T: 時定数
// c=-T/R/ln(1-Vc/Vtotal)
double c=-T/_R/log(0.33333333);
Serial.println(c,16);
digitalWrite(_PULSE_PIN, LOW);
}
Serial.end();
Serial.begin(9600);
}
double r_setup()
{
double registor;
double x; // general purpose
short i; //
char a; // general purpose
Serial.println("Input the registor [Ohm]");
Serial.println("Scientific notation only (ex, 1.23e-4)");
while (Serial.available() == 0) {};
x=Serial.parseFloat();
a=Serial.read();
i=Serial.parseInt();
registor=x*pow(10.0,i);
Serial.print("Registor: ");
Serial.print(registor,16);
Serial.println(" Ohm");
return registor;
}
from arduinodeasobu.
Related Issues (20)
- usb 切り替え IC を使う切り替え機
- 書き込み失敗 HOT 1
- usbasp HOT 1
- minicore で arduinoisp.ino が動かないんだが HOT 3
- GL850G #3
- sun ace 80 の 5000rpm のやつ
- 書き込み失敗調査 HOT 7
- a-p-prog の wait って HOT 1
- 3.3V LDO
- リレーが単純 HOT 2
- TC7USB40FT の USB switcher 、レギュレータの配線 3.3V と GND 逆になっている (設計図)
- NiMHチャージャー
- vcc の値を読む
- BME280
- 温度センサー MCP9700 は誤差が ±4℃と大きすぎる。
- usb スイッチ用フォトリレー HOT 1
- 秋月 会社一覧
- USB type-c ケーブルメモ
- usb hub 2.1
- usb hub 2.1 の電源選択
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from arduinodeasobu.