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

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


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

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

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

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

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

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

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

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

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

@Дмитрий Вас , может скажу грубо, но всё-таки. Почитайте книжки по языку. Переменные и их типы - это краеугольный камень любого языка программирования. Начальные азы.

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

 

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

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

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

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

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

4 hours ago, Alex said:

... за минуту загуглить, сесть и часик-два почитать ...

Вы не понимаете :D, весь смысл в другом:

9 hours ago, Дмитрий Вас said:

интересен процесс

 

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

1 час назад, Дмитрий Вас сказал:

Перечитал по переменным. Ничего нового не узнал...

Переменная INT - целочисленная. Поэтому в общем случае, при её делении используются правила целочисленного деления: 2/3 = 0,  4/3=1, 7/3 = 2. Остаток от деления - отбрасывается. Поэтому:

6/3 == 7/3 == 8/3 .

 

Язык Си и иже с ним здесь не сильно прям причем. Читать нужно про системв исчисления. 

ЗЫ. Один из простых и дешевых способов не терять точность - сэмулировать двоично- десятичную систему исчисления. Это когда десятичный разряд записывается двумя байтами. Но переход от двоичных разрядов того же ацп, все равно не гладок и пушист, и как один из способов повышения гладкости - использование правильно опорного напряжения - ну типа 1 в, 2.56, 5.12 ну и тд... в том же вольтметре при опорном 5.12: тогда ...×512/1024 = ... /2, что можно сделать простым "сдвигом вправо".

 

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

Я в курсе что целочисленная отбрасывает остаток. Но...

ADC= 330*1023/500= 675,18 округляем до целочисленного 675. Теперь идём от обратного.

Vin = 675*500/1023= 329,9 округляется до целочисленного 330. По любому 3,3 вольта должно выдать.

Видимо я не до конца понимаю как работают эти переменные.

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

для повышения точности целочисленных расчетов программисты пользуются методом повышения разрядности.

7/8 будет вычислено гораздо грубее нежели ((7*1024)/8)/1024 (записано примитивно, лучше применять сдвиг). По скорости очень мало уступает целочисленным операциям и очень сильно выигрывает у вычислений с плавающей точкой

я думаю смысл понятен

такой же механизм используется для чисел ограниченной разрядности после запятой. Например числа с двумя разрядами точности приводятся к целочисленному виду.

3.31 = 331/100 при использовании их в выражениях. 3.31/2 = (331/2) При выводе на экран просто выводится число 331 и ставится виртуальная точка в двух разрядах с конца

 

пс. Вообще никогда не использую в своих программах чисел с плавающей точкой и жив до сих пор

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

@dasZebraвсе равно мои вычисления так не проходят. В моем случае я получаю результат 400. 

@mail_robotЯ вывожу поразрядно с виртуальной точкой. Я получаю 500 и вывожу на экран 50,0 чтобы предел был 50 вольт. Я должен получить число 330 вывести на экран 33,0 при 3,3 вольтах на входе. Такая задумка. Но получаю 400. И не укладывается в голове в каком месте идёт округление.

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Отладка, и только отладка Вам поможет !
На крайняк - тест этой функции, по нескольким входным параметрам. Может, вообще, в неё уже передаётся что-то не то.

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

22 часа назад, Дмитрий Вас сказал:

@Влад Иванович что не так то опять? unsigned long int value

unsigned int volt - 2 байта ! 500*255 не вмещается.

Я делаю так: 5в=500мВ; АЦП 10-ти 1024, правое выравнивание

v*500/1024=v*250/512 т.е. делю на 2 без потери точности. Теперь все влазит в 2 байта.

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

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

32 минуты назад, Влад Иванович сказал:

v*500/1024=v*250/512

гениально. просто и гениально.

 

1 час назад, Влад Иванович сказал:

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

частота 62кгц, получается по расчетам или вы имеете ввиду среднее высчитать?

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

Дмитрий Васильевич, при составлении программы нужно ознакомиться с даташитом на данный микроконтроллер и учитывать его особенности. Соответственно прописывать определенные регистры. Имеется в виду тактовая частота. 

2022-03-02_20-23-51.png

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

Сейчас времени совсем не хватает. Попробовал сдвиг: ADC*500>>10;

При 5в получил 499, это меня устраивает. Но при 3,3в так же 400. Так это уже без деления! Остатков нет! Чтобы округлять. Отладка всего не доступна на моем камне. Пробовать только кусок кода на другом камне смысла не вижу. Попробую другой канал АЦП и сделать через другую переменную которую изначально приравнять к нулю.

u_int a=0;

a=ADC;

a*500>>10;

 

 

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

Господа, посоветуйте, пожалуйста, что почитать на тему радиопротоколов. Хочу сделать обмен между устройствами через приёмники/передатчики на 433 МГц, которые только в on-off-keying умеют. 

Так же хочу нарулить шифрование, чтобы нельзя было просто распарсить/повторить посылку, но чтобы устройства могли прочитать посылку даже если потерялось несколько пакетов (типа наперёд рассчитывать как-то что ли). 

То есть основная идея - защищённый обмен данными по радио с помощью on off keying. Хочу понять принципы и лучшие практики. Ну и закодить самостоятельно. 

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

@Дмитрий Вас , Вы не слышете, что Вам говорят. Или не хотите слушать.
Протестируйте свою функцию по нескольким входным параметрам. Дел на 5 минут. И всё станет понятно.

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

Выведите сырое значение АЦП и рядом посчитанное и проверьте где именно ошибка.

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

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

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

@COKPOWEHEU хорошая идея. ацп выдал при 3,3в 830 а должен был 676. выходит что и те 5в он показывал скорей просто что больше не мог. спасибо есть о чем думать

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

теперь такой вопрос. измерение тока хочу сделать с помощью усилителя в микроконтроллере. не понятен алгоритм работы, в дш не нашел описания. все что я понял так это: обнулем канал, задаем канал, запускаем преобразование, получаем результат, и последовательно выполняется преобразование по каналам. 

//вычисляем значение напряжения
unsigned int voltage_dimension(unsigned char channel)
{
	static unsigned long int value;
	Start_conv_channel(channel);
	while((ADCSRA & (1<<ADSC)));// ждем окончание преобразования АЦП
	value = ADC;
	volt = value*500>>10;
	return volt;
}
//вычисляем значение тока
unsigned int current_dimension (unsigned char channel)
{
	static unsigned long int value;
	Start_amplified_conv_channel(channel);
	while((ADCSRB & (1<<ADSC)));// ждем окончание преобразования АЦП
	value = ADC;
	amper = value*100>>10;	
	return amper;
}

#define Start_amplified_conv()                (ADCSRB |= (1<<ADSC) )//стр 253 дш (- By setting the ADSC (ADC Start conversion) bit in the ADCSRB register on AT90PWM2B/3B.)

#define Start_amplified_conv_channel(channel) (Select_adc_channel(channel), Start_amplified_conv() )

может нужно каждый раз останавливать измерение?

#define Stop_amplified_conv()                 (ADCSRB &= ~(1<<ADSC) )

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Релюхи не причём. При неисправности релюх симптомы были бы другие. И ИБП даже не клацает когда переходит в  "аварию".   Да. Аккум новый. Более того - 2 новых пробовал. И без АКБ тоже. Не влияет.
    • #include <Wire.h> #include <Oregon_TM.h> #include <BME280I2C.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Скетч для устройства, передающего данные датчика BME280 в формате Oregon Scientific THGN132N //Принципиальная схема прилагается. //Для работы необходима библиотека https://github.com/finitespace/BME280/ //Устройство работает от 3-ех пальчиковых батареек, для экономии электричества заливать скетч нужно через ISP //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Также возможна передача данных в формате - THP (температура, влажность, давление, напряжение батареи) //Пример с приёмником поддерживает расшифоовку THP //////////////////////////////////////////////////////////////////////////////////////////////////////////// # define THGN_SEND 1 // Передавать ли данные в формате THGN132 # define THP_SEND 0 // Передавать ли данные в формате THP # define DEVICE_LOG 1 //Писать ли лог В Serial # define DONE_PIN 15 // вывод сигнала об окончании работы на таймер # define BME_WAIT 10 // Сколько мс ожидать датчик BME # define BATTERY_THR 3.5 // Порог напряжения для выставляения флага разряда батарейки (THGN) ///////////////////////////////////////////////////////////////////////////////////////////////// //Ниблы датчика THP //Во всех полях младшие ниблы идут вперёд!!! // 1-2 - тип (55) // 3 - канал (0-7) // 4-6 - (температура от -100С) * 10. Т.е. +25.1С = 1251 = 4E3h // 7-9 - Влажность *10 Т.е. 25.1% = 251 = 0FBh // 10-12 - (давление от 500ммртст) * 10. Т.е. 765мм = 2650 = A5Ah // 13-15 - данные с АЦП (A0) // 16-17 - CheckSUM // 18-19 - CRC8 (poly 0x07 start 0x00) ///////////////////////////////////////////////////////////////////////////////////////////////// Oregon_TM transmitter(4); BME280I2C bme; bool bme_present = false; float bme_temp(NAN), bme_hum(NAN), bme_pres(NAN); ///////////////////////////////////////////////////////////////////////////////////////////////// void setup() { digitalWrite(DONE_PIN, LOW); pinMode(DONE_PIN, OUTPUT); #ifdef DEVICE_LOG Serial.begin(115200); Serial.println("Waiting for BMEsensor..."); #endif //Обмен данными с BME////////////////////////////////// Wire.begin(); while(!bme.begin()) { if (millis() > BME_WAIT) break; } if (!bme.begin()) { #ifdef DEVICE_LOG Serial.println("No BME sensor found"); #endif bme_present = false; } else { switch(bme.chipModel()) { case BME280::ChipModel_BME280: bme_present = true; bme.read(bme_pres, bme_temp, bme_hum); #ifdef DEVICE_LOG Serial.println("Found BME280 sensor! Success."); Serial.print("Temperature = "); Serial.print(bme_temp, 1); Serial.println("C"); Serial.print("Humidity = "); Serial.print(bme_hum, 1); Serial.println("%"); Serial.print("Pressure = "); Serial.print(bme_pres * 0.75, 1); Serial.println("mmHg"); #endif break; default: #ifdef DEVICE_LOG Serial.println("Found UNKNOWN sensor! Error!"); #endif bme_present = false; } } //Напряжения батареи/////////////////////////////////////////// word battvotage = (word)(((float)(1.1 * 16368) / Vbg()) * 100); #ifdef DEVICE_LOG Serial.print("Battery voltage = "); Serial.println(battvotage,HEX); #endif //Подготовка и отправка данных THGN////////////////////////////////////// transmitter.protocol == 2; if (THGN_SEND) { transmitter.setType(THGN132); transmitter.setChannel(3); transmitter.setBatteryFlag(battvotage < BATTERY_THR); if (bme_present) { if (bme_hum > 98) bme_hum = 98; if (bme_hum < 2) bme_hum = 2; if (bme_temp > 70) bme_temp = 70; if (bme_temp < -50) bme_temp = -50; transmitter.setTemperature(bme_temp); transmitter.setHumidity(bme_hum); transmitter.setComfort(bme_temp, bme_hum); } else { transmitter.setTemperature(-49.9); transmitter.setHumidity(2); transmitter.setComfort(-49.9, 2); } transmitter.SendPacket(); } // Если отправляются оба формата пакетов, межу ними надо выдержать паузу if (THP_SEND && THGN_SEND) delay(100); //Подготовка и отправка данных THP////////////////////////////////////// if (THP_SEND) { transmitter.setType(THP); transmitter.setChannelTHP(1); transmitter.setBatteryTHP( battvotage); if (bme_present) { transmitter.setTemperatureTHP(bme_temp); transmitter.setHumidityTHP(bme_hum); transmitter.setPressureTHP(bme_pres * 0.75); // перевод Pa в mmHg } else { transmitter.setErrorTHP(); } transmitter.SendPacket(); } #ifdef DEVICE_LOG Serial.println(); Serial.print(millis()); Serial.println("ms"); Serial.println(); #endif //Команда на отключение питания digitalWrite(DONE_PIN, HIGH); } ///////////////////////////////////////////////////////////////////////////////////////////////// void loop(){} ///////////////////////////////////////////////////////////////////////////////////////////////// int Vbg() { ADMUX = (1<<REFS0)|(0<<REFS1)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0); long buffersamp=0; for (int n=0x0; n<=0xff; n++ ) { ADCSRA = 0xc7; while (bit_is_set(ADCSRA,ADSC)); buffersamp += ADC; } buffersamp >>=4; //16368 full scale 14bit ADCSRA &= ~(1 << ADEN); // отключаем АЦП return buffersamp; } Вот код программы. Пробовал по разному и от 5в запитывал и всю систему от 3,3 в. Причем голая ардуинка с таймером работает в нормальном режиме некоторое время, но потом все равно слетает и начинает питать мк постоянно( Причем это происходит всегда через разный промежуток времени.
    • На фото может быть название , характеристики и т.д. И по этому фото я смогу выбрать такой же в инете.. самому мне не собрать..
    • А что даст фотка? Тот же щуп, только чуть крупнее и с проводами питания.
    • Для меня наверное лучше купить готовый.. цель повысить чувствительность до 1 mV.. Наверное на Авто стоит покупать , мне бы фотку какую нить..такого активного щупа..))
    • Так на схемах обозначается подключение к сети 220 В.
  • Похожий контент

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