Alexeyslav Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 А я вот всё понимаю, тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ, это не порт, даже если записано "PB1" это просто число. В памяти, в регистрах где угодно но не в порту ввода-вывода. Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD в зависимости от того какой порт-ножка нам нужны. И ещё один ньюанс - произвольно дергать ножками порта мы не можем(за редким исключением, но это уже забота компилятора), мы можем только установить все 8 ножек сразу. Если мы указываем только одну ножку то она и установится а остальные сбросятся, что в целом не есть хорошо - другие ножки в вашей программе могут нести другую функцию. Поэтому чтобы установить ножку нам надо сначала прочитать текущее состояние порта, потом сделать с этим значением логическое ИЛИ с маской нужного бита(вот именно ОНА ХРАНИТСЯ У НАС В МАССИВЕ!) и результат записать обратно, как именно это записывается в коде - надеюсь подскажут. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 2 часа назад, Alexeyslav сказал: тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ Да ну! Если вы перечитаете две темы, то я несколько раз сказал что это не порт и порт нужно тоже занести в массив отдельный, или через структуру или класс в тот же 2 часа назад, Alexeyslav сказал: Поэтому чтобы установить ножку нам надо сначала прочитать текущее состояние порта, потом сделать с этим значением логическое ИЛИ с маской нужного бита Тоже три раза. Даже с кодом написал об этом. В 25.12.2018 в 22:17, DrobyshevAlex сказал: если нужно сохранить старшие 4 бита то как то так if (PORTD & 0b00001000) { PORTD = (PORTD & 0xF0) | ((PORTD & 0x0f) >> 3); } else { PORTD = (PORTD & 0xF0) | ((PORTD << 1) & 0x0F); } 2 часа назад, Alexeyslav сказал: И ещё один ньюанс - произвольно дергать ножками порта мы не можем(за редким исключением, но это уже забота компилятора) Что это вообще значит?) Почему не можем? Я могу 2 часа назад, Alexeyslav сказал: Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD что мешает записать по адресу как я показал выше? адрес хранить в массиве точно так и писать в регистр нужные ножки 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Alexeyslav Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 Очень многое значит. Человек не понимает основ, он ожидает что обращение к PB1 например, изменяет состояние ножки. Поэтому для него занести в массив и потом обратится к нему - это изменение состояния ножки. А что написано же... и порт в имени указан и пин.... но почему оно? А потмоу что кто-то в далёком эээ году сделал язык С стандартом толком не доработав его, и теперь досихпор за ним тянется шлейф из костылей. Почему, вот почему тогда паскаль не победил? 56 минут назад, DrobyshevAlex сказал: Почему не можем? Я могу Не сомневаюсь, но в архитектуре многих контроллеров есть ограничения на побитовый доступ к портам, например на AVR для побитового доступа доступны не все порты, особенно на мясистых контроллерах-многоножках. И есть ещё правда пару фишек которые не имеют уже смысла для С++ и работают только на уровне ассемблера - например запись в порт PINB(хотя он по логике предназначен для чтения) инвертирует состояние пина в который запишешь "1" т.е. сделает операцию XOR. В С++ конечно тоже можно записать в этот порт, но ни наглядности ни скорости всеравно не получишь наоборот только запутаешь тех кто потом будет читать код. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
DrobyshevAlex Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 2 часа назад, Alexeyslav сказал: А потмоу что кто-то в далёком эээ году сделал язык С стандартом толком не доработав его, и теперь досихпор за ним тянется шлейф из костылей. О чем Вы? Какие костыли?) если человек только учится и не понимает чего то то он и в asm этого не поймет)) вообще не вижу костыля в решени данной проблемы 2 часа назад, Alexeyslav сказал: но в архитектуре многих контроллеров есть ограничения на побитовый доступ к портам Не буду спорить ибо я не в курсе, в данном случае речь шла о atmega8 где я не вижу проблемы изменить 1 бит контроллера. Или же я не понял о чем Вы вообще... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 15 минут назад, DrobyshevAlex сказал: Или же я не понял о чем Вы вообще... конечно не поняли, речь о одновременном изменении нескольких бит порта без изменения состояния соседних бит. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 Костыли - да там везде костыли, все эти макросы... удобная штука иногда, но её используют как костыли и выстроили уже такую систему костылей что исправлять всё поздно, привыкли и не считают костылями но оно всё ими является. 17 минут назад, DrobyshevAlex сказал: речь шла о atmega8 где я не вижу проблемы изменить 1 бит контроллера. В общем случае это делается через процедуру чтение-модификация-запись, и она несколько уязвима к временным задержкам. прочитали, допустим и тут возникло какое-то прерывание, прерывание закончилось и только потом мы записали в регистр результат а он уже устарел на миллисекунды и не актуален. Побитовый же доступ через команду SBI/CBI лишён этого недостатка но доступен для портов находящихся в младшем адресном пространстве - туда попадают не все внешние порты. 24 минуты назад, DrobyshevAlex сказал: если человек только учится и не понимает чего то то он и в asm этого не поймет Поэтому, начинать надо с ассемблера, с прямой работы с периферией. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 (изменено) 42 минуты назад, IMXO сказал: речь о одновременном изменении нескольких бит порта без изменения состояния соседних бит то есть or или xor это не то и есть мк где можно изменить биты как то иначе? я даже не представляю что вы имеете ввиду можно пример? То есть речь идет о том, что нужен массив при обращении к которому мы сразу получим значение состояния PIN ибо автору нужно именно это, то есть asixX[x] - должно вернуть значение состояния пина на каком то порте на каком то пине. Что есть такого у других мк или асм для этого мк что позволит это сделать? 34 минуты назад, Alexeyslav сказал: все эти макросы имхо макросы это вообще можно отнести к компилятору или ide что угодно может выполнить подстановку в код вместо макросов кода 34 минуты назад, Alexeyslav сказал: и она несколько уязвима к временным задержкам. прочитали, допустим и тут возникло какое-то прерывание, прерывание закончилось и только потом мы записали в регистр результат а он уже устарел на миллисекунды и не актуален то есть это беда именно с++? в си или асм не будет такого? что же касается данного мк, это выполняется в прерывании, то есть во время одного прерывания может стартануть другое? 34 минуты назад, Alexeyslav сказал: Побитовый же доступ через команду SBI/CBI лишён этого недостатка как все это относится к тому что запись типа struct { port; pin; } myPin; ... myPin[4] pins; ... *pins[0].port & (1 << pins[i].pin) Вы вы называете костылем с++ как я понял говорите что это беда с++ с массивом в данном случае. То есть юзая асм вам не нужно знать адрес в каком читать состояние пинов? я конечно на асм мало писал) но не думаю что в асм можно создать массив в котором будет хранится только в 8 битах информация о номере пина без адреса порта и можно будет понять к какому порту она относится) разве sbi позволит записать одновременно несколько бит порта да еще и не зная регистра? 34 минуты назад, Alexeyslav сказал: Поэтому, начинать надо с ассемблера, с прямой работы с периферией. дак я это ему и советовал парой страниц назад) или в соседней теме не помню уже Мне кажется мы немного о разном говорим. Вы пытаетесь доказать в целом что с++ плох?) Я же отталкиваюсь отданного проблемного места где человек не может понять что он в массиве хранит только бит который он хочет проверить. Говорить же в целом о том что какой то язык плох... ну блин я сайты пишу на питоне руби или пхп но не на ассемблере или с++. а приложение под андроди на яве а под иос на объектив си. Есть вопрос, я обсуждаю как его решить а не то что на с++ не стоит писать художественную литературу емнип можно легко вставлять ассемблеровский код в си и с++ если очень нужно) Изменено 3 января, 2019 пользователем DrobyshevAlex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 30 минут назад, DrobyshevAlex сказал: я даже не представляю что вы имеете ввиду можно пример? конечно можно , собственно на примере вашего кода с некоторыми допущениями PORTD = (PORTD & 0xF0) | ((PORTD & 0x0f) >> 3); в зависимости от платформы и компилятора с некоторыми вариациями разворачивается в 1. temp1=PORTD & 0xF0; 2. temp2=PORTD & 0x0f; 3. temp2>>=3; 4. temp1 |= temp2; 5. PORTD = temp1; по сути если этот код в майне и на 2..4 итерации прелетит прерывание с изменением битов <7:4> порт получит совершенно иное значение чем ожидалось , об этом вам собственно и грят 1 час назад, Alexeyslav сказал: В общем случае это делается через процедуру чтение-модификация-запись, и она несколько уязвима к временным задержкам. прочитали, допустим и тут возникло какое-то прерывание, прерывание закончилось и только потом мы записали в регистр результат а он уже устарел на миллисекунды и не актуален. Побитовый же доступ через команду SBI/CBI лишён этого недостатка но доступен для портов находящихся в младшем адресном пространстве - туда попадают не все внешние порты. 30 минут назад, DrobyshevAlex сказал: как все это относится к тому что запись типа именно так и относится , ваш код может изменять биты только последовательно , но ни как не одновременно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 1 час назад, IMXO сказал: речь о одновременном изменении нескольких бит порта без изменения состояния соседних бит. да, глянул скомпилированный код в с++ PORTD |= 1 он действительно сделал с чтением, я думал компилятор умнее, ибо еще лет 10 назад слышал что компилятор выражения типа a *= 2 компилирую как просто сдвиг. Но тут конечно компилятор компилятору рознь) может кто то и компилирует)) Тут опять же спорить не буду особо)) Ибо я не в курсе включает ли стандарт си или с++ инструкции как компилятор должен обработать код. Есть 100500 вариантов натсроек оптимизации компилятора, и я тестировал без оптимизации, так что может с другими натсройками он и по другому скомпилирует код. Так что могу лишь сказать, что есть стандарт и css и IE упорно десятилетия делает не так как другие, и под IE нужно писать костыли. Так это беда стандарта? Или все таки разработчики такие у IE?) Так и тут, спорно утверждать что это беда именно с++ или си) Есть куча компиляторов и оптимизаций) Только что, IMXO сказал: конечно можно да я уже понял о чем вы) я просто смотрел немного с другой стороны, отталкиваясь от этой фразы 7 часов назад, Alexeyslav сказал: А я вот всё понимаю, тут просто надо было сказать что значение в массиве ПРОСТО ХРАНИТСЯ, это не порт, даже если записано "PB1" это просто число. В памяти, в регистрах где угодно но не в порту ввода-вывода. Чтобы изменить состояние ножки контроллера есть ТОЛЬКО ОДИН ПУТЬ ЭТО СДЕЛАТЬ - обратится к порту ввода-вывода с символическим именем PORTB или PORTD и все мои рассуждения были о том что я не считаю костылем конкретно макросы или структуры) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 Блин, да не решает применение виртуального порта ни Си , ни Плюсы, ни компилятор , ни оптимизация. это проблема на уровне железа. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 Ну все это не мешает сделать прошивку как хочет Дмитрий) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 3 января, 2019 Поделиться Опубликовано 3 января, 2019 3 часа назад, DrobyshevAlex сказал: говорите что это беда с++ с массивом в данном случае. беды-то как раз в этом нет никакой, массив непричем и наверно единственный способ красиво решить задачу на любом языке. Но конкретно сам язык С слишком сильно и глубоко завяз в костылях, которые не позволяют ему развиваться. И один из этих костылей - макросы. Особенно в части ЯВУ - им уже не место. Они слишком непрозрачны и всепроникающи как метастазы. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 int axisX[4]={1,2,4,8}; while (1) { if (PIND&(1<<dirX))//проверяем состояние кнопки { PORTB=axisX[4-i]; } else { PORTB=axisX[i]; } if ((i>3)) { i=0; } } я не знаю в чем проблема была объяснить орфографию. 4-i заменить на 3-i 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 6 часов назад, Дмитрий Мамедиев сказал: я не знаю в чем проблема была объяснить орфографию. 6 часов назад, Дмитрий Мамедиев сказал: 4-i заменить на 3-i Серьезно? Орфографию? Для начала это не орфография даже) Ну и если вы не читаете что Вам пишут то о чем речь Вот ваш код В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал: axisX[stepX]; в каком месте тут нужно 4-i заменить на 3-i??? Где тут вообще i? а вот Вам ответ был В 02.01.2019 в 11:46, DrobyshevAlex сказал: Зачем вы пишите константу если я в примере не просто так писал define?) В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал: axisX[stepX]; Тут мало того что ничего не делается, так вы еще и пишете stepX вместо как я думаю вы хотели написать туда i что бы обойти все элементы массива, а так вы каждый проход цикла пытаетесь обратится к axisX[4] которой даже не существует. У вас всего 4 элемента массива, где первый имеет индекс 0. То есть 0, 1, 2, 3 - это существующие элементы массива, а вы пишите axisX[4] у Вас даже компилятор должен ругаться и не скомпилировать прошивку. Что у Вас там вообще нет i. Дальше Вы пишите сейчас PORTB=axisX[4-i] А что было? axisX[stepX] То есть Вы даже PORTB не писали. О чем я раза три минимум Вам написал. А теперь Вы пишите про какую то орфографию, что этим даже назвать нельзя, то ошибка логики. Если вы пишите в ста темах, не нежно потом путаться. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 Ах да совсем забыл, хотя смысла писать нет так как Вы не читаете видимо. Но я Вам уже говорил об этом, у Вас чередуются PORTB и PORTD в одном массиве В 02.01.2019 в 11:01, Дмитрий Мамедиев сказал: int axisY[stepY]={(1<<PD5),(1<<PD6),(1<<PD7),(1<<PB0)}; И если не использовать указатели на порты, то придется лепить костыль чтобы указать в какой порт писать + Вы переписываете ВЕСЬ порт, а это значит будь там ножка на вход с подтяжкой Вы ее отключите. Будь там что то еще Вы это перезапишете. Но Вам либо все равно, либо вы не читаете либо не понимаете... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 Вы писали что axis[stepx] ничего не даст. Ну привели бы пример что нужно ссылаться на порт PORTB=axis[...]. А то что в массиве разные порты, ну можно и одинаковые написать если от этого проще будет. В моем коде все равно косяк есть, в протеусе уже увидел. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 1 час назад, Дмитрий Мамедиев сказал: Ну привели бы пример что нужно ссылаться на порт PORTB=axis[...] Вы писали в несколких темах, если Вы все перечитаете что я писал, то думаю найдете как минимум это В 01.01.2019 в 18:24, DrobyshevAlex сказал: *(pins[pos].port) |= 1 << pins[pos].pin; // установить 1 на ноге Я несколько раз просил описать просто словами что Вы хотите? Вы писали что хотите вызвать состояние порта, моем понимании это вообще не запись а чтение состояние ноги. Из за этого несколько раз я просил описать что вам нужно. Код в цитате это код с учетом исправления этого 1 час назад, DrobyshevAlex сказал: И если не использовать указатели на порты, то придется лепить костыль чтобы указать в какой порт писать Вы бы строили вопрос луче а не кидали код, который как я Вам и написал полностью не вер, а судя потому что вы кинули в предыдущем посте так и вышло, было бы все гораздо проще. Где то я прочел такую фразу "Правильно сформулированный вопрос содержит 80% ответа". 1 час назад, Дмитрий Мамедиев сказал: А то что в массиве разные порты, ну можно и одинаковые написать если от этого проще будет. Вам религия не позволяет использовать структуры, классы или два массива? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 5 января, 2019 Поделиться Опубликовано 5 января, 2019 *(pins[pos].port) |= 1 для меня это пока слишком сложно. Согласен видимо я неправильно поставил вопрос. Надо было это показать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 6 января, 2019 Поделиться Опубликовано 6 января, 2019 9 часов назад, Дмитрий Мамедиев сказал: Надо было это показать. с этого надо было начинать.... решается это как-то так: Скрытый текст #define dirX_CLK PIND0 #define dirX_reverse PIND1 #define dirY_CLK PIND2 #define dirY_reverse PIND3 struct button_type { unsigned CLK: 1; unsigned old_CLK: 1; unsigned reverse: 1; unsigned just_CLK: 1; unsigned : 1; unsigned : 1; unsigned : 1; unsigned : 1; }buttonX,buttonY; unsigned char axisX[4]={(1<<PB1),(1<<PB2),(1<<PB3),(1<<PB4)}; unsigned char axisY[4]={(1<<PB0),(1<<PB5),(1<<PB6),(1<<PB7)}; unsigned char stepX=0,stepX=0; unsigned char tempPORTB; while (1) { // Cостояние кнопок if ( PIND&(1<<dirX_CLK) ){buttonX.CLK = 1;} else{ buttonX.CLK = 0;} if ( PIND&(1<<dirX_reverse) ){buttonX.reverse = 1;} else{ buttonX.reverse = 0;} if ( PIND&(1<<dirY_CLK) ){buttonY.CLK = 1;} else{ buttonY.CLK = 0;} if ( PIND&(1<<dirY_reverse) ){buttonY.reverse = 1;} else{ buttonY.reverse = 0;} // События: Тактовые кнопки только что нажаты if ( buttonX.CLK && !buttonX.old_CLK ) { buttonX.old_CLK = buttonX.CLK; buttonX.just_CLK = 1; } if ( buttonY.CLK && !buttonY.old_CLK ) { buttonY.old_CLK = buttonY.CLK; buttonY.just_CLK = 1; } // Обрабатываем события if( buttonX.just_CLK) { if ( buttonX.reverse )//проверяем состояние кнопки { stepX--; stepX &=0x03; } else { stepX++; stepX &=0x03; } buttonX.just_CLK=0; } if( buttonY.just_CLK) { if ( buttonY.reverse )//проверяем состояние кнопки { stepY--; stepY &=0x03; } else { stepY++; stepY &=0x03; } buttonX.just_CLK=0; } tempPORTB =axisX[stepX]; tempPORTB |=axisY[stepY]; PORTB =tempPORTB; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
zoom-0 Опубликовано 7 января, 2019 Поделиться Опубликовано 7 января, 2019 Народ, день добрый, кто в теме, подскажите. у какого осцилла меньше погрешность , понятно что оба не айс, просто нужен ответ у ардуиновского (отсюда) или DSO150 (вот такой) 0 好奇心不是缺点,而是一个知识的来源。 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 7 января, 2019 Поделиться Опубликовано 7 января, 2019 STM32F103C8 ADC 12bit ATmega328V ADC 10bit ответ очевиден или нет? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 7 января, 2019 Поделиться Опубликовано 7 января, 2019 Оба их нельзя использовать для измерений, показометры. В лучшем случае у этих приборов погрешность в районе 1% и не из-за того что не хватает разрешающей способности. У них другая беда - неравномерность шкалы. Откалибруете по верхней границе, а он у вас в середине врать будет на 5%, подадите чистый синус на вход а он вам скажет что у вас там гармоники 5%... и приехали, да. Забавно будет если у синуса будет противоположное искажение, и он скажет что сигнал идеален а на деле ужас-ужас. Эти игрушки поиграться и выбросить, максимум посмотреть форму сигнала. И кстати, знаете ещё один прикол с АЦП в микроконтроллерах? А прикол в том что разрядность указана для скорости измерения менее 1Кс/с для больших скоростей выборок эффективная разрядность падает вплоть до 6 бит + шум... и делай что хочешь. Это вообще ниочемные варианты, дешманский дедовский осцилоскоп типа H313 и то будет лучше(у него полоса до 100кГц). 6 часов назад, IMXO сказал: ответ очевиден или нет? Нифига не очевиден. В этих АЦП эффективная разрядность зависит от частоты выборок, и не факт что 12-битный продержится дольше чем 10-битный. На низкой скорости конечно будет преимущество, но сомневаюсь что оно сохранится уже после 1Кс/с. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 7 января, 2019 Поделиться Опубликовано 7 января, 2019 1 час назад, Alexeyslav сказал: А прикол в том что разрядность указана для скорости измерения менее 1Кс/с для больших скоростей выборок эффективная разрядность падает вплоть до 6 бит + шум... и делай что хочешь. где это написано? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 7 января, 2019 Поделиться Опубликовано 7 января, 2019 В даташите на микроконтроллер. STM-ки не смотрел, но видел на форумах плевались, а вот для ATMEGA это точно. Да и не думаю что в STM будет что-то кардинально лучше, назначение и конструкция у них принципиально одинаковая а значит и проблемы одни и те же. Даже немного ошибся - в главных характеристиках АЦП для 328-й меги написано: Up to 15 kSPS at Maximum Resolution. Дальше идёт деградация эффективной разрешающей способности, при 76kSPS это вроде 8 бит. И стоит заметить что здесь не учтён шум. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 8 января, 2019 Поделиться Опубликовано 8 января, 2019 8 часов назад, Alexeyslav сказал: В даташите на микроконтроллер. STM-ки не смотрел, но видел на форумах плевались У Вас какая то каша в представлениях об эффективной разрядности. На самом деле шум определяется условиями измерений в самом контроллере (способом формирования опоры и условиями работы цифровой части) и схемотехникой сигнала на входе АЦП. Можно плеваться до потери пульса, но винить нужно только себя. Полоса пропускания УВХ (именно она определит падение уровня сигнала в массиве АЦП при повышении частоты СИГНАЛА, а не выборок). Можно вообще иметь частоту семплирования 10 МГц, а при этом сигнал может быть 50 МГц. Стробоскопическое преобразование (даунсемплинг) возможен лишь тогда, когда это позволяет полоса УВХ, то есть время захвата сигнала. 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.