-
Постов
161 -
Зарегистрирован
-
Посещение
Информация о Tibman
- День рождения 18.06.1988
Информация
-
Пол
Мужчина
-
Город
Санкт-Петербург
Электроника
-
Стаж в электронике
3-5 лет
-
Сфера радиоэлектроники
микроконтроллеры, спектрометры
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения Tibman
-
Испытания элементов проводились без моего участия, я получил только протокол. Буду обосновывать необходимость увеличивать общую ёмкость батарей, а также напряжение. Спасибо всем за помощь.
-
Это да, я понимаю. Просто поделился теми экспериментальными данными, которые есть на данный момент.
-
Тестировали сборку из 2 батарей последовательно. При постоянном токе в 1А напряжение снизилось с 5.2 В до 4.1 В за 7 часов. Если есть ещё варианты источников питания, которые довольно дешёвые, и способны работать от -40 до +60 градусов Цельсия, я их с радостью рассмотрю.
-
https://jsc-energiya.com/catalog/item/418/
-
Тоже хочу перейти на 9В, тогда DC-DC подобранные смогут работать уже во всем диапазоне, от 9 до 4.5В, а не от 6 до 4.5В. Если оставить только 2 параллельно, то ток допустимый будет не больше 4А, может быть маловато. Проблема с оптимизацией в том, что ТЗ дано сильно приблизительное. Нет ещё всего того, что будет от этого блока работать. Просто прикинул тут кто-то, что потребление будет примерно вот такое, и задача стоит его обеспечить.
-
3 группы параллельно, в каждой группе 2 последовательно. Не хватает на 8 часов работы. Поэтому и ищу преобразователь с низким входным напряжением.
-
Именно одноразовое изделие. Для военных.
-
Руководство хочет ограничиться 6 элементами. По конструктивным и экономическим соображениям. Поэтому и пытаюсь понять, что можно из этого выжать.
-
Уважаемые коллеги, я тоже уже прикидывал цифры, и мне всё это не нравится. Тоже упёрся примерно в 7-8 А по потреблению из батарей, даже если их разряжать лишь до 4.5В. Я сам склоняюсь к мысли, что без перехода на 12В шансов сделать такой источник нет. Но спросил на всякий случай у вас, вдруг я где-то ошибся.
-
Нагрузка - микроконтроллер, УКВ передатчик и приемник.
-
Здравствуйте. Возникла задача создать источник питания с выходными параметрами 5В 2А и 12 В 1 А. Первичный источник питания - батареи CR 34615. 2 такие батареи последовательно дают 6 В при токе до 3 А. Разрядка батарей хоть до 2 В. Проблема в том, что я не могу найти в продаже DC-DC, способные работать при входном напряжении хотя бы от 3 до 6 В, отдавая 5-12 В с приличным током. Лучшее, что нашел, выдает 1А при напряжении на входе не ниже 4,5В. Если бы найти DC-DC, повышающий от 2-3 вольт до 5 и 12, думаю, что было бы ещё лучше. Входное напряжение вольт до 9-12 повысить нет возможности, это будет слишком много батарей. Прошу помочь советом, вдруг кто-то уже делал нечто подобное.
-
Да, всё верно. Из функции отправляя temper_float в терминал, показывается правильное значение, temper_float = 21.68. А возвращенное из функции через return аналогичное значение отображается через main как temper_float=1101885568.00. temper_int объявлена ранее в файле с функцией.
-
Ой, точно, ошибся. Спасибо. Теперь функция имеет следующий вид: float BME280_ReadTemperature(void) { float temper_float = 0.0f; uint32_t temper_raw; int32_t val1, val2; BME280_ReadReg_BE_U24(BME280_REGISTER_TEMPDATA,&temper_raw); temper_raw >>= 4; //sprintf(str1, "Temperature RAW: 0x%08X\r\n", temper_raw); //HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); val1 = ((((temper_raw>>3) - ((int32_t)CalibData.dig_T1 <<1))) * ((int32_t)CalibData.dig_T2)) >> 11; val2 = (((((temper_raw>>4) - ((int32_t)CalibData.dig_T1)) * ((temper_raw>>4) - ((int32_t)CalibData.dig_T1))) >> 12) * ((int32_t)CalibData.dig_T3)) >> 14; temper_int = val1 + val2; temper_int = ((temper_int * 5 + 128) >> 8); temper_float = temper_int/100.00f; sprintf(str1, "Temperature: %.2f *C\r\n", temper_float); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); return temper_float; } Я сделал вывод данных в терминал непосредственно в этой функции. И в таком виде температура приходит правильная. В результате такой вот результат: Temperature: 21.68 *C Temperature: 1101885568.00 *C Верхнее значение выведено в терминал непосредственно из функции чтения температуры, а нижнее - из main.c. Но тогда я не могу понять, почему тогда аналогичная конструкция, размещенная в main.c, выдаёт неправильные значения. Там же ведь значение temper_float, рассчитанное в функции, просто приравнивается к значению переменной tf. tf = BME280_ReadTemperature(); sprintf(str1, "Temperature: %.2f *C\r\n", tf); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000);
-
Переписал в очередной раз функцию расчета температуры: float BME280_ReadTemperature(void) { float temper_float = 0.0f; uint32_t temper_raw; int32_t val1, val2; BME280_ReadReg_BE_U24(BME280_REGISTER_TEMPDATA,&temper_raw); temper_raw >>= 4; sprintf(str1, "Temperature RAW: 0x%08X\r\n", temper_raw); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); val1 = ((((temper_raw>>3) - ((int32_t)CalibData.dig_T1 <<1))) * ((int32_t)CalibData.dig_T2)) >> 11; val2 = (((((temper_raw>>4) - ((int32_t)CalibData.dig_T1)) * ((temper_raw>>4) - ((int32_t)CalibData.dig_T1))) >> 12) * ((int32_t)CalibData.dig_T3)) >> 14; temper_int = val1 + val2; sprintf(str1, "Temperature predv1: 0x%08X\r\n", temper_int); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); temper_int = ((temper_int * 5 + 128) >> 8); sprintf(str1, "Temperature predv2: 0x%08X\r\n", temper_int); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); temper_float = temper_int/100; return temper_float; } Результат: Temperature RAW: 0x0007D472 - данные непосредственно с датчика Temperature predv1: 0x0001B0F9 - это val1 + val2 Temperature predv2: 0x00000875 - это уже значение temp_int перед его делением на 100 и переводом во float. Temperature: 1101529088.000 *C - полная ерунда в итоге. Если перевести 0x00000875 в десятичный формат, то получается 2165, что после деления на 100 дало бы в результате 21.65 градуса Цельсия, то есть целочисленные расчеты производятся правильно. К датчику и его работе нет никаких претензий. Остаётся только правильно поделить на 100 и вывести в терминал. Но почему-то возникает проблема со значением float. В main.c вывод значения в терминал: tf = BME280_ReadTemperature(); sprintf(str1, "Temperature: %.3f *C\r\n", tf); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); Этот код нормально работает, если на вход подавать что-то вроде 20.36 или тому подобного. Но вот значение temper_float он явно воспринимает как-то не так. Я так и не могу понять, как из 16-ричного значения датчика должно получиться 10-тичное значение, да ещё и дробное.
-
Спасибо, действительно это отличный способ убедиться в правильности вывода в терминал. Просто вывел через терминал дробное значение: zf = 60.28; sprintf(str1, "Test: %.3f *C\r\n", zf); HAL_UART_Transmit(&huart1,(uint8_t*)str1,strlen(str1),0x1000); Результат: Test: 60.280 *C То есть эта часть тоже работает правильно. В таком случае получается, что вся "магия" творится в этой части кода: temper_float = ((temper_int * 5 + 128) / 256); temper_float = temper_float/100.0f; Причем, считая на калькуляторе, если temper_int сразу перевести в десятичную систему, а потом умножать и делить, то результат очень похож на правду. А если произвести все расчеты в шестнадцатиричной системе, а потом переводить в десятичную, то получается ерунда, хотя и не такая, как выводится в терминал.