Частотомер на Arduino UNO и LCD KeyPad Shield

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Братцы! Только не бейте по голове за дилетантский вопрос или если подобная тема уже тут обсуждалась - я честно искал по форуму и ничего похожего не нашел.

А суть вопроса вот в чем: начал я делать частотомер на базе Arduino Uno с воткнутым в него LCD KeyPad Shield . Удобная штука этот шилд - кнопки можно использовать для выбора режимов измерений, двухстрочный дисплей - для вывода результатов и разной вспомогательной информации.  Для измерения частоты нашел библиотеки FreqMeasure и FreqCount. Первая из них предназначена для измерения частот до 1 кГц, вторая - выше 1 кГц. Попробовал - работают хорошо.

Но как только стал собирать все это хозяйство вместе, столкнулся со следующей проблемой. Библиотеки эти предполагают, что измеряемая частота подается на pin 5 (для FreqCount) и pin 8 (для FreqMeasure), причем, похоже, что изменить их на другие в исходных текстах этих библиотек невозможно, поскольку они связаны с конкретными входами таймеров Arduino. С другой стороны, LCD KeyPad Shield использует пины с 4-го по 9-й из коих 8 и 9 для управляющих сигналов и 4-7 для передачи данных. Т.е. входы 5 и 8, которые мне нужны для подачи измеряемых сигналов, заняты дисплейным модулем. Что в таком случае делают опытные товарищи?

Заранее благодарен всем, кто сможет что-нибудь посоветовать.

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Doctor, освобождать пины, как ещё. Я б наверное выпаял дисплей, подключил его к плате через  этот модуль, и получил i2c дисплей.

slider
Offline
Зарегистрирован: 17.06.2014

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

лучше выпаять пины с кейпад шилда и перекинуть их другие.

Зачем много кнопок? и вообще подумайте так ли без них не обойтись для частотомера? 

я делал частотомер на arduino pro mini и lcd1602 , перерыл инет в поиске готовых проектов, перепробовал многие, потратил пару деньков, (очень плохо и коряво работали) , остановился именно на FreqCount.h FreqMeasure.h . Вместо кнопок и меню , просто сделал джампер .

FreqCount vs FreqMeasure :

FreqCount: best for 1 kHz to 8 MHz (up to 65 MHz with Teensy 3.0 & 3.1)

FreqMeasure: best for 0.1 Hz to 1 kHz

Сам скетч:

// частотомер // Slider 
// если нато переключить на точность с сотыми долями до 1Кгц, то снять перемычку с А4-А7,
// и нажать на ардуиновскую кнопку reset на плате
#include <FreqCount.h>
#include <FreqMeasure.h>
#include <LiquidCrystal.h>
const int ledPin=13;
float k=1.0002286; // k=1.0002285 
unsigned long int fr;
boolean rezhim=0; 
//1 - FreqCount: best for 1 kHz to 8 MHz (up to 65 MHz with Teensy 3.0 & 3.1)
//0 - FreqMeasure: best for 0.1 Hz to 1 kHz
double sum=0;
float frequency=0;
//int count=0;
unsigned long count;
LiquidCrystal lcd(10, 11, A0, A1, A2, A3);

void setup() 
{
 pinMode(5, INPUT); // вход FreqCount
 pinMode(8, INPUT); // вход FreqMeasure 
 pinMode(12, INPUT); // параллелиться с входами просто как держатель , для удобства расположения рядом с + - +12v
  lcd.begin(16, 2);
   pinMode(ledPin, OUTPUT);
   pinMode(A4, OUTPUT);  
   digitalWrite(A4, HIGH); // если перемычка установлена 
   pinMode(A7, INPUT);     // то FreqCount  иначе FreqMeasure
  if (analogRead(A7)>500) rezhim=1 ; 
  if (rezhim==1) { lcd.print("freq  1kHz..8MHz"); FreqCount.begin(1000); }
            else { lcd.print("freq 0.1Hz..1kHz"); FreqMeasure.begin(); }
  
}


void loop() 
{
 //if (rezhim==1) FreqCountFunction(); //else  FreqMeasureFunction();
while (rezhim==1)
{
if (FreqCount.available()) 
   {
    //unsigned long count = FreqCount.read();
    count = FreqCount.read();
    lcd.setCursor(0, 1);
    fr=count*k;
    lcd.print(fr);
    lcd.print("       ");
    digitalWrite(ledPin, HIGH);
    delay(50);
    digitalWrite(ledPin, LOW);
    delay(250);
    }  
}   


while (rezhim==0)
{  
if (FreqMeasure.available()) 
  {
    // average several reading together
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 30) 
    {
      frequency = FreqMeasure.countToFrequency(sum / count);
      lcd.setCursor(0, 1);
      lcd.print(frequency);
      lcd.print("       ");
      sum = 0;
      count = 0;
      digitalWrite(ledPin, HIGH);
      delay(50);
      digitalWrite(ledPin, LOW);
      delay(250);
    }
  }  


}

 
}

Для защиты по входу и питанию налепил стабилитронов . Резисторы: перед входом 100 ом, для контрастности дисплея с VSS (gnd)  на V0 2,2-2,7ком  ,  на RW перемычка 

 

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Спасибо братцы dimax и slider! Оба ответа полезные, но достаточно очевидные. Я, честно говоря, ожидал какой-нибудь хитрости, которая позволила бы не сильно курочить имеющуюся аппаратную часть т.е. продолжать использовать LCD KeyPad Shield без выпаивания дисплея и выкусывания ножек. Нельзя ли, например, просто разделить процессы измерения частоты и индикации результатов во времени следующим образом:

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

1. Снять сигнал Enable с дисплейного модуля (pin 9), чтобы он перестал чувствовать, что у него на всех других входах делается.

2. Открыть входной ключ, подав тем самым измеряемый сигнал на пины 5 и 8.

3. Выполнить цикл измерения частоты методами FreqCount или FreqMeasure (в зависимости от измеряемой частоты выбрав тот или другой метод) и запомнить результат. 

4. Запереть входной ключ, сняв тем самым измеряемый сигнал с пинов 5 и 8.

5. Разрешить работу дисплея и вывести на него результат измерений.

Повторить все вышеуказанное в цикле.

Таким образом, во время измерения частоты пины 5 и 8 будут использоваться для подачи измеряемого сигнала, а во время передачи данных на дисплейный модуль - для обмена данными с дисплеем. Так можно?

 

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

slider пишет:

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

По-моему вы ошибаетесь, никакой завязки там нет, библе совершенно безразлично с какими пинами работать, я включал всегда как мне удобно было, -никаких проблем. Можно на аналоговые повесить, -все в одном ряду. LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

dimax пишет:

slider пишет:

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

По-моему вы ошибаетесь, никакой завязки там нет, библе совершенно безразлично с какими пинами работать, я включал всегда как мне удобно было, -никаких проблем. Можно на аналоговые повесить, -все в одном ряду. LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

Нет, slider прав - в библиотеках FreqCount и FreqMeasure все завязано на таймер и прерывания. У Arduino UNO два восьмиразрядных таймера и один 16-ти разрядный, именно он и используется, а этот таймер и входы прерываний сидят на конкретных пинах поэтому изменить их невозможно.

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

 

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Doctor, я думал, что он про LCD пишет. Только сейчас дошло, что он имел ввиду библы частотомеров. Это да, там очень сильная привязка, я сам писал скетчи частотомеров и генераторов, без библиотек, так что с аппаратно-программной частью знаком не по наслышке :)

По поводу разделить задачи -да, в теории можно. Но, скорее всего придёться отказаться от всех библиотек и переписать всё с ноля :))

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Doctor, сделал скетч частотомера с расшарингом 5-го пина на двоих с LCD.  Оказалось, что он почти всё время сидит в Z-состоянии, и только в момент вывода на дисплей там пролетает пачка импульсов длиной 3ms. В идеале этот пин нужно коммутировать, что -б совсем избегать той ситуации, когда и входной сигнал идёт на пин, и МК переключил пин в OUTPUT  Но я просто подрубил  входящий сигнал через килоомный резистор. И о чудо, всё работает. И на LCD никаких глюков, и частота измеряется. С этим скетчем рабочий диапазон измерения примерно 1Гц..3МГц

volatile unsigned int int_tic=0; 
volatile unsigned long tic; 
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0; 
lcd.setCursor(0, 0);
lcd.print(tic);
lcd.print(" Hz  ");


}



 

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

dimax

Потрясающе! Вот это ровно то, о чем я и мечтал! И пилить ничего не надо, и конфликт пинов разрешен. Спасибо, dimax!

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

hik1981
hik1981 аватар
Offline
Зарегистрирован: 04.02.2016

dimax спасибо Вам за ваш труд.

AUno
Offline
Зарегистрирован: 08.06.2016

dimax пишет:

Doctor, сделал скетч частотомера с расшарингом 5-го пина на двоих с LCD.  Оказалось, что он почти всё время сидит в Z-состоянии, и только в момент вывода на дисплей там пролетает пачка импульсов длиной 3ms. В идеале этот пин нужно коммутировать, что -б совсем избегать той ситуации, когда и входной сигнал идёт на пин, и МК переключил пин в OUTPUT  Но я просто подрубил  входящий сигнал через килоомный резистор. И о чудо, всё работает. И на LCD никаких глюков, и частота измеряется. С этим скетчем рабочий диапазон измерения примерно 1Гц..3МГц

volatile unsigned int int_tic=0; 
volatile unsigned long tic; 
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0; 
lcd.setCursor(0, 0);
lcd.print(tic);
lcd.print(" Hz  ");


}



 

 

Это просто шедевр) Я сейчас как раз собираю "Шмеля"-радиомикрофончик маленький.(http://vrtp.ru/index.php?act=categories&CODE=article&article=1892)

А частометра, к сожалению, нет, но ардуино как всегда под рукой. Можно ли ваш скетч переделать под ардуино уно, и если можно, то как?

gena
Offline
Зарегистрирован: 04.11.2012

  А как этот частотомер можно применить к "Шмелю"?

AUno
Offline
Зарегистрирован: 08.06.2016

Он нужен для настройки радиосигнала, испускаемого от антенны

 

gena
Offline
Зарегистрирован: 04.11.2012

 У Вас есть уверенность, что частотомер на ардуине измерит несущюю частоту "Шмеля"?

AUno
Offline
Зарегистрирован: 08.06.2016

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

gena
Offline
Зарегистрирован: 04.11.2012

 Похвально.

AndryGladky
Offline
Зарегистрирован: 09.10.2014

Здравствуйте, подскажите по подключению этого частотомера, подключаю тахогенератор для измерения частоты один выход на вход, второй на Gnd, не работает. Когда подключаю один на вход, второй на заземление тогда работает, почему так?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

AndryGladky, что у вас подразумевается под "заземлением", и почему это не тоже самое, что "Gnd" -нам не известно.

AUno
Offline
Зарегистрирован: 08.06.2016

Напишите, пожалуйста, что к чему подключать. Какие выводы LCD к каким входам ардуинки, что "висит в воздухе" и используется для определения частоты. 

AUno
Offline
Зарегистрирован: 08.06.2016

Напишите, пожалуйста, что к чему подключать. Какие выводы LCD к каким входам ардуинки, что "висит в воздухе" и используется для определения частоты. 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

AUno, успокойтесь уже, этот частотометр до 3МГц, вы не измерете частоту своего радиомикрофона. Даже если бы он был до 200МГц, вы бы всё равно не измерили -потому что нельзя просто так подключить М.К. к антенне передатчика без согласования и усиления. 

AndryGladky
Offline
Зарегистрирован: 09.10.2014

Я взял тахогенератор для измерения скорости ветра, это двигатель переменного тока. Когда один вывод его подключаю к pin 8, а второй к gnd, то показывает нули. Когда беру один вывод подключаю к pin 8, а второй к металлическому столу который подключен к контуру заземления, то он нормально работает, измеряет частоту. LCD подключен проводами на макетной плате к 12, 11, 6, 4, 3, 2 пины.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

AndryGladky, тахогенератор подключается к М.К. только через специальную схему согласования.

AndryGladky
Offline
Зарегистрирован: 09.10.2014

А какую?

AndryGladky
Offline
Зарегистрирован: 09.10.2014

Я снимал с него сигнал осцилографом, там обычная синусоида, только надо ставить делитель так как при высоких оборотах он дает до 40 вольт.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

AndryGladky, что бы подключить источник переменного тока к МК для измерения частоты нужно - (1) исходный сигнал выпрямить или срезать отрицательную часть синуса. (2) Ограничить макс. напряжение.(3) компаратором или триггером Шмитта сделать меандр. После всех этих преобразований можно подать на вход М.К.

AndryGladky
Offline
Зарегистрирован: 09.10.2014

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

facset
Offline
Зарегистрирован: 10.08.2016

Возможно уже не актуально, и без LCD дисплея (немного не по теме), но все же... за основу взял скетч из поста №2, добавил в него кнопку для переключения режимов измерений.

// частотомер
#include <FreqCount.h>
#include <FreqMeasure.h>

unsigned long count;
int cont;
double sum=0;
boolean rezhim=1;    
boolean flag=0;   

float frequency=0; // FreqMeasure: измерение от 0.1 Hz до 1 kHz
float k=1.0002286; // k=1.0002285 
unsigned long int fr; // FreqCount: измерение от 1 kHz до 8 MHz

void setup() 
{
 Serial.begin(9600);
 pinMode(2,INPUT); // кнопка выбора режима
 pinMode(5,INPUT); // вход FreqCount
 pinMode(8,INPUT); // вход FreqMeasure 
 FreqCount.begin(1000);
 FreqMeasure.begin(); 
}


void loop() 
{
 if(digitalRead(2)==LOW&&flag==0) 
   { 
    rezhim++;   //выбираем режим
    flag=1;          
    if(rezhim>2)rezhim=1;
   }  
 if(digitalRead(2)==HIGH&&flag==1)flag=0;
        switch (rezhim)
         {
          case (1):  //действие в режиме 1
             if (FreqCount.available()) 
             {
               count=FreqCount.read();
               fr=count*k;
               Serial.print(fr);
               Serial.println("  kHz");

             }  
          break;
          case(2):  //действие в режиме 2
            if (FreqMeasure.available()) 
                {
                 sum=sum+FreqMeasure.read();
                 cont=cont+1;
                 if(cont>30) 
                   {
                    frequency=FreqMeasure.countToFrequency(sum/cont);

                    Serial.print(frequency);
                    Serial.println("  Hz");
                    sum=0;
                    cont=0;
                   }
                }
           break;
         }
}

 

pastry777
Offline
Зарегистрирован: 16.01.2014

подскажите пожалуйста,как измерить частоту в сети 220в?как правильно развязаться с высоковольтной частью?

pastry777
Offline
Зарегистрирован: 16.01.2014

dimax пишет:

AndryGladky, что бы подключить источник переменного тока к МК для измерения частоты нужно - (1) исходный сигнал выпрямить или срезать отрицательную часть синуса. (2) Ограничить макс. напряжение.(3) компаратором или триггером Шмитта сделать меандр. После всех этих преобразований можно подать на вход М.К.

можно подробнее как срезать отрицательную часть синуса?

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

pastry777 пишет:

dimax пишет:

AndryGladky, что бы подключить источник переменного тока к МК для измерения частоты нужно - (1) исходный сигнал выпрямить или срезать отрицательную часть синуса. (2) Ограничить макс. напряжение.(3) компаратором или триггером Шмитта сделать меандр. После всех этих преобразований можно подать на вход М.К.

можно подробнее как срезать отрицательную часть синуса?

Я бы еще вдобавок к вышеописанному использовал какую-нибудь оптопару чтобы получить гальваническую развязку между сетью и общим проводом частотомера. Иначе частотомер этот может очень больно кусаться. :)

 

facset
Offline
Зарегистрирован: 10.08.2016

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

pastry777
Offline
Зарегистрирован: 16.01.2014

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

 

схемку бы как компаратор подключить в данном случае=)а то шмидта только сборки есть на 4 штуки в одном корпусе,габаритно и расточительно....

facset
Offline
Зарегистрирован: 10.08.2016

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

facset
Offline
Зарегистрирован: 10.08.2016

pastry777 не подскажешь модельку Шмитта, которае есть у тебя, а то знаю только про 74HC14 но ее в городе не нашол, да и что то подобное не попадается а заказывать онлайн от 150/200р за шт жаба душит

pastry777
Offline
Зарегистрирован: 16.01.2014

да,у меня именно 74НС14....спутал,там 6 каналов...так давно их не касался,что уже и забыл....я из Украины,покупал еще давно,сейчас специально цены посмотрел,продается в переводе рублей 15 за штуку...то сайт у вас дорогой какой-то видимо,поищите еще...

facset
Offline
Зарегистрирован: 10.08.2016

pastry777 пишет:

да,у меня именно 74НС14....спутал,там 6 каналов...так давно их не касался,что уже и забыл....я из Украины,покупал еще давно,сейчас специально цены посмотрел,продается в переводе рублей 15 за штуку...то сайт у вас дорогой какой-то видимо,поищите еще...

дело в том где можно по штучно взять - 150р и далее цены, где по 15\20р то там либо за доставку 300 \ 500 р отвали либо товару у них на 1.5к набирать, а из-за 1 микросхемки на..... надо

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Есть оптопары со встроенным триггером Шмитта, вот такие, например, H11L1M, H11L2M, H11L3M  или SFH6720T и масса аналогичных. Можно из китайщины достаточно дешево выписать, вот тут за 88 рублей 10 штук предлагают, только посылки из Китая не очень быстро доходят, иногда больше месяца ждать приходится.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

pastry777, всё зависит от того, что вы хотите получить. В принципе уже после оптрона будет почти квадратный сигнал. Дальнейшая обработка целесообразна если нужно высокое качество.

 

pastry777
Offline
Зарегистрирован: 16.01.2014

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

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

pastry777
Offline
Зарегистрирован: 16.01.2014

Doctor пишет:

Есть оптопары со встроенным триггером Шмитта, вот такие, например, H11L1M, H11L2M, H11L3M  или SFH6720T и масса аналогичных. Можно из китайщины достаточно дешево выписать, вот тут за 88 рублей 10 штук предлагают, только посылки из Китая не очень быстро доходят, иногда больше месяца ждать приходится.

Спасибо!заказал 1 лот этих оптопар,так,впрок,на будущее,даже если сейчас не пригодятся)

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

provan
Offline
Зарегистрирован: 29.11.2016

Я новичок в програмировании на ардуино и у меня возникла проблема в измерении быстрых процессов. Например когда я пытаюсь считать данные с акселирометра ADXL335 ардуино не поспевает чертить данные на экран в ввиде кривой линии. Хотелось бы увеличить частоту до 1Кгц. Если кто знает как это сделать помогите пожалуйста  

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

Частоту чего до 1 кГц?

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

Если же Вы хотите рисовать на экране 1000 fps, то об Ардуине сразу забудьте.

Если стоит задача нарисовать наэкране кривую, снятую с прибора с частотой 1000 отсчета в секунду и прибор это позволяет, то сначала нужно считать всю серию измерений в массив и только после окончания измерения рисовать кривую на экране.

vasus
Offline
Зарегистрирован: 18.05.2017

1

vasus
Offline
Зарегистрирован: 18.05.2017

dimax пишет:

Doctor, сделал скетч частотомера с расшарингом 5-го пина на двоих с LCD.  Оказалось, что он почти всё время сидит в Z-состоянии, и только в момент вывода на дисплей там пролетает пачка импульсов длиной 3ms. В идеале этот пин нужно коммутировать, что -б совсем избегать той ситуации, когда и входной сигнал идёт на пин, и МК переключил пин в OUTPUT  Но я просто подрубил  входящий сигнал через килоомный резистор. И о чудо, всё работает. И на LCD никаких глюков, и частота измеряется. С этим скетчем рабочий диапазон измерения примерно 1Гц..3МГц

volatile unsigned int int_tic=0; 
volatile unsigned long tic; 
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0; 
lcd.setCursor(0, 0);
lcd.print(tic);
lcd.print(" Hz  ");


}



 

День добрый! Собираюсь смастерить частотомер с индикацией через 7-ми сегментные LED индикаторы. Планирую также кнопкой задавать кол-во импульсов за оборот (к примеру кол-во зубьев шестерни). Заниматься ардуино только только начал. Статью о прерываниях почитал здесь. И, пока, мало что понял по использованию таймеров и прерываний. Заинтересовал Ваш скетч по опредению частоты, а так же наткнулся на вот эту статью
 
 
скетч которой мне более понятен. Подскажите достоинства и недостатки двух разных подходов для данной задачи. К чему мне стоит больше обратиться, начать углубляться в прерывания, или воспользоваться этим простым для меня примером?
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vasus, очевидно, разница в ошибке округления.

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

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

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

vasus
Offline
Зарегистрирован: 18.05.2017

andriano, Спасибо, я и не сообразил что полупериоды беруться с разных периодов. Тогда конечно это для более менее равномерного вращения. хотя , если необходимо замерить частоту вращения вала зубчатым колесом, то, думаю, будет достаточно. но может возникнуть следующая проблема, если сигнал от индуктивного датчика будет "оквадрачиваться" (например триггером-Шмидта) то, при налинии не постоянного зазора между зубьями и датчиком, будет меняться амплитуда сигнала на протяжении одного оборота и , следовательно , будет непостоянной ширина "оквадраченного" импульса. И тогда будет белиберда... Вопрос по первому случаю, если увеличить время замера кол-ва импульсов, точность на низких частотах возрастёт?

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

vasus пишет:

Вопрос по первому случаю, если увеличить время замера кол-ва импульсов, точность на низких частотах возрастёт?

Естественно, возрастет. Но... чтобы полусить две цифры после запятой, придется увеличить время измерения до 100 секунд.

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

ssss
Offline
Зарегистрирован: 01.07.2016

andriano пишет:

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

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

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

shtep
Offline
Зарегистрирован: 16.06.2017

Здравствуйте. Дабы не поднимать новых тем спрошу здесь.

Собрал емкостной датчик влажности. Для измерения частоты генератора воспользовался кодом dimax. Все  прекрасно и стабильно считывается.

Теперь у меня огромная проблема: у меня таких датчиков 3 штуки. Как мне с одной ардуины считать показания с трех генераторов? (частота порядка 120кГц)

Это вообще реально сделать на UNO или же на DUE ?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

shtep, нужна плата с тремя 16-битными таймерами + что бы были выведены три их тактовых входа. Насчёт  Due непомню, как там с \тим делом. Да и не найдёте вы примеров на неё. В стандартной плате мега2560 туча таймеров, но выведено лишь два тактовых входа.  Есть вариации плат мега2560 со всеми распаяными  пинами, вот например. Думаю это для вас самый оптимальный вариант.