Giter VIP home page Giter VIP logo

Comments (4)

Nobutarou avatar Nobutarou commented on September 26, 2024

image

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.

Nobutarou avatar Nobutarou commented on September 26, 2024

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.

Nobutarou avatar Nobutarou commented on September 26, 2024

つかえる interrupt service routine はこちらにある
https://gammon.com.au/interrupts

こちらは sei() 関数で割込みを有効化しているけど、ラジオペンチ氏のは、レジスタ処理してるだけ。sei() 割込み可能なレジスタを一気に設定するとかそんなのなのかな。

ていうか cbi() とか sbi() とかビット指定できる関数あるんじゃん。 and と or で頑張ってたよ

from arduinodeasobu.

Nobutarou avatar Nobutarou commented on September 26, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.