Полезная информация


avatar_UriBas

Продвинутое самодельное универсальное ЗУ на МК

Автор UriBas, 02 Апр. 2018 в 22:43

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Яков93

Цитата: serggio от 17 Май 2018 в 19:10
Я с ардуиной не знаком, это некая стандартная переменная или вы ее так назвали?
Просто под дельтой обычно подразумевают разницу двух случайных значений а постоянные значения, напр. длительность цикла обозначают просто как T
В моем примере все переменные выдуманные, кроме millis() (стандартный счетчик миллисекунд).

KIE

Цитата: Яков93 от 17 Май 2018 в 19:49(стандартный счетчик миллисекунд)
А что это за стандартный счетчик mCek в Mege?
Видимо таймер задействован.
.......................
Мне кажется, что с Вашим алгоритмом, существует вероятность выскочить за пределы выделенной оперативной памяти, которой фигзнает сколько надо, но много.
С этими же ресурсами проще и лучше время между измерениями жестко зафиксировать и не заниматься каждый цикл лишней арифметикой. 

Яков93

Цитата: KIE от 17 Май 2018 в 20:56
А что это за стандартный счетчик mCek в Mege?
Видимо таймер задействован.
.......................
Мне кажется, что с Вашим алгоритмом, существует вероятность выскочить за пределы выделенной оперативной памяти, которой фигзнает сколько надо, но много.
С этими же ресурсами проще и лучше время между измерениями жестко зафиксировать и не заниматься каждый цикл лишней арифметикой.
Это Вам только кажется, никакого выхода за пределы оперативной памяти там и близко нет, подобные алгоритмы я постоянно применяю в своих поделках.
Из "лишней арифметики" там всего одно простое действие вычитания - текущие миллисекунды отнимаются от числа миллисекунд в начале цикла таким образом определяем длительность цикла.
При этом алгоритм-то стандартный, вот уж не думал, что кого-то таким алгоритмом удивлю.

serggio

Мне тоже кажется странным постоянно вычислять время. Проще использовать таймер и сбрасывать его в конце цикла.
Кроме того, зачем такие короткие промежутки циклов и расчетов 50 мс?
Не проще ли установить порог 4-10 % при выходе за который величина сбрасывает таймер, а если выхода за порог нет, то фиксировать и рассчитывать среднее раз в 1 сек.

Яков93

#220
Цитата: serggio от 17 Май 2018 в 21:26
Мне тоже странно вычислять время. Проще использовать таймер и сбрасывать его в конце цикла.
Чем проще и почему странно вычислять? Чем жестко заданный таймер для каждого цикла лучше такого же цикла но без таймера?
В каких-то случаях таймер действительно нужен - для опроса некоторых датчиков, (которые не любят частых опросов), для обновления информации на дисплее, чтобы все перед глазами не мелькало. Но для этих действий я ставлю отдельные таймеры, которые срабатывают в нужное время независимо от остального цикла.
А для быстрого прочтения тех же аналоговых входов ставить какие-то таймеры вообще не вижу смысла.

KIE

Цитата: serggio от 17 Май 2018 в 21:26Мне тоже кажется странным постоянно вычислять время.
Вот и я так думаю.
Если бы мы проводили измерения по событию, то понятно. Наступление события не предсказуемо.
А тут каждые циклы длятся примерно одинаковое время....можно конечно, но не красиво.
В mCek считать или точность теряем, или с плавающей запятой работаем....проблемы.
Но пути ардуины неисповедимы. Так то так.
................
Цитата: Яков93 от 17 Май 2018 в 21:35Чем жестко заданный таймер для каждого цикла лучше такого же цикла но без таймера?
А что у Вас время считает?

serggio

Цитата: Яков93 от 17 Май 2018 в 21:35А для быстрого прочтения тех же аналоговых входов ставить какие-то таймеры вообще не вижу смысла.
Есть понятие измерения мгновенных значений и периодические измерения. При измерении величины в любой момент времени действительно не нужны таймеры.
Когда вы делаете периодические измерения, для построения графиков, подсчета Ач, тут без них не обойтись
[user]Яков93[/user], кстати, вы на своем датчике тока не тестировали дрейф нуля, 25% от номинального тока и 75%?

Яков93

#223
Цитата: KIE от 17 Май 2018 в 21:52
Вот и я так думаю.
Если бы мы проводили измерения по событию, то понятно. Наступление события не предсказуемо.
А тут каждые циклы длятся примерно одинаковое время....можно конечно, но не красиво.
В том то и дело, что неодинаково длятся. В какие-то циклы могут происходить какие-то дополнительные действия, включающиеся по доп. таймеру, например то же обновление экрана или опрос датчика температуры (условно DS18B20).
Цитировать
В mCek считать или точность теряем, или с плавающей запятой работаем....проблемы.
Но пути ардуины неисповедимы. Так то так.
................А что у Вас время считает?
Какая плавающая точка в millis() ? Там целочисленное беззнаковое число от 0 до  4 294 967 295, переполняется раз в 50 дней. Точность у этого счетчика зависит от качества кварцевого резонатора на Ардуине, заявляют точность 4 сек. в сутки.
Время у меня считает длительность цикла между измерениями тока чтобы можно было точно посчитать Ампер*часы.

Цитата: serggio от 17 Май 2018 в 21:54Яков93, кстати, вы на своем датчике тока не тестировали дрейф нуля, 25% от номинального тока и 75%?
Дрейф нуля не тестировал.
Цитата: serggio от 17 Май 2018 в 21:54Когда вы делаете периодические измерения, ... подсчета Ач, тут без них не обойтись
Для подсчета Ач нужно значение силы тока и период времени. Период времени можно жестко забить в программе или вычислять каждый раз. С одной стороны вычислять каждый раз этот период на одно арифметическое действие сложнее, чем если забить жесткий таймер. А с другой стороны можно не угадать со значением этого таймера - поставить слишком маленькое число, тогда цикл просто не успеет выполниться. Или поставить слишком большое число, что уменьшит точность вычисления Ач.

KIE

Цитата: Яков93 от 17 Май 2018 в 22:05Там целочисленное беззнаковое число от 0 до  4 294 967 295
Мы что то не понимаем друг друга.
1.Какой блок Меги у Вас считает время? Мне кажется, что без таймера это сделать проблематично.
Цитата: Яков93 от 17 Май 2018 в 22:05В том то и дело, что неодинаково длятся.
Вот именно, например цикл длился 49,954мСек, второй 50,035мСек, третий 50,499 итд.  Как в этом случае?

Яков93

Цитата: KIE от 17 Май 2018 в 22:18
Мы что то не понимаем друг друга.
1.Какой блок Меги у Вас считает время? Мне кажется, что без таймера это сделать проблематично.Вот именно, например цикл длился 49,954мСек, второй 50,035мСек, третий 50,499 итд.  Как в этом случае?
Для подсчета millis() применятеся аппаратный Timer0.
Считать десятые доли миллисекунд не вижу смысла. Если есть желание для этого есть подсчет микросекунд на том же аппаратном таймере.

KIE

Слава Богу.
А то: "ты в баню? нет я в баню!"
Вот и выявили, что таймер так и так нужен, и точность сами режем.
По этому я и писал, что такой алгоритм не оптимальный. Цикл должен быть цикл, а не "тут играй, тут селедку заворачивали". 

serggio

#227
Цитата: Яков93 от 17 Май 2018 в 22:05Дрейф нуля не тестировал.
Попробуйте, на сколько уйдет за 8-12 часов.
Цитата: Яков93 от 17 Май 2018 в 22:05Для подсчета Ач нужно значение силы тока и период времени. Период времени можно жестко забить в программе или вычислять каждый раз.
Период измерений. Период времени как то непонятно звучит.
Да и вообще, Ач - означает ток отданный в нагрузку за 1 час. Т.е. за 3600 сек. Подсчитывать Ач раз в секунду более чем избыточно, не говоря уже про 50 мс.

Яков93

Цитата: KIE от 17 Май 2018 в 22:41
Слава Богу.
А то: "ты в баню? нет я в баню!"
Вот и выявили, что таймер так и так нужен, и точность сами режем.
По этому я и писал, что такой алгоритм не оптимальный. Цикл должен быть цикл, а не "тут играй, тут селедку заворачивали".
Чего ж тут "выявлять", про аппаратные таймеры на Ардуино информация открытая.
Алгоритм не оптимальный потому что используется аппаратный таймер? Если завести цикл по жесткому таймеру этот таймер будет пользоваться тем же самым аппаратным таймером, в чем увеличение оптимальности?
Цитата: serggio от 17 Май 2018 в 22:47Подсчитывать Ач раз в секунду более чем избыточно, не говоря уже про 50 мс.
Не спорю, лабораторной точности я не получу. Но считать хоть раз в 50 мс, хоть раз в 20 мс ни капли не проще и не сложнее чем раз в секунду, так почему бы и не считать чаще, так изменения тока виднее.

Кass

Цитата: Яков93 от 17 Май 2018 в 13:34Не понимаю.
У Вас что ток измеряется все время цикла, все 50 мс без перерыва?
Я себе это несколько по другому представлял, да и представляю.

Вы не верно представляете. В начале цикла считывается не мгновенное значение, а среднее за цикл. Это не низовой цикл опроса АЦП.

Цитата: Alex_Soroka от 17 Май 2018 в 17:01АЦП в вашей поделке называемой ПЛК, насколько я помню, отдельного не стоит, значит "оно в микроконтроллере" на чипе, а там АЦП не выше 200ksps, и это в лучшем случае.
Так что вы снова врете. 

:-D  Александр, как опять в своей манере. Тут никто кроме вас не врет, ибо нет ни у кого более цели что то впарить. Вы вроде внимательно читаете тему про стенд на ПЛК, а там не раз выкладывалось, какой МК там стоит. Это старая  серия ПЛК, которой более 15 лет и потому там стоит C8051F125 от Силикон Лаб. Можете погуглить, у него 500ksps АЦП. В новых уже и МК на АРМе, и разрядность АЦП 16 или 24 бит на выбор. Чуть позже думаю сделать ЗУ на новой бюджетной серии. Там и тач ТФТ есть.  :-)
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

Alex_Soroka

Цитата: Яков93 от 17 Май 2018 в 22:29
Для подсчета millis() применятеся аппаратный Timer0. 
он вообще-то восьмибитный  :hello: или я не прав?
а теперь смотрим нагрузку на процессор от постоянных милисекундных прерываний по таймеру: это "складывание в стек" регистров + части переменных, потом прыг в исполнение кода по таймеру, в нем куча всего, потом восстановление регистров и части переменных из стека и прыг в основной код. 
:facepalm:
...и так постоянно при каждых милисекундах...

KIE

Цитата: Яков93 от 17 Май 2018 в 23:25Не спорю, лабораторной точности я не получу. Но считать хоть раз в 50 мс, хоть раз в 20 мс ни капли не проще и не сложнее чем раз в секунду, так почему бы и не считать чаще, так изменения тока виднее.
Тут все зависит от поставленной задачи и удобства программирования. При маленьком времени цикла проблемы могут быть и реально бывают с переходом\выходом в прерывания. Как не делаешь, а шось реально не учел. Видимо по этому и выбран такой алгоритм (с переменным временем) цикла. Все по очереди, пока все в очереди не просчитает. Меньше проблем с запрещением\выходом прерываний и сохранением переменных при входе в п\п итд итп.
Но тут скорость особой роли не играет, ограничена  периодом обновления индикатора (0.5-1сек , чаще блекать будет) можно\проще (если не шаблонами, а в рукопашную прогу писать) период сделать константой.

Цитата: Кass от 18 Май 2018 в 09:22В новых уже и МК на АРМе, и разрядность АЦП 16 или 24 бит на выбор. Чуть позже думаю сделать ЗУ на новой бюджетной серии.
А есть в этом смысл? Зачем точность в микроАмперах и микроВольтах? Да и не реально это.
Считается чисто условный параметр. Реальные датчики  имеют неприемлимые для такой точности параметры. Мне кажется, лучше уделить внимание более совершенной математике обработки входящих данных.
Сделать то конечно можно, только последние три цифры качество комлектующих будут показывать, а не реальный сигнал.
Цитата: Alex_Soroka от 18 Май 2018 в 09:43а теперь смотрим нагрузку на процессор от постоянных милисекундных прерываний по таймеру
Когда "болванка" отработана, то глюки вылизаны, но конечно ресурсов жрет....да и поймаешь зацикливание, хрен найдешь, а собаку вставить проблема при таком алгоритме.

Alex_Soroka

#232
Цитата: Кass от 18 Май 2018 в 09:22
вроде внимательно читаете тему про стенд на ПЛК, а там не раз выкладывалось, какой МК там стоит. Это старая  серия ПЛК, которой более 15 лет и потому там стоит C8051F125 от Силикон Лаб. Можете погуглить, у него 500ksps АЦП.

Ну вот вы и спалились :)
врете про 500ksps и не краснеете.
читаем даташит: http://www.keil.com/dd/docs/datashts/silabs/c8051f12x.pdf
во-первых, ADC там SAR, т.е. "последовательного приближения".
12битное SAR ADC работает всего на 100ksps МАКСИМУМ! :hello: это предел его возможностей.
10битное SAR ADC работает всего на 100ksps МАКСИМУМ! :hello: это предел его возможностей.
ADC2 (8-BIT ADC) таки да, работает до 500ksps. у кого есть этот ПЛК - проверьте на какие ноги Касс свои напряжения и токи подключил, я уверен что не на ADC2 (8-BIT ADC).
The maximum ADC2 conversion clock is 7.5 MHz.
Обычное восьмибитное, т.е. 256 значений вся шкала, причем в описании-же написано что лучше на 500 не гонять - шумы будут, а еще есть "время обработки" того что АЦП насчитало
и стандартно про мультиплексор:  Note: An abso lute minimum settling time of 800 ns required after any MUX selection.
Т.е. если мерять более одного канала, то надо МИНИМУМ 800наносек на "время успокоения" после переключения АЦП на новый канал  :hello: так что про 500кспс это хорошая маркетинговая лапша.
...и Vref=2.4 вольта  :hello:  а это значит что точность будет не выше 0.009 Вольт (9миливольт) на АЦП, а если "растянуть" делителем , ведь мы меряем 12-15в, то точность и того хуже.

Дааа... вы оказывается еще и профан в микроконтроллерах.



Яков93

Цитата: Кass от 18 Май 2018 в 09:22
Вы не верно представляете. В начале цикла считывается не мгновенное значение, а среднее за цикл. Это не низовой цикл опроса АЦП.
Сами же написали
Цитата: Кass от 17 Май 2018 в 13:06
за 50 мс МК получает 10 000 мгновенных значений а раз в 50 мс выдает среднее из них.
А теперь оказывается все-таки не весь цикл без перерыва МК получает значения, а только вначале.
Как Вы определите среднее за цикл без получения мгновенных значений? Так и получается как я описываю получаете в начале цикла допустим 100 мгновенных значений, усредняете их, все это занимает 2-3 мс. Допустим еще 10 мс занимает остальная реальная работа в цикле, итого весь цикл допустим 15 мс, а таймер цикла установлен на 50 мс. Т.е. 35 мс просто пауза в которой ничего не происходит, МК ничего не измеряет, на выход тока и напряжения за пределы не реагирует.
Измерения тока и напряжения в течение 2-3 мс искусственно признаются средними за 50 мс.

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

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