Работа с пьезоэлектрическим датчиком

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Всем привет.
Приобрёл пьезоэлектрический датчик как на фото ниже.

Не могу снять с него показания при помощи Arduino Nano.
Пишу простенькую программу для считывания значений, но показания прыгают, смысла в них нет.
 

const byte piezoPin = A1;
int val;

void setup() {
  Serial.begin(9600);
  analogReference(INTERNAL);
    
}

void loop() {
    val = analogRead (piezoPin);
  if (val >= 3){
  Serial.println( val );
  delay (600);
   }
   else {
     Serial.println( "NO" );   }
       
}

Полярность датчика мне не известна подключаю по разному. Изменяется диапазон прыгающих значений.
Подтягивающий резистор пробовал 1MOm показания через порт вижу изменяющиеся от 0 до 1023 хаотично.
С резистором 15kOm-25 kOm значения перестают прыгать, но при нажатии на датчик в порте вижу числа около 4 обычно, срабатывет плохо, может срабатывать даже на тепло рук и писать цифру 3. В общем о измерении усилия нажатия и речи быть не может.
Осциллографа в доступе нет сейчас. Тестером на прямую с датчика при нажатии вижу напряжение примерно до 0,3В.
 Прошу помощи в чём моя ошибка? Может нужен усилитель сигнала?
 

 


 

rkit
Offline
Зарегистрирован: 23.11.2016

А почему ты решил, что они не должны прыгать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa пишет:

...пьезоэлектрический датчик...

Не могу снять с него показания при помощи Arduino Nano.

...при нажатии на датчик в порте вижу числа около 4 обычно, срабатывет плохо, может срабатывать даже на тепло рук и писать цифру 3. В общем о измерении усилия нажатия и речи быть не может.

 Прошу помощи в чём моя ошибка? Может нужен усилитель сигнала?

Ошибка в том, что Вы думаете, будто пьзодатчик способен работать со статическим сигналом.

nik182
Offline
Зарегистрирован: 04.05.2015

Такая хрень у меня висела на моторе девятки. Делала вид что детонацию устраняла. Сигнал был острый пик. Как высота превышала какое то значение, опрежение зажигания сдвигалось в минус. Что бы проверить били по ней молотчком. Смотрели осцилографом.

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Просто с точки зрения расчёта: датчик выдаёт 0,2В, при подтяжке напряжения INTERNAL 1,1В  я должен видеть значения порядка 186, таких значений нет и это мне не понятно.
Датчик этот не такой как датчик детонации, он создан специально под цели которые я преследую.
Я совсем новичок в работе с подобного рода электроникой, и по моим ощущениям дело именно в моих знаниях.

Удалось найти код на иностранном форуме и  чудо он работает, осталось его понять и буду пробовать применить в своём проекте.
 

int threshold = 100; // alarm threshold from 1 (very sensitive) to 1022 <<<<<<<<
int alarmDuration = 100; // alarm duration in milliseconds <<<<<<<<

const byte piezoPin = A0;
int rawValue; // raw A/D readings
int piezoValue; // peak value
const byte onboardLED = 13; // onboard LED and/or buzzer

void setup() {
  analogReference(INTERNAL); // remove this line if too sensitive
  Serial.begin(115200); // serial monitor for raw piezo output
  pinMode (onboardLED, OUTPUT);
}

void loop() {
  // reset
  piezoValue = 0;
  // read
  for (int x = 0; x < 250; x++) { // multiple A/D readings
    rawValue = analogRead(piezoPin);
    if (rawValue > piezoValue) {
      piezoValue = rawValue; // store peaks
    }
  }
  // print
  if (piezoValue > 0) {
    Serial.print(F("Piezo value is "));
    Serial.println(piezoValue);
  }
  // action
  if (piezoValue > threshold) {
    Serial.print(F("Knock was over the threshold of "));
    Serial.println(threshold);
    digitalWrite (onboardLED, HIGH);
    delay(alarmDuration);
    digitalWrite (onboardLED, LOW);
  }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

I-Antoxa пишет:

Просто с точки зрения расчёта: датчик выдаёт 0,2В

ты забыл показать расчет

nik182
Offline
Зарегистрирован: 04.05.2015

Код простой пиковый детектор, если тебе это что то скажет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa, прежде, чем говорить о скетче, следует привести схему. Пока что разговор беспредметен.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

код порочен по своей сути так как для нахождения пика каждые (ориентировочно) 100 миллисекунд впадаем в цикл длительностью 25 миллисекунд, что происходит в эти 100 миллисекунд неизвестно...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa, вот характерные сигналы с пьезодатчика. Обратите внимание, что характерная ширина импульса порядка 2 мс. А что Вы измеряете?

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

rkit пишет:

I-Antoxa пишет:

Просто с точки зрения расчёта: датчик выдаёт 0,2В

ты забыл показать расчет

Расчёт таков 0,2В*1023/1,1В=186
В своей программе изначально я сделал ошибку в том, что считываю значения напряжения с датчика, с которого нарастает напряжение плавно и как только оно начинает повышаться я выводил в порт величину которая равнялась либо чуть превышала мой минимальный порог ( значение 3).

nik182 пишет:
Код простой пиковый детектор, если тебе это что то скажет.

Почитав внимательно код я пришёл к такому же выводу. Программа уходит в цикл за время выполнения которого я нахожу пиковое значение с датчика усилия после чего я вывожу это значение в порт. Это должно хорошо подойти при отладке датчика, чтобы узнать необходимую величину давления на датчик.

andriano пишет:

I-Antoxa, прежде, чем говорить о скетче, следует привести схему. Пока что разговор беспредметен.


Абсолютно согласен, поленился такую простую схему рисовать, думаю все сами догадались.
Одна нога с датчика идёт на END другая нога идёт на пин A0, пин A0 также подтянут на землю через резистор 1МОм

ua6em пишет:

код порочен по своей сути так как для нахождения пика каждые (ориентировочно) 100 миллисекунд впадаем в цикл длительностью 25 миллисекунд, что происходит в эти 100 миллисекунд неизвестно...

Суть моего проекта довольно простая:
Ждём определённого уровня усилия с датчика, параллельно считаем через прерывания обороты, как только необходимое усилие создано, подаём питание на один из цифровых пинов на определённую величину времени в зависимости от оборотов в этот момент.
Мне было бы очень полезно понять как вы можете ориентировочно узнать время затраченное на нахождение пика и время которое занимает цикл. Я этого не знаю.

andriano, спасибо за график.

Чуть позже я выложу всю программу о структуре которой писал выше, буду рад услышать по ней замечания и предложения. Всем спасибо за помощь.

 

nik182
Offline
Зарегистрирован: 04.05.2015

http://arduino.ru/Reference/Millis

http://arduino.ru/Reference/Micros

Перед началом нахождения пика считываете значение времени одной из этих функций и по окончании повторно получаете время. Разница между значениями будет равна времени выполнения.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

35 строка, это задержка в 100 миллисекунд, а 250 измерений аналогового сигнала в цикле дадут задержку в 25 миллисекунд

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

ua6em пишет:

35 строка, это задержка в 100 миллисекунд, а 250 измерений аналогового сигнала в цикле дадут задержку в 25 миллисекунд


 
Понял, 35 строка для меня была не принципиальна, не предавал этому значение.

nik182 пишет:

Перед началом нахождения пика считываете значение времени одной из этих функций и по окончании повторно получаете время. Разница между значениями будет равна времени выполнения.

Точно, это довольно просто оказывается)

Второй момент изменил в программе которую пишу под проект, привожу её ниже и жду критику:
 

unsigned long lastflash; 
int RPM;                 
int pitanie = 13;         //Включение SSR 
const byte piezoPin = A0; //Считывание значений с датчика усилия
int rawValue;             //Не обработанное значение


void setup()
{
  Serial.begin(115200); // Эта скорость не слишком высокая?
  analogReference(INTERNAL);
  attachInterrupt(0,sens,HIGH); //Аппаратные прерывания
  pinMode(pitanie, OUTPUT);  //питание реле
  digitalWrite(pitanie, HIGH);
  }

void sens() {
  
  RPM=60/(2*((micros()-lastflash)/1000000));  // обороты в мин двигателя, возможно нужно float перед micros
     // умножение на 2 т.к. обороты с распредвала. 
  lastflash = micros();  //запомнить время последнего оборота
}

void loop() {

 while (1) {
 rawValue = analogRead(piezoPin);
   if (rawValue >= 400) { // 400 значение полученное при калибровке усилия, ждём в замкнутом цикле нужного значения с датчика усилия
       break;
    }
 }
 
   while (RPM >= 2000 && RPM <= 6000) {                 //сурово размыкаем реле на требуемый момент времени в зависимости от оборотов
         digitalWrite(pitanie, LOW);
         delay (80);
         break;
   }
   while (RPM > 6000 && RPM <= 10500) {
         digitalWrite(pitanie, LOW);
         delay (65);
         break;
   }
    while (RPM > 10500) {
         digitalWrite(pitanie, LOW);
         delay (55);
         break;
   }
   digitalWrite(pitanie, HIGH);
         delay (300);                                          // задержка для исключения повторного срабатывания выключения питания
  }

 

SLKH
Offline
Зарегистрирован: 17.08.2015

I-Antoxa пишет:

ua6em пишет:

35 строка, это задержка в 100 миллисекунд, а 250 измерений аналогового сигнала в цикле дадут задержку в 25 миллисекунд


 
Понял, 35 строка для меня была не принципиальна, не предавал этому значение.

nik182 пишет:

Перед началом нахождения пика считываете значение времени одной из этих функций и по окончании повторно получаете время. Разница между значениями будет равна времени выполнения.

Точно, это довольно просто оказывается)

Второй момент изменил в программе которую пишу под проект, привожу её ниже и жду критику:
 

unsigned long lastflash; 
int RPM;                 
int pitanie = 13;         //Включение SSR 
const byte piezoPin = A0; //Считывание значений с датчика усилия
int rawValue;             //Не обработанное значение


void setup()
{
  Serial.begin(115200); // Эта скорость не слишком высокая?
  analogReference(INTERNAL);
  attachInterrupt(0,sens,HIGH); //Аппаратные прерывания
  pinMode(pitanie, OUTPUT);  //питание реле
  digitalWrite(pitanie, HIGH);
  }

void sens() {
  
  RPM=60/(2*((micros()-lastflash)/1000000));  // обороты в мин двигателя, возможно нужно float перед micros
     // умножение на 2 т.к. обороты с распредвала. 
  lastflash = micros();  //запомнить время последнего оборота
}

void loop() {

 while (1) {
 rawValue = analogRead(piezoPin);
   if (rawValue >= 400) { // 400 значение полученное при калибровке усилия, ждём в замкнутом цикле нужного значения с датчика усилия
       break;
    }
 }
 
   while (RPM >= 2000 && RPM <= 6000) {                 //сурово размыкаем реле на требуемый момент времени в зависимости от оборотов
         digitalWrite(pitanie, LOW);
         delay (80);
         break;
   }
   while (RPM > 6000 && RPM <= 10500) {
         digitalWrite(pitanie, LOW);
         delay (65);
         break;
   }
    while (RPM > 10500) {
         digitalWrite(pitanie, LOW);
         delay (55);
         break;
   }
   digitalWrite(pitanie, HIGH);
         delay (300);                                          // задержка для исключения повторного срабатывания выключения питания
  }

 

1. Условия в 33, 38 и 43 не эквивалентны одному выражению "RPM >= 2000" ? или мне показалось?

2. Вы уверены, что ваши конструкции "while(условие) { /* выполнить что-то */ ; break; }" работают именно так, как вам хотелось бы?

 

 

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

1. В трёх диапазонах оборотов я должен получать разный промежуток времени отключения сигнала.
2. Протестировал подобное условие через порт выполняется исправно, вероятно эти условия можно было записать бес циклов, т.к. цикл по сути мне не нужен, требуется однократное выполнение кода любого из циклов который соответствует условию цикла.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa пишет:

Одна нога с датчика идёт на END другая нога идёт на пин A0, пин A0 также подтянут на землю через резистор 1МОм

Вообще-то словесное описание обычно не может заменить схему целиком, но в данном случае пусть будет так.

Вопрос: какова емкость пьезодатчика?

Те, что есть у меня имеют емкость около 20нФ, т.е. 20е-9. При подключении параллельно резистора на 1М, т.е. 1е+6 постоянная времени будет 0.02, т.е. 20 мс. Соответственно, если измерять что-то с интервалом более 10 мс, адекватного результата мы не получим.

Цитата:

Суть моего проекта довольно простая:

Ждём определённого уровня усилия с датчика...

Вопрос в том, каким именно образом Вы вычисляете, какое усилие приложено к датчику?

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Чуть позже схематично общую схему выложу.
Ёмкость датчика 860 nF.
Измерение требуемого усилия планирую следующим образом: беру первую программу, подключаю датчик на его рабочую позицию и делаю несколько замеров усилия выводя значения в порт. Нахожу среднее усилие вношу в рабочую программу и пробую работать с этими значениями.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa пишет:

Чуть позже схематично общую схему выложу.
Ёмкость датчика 860 nF.
Измерение требуемого усилия планирую следующим образом: беру первую программу, подключаю датчик на его рабочую позицию и делаю несколько замеров усилия выводя значения в порт. Нахожу среднее усилие вношу в рабочую программу и пробую работать с этими значениями.

Еще раз спрашиваю: каким именно образом Вы вычисляете усилие?

Покажите в тексте скетча строки, где происходит вычисление усилия.

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Строки 26-29. Замкнутый цикл while (1) который прекращается при достижении усилия в эквиваленте равного 400 (заранее измеренное значение). Думаю это должно работать таким образом.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Должен Вас разочаровать: в строках 26-29 ничего хотя бы отдаленно напоминающего вычисление усилия не содержится. Там вообще нет никаких вычислений - только измерение напряжения и ожидание наступления условия (кстати, написанное очень криво).

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

В моём понимании напряжение зависит от усилия, усилие мне рассчитывать не нужно, а лишь фиксировать момент достижения определённой величины усилия (напряжения). Написано криво по тому как знания мои на данном этапе в программировании ограничены и вопрос задан в разделе для новичков соответственно. Поправки и замечания приветствуются.
Есть вероятность того, что программа работать не будет, это пока лишь мои предположения, которые я сам смогу проверить собрав схему.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa, скажите, а сколько классов школы Вы окончили? 

Такие слова как заряд, ток, напряжение, сопротивление, емкость, функция, производная, интеграл Вам о чем-то говорят?

Тут ведь вопрос не в программировании, а прежде всего - в физике и математике.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я сам в этом ещё далёкий новичок (интересная новая для меня тема, слежу), но если я правильно понял - andriano намекает, что для расчета усилия важно не только напряжение мерить, но и время (длительность?).

Ни на что не претендую - просто умозаключение исходя из выше им сказанного.

А в #16 имелось ввиду менее 10мс?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вспоминаем физику:

1. Пьезоэлемент - это конденсатор, заряд которого может изменяться под механическим воздействием. У ТС пьезоэлемент помещен в корпус, основным предназначением которого, скорее всего, является сокращение количества степеней свободы до одной. Другими словами, между приложенной силой F и зарядом Q существует некоторая скалярная монотонная зависимость Q = f(F).

2. При сообщении конденсатору некоторого заряда на нем образуется напряжение E=Q/C, где С - емкость конденсатора.

3. На первый взгляд, самое простое - измерить это напряжение. Если нас интересуют только короткие во времени процессы, еще можно как-то выкрутится, но и статической нагрузке конденсатор неизбежно будет разряжаться черед сопротивление изоляции и входное сопротивление вольтметра, которое, к тому же, обычно нелинейно и имеет емкостную составляющую. Ну и напряжение может выходить далеко за пределы диапазона измерения АЦП МК. Например, в пьезозажигалках за счет этого напряжения формируется искра, способная поджечь газ. Ну а там где горит газ, поджарится и МК.

4. Чтобы избежать проблем, связанных с неизвестным нелинейным сопротивлением, параллельно пьезоэлементу подключают измерительный резистор, который ТС почему-то называет подтягивающим. Собственно, величина этого резистора и фигурирует во всех дальнейших расчетах.

5. Через резистор протекает ток, который создает на нем падение напряжения (надеюсь, закон Ома все помнят). Это падение напряжения и измеряется вольтметром (или АЦП МК, что в данном случае одно и то же).

6. Ток, как известно, является производной по времени от заряда. Ну а заряд, соответственно, интегралом тока.

Собственно при измерении нам нужно проинтегрировать ток и таким образом найти заряд, перетекший в процессе измерения через измерительный резистор, а потом по обратной функции F = g(Q) определить приложенное к датчику усилие.

Вот как-то так.

BOOM пишет:

А в #16 имелось ввиду менее 10мс?

Нет, все написано правильно - имеется в виду интервал времени между последовательными измерениями. Период дискретизации.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А, данный интервал (10мс) нужен для суммирования «ряда», минимальная выборка. Или я не в ту степь думаю?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нам надо произвести численное интегрирование. Для этого нужно выбрать шаг по времени. Вот этот шаг и есть.

Кстати, в предыдущем посте я не упомянул - именно численное интегрирование и есть самая сложная часть алгоритма. Но на этот счет написана масса монографий. Так что всяк желающий может повысить свой образовательный уровень путем штудирования последних.

2ТС: IMHO без осциллографа это налаживать немыслимо.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Собственно говоря да, нам нужно «разложить сигнал» на временные интервалы, которые нужны для разложения формы сигнала в ряд, который потом можно просуммировать (ведь интеграл в программировании это именно сходящийся (вот сейчас могу врать) ряд?).

Ой давно это было, в PHP такое не использовал, последний раз на бумаге писал ряды к функциям... ооочень давно. Прошу прощения, что влез в беседу, и, скорее всего, напутал только все.(

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

Собственно говоря да, нам нужно «разложить сигнал» на временные интервалы, которые нужны для разложения формы сигнала в ряд, который потом можно просуммировать (ведь интеграл в программировании это именно сходящийся (вот сейчас могу врать) ряд?).

на практике все проще, численное интегрирование - это сумма амплитуд сигнала через некоторые, обычно равные,  промежутки времени, деленная на интервал Точность интегрирования зависит от частоты считываний, в обшем случае чем чаще считываем - тем точнее интеграл

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Теоретически - да. (правда термин "разложение в ряд" здесь не очень уместен. Но суммирование - да. А о"сходимости" - см. ниже)

Но на практике много нюансов, начиная с того, что измерять нужно будет как положительные, так и отрицательные значения напряжения, и до того, что как-то нужно обрабатывать (т.е. избавляться от) дрейф и постоянную составляющую - при интегрировании очень неприятная вещь.

PS. Это ответ на №27, пока писал, появился №28. Там все верно, но остаются в силе оговорки выше.

PPS. Нет, все-таки не совсем верно, - насколько я понимаю, следить за показаниями нужно постоянно. Соответственно, интегрировать - тоже. Т.е. никакого интервала интегрирования не существует - алгоритм нужно адаптировать к бесконечному интервалу.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Спасибо мужики! Хоть и влез я в чужую тему (да простит меня ТС), но почерпнул очень много!

nik182
Offline
Зарегистрирован: 04.05.2015

Ну зачем все эти заумности - интегралы и прочие заряды? В данном конкретном случае нужна только амплитуда напряжения на кварце. Пожно ставить ограничитель напряжения, что б не спалить вход, но в целом, в цикле считывае напряжение, сравниваем с необходимым порогом и если превысили, то что то делаем. Если убрать вывод в сериал всех значений, а только ждать превышения,то разрешение по времеми можно получить лучше сотни микросекунд, что вполне достаточно, что бы не пропускать событие.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Скорее эту пое**нь надо ставить через триггер Шотки на прерывания и мерять время между и т.д.  А амплитуду это от мартышки и ее очков.

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Я дал ответ не корректный.
Усилие я вычисляю изначально по первой программе #4 убрав оттуда лишние данные выводя в порт максимальные значения напряжения (т.е., которые отличны от значений когда датчик находится в покое).
Делаю двадцать нажатий и использую расчётное среднее значение из порта либо самое большое.
Это значение я взял ориентировочно и вписал его как величину 400 (как только у меня получиться добраться до места установки датчика и выполнить измерение я это значение укажу другое)  в свою рабочую программу проекта сообщение #13
Мой датчик физически не способен выдавать напряжение выше 0,6В. Позже я выйду с отпуска и смогу измерить его показания осциллографом, скрин приложу в тему. По этому я не ставлю стабилизатор напряжения и прочее, а наоборот ограничиваю диапазон измерения для повышения точности analogReference(INTERNAL);.
Вполне возможно я столкнусь в программе проекта (#13) с ситуацией ощутимого превышения усилия на датчике до того как условие будет выполнено из за временного интервала. Буду решать эту проблему при возникновении.

BOOM пишет:

Эта тема открыта для всех я приветствую ваше рассуждение и с радостью подчёркиваю для себя новые знания.

nik182 пишет:

Это я и имел в виду, значения напряжения с моего датчика находится в пределах 0,6 В и как я писал выше я приведу скрин с осциллографа позже.

Ниже информация о себе к прочтению не обязательно, к теме не относится.

andriano пишет:

Для вас пару строк о себе. Я закончил школу, после чего и университет по технической специальности, но из электроники 1 семестр у нас был предмет Электротехника и на том этапе я был не сильно заинтересован в этом предмете хотя сдал экзамен.
После этого прошло уже около 10 лет и моя сфера деятельности ооочень отдалённо связана с электроникой и совсем чутка с программированием (самому программы писать не приходится в общем). По этой причине моя компетентность ограничена. Я изучаю электронику реализуя свои проекты и мне это нравится.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вместо эпиграфа

Бесовские интегралы нам здесь не нужны.

Нам нужны такие же, но православные.

Петрович

nik182 пишет:
Ну зачем все эти заумности - интегралы и прочие заряды? В данном конкретном случае нужна только амплитуда напряжения на кварце...

Вот как же мне нравятся люди, не понимающие физики, но берущиеся давать советы по физическим вопросам.

ТС нужно отслеживать усилие, а Вы предлагаете вместо этого отслеживать скорость изменения этого усилия и утверждаете, что, якобы, это одно и то же.

 

2All:

Кстати, я тут подумал, как настраивать подобное устройство.

Я бы, наверное, взял электромотор с хорошим редуктором (чтобы обеспечить минимум частоты вращения в единицы об/мин), приделал к нему любой преобразователь вращения в возвратно-поступательное движение и эластичный элемент (типа пористой резины), чтобы усилие на датчике менялось по синусоидальному закону с известной частотой.

А дальше - критерием правильности настройки я бы считал независимость амплитуды синусоиды выходного (посчитанного) сигнала от частоты вращения в требуемом диапазоне частот. На практике выходной сигнал можно реализовать через ШИМ с последующей интегрирующей цепью - и на осциллограф. Это намного нагляднее, чем циферки в мониторе порта и заодно менее ресурсоемко.

При измерении "амплитуды напряжения на кварце", очевидно, этот критерий выполняться не будет.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa пишет:

Для вас пару строк о себе. Я закончил школу, после чего и университет по технической специальности, но из электроники 1 семестр у нас был предмет Электротехника и на том этапе я был не сильно заинтересован в этом предмете хотя сдал экзамен.

После этого прошло уже около 10 лет и моя сфера деятельности ооочень отдалённо связана с электроникой и совсем чутка с программированием (самому программы писать не приходится в общем). По этой причине моя компетентность ограничена. Я изучаю электронику реализуя свои проекты и мне это нравится.

Хорошо, поступлю аналогично.

ФУПМ МФТИ, где я учился, единственный факультет, где не изучали ни электротехнику, ни электронику, ни радиотехнику, ни схемотехнику либо что-нибудь подобное (все освободившееся в учебном плане время было отдано под программирование и численные методы). Хотя, в школе учился в классе с углубленным изучением физики и радиоэлектроники. Ну и школа была достойной по любым критериям.

Но имел хобби - в широком смысле - радиолюбительство, но собственно к радио никакого отношения не имевшего - интересовала звуковая техника и электронные музыкальные инструменты.

С программированием сталкивался профессионально, а в качестве хобби программирование стало вместе с первым ПК. Да - Радио РК-86. Через некоторое время на 20 лет забросил электронику (как хобби), переключившись на программирование (естественно, IBM PC совместимые). Ну а в 2015 открыл для себя Ардуино, где эти оба увлечения соединились.

Ну и, отвечая на Ваш пост: если Вы действительно занимаетесь своими проектами, то перед Вами неизбежно встанет вопрос овладения фундаментальными знаниями. Иначе ваш удел лишь повторять чужие проекты, возможно, с незначительной модификацией.

nik182
Offline
Зарегистрирован: 04.05.2015

andriano пишет:

nik182 пишет:
Ну зачем все эти заумности - интегралы и прочие заряды? В данном конкретном случае нужна только амплитуда напряжения на кварце...

Вот как же мне нравятся люди, не понимающие физики, но берущиеся давать советы по физическим вопросам.

ТС нужно отслеживать усилие, а Вы предлагаете вместо этого отслеживать скорость изменения этого усилия и утверждаете, что, якобы, это одно и то же.

Я бы поспорил с тем, кто знает физику лучше. По крайней мере напряжение к скорости прямого отношения не имеет. Если приложение силы к датчику по времени сильно не меняется, то и интеграл и максимум напряжения на датчике для одного и того же порогового усилия дадут одинаковый результат. Но программировать через напряжение, особенно для начинающего, намного проще. 

А вообще это мне напоминает анекдот про Холмса и Ватсона на воздушном шаре. На вопрос - где мы? Получить ответ: на воздушном шаре. Абсолютно точный, но совершенно не нужный. Зачем начинающему Ваши тонкости. Вы описали ситуацию правильно, но мне кажется что ТС пока не в состоянии это оценить и использовать в программе.   

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Я бы поспорил с тем, кто знает физику лучше.

Я должен как-то реагировать на это заявление?

Цитата:

По крайней мере напряжение к скорости прямого отношения не имеет.

Здесь я с Вами полностью согласен. 

Можно даже убрать слово "прямого" - просто отношения не имеет.

Собственно, "напряжение" встречается в моих рассуждениях два раза: первый раз в п.2 - но только упоминается, без дальнейшего использования. А второй раз - в п.5, где по сути само напряжение нам тоже не нужно, а нужен ток через резистор. Но МК может измерять только напряжения.

Цитата:

Если приложение силы к датчику по времени сильно не меняется,

Можно это сформулировать как-то иначе? Что такое "приложение силы к датчику"? Я не могу понять это утверждение.

Цитата:

то и интеграл и максимум напряжения на датчике для одного и того же порогового усилия дадут одинаковый результат.

Хотелось бы посмотреть на доказательство этого утверждения. В общем случае оно представляется неверным.

Притом, неверным от слова "совсем".(* см. Примечание)

Цитата:

Но программировать через напряжение, особенно для начинающего, намного проще. 

Кто бы спорил!

Но при таком подходе мы уподобляемся пьяному из анекдота, который ищет часы не там, где их потерял, а у фонаря - где светлее.

Цитата:

А вообще это мне напоминает анекдот про Холмса и Ватсона на воздушном шаре. На вопрос - где мы? Получить ответ: на воздушном шаре. Абсолютно точный, но совершенно не нужный. Зачем начинающему Ваши тонкости. Вы описали ситуацию правильно, но мне кажется что ТС пока не в состоянии это оценить и использовать в программе.   

Анекдотами обменялись - это уже хорошо!

А по поводу дальнейшего хочу сделать два замечания:

1. Я абсолютно с Вами согласен, что ТС эта задача не по зубам. Но сама эта информация, мне кажется, будет ему полезна.

2. "Тонкости" начинающему, продолжающему либо даже заканчивающему нужны для того, что без знания этих "тонкостей" получается все совершенно неправильно.

 

* Примечание.

Доказательство того, что "неправильно от слова "совсем"":

Рассмотрим два случая:

- мы медленно нажимаем на датчик с некоторым заданным конечным усилием.

- мы быстро нажимаем на тот же датчик с тем же самым конечным усилием.

Усилие - одно и то же. Перетекший заряд - площадь под кривой тока - один и тот же. Ширина импульса во втором случае меньше, а, следовательно (из равенства площадей), высота - больше. Т.е. доказано, что при равных усилиях получаем разную высоту пиков.

Но Вами утверждалось, что вычисление интеграла и измерение высоты пика дадут один и тот же результат.

Если обозначить:

E1 - высота пика в первом случае,

E2 - высота пика во втором случае,

F1 - "усилие" в первом случае,

F2 - "усилие" во втором случае,

Ваше утверждение эквивалентно следующей системе уравнений:

E1 == F1

E2 == F2

F1 == F2

E1 != E2

что, очевидно, не выполняется никогда.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Я сразу обозначил условие что нажатие одинаково по времени. При резном времени Ваши выкладки справедливы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не, ну если нажимать всегда в одном темпе и с одной силой, то в программе вообще можно ничего не измерять, а заменить константой.

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Сделал замеры как обещал ранее, фото прикрепляю.
1 фото без резистора

 

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Второе фото с резистором 1 МОм. Усилие прикладывал руками получалось по разному.
Тут я увидел напряжение всё же выходит за пределы допустимого, по этой причине придётся его ограничить.

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Взял стабилитрон на 5,1В и поставил параллельно резистору, возможно это не правильно, решил ток очень незначительный и токоограничивающий резистор не нужен. Также изменил полярность подключения на фото можно заметить. Получилось как то так:

I-Antoxa
Offline
Зарегистрирован: 12.02.2022

Так же прикрепляю схему проекта где планирую использовать датчик. Буду рад обоснованным корректировкам.
На этой схеме обороты хочу считывать через катушку, есть аналогичный вариант с использованием датчика распредвала.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

I-Antoxa пишет:

Второе фото с резистором 1 МОм. Усилие прикладывал руками получалось по разному.
Тут я увидел напряжение всё же выходит за пределы допустимого, по этой причине придётся его ограничить.

Хотелось бы увидеть схему измерения.

Ну и по сигналу прекрасно видно, что сигнал представляет собой производную от воздействия. И, кстати, было бы лучше, если бы Вы все-таки прикладывали усилие не "руками", а обеспечили воспроизводимость результата, как это описано в сообщении №34.