Перейти к содержанию
    

Сергей Борщ

Модератор
  • Постов

    10 921
  • Зарегистрирован

  • Посещение

  • Победитель дней

    31

Сообщения, опубликованные Сергей Борщ


  1. 1 минуту назад, manul78 сказал:

    Не хочу скатываться в политику

    Уже скатились.

    1 минуту назад, manul78 сказал:

    но в новейшей истории РФ известны случаи оплаты из государственного кармана (бюджета, фондов) долгов некоторых

    компаний

    Долги компаний, вдвое превышающие весь внешний долг государства? Самому не смешно?

  2. 42 минуты назад, Plain сказал:

    По принуждению, результат вряд ли будет.

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

    • Like 1
  3. 28.09.2021 в 09:25, AlanSbor сказал:

    Понял. Ничего не подписывал. Вечером выложу.

    Спасибо. "Дело было не в бобине".

    Во-первых, был прав @KnightIgor и у меня была ошибка в коэффициенте перевода пупок АЦП в Гауссы.

    Во-вторых, у меня датчик вместе с конденсатором располагается на маленькой платке и довольно толстым метровым кабелем соединяется с основной платой, где запитан от ноги контроллера. Датчики отдавали запаивать на производство, чтобы они оценили - смогут ли ставить их потом серийно. Ну они только датчик и запаяли. А потом монтажник, не сильно задумываясь, припаял кабель, который конструктивно закрывает собой и датчик и конденсатор. В общем без конденсатора с таким длинным кабелем и вялым питанием от ноги контроллера Set/Reset работают ну очень неохотно (почти не работают совсем).

    В-третьих, нельзя одновременно выставлять DoSet/DoReset и AutoSR_en, если это сделать - в последующих измерениях будут получаться нули. После DoSet/DoReset выставлять AutoSR_en можно.

    В-четвертых, бит Sat_sensor несмотря на свое название выставляется только во время автокалибровки. Если же поднести очень мощный магнит во время работы - показания будут какие угодно, но только не максимальное/минимальное значение шкалы. То есть лежащий на датчике магнит, который невозможно одной рукой оторвать от листа железа, вполне может показывать 1.5 Гс, 0 Гс и сброшенный Sat_sensor. После убирания магнита показания могут быть совершенно любыми и реакция на слабое поле тоже непредсказуема. Узнать о насыщенни, судя по всему, можно только пропуская ток через встроенную катушку битами St_enp, St_enm или делая периодический self-test, но тогда ни о каком микропотреблении речи уже быть не может. А мне нужно заменить им LIS3MDL в считывателе водяного счетчика со сроком службы 10 лет от одной батарейки. У LIS3MDL таких проблем не было - он при насыщении честно уходил в край шкалы, но сейчас этих LIS3MDL не купить.

    В-пятых, отличается от документации вычисление порога в процедуре auto-self-test. И я даже не знаю, кому верить - в документации просто сказано "вычислите 80% от значений ST_(x,y,z), в коде эти значения сначала преобразуются в знаковые с умножением на 32, потом берется их модуль, вычисляется 80% и делится на 8. Может потому, что код от 5603, а документацию я смотрю на 5633 (посмотрел документацию на 5603 - там все то же самое).

    23 часа назад, KnightIgor сказал:

    убедить "дефектный" датчик убрать смещение (думаю, это понимается под "upset") по "дефектной" оси не удается.

    В документации 5633 описана процедура программного вычисления и учета смещения:

    Цитата
    1. The most accurate magnetic field measurements can be obtained by using the protocol described as follows: Perform SET. This sets the internal magnetization of the sensing resistors in the direction of the SET field.
    2. Perform MEASUREMENT. This measurement will contain not only the sensors response to the external magnetic field, H, but also the Offset; in other words, Output1 = +H + Offset.
    3. Perform RESET. This resets the internal magnetization of the sensing resistors in the direction of the RESET field, which is opposite to the SET field (180o opposed).
    4. Perform MEASUREMENT. This measurement will contain both the sensors response to the external field and also the Offset. In other words, Output2 = -H + Offset.
    5. Finally, calculate H by subtracting the two measurements and dividing by 2. This procedure effectively eliminates the Offset from the measurement and therefore any changes in the Offset over temperature. H = (Output1-Ouput2)/2.

    Note:

    •  To calculate and store the offset; add the two measurements and divide by 2. This calculated offset value can be subtracted from subsequent measurements to obtain H directly from each measurement.

    Я реализовал описанное в note, оно работает. Причем смещения для трех датчиков у меня получились примерно такие (X/Y/Z):

    на столе - 17/-418/-8, -163/24/-365, -203/-68/-926

    в магнитном поле 5-8 Гс смещение отличается: 3/-416/51, -241/31/-102, -276/-85/-548

    Похоже, надо вычислять его заново как минимум при сильном изменении поля, как максимум - при каждом измерении.

  4. 1 час назад, one_eight_seven сказал:

    GCC так не делает

    Делает-делает, c -fshort-enums.

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

    Даже не просто какого-то конкретного значения, а и сам размер его может быть недостаточным

    К счастью, компилятор знает размер enum в точке использования и вполне может определить - влезет в него соответствующий вид целого или нет. Но он этим не занимается, как не занимается подобным и при присваивании char = int, int = long int и тому подобных. В сях (но не в плюсах) просто разрешены неявные преобразования int к enum и все.

     

    Как версия: обсуждаемое предупреждение выдается потому, что если программист делает явное приведение там, где оно и так будет выполнено неявно  - то он погроммист и плохо представляет, что он делает :blum:.

  5. 4 часа назад, firew0rker сказал:

    C этим дескриптором такая ошибка:

    Вбейте этот дескриптор в HID Descriptor Tool. Он отступами покажет все коллекции и незакрытые будут видны невооруженным глазом. Также там можно в меню выбрать parse descriptor - может быть его отчет натолкнет на какие-то мысли. Или сохраните введенный дескриптор в файл и выложите сюда - подумаем вместе. 

  6. 2 часа назад, dxp сказал:

    А "целое в перечисление" - небезопасное, т.к. в перечислении просто может не оказаться соответствующего значения. И тут требуется явное преобразование, т.е. ответственность перекладывается на программиста.

    В плюсах. В обычных же сях такое неявное преобразование разрешено.

    2 часа назад, dxp сказал:

    То, что компилятор ругается при включенном предупреждении, имеет к вышесказанному опосредованное отношение

    Причем это предупреждение работает только в сях и объективных сях.

    Вот тут достаточно внятно написано - зачем это предупреждение и с какими именно проблемами кода оно должно помогать бороться. А именно - с явными приведениями типов в тех местах, где такое приведение не требуется ввиду наличия неявного приведения и ввиду наличия в сях до стандарта 11 года возможности использовать функцию без предварительного объявления, которую компилятор обязан считать возвращающей int. Однако, в таком случае выдается предупреждение об использовании функции без прототипа, которого достаточно для выявления подобных недоработок кода, так что смысла дополнительно включать еще и это предупреждение (а оно может быть включено только принудительно) не видно.

  7. 1 час назад, MDD сказал:

    Конечно в этом случае зеркало будет вращаться на угол немного больше 90 градусов. Не вникал как ведутся измерения в глазу

    Что-то мне кажется, что там надо просто сравнительно равномерно двигать зеркало туда-сюда примерно на 90 градусов и люфты роли не играют. 

  8. 12 часов назад, AlanSbor сказал:

    Только заметил что копирайт стоит.

    Так вы же их за свои не выдаете. Вот если бы их вам дали после подписания соглашения о неразглашении (NDA) - тогда другое дело.

  9. 37 минут назад, AlexRayne сказал:

    да приводится, если это не результат функции.

    Можно какое-нибудь подтверждение ваших слов, например - цитату из страндарта?

    37 минут назад, AlexRayne сказал:

    курите  Wbad-function-cast

    Курите сами. 

  10. 48 минут назад, AlexRayne сказал:

    где `disconnect_mode()` - возвращает enum. 

    Покажите объявление disconnect_mode() и enum. Потому что по правилам языка C enum к int приводится неявно оно должно компилироваться даже без явного приведения.

  11. 1 час назад, KnightIgor сказал:

    неправильная интерпретация 20-ти битного значения из 5633 (может, сильно загрубили результат)

    Я вывожу на экран весь обмен и могу глазами смотреть именно отдаваемые данные. Результат с ними сходится.

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

    скорость опроса датчика выше скорости внутреннего преобразования.

    Тоже маловероятно - я считываю данные через 5 секунд после запуска преобразования, а у него самое медленное преобразование - 6.6 мс, причем все три оси оцифровываются последовательно, то есть если бы оно не успевало - результаты оси Z сильно отличались бы. Но нет - они одного порядка.

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

    Тем не менее, по моей проблеме: у меня же не "замылены" глаза, что проекции ненулевого вектора на систему ортогональных координат не могут быть все нулевыми вне зависимости от ориентации этой системы координат?

    У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

  12. 10 минут назад, AlanSbor сказал:

    По ману 5633, у него полная шкала +-30 Гаус и управление чувствительностью в зависимости от выбранного разрешения АЦП.

    Я раз пять перечитал документацию от корки до корки, но так и не нашел - где там выбирается разрешение АЦП. Решил, что оно определяется тем, сколько битов разработчик захочет использовать, ибо в таблице параметров есть всего одна строка о разрешении АЦП:

    image.thumb.png.ad4567547c7fc9594af9020ae34f4996.png

    12 минут назад, AlanSbor сказал:

    было бы интересно перевести переписку в приватный вариант общения

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

  13. 7 минут назад, AlanSbor сказал:

    у меня вроде как получше отвечают

    А 5633 вы уже попробовали? У меня они почему-то выдают очень маленькое значение. Магнит, который вводит в насыщение LIS3MDL с полной шкалой в +-16 Гауссов изменяет показания 5633 чуть меньше чем на 1000 единиц в старших 16 битах. 

  14. 5 часов назад, Tanya сказал:

    Без обид - имели дело с шаговым двигателем?

    А что вас смутило? Работа в упор для шагового двигателя - вполне себе штатная операция. Помните как матричный принтер после включения первым делом отводил печатающую головку в левый край и трещал ей несколько секунд - это оно и есть. 

  15. 29 минут назад, jcxz сказал:

    Вообще-то не тот-же. Гибкости - в разы меньше.

    Если этот вариант не подходит для каких-то отдельных случаев - это не значит, что  его не нужно применять даже в тех случаях, для которых он подходит очень хорошо. Идеальных решений не существует - ваше требует больше писанины и усидчивости (чтобы не забыть LogReleaseOut там, где он необходим).

  16. Раз уж пошел разговор не по исходной теме (кстати, может его выделить в отдельную тему?)...

    29 минут назад, jcxz сказал:

    LogCatchOut...()/LogReleaseOut...() - захват/освобождение отладочного вывода через семафор.

    Ну то есть закат солнца вручную, "потому что без плюсов". А были бы плюсы и LogCatchOut()/LogReleaseOut() в конструкторе/деструкторе - было бы 

    {
      Log_mutex Mutex;
      
      Log.write(.....);
      Log.printf(.....);
      ......
      Log.new_line();
    }

    Писанины меньше, головной боли меньше,  результат - тот же. "Машина должна работать, а человек - думать" (принцип IBM).

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

    А если нужно сформировать строку (или блок строк) несколькими такими вызовами? И чтобы другой процесс не влез в его середину

     У меня семафор захватывается по первому выводимому символу, освобождается по "\r\n" (но только это делается не в printf(), а в классе, реализующем собственно вывод). Внутри блока перевожу строку комбинацией "\n\r", которая выглядит так же, но семафор не освобождает. В результате сообщение от одного потока никогда не разрывается сообщением другого без всяких рукопашных CatchOut()/ReleaseOut().

  17. 22 часа назад, MegaVolt сказал:

    P.S. Я в курсе про конечные автоматы, машины состояний,

    Видимо не до конца, потому что "машина состояний" - калька с английского "state machine", а правильный русскоязычный термин как раз "конечный автомат". То есть запятая между ними неуместна.

    21 час назад, MegaVolt сказал:

    Начало последовательности судя по тексту автора всегда 5 символов. \033[   если мы нашли эту часть в потоке данных то далее возможны 3 варианта:

    Вы описали конечный автомат.

×
×
  • Создать...