Jump to content

    

-=Женек=-

Свой
  • Content Count

    679
  • Joined

  • Last visited

Everything posted by -=Женек=-


  1. То есть придется ваять некую программную надстройку, просто так, аппаратно, H743 QSPI NAND не окучит?
  2. хм... приведите пример использования NAND, в котором точно ничего не страшно. Если их выпускают, значит это кому-нибудь нужно?
  3. Почитал я о преимуществах и недостатках NOR и NAND. Вроде все понятно, но волнуют некие практические вопросы. Мне нужна память для хранения картинок и коротких звуковых файлов. То есть если пара байт вдруг испортится - ничего страшного. Хочется скорости. Чтение по логике будет последовательным, не случайные выборки. Таким образом - мне больше подойдет NAND память? За NOR не стоит переплачивать?
  4. Странно, почему W25Q128 стоит чуть дороже чем W25N01G ? 128 Мбит дороже чем 1 Гбит.....
  5. Скажите пожалуйста, режим DualFlash дает прирост в скорости чтения? В даташите написано, что контроллер в этом режиме как-то хитро раскидывает байт между двумя микросхемами, и у меня вдруг возникло ощущение, что единственный плюс - это прирост памяти. Дальше анализируем https://yandex.ru/turbo?text=https%3A%2F%2Fwww.macrogroup.ru%2Fnews%2F2018%2Fvysokoskorostnaya-qspi-nand-flash-na-1-gbit-ot-winbond W25N01JW - на 1 гбит стоит столько же сколько память на 128 мбит того же производителя. Если в режиме DDR, то скорость 83 мб/сек. А контроллер больше 90 мб/сек на максимальных настройках не прочтет. Так есть ли смысл ставить две микросхемы для увеличения скорости?
  6. Добрый день. Есть положительный опыт работы с этим поставщиком? Это, насколько я понял, китайцы. Вводишл им в поисковик какую нибудь микросхему, выдается несколько позиций. Одна, к примеру Philips, другая OnSemiconductor, а ниже что то вроде Хунь-Мань-Тянь... Можно ли быть уверенным, что все что выше ХуньМаньТянь - действительно филлипс, а не китайская подделка? Ну и еще подвопрос. Наиболее широкий ассортимент всякого рода рассыпухи отмечается у Yageo. Что скажете, как у них с качеством? Керамкиа нужна на входы и выходы импульсников и в качестве блокировочных. Да и точные резисторы для установки напряжения тоже можно назвать ответственными деталями. Стоит ли в этом случае брать Yageo? Если нет, то что порекомендуете?
  7. Plain, я любитель, а потому, сами понимаете, матчасть знаю избирательно. И в который раз, благодаря таким как вы, убеждаюсь, что никакие микросхемы не заменят хорошего знания аналоговой схемотехники. Кстати, вот неплохая микросхема от техасцев по цене 20 рублей TPS6115. Она способна вытянуть 150 мА для трех последовательных диодов и выходном 3 вольта. Правда КПД будет всего 85% http://www.ti.com/product/TPS61165 Fig.7 как раз случай автора - решетка светодиодов 3х9
  8. Теперь понятно. А вот эта сложная обвеска, что на первой картинке - она какую цель преследует? Разве классика - делитель на двух резисторах, ну и добавка в виде транзистора и эмиттерного резистора, не будут работать? И еще вопрос. У меня не вызывал сомнений выбор в качестве типа транзистора биполярного. А вот в сети встречаются и стабилизаторы напряжения и стабилизаторы тока на полевых внешних. Как к этому относиться? И все же.... а почему именно 11 вольт? Почему не 11,6 вольт и выкинуть транзисторы. Я пересчитал ваши расчеты на предыдущей странице насчет рассеиваемой мощности. Получилось 100 и 225 мвт. Неужели lm358 не рассеет такую мощность?
  9. А зачем в линейнгм стабилизаторе городить этажерку из транзисторов, если рассеиваемая мощность меньше 100 мВт? При этом на источнике тока 135 мвт, что близко к пределу (если я не ошибаюсь, 150 мВт), но в источнике тока вы этажерку не советуете. Если честно, то я бы наверное все же запитал AVDD непосредственно от TPS65100, настроенной на 9.6 вольт. А подсветку от импульсного понижателя, на вход которого подается 12/24 вольт. Я думаю, импульсник при понижении с 24 до 9.6 вольт сильно греться не будет? Тот же pt4115. Правда требуемый ток он может обеспечить только при входном 12 вольт, но ведь у нас есть 12 вольт? Да и по месту на плате - 5 деталей. А в случае с рублевым lm328 - куча делителей, конденсаторы, этажерки из транзисторов (либо два sot223). Я неправ? Просто не являюсь профи и боюсь сбить автора своим советом, но при всей изящности и дешевизне решения с lm328, оно все же громоздко.
  10. Вроде бы речь шла о ШИМ регулировании. На lm358 так получится? Подавать 0 и 1 на инвертирующий вход, а резисторами добиться, чтобы в результате этого ток через диоды был либо ноль либо максимум? Есть ведь готовые решения от ST линейные драйверы, с шим-входом. Стоят около 50 рублей. Хотя можно и pt4115 поставить - он понижающий.
  11. Как бы не так. Сервис существует давно. Просто раньше он существовал только для Китая, даже сайт для китайцев отдельны был. Теперь его открыли для мира.
  12. Есть шнековый дозатор со сменными наконечниками, количество пасты за одно нажатие кнопки на дозаторе регулируется. Хотелось бы не экспериментировать, а четко знать - к примеру 0805 компонент, нужно взять наконечник такого-то диаметра и выдавить столько-то. Есть такие данные? Нет, я могу конечно умножить площадь контактной площадки на высоту стандартного трафарета, но вдруг уже кто-то провел такую работу за меня?
  13. Так я изначально так и сделал. Просто хочется более изящно. В других функциях я прямо внутри добавил, что хотел, а тут....
  14. Друзья, в генерируемых кубом проектах есть строки типа /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ для того, чтобы туда можно было вставить свой код и куб при изменении настроек и повторной генерации проекта не трогал то, что внутри них. Однако в функции static void MX_GPIO_Init(void) нет директив для user_code Если я вставляю свои и даже пытаюсь соблюсти синтаксис и пишу /* USER CODE BEGIN GPIO_Init 2 */ - то куб при повторной генерации кода безжалостно эти строки удаляет. МОжно ли как-то обойти это?
  15. Да.... вот что значит чужой код. Настроил разрешение измерения температуры - pid_out стал дробным, но все равно стал меняться с шагом 10. А цуцик вот где был зарыт double pid_Controller(int16_t setPoint, int16_t processValue) измеренная и целевая температуры выражались в целых числах. За всеми проверять нужно... Так все-таки, поясните Ваши слова? Какую методику я проигнорировал, в ней ли было дело? Или так - прочитали по диагонали и решили выпендриться?
  16. Да, действительно понял. Я любитель, без технического образования. Что такое интеграл - забыл. Что такое дифференциал - для меня это часть ходовой в автомобиле) шутка. Не надо было бояться этого ПИДа), вот и все. Если будет шаг в 2.5% мощности, то я думаю, это существенно улучшит ситуацию. Самое смешное, чтобы совсем не было мерцания от 0 до 2.5%, нужно увеличить величину тепловых потерь)))
  17. Хм... если вглядеться в формулу, то получается, что на каждый 1 градус ошибки при коэффициенте р=10 система увеличивает мощность на 10 %. То есть нужно просто точнее измерять температуру. Если этому коду скармливать значения ошибки с шагом в 0.1 градус, то тогда и шаг температуры будет 1%. В принципе у меня разрешение измерения -0.25 градуса. А у меня регулятору подается значение типа int.
  18. Зря я наверное график выложил. Проблема не в нем. Манипуляции с I , если мне не изменяет память, вносили задержку в реакции системы на отклонение температуры от заданной. Что-то мне подсказывает, что умножение прмежуточных значений на коэффициент p происходит поздновато. То есть система рассчитала некое значение с точностью до единицы, а потом тупо умножила его на 10. P.S. сколько раз убеждался, что стремление сэкономить время, взяв чужой код, не приносит желаемого результата. Хотя код-то не выдран откуда-то, он написан, скажем так, в экспортном формате, готов для использования
  19. Да.... если вдруг кто-то неправильно понял меня - график, что я привел, может навести кого либо (например форумца rkit) на мысль о том, что не настроен D коэффициент и имеет место статическая ошибка. Это не так. При коэффициенте p=3 -это лучшее, чего удается добиться за счет настройки остальных коэффициентов. И при p=3 проблема все равно остается - ПИД не выдает выходных значений кроме как кратных трем. Меня именно это беспокоит. Изначально у меня была ошибка в программе - вызов пид контроллера вызывался в основном цикле программы без каких либо условий, то есть работал так часто, насколько позволяло быстродействие контроллера. Я исправил ошибку - привязал вызов функции к таймеру, по которому у меня измеряется температура, то есть вызываю её тотчас после очередного измерения и строго один раз в 0.1 сек. Не изменилось ровным счетом ничего.
  20. Под методикой вы понимаете алгоритм расчета выходного сигнала или настройку коэффициентов?
  21. Друзья, помогите с натройкой PID-регулятора. Хотя тут наверное проблема не в настройке коэффициентов, а в самом коде. Работает он в печке, которая горячо обсуждалась в соседней теме. Забегая вперед, скажу, что термопрофиль она держит прекрасно. Но есть одно но. Мощность нагревателя у меня регулируется от 1 до 100. С шагом в 1. А регулятор выдает значения кратные 10-ти, то есть при его настройках он способен выдать всего 10 значений Стал настраивать, начал, как полагается с коэффициента P. Температура смогла "угнаться" за графиком только тогда, когда я поставил коэффициент P=10. При этом никогда не было необходимости во включении печки на полную мощность - максимум 50%. Если ставить скажем 3, то картина такая Если же ставить P=10, то, повторюсь, все нормально, однако регулятор выдает значения в диапазоне от 0 до 100 с шагом 10. То есть 0,10,20,30,40... И когда идеальным значением, к примеру было бы 5 - регулятор попеременно выдает 10 и 0. В виду температурной инерции это на конечный результат не влияет, но лампы мигают. Что не так? Код (не мой) /************************************************************************/ /* AVR PID Library source file */ /* @author Gazizov A.T. gazizov@tpu.eu */ /************************************************************************/ #include "stdint.h" #include "pid.h" /** Structure for storing PID data between calculations */ typedef struct PID_DATA { int16_t lastProcessValue; int32_t integralTerm; double kp; double ki; double kd; int16_t MAX_OUT; int16_t MIN_OUT; } pidData_t; struct PID_DATA pidData; /* PID controller initialization. Should be called only once. * @param kp - proportional coefficient. * @param ki - integral coefficient. * @param kd - differential coefficient. */ void pid_Init(double kp, double ki, double kd) { pidData.integralTerm = INITIAL_INTEGRAL_TERM; pidData.lastProcessValue = INITIAL_PROCESS_VALUE; pid_setParams(kp, ki, kd); pid_setOutputLimits(DEFAULT_MIN_OUT, DEFAULT_MAX_OUT); } /* Main PID controller function. It should be called regularly, each SAMPLE_TIME sec. * @param setPoint - level desired at output of the control object. * @param processValue - level obtained from the control object. * @returns input to control object. */ double pid_Controller(int16_t setPoint, int16_t processValue) { double error, p_term, d_term; double out; error = setPoint - processValue; pidData.integralTerm += pidData.ki * error; if (pidData.integralTerm > pidData.MAX_OUT) { pidData.integralTerm = pidData.MAX_OUT; out = pidData.MAX_OUT; } else { d_term = pidData.kd * (processValue - pidData.lastProcessValue); p_term = pidData.kp * error; out = (p_term + pidData.integralTerm - d_term); if (out > pidData.MAX_OUT) { out = pidData.MAX_OUT; } else if (out < pidData.MIN_OUT){ out = pidData.MIN_OUT; } } pidData.lastProcessValue = processValue; return out; } /** Restricts PID controller output. * @param Min - minimal allowed output value. * @param Min - maximal allowed output value. */ void pid_setOutputLimits(int16_t Min, int16_t Max) { if(Min > Max) return; pidData.MIN_OUT = Min; pidData.MAX_OUT = Max; } /** Set PID controller params with consideration of sampling time. * @param Kp - proportional coefficient. * @param Ki - integral coefficient. * @param Kd - differential coefficient. */ void pid_setParams(double Kp, double Ki, double Kd) { if (Kp<0 || Ki<0 || Kd<0) return; pidData.kp = Kp; pidData.ki = Ki * SAMPLE_TIME; pidData.kd = Kd / SAMPLE_TIME; } Заголовок /************************************************************************/ /* AVR PID Library header file */ /* @author Gazizov A.T. gazizov@tpu.eu */ /************************************************************************/ /** Range of allowed PID output range. Needed to avoid sign/overflow problems. */ #define DEFAULT_MIN_OUT 0 #define DEFAULT_MAX_OUT 100 /** Sample time in seconds. * How often PID control function (pid_Controller) will be called. * Important setting dependent on timer implementation in your program. */ #define SAMPLE_TIME 0.1 /** Parameters for initializing */ #define INITIAL_INTEGRAL_TERM 0 #define INITIAL_PROCESS_VALUE 0 /** Library functions declaration */ void pid_Init(double p_factor, double i_factor, double d_factor); void pid_setParams(double Kp, double Ki, double Kd); void pid_setOutputLimits(int16_t Min, int16_t Max); double pid_Controller(int16_t setPoint, int16_t processValue);
  22. Ёкерный бабай. Вы правы. Именно так. Я почему-то думал, что сообщение выдает не программа, а система. И пытался перехватить систему. А оказывается надо было бороться с программой)
  23. Как то раз при выдергивания шнура у меня выскочило "APRO Except!" Обрабатывает он исключения, но не все. Вот файл, где и работа порта и организация потоков... Не глянете? Может вам удастся понять, где там исключение ловить? AwUser.pas