Вопрос по быстродействию

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

Задача, считывать показания с промышленного датчика с выходным сигналом 4...20мА с частотой 10раз в секунду и регистрировать их (в любом виде для последующей обработки), имеется arduino duemilanove + модуль RTC на DS1307 и модуль для работы с картой.
Вопроса три.
1. Возможно ли получить данные с модуля RTC со зщначениями точнее 1 секунды, погуглив понял что дискретность 
DS1307 - одна секунда.

2. С какой максимальной частотой сам контроллер позволит опрашивать датчик и записывать данные. (повторюсь цель - 10Гц)

3. Подключение промышленного датчика 4...20мА к пятивольтовому входу ардуино, тут как я понимаю нужен резистор для приведения напряжения питания датчика (24В) в пятивольтовый сигнал.
 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

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

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

речь о DS1307? что значит внешнее прерывание

std
Offline
Зарегистрирован: 05.01.2012

Открываем datasheet и читаем:

Адрес 0x07.

Бит 4 - SQWE. Ставим в единицу.

Биты 1, 0 -  Rate select. Оба нули - на выходе частота 1 Гц; 01 (MSBFIRST, т. о. RS1=0, RS0=1) - 4096 Гц; 10 - 8192 Гц; 11 - 32768 (частота кварца). Поделить можно счётчиком или T-триггерами (D-триггерами у которых выход _Q соединён с входом D). Делится степенями двойки, так что 10 Гц не получится, только 16. Или уже 8. Либо оставляем частоту кварца и считаем ардуиной до 3277-го импульса, но будет неточно, это 9.99938 Гц. Если считать до 3276-го, будет 10.00244 Гц.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

DS1307 тут как собаке пятая лапа. Если нужна высокая точность в измерении отрезков времени, то удобнее сделать специализированный контроллер  с хорошим кварцевым генератором на 16МГц (ибо на ардуинах стоит г@вно). Он будет считать время точнее любого ds1307. И производить какие-либо действия точно 10 раз в секунду.

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

std пишет:

Открываем datasheet и читаем:

Адрес 0x07.

Бит 4 - SQWE. Ставим в единицу.

Биты 1, 0 -  Rate select. Оба нули - на выходе частота 1 Гц; 01 (MSBFIRST, т. о. RS1=0, RS0=1) - 4096 Гц; 10 - 8192 Гц; 11 - 32768 (частота кварца). Поделить можно счётчиком или T-триггерами (D-триггерами у которых выход _Q соединён с входом D). Делится степенями двойки, так что 10 Гц не получится, только 16. Или уже 8. Либо оставляем частоту кварца и считаем ардуиной до 3277-го импульса, но будет неточно, это 9.99938 Гц. Если считать до 3276-го, будет 10.00244 Гц.

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

http://zelectro.cc/RTC_DS1307_arduino нашел здесь про частоты  то о чем вы говорили, и о том как силами ардуино переключить в генератор импульсов и задать частоту. Но как считать эти импульсы с выхода SQW/OUT

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

dimax пишет:

DS1307 тут как собаке пятая лапа. Если нужна высокая точность в измерении отрезков времени, то удобнее сделать специализированный контроллер  с хорошим кварцевым генератором на 16МГц (ибо на ардуинах стоит г@вно). Он будет считать время точнее любого ds1307. И производить какие-либо действия точно 10 раз в секунду.

нужно решить задачу имеющимися средствами, точность измерений отрезков времени не нужна

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ghttoblstr, тогда взять с 1307 частоту 4096Гц, завести её на счётный вход таймера1. Каждые 256 импульсов создавать прерывание -в нём делать свои дела. Это будет 16 раз в секунду.

Logik
Offline
Зарегистрирован: 05.08.2014

ghttoblstr пишет:

Задача, считывать показания с промышленного датчика с выходным сигналом 4...20мА с частотой 10раз в секунду 

Откуда вообще проблемы с точностью интервала? Датчик с аналоговым выходом, 10Гц это предел его быстродействия или хотелок ТС. Очевидно ТС слабо представляет возможности контроллера, не пугайте его рассказами о хреновом кварце, он восприймет это как "туда-сюда пол лаптя". Тут погрешность до процента не проблема.

По вопросам

1. DS1307 выкинуть и забыть, по постановке задачи не требуется.

2. аналоговый ввод до 75кГц

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

std
Offline
Зарегистрирован: 05.01.2012

ghttoblstr,

unsigned long timestamp=millis();
if(millis()-timestamp>=100){
  // sensor poll here
  timestamp=millis();
}

 

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

Logik пишет:

ghttoblstr пишет:

Задача, считывать показания с промышленного датчика с выходным сигналом 4...20мА с частотой 10раз в секунду 

Откуда вообще проблемы с точностью интервала? Датчик с аналоговым выходом, 10Гц это предел его быстродействия или хотелок ТС. Очевидно ТС слабо представляет возможности контроллера, не пугайте его рассказами о хреновом кварце, он восприймет это как "туда-сюда пол лаптя". Тут погрешность до процента не проблема.

По вопросам

1. DS1307 выкинуть и забыть, по постановке задачи не требуется.

2. аналоговый ввод до 75кГц

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

10Гц предел моих хотелок, можно больше.

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

2. это предел ардуино?

3. датчик давления DMP 330L
Диапазон: 0...400бар
Выходной сигнал: 4...20 мА / 2-х пров.
Питание 12...36В (блок питания есть 24В)

4003-1-100-800-00R
http://www.bdsensors.ru/pdf/doc/dmp330l.pdf

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

dimax пишет:

DS1307 тут как собаке пятая лапа. Если нужна высокая точность в измерении отрезков времени, то удобнее сделать специализированный контроллер  с хорошим кварцевым генератором на 16МГц (ибо на ардуинах стоит г@вно). Он будет считать время точнее любого ds1307. И производить какие-либо действия точно 10 раз в секунду.


А я бы посчитал сколько импульсов таймера "влезет" в эту секунду.
И иногда корректировал эту "константу". Под изменение кварца 16 МГц.
Можно даже при каждом импульсе.
Время считать по предыдущей "константе времени" , а  менять её по окончении текущей секунды
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ghttoblstr пишет:

10Гц предел моих хотелок, можно больше.

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

Вот пример вашей задачи без использования RTC. Измерение 10 раз в секунду напряжения на аналоговом входе A0, и вывод результата в сериал вместе с текущим временем (часы, минуты, секунды, сотые секунды)

void setup(){
Serial.begin(9600);
TCCR1A=(1<<WGM11); //режим14 FAST PWM 
TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12); //делить частоту CPU на 256
ICR1=6249;  // (16000000MHz /div256) -1 = 10 раз в секунду
TIMSK1=(1<<TOIE1); //разрешить прерывание
}

ISR (TIMER1_OVF_vect) { 
static uint8_t chas, minut, secu, msec;
msec++ ; //инкремент переменной каждую 1/10 секунды
if (msec==10){msec=0; secu++; }
if (secu==60){secu=0; minut++; }
if (minut==60){minut=0; chas++; }
if (chas==24){chas=0;}
Serial.print("Data="); Serial.print(analogRead(A0));
Serial.print("   Time= "); Serial.print(chas); Serial.write(':');
Serial.print(minut); Serial.write(':');  Serial.print(secu); 
Serial.write(':'); Serial.print(msec); Serial.println();
}

void loop(){
}

Гриша
Offline
Зарегистрирован: 27.04.2014

Есть такое впечатление, что ТС ни в электронике, ни в программировании не понимает. Как и где хранить результаты, я так понял следующий вопрос? Если делать некоторую точно без заморочек, хватит МК. То просто поделить на интервалы :

либо пост 9, или этот вариант...

unsigned long T1;
//
if (условие запускает запись)// выполняется один раз после остановки
{
T1=millis()+100;
}


if(millis()-T1>0)
{
T1=T1+100;
//чего-то делаем
}

Точность средняя, но интервал стабильно 0,1С +- проблемы кварца.

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

dimax пишет:
Вот пример вашей задачи без использования RTC. Измерение 10 раз в секунду напряжения на аналоговом входе A0, и вывод результата в сериал вместе с текущим временем (часы, минуты, секунды, сотые секунды)

спасибо, попробую

ghttoblstr
Offline
Зарегистрирован: 15.02.2012

Гриша пишет:
Есть такое впечатление, что ТС ни в электронике, ни в программировании не понимает. Как и где хранить результаты, я так понял следующий вопрос? Если делать некоторую точно без заморочек, хватит МК. То просто поделить на интервалы :

либо пост 9, или этот вариант...

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

Гриша
Offline
Зарегистрирован: 27.04.2014

ghttoblstr пишет:

Гриша пишет:
Есть такое впечатление, что ТС ни в электронике, ни в программировании не понимает. Как и где хранить результаты, я так понял следующий вопрос? Если делать некоторую точно без заморочек, хватит МК. То просто поделить на интервалы :

либо пост 9, или этот вариант...

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

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

 

UPD

для интереса, познакомьтесь с этим топиком - человек не сдавался до последнего, правда потом куда-то пропал...

parovoZZ
Offline
Зарегистрирован: 15.02.2016

ghttoblstr пишет:

3. Подключение промышленного датчика 4...20мА к пятивольтовому входу ардуино, тут как я понимаю нужен резистор для приведения напряжения питания датчика (24В) в пятивольтовый сигнал.
 

НЕТ. Датчик с так называемым выходом токовая петля. Вам нужен прецинзионный резистор с очень малым ТКС. Значение подобрать так, чтобы при 20 мА не пожечь вход МК (т.е. не более 5 вольт, а лучше меньше во избежании потерь данных). Максимальное значение сопротивления дано в даташите, схема подключения там же (вместо амперметра ваш резистор). Блок питания не абы какой, а с очень низкими параметрами нестабильности по напряжению и температуре. Например, МП36С1. Земли блоков питания не объединять! Если кабель с экраном, то экран землить на ноль МК! Как-то так))))