PDA

Просмотр полной версии : Помогите написать программу для микропроцессора



tuner68
18.12.2015, 23:57
Доброго всем времени суток! Есть необходимость написать программку для avr или pic. Нужно преобразовать изменение сопротивления датчика давления в килограммы и вывести в цифре на светодиодный индикатор. Характеристика датчика линейная. Оплачу. Предложения в личку.

Dmitry
19.12.2015, 02:12
выловлено гуглом - может подойдет? тыц (http://cxem.net/mc/mc299.php)
(для повторения все данные есть в статье)

olegtur77
19.12.2015, 07:45
Датчик давления имеется ввиду тензодатчики? Стенд для измерения статической тяги моторов?

- - - Добавлено - - -

http://arduino-diy.com/arduino-rezistivnyy-datchik-davleniya,

ну или купить кухонные веси, вытащить внутренности и пристроить к устройству.

ТЗ не определено

tuner68
19.12.2015, 11:53
это датчик давления масла от авто, приспособленный для измерения усилия при затяжке параплана тросом(так называемая "малинка")

serg5791
19.12.2015, 18:11
Датчик давления имеется ввиду тензодатчики? Стенд для измерения статической тяги моторов?

- - - Добавлено - - -

http://arduino-diy.com/arduino-rezistivnyy-datchik-davleniya,

.....
Не слишком удачный пример. Там датчик цифровой, а автомобильный датчик аналоговый.
Более удачная тема с характеристиками датчика http://arduino.ru/forum/apparatnye-voprosy/tsifrovoi-manometr-s-datchikom-davleniya-masla-mm393a-vaz2106

Правда код там не слишком, сложный с выводом информации на СOM порт и ЖКИ дисплей.
Для цели автора темы луше бы подошел трехразрядный или четырехразрядный светодиодный индикатор (7ми сегментный, для чисел) типа такого http://www.kosmodrom.com.ua/el.php?name=E30361-I-BL-8-W
На улице его лучше видно, а точности трех знаков хватит с большим запасом.
Тут главные вопрос надежность? Если плата заглючит то парапланеристу не будет лишний риск?
Еще вопрос по калибровке или тарировке датчика в связи с не стандартным использованием.
По идее надо бы заложить такую функцию в программе. Или хотя бы возможность ручного ввода верхнего значения шкалы для датчика. Если верить интернету, у автомобильных датчиков давления большой разброс по конкретным экземплярам.
P.S/ Ops, извиняюсь про пример с цифровым датчиком, это первый ответ Dmitry

Alext
19.12.2015, 19:33
это датчик давления масла от авто, приспособленный для измерения усилия при затяжке параплана тросом(так называемая "малинка")

Программа тут самое плевое дело. Для начала нужно определиться с подключением индикатора и сколько цифр выводить, потом задать точность измерения этих самых килограммов ( до 1 кг , до 0,1 кг ??). Далее определиться жестко типом процессора.
Я бы выбрал Ардуино и LCD дисплей ( самый простой) - выводи себе хоть 16 цифр. Программы там на десяток строк. А вот LED индикацию не люблю - ток жрет, динамическую индикацию просит :), регистр внешний так и просится или токовые ключи.
В общем определяйтесь с ТЗ поточнее, может кто и согласится. Может и я решусь после 15 января, если не рехнусь от такого количества выходных на Новый Год.

tuner68
19.12.2015, 22:11
с датчика характеристику уже снял, индикатор светодиодный 2 знака, время индикации(пересчёта вывода значения) около 0,5 секунды точность 1кг , процессор значения не имеет - программаторы в наличии, сборка тоже не проблема - отработана технология изготовления плат с фоторезистом. В общем в радиоделе не новичёк, а вот в программировании дуб-дубом, поэтому и прошу помощи.

serg5791
19.12.2015, 22:37
с датчика характеристику уже снял, индикатор светодиодный 2 знака, время индикации(пересчёта вывода значения) около 0,5 секунды точность 1кг , процессор значения не имеет - программаторы в наличии, сборка тоже не проблема - отработана технология изготовления плат с фоторезистом. В общем в радиоделе не новичёк, а вот в программировании дуб-дубом, поэтому и прошу помощи.
Если не нужна высокая надежность и у Вас есть время+терпение, то можем попробовать сделать на Ардуино (или на микросхемах ATMEL mega168 - mega 328).
Вариант возможной схемы устройства

tuner68
20.12.2015, 00:27
Если не нужна высокая надежность и у Вас есть время+терпение, то можем попробовать сделать на Ардуино (или на микросхемах ATMEL mega168 - mega 328).
Вариант возможной схемы устройстваа что с надёжностью этой ардуинки не так? Весь сезон отлетал с вариометром на такой, общей наработки около 20-ти часов и никаких сбоев, так что в понедельник закажу и в среду чего-то соберу, но пробовал уже под неё скетч переделывать с других измерителей - ума не хватило:drag:, если поможете, буду очень благодарен.

serg5791
20.12.2015, 10:13
а что с надёжностью этой ардуинки не так? Весь сезон отлетал с вариометром на такой, общей наработки около 20-ти часов и никаких сбоев, так что в понедельник закажу и в среду чего-то соберу, но пробовал уже под неё скетч переделывать с других измерителей - ума не хватило:drag:, если поможете, буду очень благодарен.
Будете Ардуинку выбирать учтите, что их много вариантов даже но одной MEGA368-
с встроенным преобразователем порта USB (FTDI)
c отделяемым преобразователем USB (FTDI)
без преобразователя USB (FTDI)
Удобней всего с встроенным USB, можно зашивать программу без программатора.
Но если нужен минимальный вес (можно сэкономить 2-3 грамма) и габариты, то можно и без него.
По надежности, то просто дать гарантию 100% что не будет сбоев не смогу. Но работать и выдавать нужные показания будет.
Схемку и программу предлагаю доработать по шагово:
1) цепляем индикаторы и проверяем работу
2) реализуем АЦП и обработку данных с датчика с индикацией
Да и предложенный вариант схемы тоже обсуждаем, индикаторы подключены для динамической индикации, но можно реализовать и статический вариант (выходов портов хватает)

tuner68
20.12.2015, 12:18
nano V 3.0 подходит?

serg5791
20.12.2015, 13:38
nano V 3.0 подходит?
да подойдет

serg5791
29.12.2015, 10:43
Привет.
За основу программы взял пример http://www.radio-magic.ru/arduino-projects/123-led-seg
Немного доработал .
Тестовая версия программы только для проверки работы индикаторов. Выводит на экран число 64.Проверил в “железе”, работает.
Далее в разработке программы начал с определения значения. Ввел константу-параметр sсala, которая должна соответствовать максимальному пределу измерений датчика (определить при калибровке). Предварительно присвоил ей значение 99.
Датчик 360 Ом и постоянный резистор на 50 Ом образуют делитель напряжения с коэффициентом равным 360/(360+50)=360/410 Ом.
Напряжение с этого делителя поступает на вход 0 АЦП микроконтроллера и в программе преобразуется в число value от 0 до1023. (0…5 вольт)
Для преобразования в нормальные единицы датчика
Value=value/1023*scala*410/360.
Тут еще вопрос по характеристике датчика. Если предположить, что как в статье
при 360 Ом на датчике нет усилия (0 кг).
Тогда нужно формулу доработать до вида
Value=(1023-value)/1023*scala*410/360.
В принципе должно уже работать.

Но для удобства использования нужно осреднять значение. Не очень удобно, если каждые 5 миллисекунд значение меняется, например 19 на 20.
Для этого вводим цикл на 40 замеров и будет выводить на дисплей значения осредненные за 40 замеров, примерно за чуть больше 200 миллисекунд=0.2 секунды.
За 0.2 секунды человек обычно успевает прочесть значение.
Код выкладываю, но пока не проверил в “железе”.
Оба кода выложил в посте в формате программ под ардуино.

tuner68
29.12.2015, 17:38
Привет.
За основу программы взял пример http://www.radio-magic.ru/arduino-projects/123-led-seg
Немного доработал .
Тестовая версия программы только для проверки работы индикаторов. Выводит на экран число 64.Проверил в “железе”, работает.
Далее в разработке программы начал с определения значения. Ввел константу-параметр sсala, которая должна соответствовать максимальному пределу измерений датчика (определить при калибровке). Предварительно присвоил ей значение 99.
Датчик 360 Ом и постоянный резистор на 50 Ом образуют делитель напряжения с коэффициентом равным 360/(360+50)=360/410 Ом.
Напряжение с этого делителя поступает на вход 0 АЦП микроконтроллера и в программе преобразуется в число value от 0 до1023. (0…5 вольт)
Для преобразования в нормальные единицы датчика
Value=value/1023*scala*410/360.
Тут еще вопрос по характеристике датчика. Если предположить, что как в статье
при 360 Ом на датчике нет усилия (0 кг).
Тогда нужно формулу доработать до вида
Value=(1023-value)/1023*scala*410/360.
В принципе должно уже работать.

Но для удобства использования нужно осреднять значение. Не очень удобно, если каждые 5 миллисекунд значение меняется, например 19 на 20.
Для этого вводим цикл на 40 замеров и будет выводить на дисплей значения осредненные за 40 замеров, примерно за чуть больше 200 миллисекунд=0.2 секунды.
За 0.2 секунды человек обычно успевает прочесть значение.
Код выкладываю, но пока не проверил в “железе”.
Оба кода выложил в посте в формате программ под ардуино.


тоже нашёл эту статью, собрал схемку, залил скетч, но потенциомер ещё не припаивал. Индикатор работает. С датчиком будет проблема - слишком пологая характеристика - при нагрузке 20 кг сопротивление 130 Ом, с добавлением каждого кг падает по 1 Ом, думаю, что АЦП не сможет адекватно пересчитывать столь малое изменение напряжения, да ещё кабель от датчика до устройства около 5 метров, будет много шумов. Буду ставить усилитель возле датчика.За коды спасибо - попробую залить.

serg5791
29.12.2015, 21:24
тоже нашёл эту статью, собрал схемку, залил скетч, но потенциомер ещё не припаивал. Индикатор работает. С датчиком будет проблема - слишком пологая характеристика - при нагрузке 20 кг сопротивление 130 Ом, с добавлением каждого кг падает по 1 Ом, думаю, что АЦП не сможет адекватно пересчитывать столь малое изменение напряжения, да ещё кабель от датчика до устройства около 5 метров, будет много шумов. Буду ставить усилитель возле датчика.За коды спасибо - попробую залить.
Пологая характеристика не проблема! Даете табличку характеристики датчика и вводим подпрограммку расчета значений по табличным значением c апроксимацией значений кубическим сплайном (функцией y=a+b*x+c*x^2+d*x^3).
Идем от простого к сложному.
1) Шаг первый. Работа индикаторов. +
2) Шаг второй. Работа АЦП и отображение на индикаторах значений, пусть и с плохой точностью.
3) Шаг третий. Доводка до нормального вида и устранение проблем, улучшения точности за счет усложнено математической обработки
P.S. Усилитель не советую, с этого "датчика" идет сигнал нормальной амплитуды от 0... до почти +5В. Усилитель ничего не даст, это не тензодатчик с мв сигналом.
Если бюджет позволяет, то может лучше взять нормальный покупной датчик типа такого http://zemic.com.ua/catalog/ru/2/19/75/p/1 в модификации на 100 кг и с нужным вариантом крепления.
К нему придется городить простейший тензоусилитель, например на микросхеме INA122.
Это тензодатчики S типа идеальный вариант для датчиков на растягивающее усилие. Лучше конечно датчики немецкого производства фирмы HBM, но дюже дорого.

- - - Добавлено - - -

Нашел ошибку в программее. Исправил.
value=scala-(value*scala/1023*410/360);
(Value=(1023-value)/1023*scala*410/360. неправильные значения, т.к. не учел что делитель обрезает максимальное выходное напряжение с 5 в до 4.39 В )

tuner68
30.12.2015, 13:39
Знал-бы, что есть такие датчики, не стал-бы городить огород с гидравликой:), но сейчас переделывать уже не вариант - буду доделывать как есть.

serg5791
30.12.2015, 17:03
Знал-бы, что есть такие датчики, не стал-бы городить огород с гидравликой:), но сейчас переделывать уже не вариант - буду доделывать как есть.
Век живи, век учись....
С наступающим Новым Годом!

tuner68
30.12.2015, 22:54
припаял переменный резистор, покрутил, - работает(скетч отсюда http://www.radio-magic.ru/arduino-projects/123-led-seg), подключено 2 первых разряда индикатора, во втором разряде не индицирует 0, показания просто пропадают - что не так?

С наступающим Новым Годом!

serg5791
31.12.2015, 11:30
припаял переменный резистор, покрутил, - работает(скетч отсюда http://www.radio-magic.ru/arduino-projects/123-led-seg), подключено 2 первых разряда индикатора, во втором разряде не индицирует 0, показания просто пропадают - что не так?

С наступающим Новым Годом!
Пропадают во всех разрядах при выводе 0 или только на 2 м?
Если да, то какие сопротивления резисторов поставили к индикаторам?
И еще при выводе "0" значения в текст программы зачем то выводится на 1 число меньше.
Исходный код


void showNumber( int number)
{
if(number == 0) {
showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit
....
Исправить на




void showNumber( int number)
{
if(number == 0) {
showDigit( 0, nbrDigits) ; // display 0 in the rightmost digit

tuner68
01.01.2016, 21:57
Здравствуйте! С Новым Годом!
Пытался залить эти скетчи
http://forum.modelka.com.ua/images/metro/blue/misc/paperclip.png Вложения

http://forum.modelka.com.ua/images/attach/zip.gif Test1.zip (http://forum.modelka.com.ua/attachment.php?attachmentid=241641&d=1451378598) (1.2 Кб, Просмотров: 1)
http://forum.modelka.com.ua/images/attach/zip.gif izmerenie.zip (http://forum.modelka.com.ua/attachment.php?attachmentid=241642&d=1451378598) (1.1 Кб, Просмотров: 1)

выдаёт такое 241861

serg5791
02.01.2016, 10:52
Привет.
Выдает ошибку переопределение функции Setup ( второй раз объявит функцию Setup).
Закройте Ардуино. И потом заново откройте но только с одним проектом. Или Test или Izmerenie.
У Вас попытка скомпилировать сразу 2 программы.

tuner68
02.01.2016, 13:32
Выдает ошибку переопределение функции Setup ( второй раз объявит функцию Setup).[/COLOR]
Закройте Ардуино. И потом заново откройте но только с одним проектом. Или Test или Izmerenie.
У Вас попытка скомпилировать сразу 2 программы.]
Спасибо, всё работает. Местами начинаю понимать код:)

Aleks
16.02.2016, 23:03
Можно написать программу для Ардуино , а прошить в Atmega 8, схема совпадения выходов есть
245601