volw

Программный расчет данных АЦП

23 posts in this topic

volw    0

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

Помогите программно рассчитать  рабочий диапазон чтобы показания на дисплей выводились от 0 до 420. Все значения на рисунке условны, главное узнать общий принцип расчета.

PS: Очень нужно да и для будущих поделок пригодится.

2018-03-10_104048.jpg

Edited by volw

Share this post


Link to post
Share on other sites
volw    0
59 минут назад, солар сказал:

N= (ADCW - 117)*420/261

Огромное спасибо  солар, формула работает так как я и хотел.

А если задачу немного усложнить нижний требуемый предел сделать не 0, а скажем 21 (комнатная температура)? 

Edited by volw

Share this post


Link to post
Share on other sites

Опорное решение: компоненты для защиты RS-485

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

Подробнее...

солар    198

Пожалуйста.

Общий принцип масштабирования даётся в началах алгебры в 8-ом классе общеобразовательной школы. Выглядит он так:

y= ax+b

В вашем случае y - нужное значение, х - входная величина АЦП.

Share this post


Link to post
Share on other sites
volw    0

Рано радовался, формула "N= (ADCW - 117)*420/261" работает только на бумаге в  atmega8 как я полагаю он спотыкается при умножении результата в скобках на 420 так как получается число более ста тысяч. Подскажите реализацию данных расчетов, пишу на СИ в AVR Studio 4

Share this post


Link to post
Share on other sites

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

Подробнее...

ruhi    39
54 минуты назад, volw сказал:

Рано радовался, формула "N= (ADCW - 117)*420/261"

если на С-ях можно попробовать тип LONG, как то так:

long N;

long x = ADCW;

N= (x - 117)*420/261;

Share this post


Link to post
Share on other sites
IMXO    1498
24 минуты назад, Falconist сказал:

N= (ADCW - 117)*(420/261).

не надо так пробовать.

1 час назад, volw сказал:

"N= (ADCW - 117)*420/261" работает только на бумаге в  atmega8 как я полагаю он спотыкается при умножении результата в скобках на 420 так как получается число более ста тысяч.

укажите компилятору, что число в скобках имеет размерность long 

N= (ADCW - 117L)*420/261

 

Share this post


Link to post
Share on other sites
солар    198

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

N= ADCW*1,61 - 188

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

Чтобы уйти от плавающей арифметики, которая съест и память, и время, то *1,61 проведите с помощью сдвигов влево/вправо.

Share this post


Link to post
Share on other sites
volw    0
В 16.03.2018 в 15:51, солар сказал:

Упростите формулу, например, так

N= ADCW*1,61 - 188

Спасибо, формула работает, но поясните пожалуйста отчего образовалось число 188 и как реализовать сдвиг на 1,61, (могу только на целые числа сдвигать)

 

Share this post


Link to post
Share on other sites
volw    0
В 10.03.2018 в 15:33, солар сказал:

Выглядит он так:

y= ax+b

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

Share this post


Link to post
Share on other sites
IMXO    1498
29 минут назад, volw сказал:

отчего образовалось число 188

117*420/261  :)

Share this post


Link to post
Share on other sites
солар    198

x*1,61 = x* 161/100 = x*412/256 = x * (256 + 128 + 16 + 8 + 4)/256

Каждый из множителей в скобках - простой сдвиг влево на нужное количество разрядов. Деление на 256 - отсечение младшего байта.

Да, придётся сделать ADCW трёхбайтной величиной. Зато быстро и просто.

Касательно

В 16.03.2018 в 14:51, солар сказал:

N= ADCW*1,61 - 188

Замените N на у и ADCW на х. Всё стало на места, не так ли?

Share this post


Link to post
Share on other sites
volw    0
12 минуты назад, солар сказал:

Замените N на у и ADCW на х

В этом случае если например ADCW = 117 то N будет 0, а мне надо ADCW = 117 но чтобы N стало = 21 и при этом когда ADCW = 378 то N = 420

Share this post


Link to post
Share on other sites
солар    198

Пардоньте-пардоньте! А как же рисунок? При ADCW=117 N должно быть 0.

В любом случае вы можете составить свою формулу.

Share this post


Link to post
Share on other sites
volw    0
В 10.03.2018 в 13:12, volw сказал:

А если задачу немного усложнить нижний требуемый предел сделать не 0, а скажем 21 (комнатная температура)? 

Об этом я сказал в пятом посту. 

С "0" проблем нет, ваша формула меня устраивает как и другие предложенные в этой теме, все варианты работают но вот хочется чтобы паяльник в холодном состоянии показывал температуру не 0 а допустим 21 в максимальном нагреве оставалось 420 причем пределы ADCW были 117 - 378

Share this post


Link to post
Share on other sites
volw    0
19 часов назад, солар сказал:

https://algebra24.ru/uravnenie-pryamoi

В вашем случае  х1= 117 y1= 21 и x2= 378 y2= 420

Спасибо! за помощь. Хочу подвести итоги. При введенных значениях сервис сгенерировал такую формулу  "y=1.529*x+(-157.862)", попробовал вот так: y=1.529*x-157.862   результат не изменился, отлично! так немного проще. 

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

N=(ADCW-117)*1.61

N= ADCW*1.61-188

N=(ADCW-117L)*420/261

long N;
long x = ADCW;
N= (x - 117)*420/261

N=(ADCW-117)*(420/261)  -  в этом случае результат не верный, странно? 

Ещё раз спасибо!, тема решена, вопросов больше нет.

Share this post


Link to post
Share on other sites
snn_krs    58
35 minutes ago, volw said:

N=(ADCW-117)*(420/261)  -  в этом случае результат не верный, странно? 

(420/261) -> 1

Это целочисленное деление надо (420.0/261.0) или явно приводить тип.

Share this post


Link to post
Share on other sites
volw    0
3 часа назад, солар сказал:

Какой компилятор?

AVR GCC в AVR Studio4

Share this post


Link to post
Share on other sites
ARV    768
3 часа назад, volw сказал:

N=(ADCW-117)*(420/261)  -  в этом случае результат не верный, странно?

Нет, не странно - закономерно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Similar Content

    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By pryanic
      Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.
      На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.
      Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 
      В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
       
       
      ADC_test.zip
    • By Cheshire Cat
      Здравствуйте, только начинаю изучать программирование мк. Я уже задавал этот вопрос в моих прошлых схемах мне отвечали что-то типа "любой стабилизрованый источник постоянного напряжения", или кидали схему такого источника. Можно назвать мне конкретное устройство? В общем то что я смогу забить в гугл и приписать купить. 

      Я уже больше двух месяцев жду пока мне придут с aliexpress детали для маленького лабараторного блока, но этот вариант может разбиться о кривизну моих рук.  Хочу просто купить такой источник и наконец заняться непосредственно МК. 
    • By Cheshire Cat
      Здравствуйте, только начал изучать программирование микроконтроллеров. В учебнике есть схема, но она не учитывает питание и землю. Скажите правильно ли я её дополнил.
      И еще дополнительный вопрос. Что можно использовать как источник постоянного питания на 5В? Из не дорогого и того, что можно купить в Казани. Знаю, что лучший вариант - лабораторный БП, но они дорогие.

    • By went
      Здравствуйте!
      Сразу скажу что мои познания в схемотехнике стремятся к нулю, так что прошу отнестись с пониманием. Увлекся как то я всякими штуками на ардуино и это привело к тому, что я захотел сделать машинку на радиоуправлении. Почитал/посмотрел в интернете и составил свою схему (см. фото). Казалось бы что могло пойти не так, но при питании от 12в при вращении двигателя сервопривод начинает отклоняться на определенный угол. Ставил керамику на двигатель, заземлял корпус и ничего не помогло. Как то после попыток справить все способами из интернета сидел, размышлял и чисто по приколу поставил диод 1N4007 между выходом шим с МК и землей. Не знаю как оно работает, но дергаться сервопривод стал меньше и дергается теперь только под средней нагрузкой. На этом мои знания и идеи заканчиваются, прошу помощи разобраться в чем проблема. Немного о схеме. Мозг - AtMega328P, питается от стабилизатора L7805ABV (5В 1,5А), от него же питается серва. Передатчик NRF24L01+ запитан от LD1117AL-3,3, драйвер двигателя TB6612FNG. Двигатель пока что работает не от шим, а от 5в. Запускал без пульта программно на газ + поворот и глюки оставались, так что с передатчиком проблема не связана.
      Всем заранее спасибо.