Jump to content

RIMUS1989i

Members
  • Posts

    380
  • Joined

  • Last visited

Everything posted by RIMUS1989i

  1. Добрый день. Давно не подходил к этому проекту, но решил к нему вернуться. Окончательная функция получилась в таком виде (см. ниже). Она работает для 16ти битного числа, кто ее захочет использовать, обратите внимание, нет проверки на максимально допустимое число для 16бит - 65535. Мне достаточно до 25000. #define DEFAULT_MAX 25000 static const uint16_t mas[5] PROGMEM = {1,10,100,1000,10000}; uint16_t bitwise_number_change(uint16_t val, uint8_t n, int8_t diff, uint8_t x, uint8_t y) { if(n > 4) return val; uint8_t iv = 0; iv = (val/pgm_read_word(&mas[n]))%10; // Выбираем нужный разряд в десятичной системе val = val - iv * pgm_read_word(&mas[n]); // Обнуляем выбраный разряд iv = iv + diff; // Производим изменение нужного разряда +-1 // Проверяем разряд на правильность введеного значения if((iv & 0x0f) == 15) iv = 9; if(iv > 9) iv = 0; val = val + iv * pgm_read_word(&mas[n]); // Записываем новое значение разряда if(val > DEFAULT_MAX) val = DEFAULT_MAX; // Проверяем значение на максимально доступное ks0066SetXY(x, y); // Координаты выводимого числа for(uint8_t i = 0; i < 5; i++)// Выводим число ks0066WriteData('0' + (val/pgm_read_word(&mas[4-i]))%10); if(level > LEVEL_MENU_CHILD && level <= LEVEL_MENU_DIGIT_5) // Если уровень меню в редакторе, рисуем курсор { ks0066SetXY(x + 4 - n, y); ks0066WriteCommand(0x0E); }else{ ks0066WriteCommand(0x0C); // Удаляем курсор } return val; }
  2. Спасибо за поддержку. Просто люблю из железа выдавить максимум. Что у меня и получилось.
  3. Чуть выше описал основные функции этой затеи, Вы спросите и что? А то что многие проекты которые есть на этом форуме и не только, они все на LCD дисплеях. Увидел я один усилитель со светодиодным анализатором, но он монохромный, я решил пойти дальше и замутил на RGB светодиодах.
  4. Так же данная разработка, будет управлять усилителем, РГ Никитина, селектор входов, защита и лентяйка. Может кому интересно.
  5. Всем привет! Затеялся разработкой анализатора для своего усилителя. Первая печатка была с ошибками, и служила только для отладки (она на видео). Последняя схема перерисована и заказана новая плата на производстве.
  6. Всем привет. 78 герц не так уж хорошо, в одной из тем я писал что для LED дисплея она (частота обновления) должна быть не менее 600 герц. Этот вывод я нашел в интернете в одной из статей. Т.К. при малой частоте обновления экрана, хоть не видно мерцания, но это очень сильно влияет на зрение. По ощущениям, как будто смотришь на сварку (испытал на себе) . Эту частоту не надо путать с частотой обновления кадров. В итоге добился частоты обновления 2500 Гц, при тактовой в 16Мгц. Тактовую частоту можно повысить до 30Мгц. Уже заказана финальная печатная плата 4 слоя.
  7. Я выше писал что это датчик давления. Приводить милливольты в величину придется в любом случае. Но я уже написал код с калибровкой по двум точкам, и преобразованием в величину. Код тестировал на встроенном АЦП 10 бит. #define COEFF_SCALE 10000L static uint32_t Kx[MAXIMUM]; // Наклон static uint32_t Sx[MAXIMUM]; // Смещение // p1, p2 - физическая величина, c1 - c2 значения АЦП, n - номер АЦП, void calibrate(uint8_t p1, uint16_t c1, uint8_t p2, uint16_t c2, uint8_t n) { uint16_t temp = c2 - c1; Kx[n] = ((uint32_t)(p2 - p1) * COEFF_SCALE + (uint32_t)(temp>>1)) / ((uint32_t)temp); Sx[n] = (uint32_t)p1 * COEFF_SCALE - (uint32_t)c1 * Kx[n]; } uint16_t code_to_value(uint16_t code, uint8_t n) { return (uint16_t)(((uint32_t)code * Kx[n] + Sx[n] + (COEFF_SCALE>>1)) / (COEFF_SCALE)); }
  8. Я не прошу за меня решать задачу полностью, и поэтому нет полного т.з. Почитав все ваши (всех кто участвовал в данной теме) посты - советы, сделал вывод, да действительно, а есть ли смысл удоражать схему для экономия разрядов? Нет смысла. Конечный пользователь этого особо не заметит. Тут уже баланс между точно и не дорого. Моэтому сигнал будет заведён на прямую в АЦП, естественно с защитой. ИОН будет 4,096в. А если делать смещение сигнала из первого поста, будет много деталей, которые повысят себестоимость устройства. Не обоснованно. Ещё раз Всем Спасибо!
  9. @yaroslav.s Задача мерить давление 0 - 10кг/см2. с максимальной точность. Сейчас посыпятся вопросы, а какой датчик, тебе мало точности в 1 сотку и т.д.. На данном этапе не важно какой будет датчик. Сейчас стоит задача максимально выжать точности из АЦП. И как правильно преобразовать данный диапазон 0.5-3.5в. Когда с этим разберемся, в любой момент можно коэффициенты подкрутить делителями, и поменять датчик на более точный. Вся точность измерения также зависит от первичного преобразователя, в моем случае это датчик давление, и она (погрешность) суммируется на всех этапах, это я думаю всем понятно. Вопрос состоит в том как все таки правильно преобразовать диапазон. Чтобы тут еще не накосячить. Как говорит один знакомый: делай хорошо, х...(плохо) оно само получится. Как посоветовал @Starichok действительно кто мешает так сделать.
  10. ИОНа пока нет. Вот есть на чид MCP1541T-I/TT - 1% - 69руб., 4.096 или, как выше писал TL431BQDBZRQ1 - 0.5%, 2.5-36в - 47руб.. Есть точнее и дороже... @Starichok Вот теперь совсем запутали. Да действительно можно так, как Вы, сказали. Но что лучше? я уже в замешательстве. Подать напрямую в АЦП, с ИОН 4.096 - потеряю разряды. Понижается точность, из-за потери разрядов. Сделать на ОУ 0-4в., будет куча деталей которые нужно выбирать более точные... Повышается стоимость, для хорошей точности.
  11. Так я и не собираюсь на обычных. Поищу более точные 0.1-0.5% Диапазон измерений от 0.5 до 3.5 в. Опять тратить разряды АЦП. В начале с 0.5 вольтами можно смериться, как-раз идентифицировать обрыв цепи измерения, а выше 3.5 можно конечно и К.З. , но для этого можно и до 3.6-3.7 вольт поднять диапазон измерений. 12 бит не так уж много. С максимально возможной. При измерении 0.5 - 3.5 потеряю около 580 единиц АЦП при ИОН 3.5в, а при ИОН 4.096 уже 1096.
  12. Тоже верно. ИОНа на фиксированные 3.5 нет, можно также через делитель.Взять ИОН на 4.096 и после него поставить делитель. Или есть более точная 0.5% TL431BQDBZRQ1... MCP3208
  13. @Starichok Добрый день. Странный глюк. Обращался к @Lexter
  14. @RIMUS1989i Вот поэтому здесь и задал вопрос, стоит это делать или нет. Вторую часть (повторитель, делитель) придется оставить в любом случае, т.к. измеряемое напряжение выходит за пределы измерения АЦП. Всем спасибо.
  15. чтобы не тратить разряды АЦП на 0.5 вольта.
  16. @yaroslav.s Поясните. Upd Увидел только перепутаны 2 и 3
  17. Добрый день. Опять про АЦП. Понадобилось измерять аналоговый сигнал в диапазоне от 0.5 до 3.5 вольт. Опорное напряжение 2.5 вольта как для АЦП так и для ОУ, питание 5вольт. ИОН один на все каналы АЦП и ОУ. Всего их 6. Набросал схему с двумя каскадами, первый смещает и усиливает 0-4в. второй повторяет и после второго стоит делитель. Прошу проверить и высказать замечания. Заранее спасибо.
  18. Эм... не понял, вы про какие библиотеки говорите?
  19. Набросал вот такой алгоритм, но мне не нравится, жрет очень много ресурсов. Он не допилен т.к. нет проверки максимума каждого разряда, при переполнении разряда происходит увеличение старшего разряда. Функция редактирования bitwise_number_change, где val - редактируемое значение, n - номер разряда от младшего к старшему, diff - значения от энкодера +1 или -1, x,y куда рисовать. #define DEFAULT_MAX 30000UL uint8_t divide_number_into_digits(uint16_t value, uint8_t n_digit) { int8_t out = 0; switch(n_digit) { case 0: out = (value/10000);break; case 1: out = (value/1000)%10;break; case 2: out = (value/100)%10;break; case 3: out = (value/10)%10;break; case 4: out = value%10;break; } return out; } uint16_t bitwise_number_change(uint16_t val, uint8_t n, int8_t diff, uint8_t x, uint8_t y) { uint16_t vi = 1; for(uint8_t i = 0; i < n; i++) { vi *= 10; } val += vi * diff; ks0066SetXY(x,y); for(uint8_t d = 0; d < 5; d++) { ks0066WriteData('0' + divide_number_into_digits(val,d)); } if(val > DEFAULT_MAX) val = DEFAULT_MAX; return val; } Чуть опоздал я с сообщением.
  20. Добрый день. Прошу помощи в определении алгоритма для поразрядного изменения числа - переменной. Имеется дисплей, пусть будет 1602, выводим на него число (переменную) в десятичной системе счисления, например "uint16_t value = 32678", как его изменить поразрядно?
  21. @finn32 Спасибо за оперативный ответ. А что получше подобрать? Какие лучше..
  22. Здравствуйте. В ВК NJW0302G + NJW0281G (от ON Semiconductor) пойдут?
  23. Как этот квадратик потом преобразовать в печатную плату? Естественно большую часть дорожек буду разводить вручную, но со схемой будет легче искать ошибки. На то она и матрица, строчки и столбцы, всего 20Х24 rgb светодиодов, получается 60+24 вывода. Всего 84.
  24. @Dr. West Уже пиратка стоит, она дает мне много выводов. Проблема в копировании, при котором не могу скопировать название связей, чтобы вручную их не присваивать. @chip-chip Во вложении схема, частично вручную пронумерована. rgb_led_matrix_n.dch
×
×
  • Create New...