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

Вопросы от начинающих по МК


Рекомендуемые сообщения

26 minutes ago, LiVit said:

На гражданина это заклинание не действует

Прискорбно. Он прямо как тот "хирург", который по советам с форумов делает операцию на мозге, и уже на вскрытии черепной коробки застрял…

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Yurkin2015, зачем ворошить старое.
По-моему, я достаточно ясно сказал, что в этой теме я разобрался и принёс извинения Всем участникам форума:

06.11.2021 в 03:37, Юрий_Нд сказал:

1. Извиняюсь, был неправ, заблуждался.
Теперь я знаю почему (1<<0) = 0b0000 0001. И теперь я в это не просто верю, как делал это раньше, а точно знаю это и могу объяснить/пояснить любому желающему.
2. Интернетом не пользовался, книжки умные по этому вопросe не читал, просто взял листочек с карандашиком и написал:
(1<<6)=(16<<2)=(4<<4)=64 
верно?
3. LiVit, как Вы думаете Керниган и Ричи могут мне сказать что-либо новое и неизвестное именно по этому вопросу?

----------

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

 

8 часов назад, Yurkin2015 сказал:

float даёт 7

... а почему не 8 значащих цифр?

Изменено пользователем Юрий_Нд
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 час назад, Юрий_Нд сказал:

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

Вам за меня ответили.
Погрешности и ошибки имеют свойство накапливаться.
Плюс непонятно, зачем микроконтроллер заставлять ворочать эту тяжелую математику.

И лично меня убивает эта чУдная математика 2.20000005 + 1.10000002 = 3.30000019

И это при том, что вам не нужны эти float. Я могу понять, когда их используют в каких-нибудь сложных ЦОС (цифровая обработка сигналов), но при измерении тока, напряжения, времени....

PS. не удивляйтесь, что вам скоро вообще перестанут отвечать.

Изменено пользователем LiVit
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

08.11.2021 в 19:11, Юрий_Нд сказал:

Допустим число нужно умножить на 0.384.
Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

08.11.2021 в 19:38, Eddy_Em сказал:

... нужно умножить на пять и разделить на 13.

Что Вы по этому поводу можете сказать?

Изменено пользователем Юрий_Нд
Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Огонёк сказал:

Си есть си, какая разница?

В AVR модификатор const не означает размещение во флеш, нужен еще PROGMEM.

32 минуты назад, Юрий_Нд сказал:
08.11.2021 в 20:11, Юрий_Нд сказал:

Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

Вариантов много. Самый простой - да, умножить на 384 и делить на 1000 - тогда коэффициент можно задать в человеко-читаемом виде. Если же это просто число, чье представление не несет особого смысла - коэффициент резистивного делителя, например - можно умножить на 98 и поделить на 256. Или умножить на 25166 и поделить на 65536.

Домашнее задание: разобраться почему для делителей я выбрал именно эти числа.

Кстати, на соседнем форуме сейчас обсуждается подобный подход как замена делению на 10. Потому что умножение действительно оказывается быстрее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, Юрий_Нд said:

Что Вы по этому поводу можете сказать?

Могу сказать, что налицо полный профан. Тут, похоже, не только С надо изучать, но и элементарный матан!

Я уже писал, что там, где нет флоатов, заменяю умножение на некую нормировочную константу двумя действиями: умножением и делением. Однако, в STM32F0 даже деления нет, поэтому для них лучше эту операцию реализовать как умножение и сдвиг, пусть даже uint32_t может понадобиться расширить до uint64_t. Правда,  считать коэффициенты так лихо не получится. Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов 1.23, 3.25 и 7.11. Я просто в октаве пишу:

[n d]=rat([1.23 3.25 7.11], 0.001)
	n =
	    16    13   711
	d =
    13     4   100

Вот и сразу три числителя и три знаменателя. Можно проверить:

n./d
ans =
   1.2308   3.2500   7.1100

- просто превосходно!

Однако, в случае, когда деление хочется заменить сдвигом, придется покумекать, т.к. через цепные дроби подбирать эти числа нереально! Могу разве что предложить последовательный перебор. Вот так:

K=1.23; for x=0:31; N=round(K*bitshift(1,x)); printf("a*%g approx a*%d>>%d (*%g)\n",K, N, x, bitshift(10000*N,-x)/10000); endfor
a*1.23 approx a*1>>0 (*1)
a*1.23 approx a*2>>1 (*1)
a*1.23 approx a*5>>2 (*1.25)
a*1.23 approx a*10>>3 (*1.25)
a*1.23 approx a*20>>4 (*1.25)
a*1.23 approx a*39>>5 (*1.2187)
a*1.23 approx a*79>>6 (*1.2343)
a*1.23 approx a*157>>7 (*1.2265)
....

Можно функцию написать, которая будет подбирать коэффициенты с наибольшей точностью. Вот так:

function [N Shift] = findNR(K, dk)
    N = 1; Shift = 1; delta = 1;
    Ngood = 1; Shiftgood = 1; deltagood = 1;
    Nmax = bitshift(1,32)-1;
    for Shift = 3:31;
        N = round(K*bitshift(1,Shift));
        if(N > Nmax) break; endif
        delta = abs(bitshift(1e6*N, -Shift)/1e6 - K);
        if(delta < dk) break; endif
        if(delta < deltagood)
            deltagood = delta; Ngood = N; Shiftgood = Shift;
        endif
    endfor
    if(delta > dk)
        printf("tolerance %g not found, use %g\n", dk, deltagood);
        Shift = Shiftgood; N = Ngood;
    endif
endfunction

И в этом случае:

[N S] = findNR(1.23, 0.001)
N = 315
S = 8

Т.е. можно было бы просто умножить на 315 и сдвинуть вправо 8 раз! А вот если я захочу 10¯⁶ получить, то уже может быть переполнение uint64_t, так что придется точность понизить:

[N S] = findNR(1.23, 1e-6)
tolerance 1e-06 not found, use 1e-05
N = 40305
S = 15
Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Юрий_Нд сказал:

COKPOWEHEU, а Вы видели мою тему

Я много ваших тем видел. Смысла они обычно не несут.

8 часов назад, Eddy_Em сказал:

Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

8 часов назад, Eddy_Em сказал:

Однако, в случае, когда деление хочется заменить сдвигом

Зачастую можно выбрать сдвиг на 1, 2, 3 и т.д. байтов в зависимости от требуемой точности.

8 часов назад, Eddy_Em сказал:

Я просто в октаве пишу:

Вот использование стороннего софта для генерации констант мне не нравится:

//доступно для изменения юзеру
#define KOEFF1 1.23
#define KOEFF2 3.25

//внутренние константы, рассчитываемые препроцессором
#define KOEFF1_8 ((unsigned int)((KOEFF1)*256))
#define KOEFF2_16 ((unsigned long)((KOEFF2)*65536))
  
...
x = (x*KOEFF1_8)>>8;
y = (y*KOEFF2_16)>>16;

 

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

3 minutes ago, COKPOWEHEU said:

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

Второе — калибровки по платиновому термометру, сглаженные, аппроксимированные полиномом пятой или шестой степени и в соответствии с желаемой точностью (±0.5℃ — все равно NTC лучше никогда не даст) разложенные кусочно-линейной аппроксимацией.

4 minutes ago, COKPOWEHEU said:

Вот использование стороннего софта для генерации констант мне не нравится:

Октава - свободный софт, так что все ОК. Не на пытхоне же [censored] писать! Но кое-что я рассчитывал и на сях, и прямо в репу вкладывал в отдельную директорию сишный файлик, который компилируется даже без Makefile'а (просто gcc file.c) и позволяет в случае необходимости нужный заголовочный файл сгенерировать.

Еще, бывает, баш-скрипты вкладываю: для того, чтобы сгенерировать, допустим, заголовочный файл с макросами, позволяющими удобно шрифты описывать (в виде X___XX_X, а не менее наглядных 0b10001101). Ну или просто в комментах содержимое этих скриптов пишу: вдруг в другой раз (или кому-то еще) захочется что-то подобное сделать...

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Здравствуйте !

История такая -

инициализация прерываний по компаратору:

 ldi temp,(0<<ADEN) out ADCSRA,temp                       ; 0<<ADEN выключение АЦП
in temp,SFIOR sbr temp,(1<<ACME) out SFIOR,temp                 ; 1<<ACME подключенгие инвертирующего входа AIN1 к входу АЦП
ldi temp,(0<<MUX3)+(0<<MUX2)+(0<<MUX1)+(0<<MUX0)out ADMUX,temp  ; AIN1 к входу АЦП (ADC0) 23 нога/(ADC1) 24 нога
ldi temp,(0<<ACD)+(1<<ACBG)+(1<<ACIE)+(0<<ACIS1)+(0<<ACIS0) out ACSR,temp

инициализация  АЦП:

ldi temp,(1<<REFS1)+(1<<REFS0)+(1<<adlar)+(1<<MUX2)+(0<<MUX1)+(0<<MUX0); Выбор ADC4(27н), выравнивание влево, ИОН=2.56
out ADMUX, temp
ldi  temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS1)+(1<<ADPS2) out  ADCSRA,temp   ; 8МГц:64=125 кГц  включение и однократный запуск
sbic ADCSRA,ADSC  rjmp PC-1  ожидание конца преобразования

in temp ,ADCH

 

Основной вопрос - правильно ли при инициализации АЦП с однократным преобразованием - сначала переключать канал ,  а потом включать сам АЦП и преобразование ?

Проблема в том, что АЦП хватает мусор более 4-10% от максимальной шкалы , но не всех процессорах , а на некоторых .

процессор - ATmega8

Изменено пользователем dodik
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
В 08.11.2021 в 13:13, Юрий_Нд сказал:

Вполне приемлемая для моих расчётов ошибка в одну сотую даёт погрешность 0.3 процента. 
Тогда какое мне дело, что ошибка, связанная с типом переменных даёт относительную погрешность 5-6 миллионых процента.
Наверное это может интересовать только тех, кто собирается решать систему уравнений из 50 неизвестных.
Хотя не уверен, насколько это важно для них. Ответ на это вопрос нужно спрашивать у "чистых математиков".

Я конечно извиняюсь что поднял столь древний пост, но... я делал решатель систем уравнений до 20 порядка, так вот при размере уравнения в 20 неизвестных ошибка "ответа" составляла в несколько единиц!!! Попробуете догадаться почему? Использование 192-битного числа с плавающей запятой в вычислениях снизило ошибку до сотых долей единиц... но это по прежнему чудовищно много.
Проблема не в самой погрешности, а в том что ОНА НАКАПЛИВАЕТСЯ по мере вычислений. Мощность вы вычисляете произведением двух величин, погрешность здесь будет тысячные доли процента. Теперь вы просуммировали 1000 раз это произведение и... погрешность увеличилась ровно в 1000 раз! Причем она увеличится больше чем в 1000 раз, 1000 раз - это только на произведениях, а есть ещё и сумма, которая тоже даёт погрешность. Любая ваша операция с плавающим числом накапливает погрешность. И то что она изначально не очень большая нивелируется количеством операций. Float хватит чтобы умножить два числа, или сложить. Ну пусть даже 1000 раз, но на миллионе он уже даст ощутимую погрешность. И для каждой величины есть число меньше которого сумма не будет меняться. Т.е. 1.0 + 1Е-30 будет по прежнему равен 1.0 это иногда тоже выплывает неожиданно для программиста. И хоть миллион раз прибавь...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, Alexeyslav said:

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

Загадочная фраза. Я, конечно, извиняюсь, но вы в курсе, что означает термин "порядок уравнения"?

Если же речь о решении систем уравнений, то слышали ли вы о сходимости численных методов решения?

Ссылка на комментарий
Поделиться на другие сайты

В контексте этой темы это не важно. Да  имне тогда было это не важно, нужно было решать лишь СЛАУ до 8 неизвестных, а 20 - это предел удобства ввода на одном экране, пробовал чисто только потому что можно было. И результат запомнился.

 

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • 1 месяц спустя...

Здравствуйте. Собираю штуку на атмега8а. К прошивке идет такой скрин,как выставить правильно фьююзы.Такой программы нету,есть avrdude. Как правильно выставить фьюзы в ней? я попробовал выставить какие были пункты и залочил мк.

fuses.jpg

Ссылка на комментарий
Поделиться на другие сайты

@Нэцкэ там простой паяльник на т12 собираю,без кварца. может какие стандартные фьюзы подойдут. скачал эту программу для прошивки(что на скрине) и так и не смог ее подружить с программатором за $1

Ссылка на комментарий
Поделиться на другие сайты

Лучше дай нам  ссылку и мы поможем тебе , пока нажми в программе  кнопочку по умолчанию и программа покажет верное положение  галочек 284939087_.jpg.98c9020c0032cb32f7f2825cdf042c52.jpg

Изменено пользователем Нэцкэ

У меня есть мысль , и я её думаю ...  

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Пиздец вы тут все токсики) Свят-свят-свят.
    • Ещë раз говорю, схема не моя! Этой схеме уже лет 30 как минимум! Есть немного более сложная вариация этой схемы, усилитель "Омикрон". По сути практически тоже самое только с небольшими доработками. Что ту схему что я дал, что Омикрон, люди собирали очень много раз и более чем довольны. Не надо тут чушь молоть про симулятор, если бы я на 100% не знал бы что схема рабочая, никогда бы не дал!   Про ОУ я тоже ранее писал. 4558 конечно далеко не HiEnd ОУ, но дать до 0.01% КНИ и немного ниже он более чем способен. Тем более автор темы не собирается делать что-то сверхтоповое, ему нужен обычный, просто нормальный ушник. Если захочет улучшить, никто не мешает заменить ОУ на более хороший и получить параметры намного лучше, переделывать на плате для этого вообще ничего не нужно. 4558 я и сам уже не раз использовал, это вполне себе нормальный ОУ и с убогим LM358 вообще ни в какое сравнение и близко не идëт. 
    • Не будут, тут разнос между на и вч огромный, я же написал Широколосный, все пропустит от 20 Гц до 20 кГц, далее магнитола срежет на какой надо частоте. 60, 80 , 120 Гц. Но сейчас осенило, вроде магнитолы режут 2 порядком, может этого будет и мало Вам, нужно слушать. 
    • Нет, изначально планировал дальний в полнакала, развел плату, заказал в Китае 5шт (первый заказ, скидки и просто красиво). Установка планировалась в семейный "парк" авто. Конечно, если все будет работать правильно, то каким-то знакомым или знакомым знакомых можно и сделать.  Но, как оказалось, есть куча нюансов. Потом присмотрел ДХО с режимом поворотника такого плана:   Как уже ранее писал, для ледов девайс можно перевести в режим реле. Но поскольку обычно в подобных лампах все на пределе по току и по нагреву, и живут они соответственно не долго,  хотелось бы оставить возможность ШИМ. Вот и интересно как реагирует светодиод на ШИМ. Пока ясно, что нужно поднять частоту. Может еще электролит по выходу добавить или нет особого смысла?  
    • Тут подробнее. Становится понятно что бета величина нифига не линейная.  
    • И что тут я должен сравнивать ? На последнем фото моя плата, сравните с видеороликом. В однофазной мотор подключается непосредственно к плате, в трёхфазной версии мотор подключается через контактор, а реле контактора подключаются к out motor (на L/S и N/R)  Если вы не верите, то я могу запустить плату и сделать фото загрузки блока, где на экране будет видна модель устройства... Или вы будете утверждать ещё и факт перепрошивки ?
    • Собственно вопрос - как увеличить выходной ток заряда? Вот в этой схеме какой именно резистор нужно подобрать для изменения тока заряда?  
  • Похожий контент

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