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

Tibman

Members
  • Постов

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

  • Посещение

Информация о Tibman

  • День рождения 18.06.1988

Информация

  • Пол
    Мужчина
  • Город
    Санкт-Петербург

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    микроконтроллеры, спектрометры

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения Tibman

Исследователь

Исследователь (4/14)

  • Преданный
  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

6

Репутация

  1. Испытания элементов проводились без моего участия, я получил только протокол. Буду обосновывать необходимость увеличивать общую ёмкость батарей, а также напряжение. Спасибо всем за помощь.
  2. Это да, я понимаю. Просто поделился теми экспериментальными данными, которые есть на данный момент.
  3. Тестировали сборку из 2 батарей последовательно. При постоянном токе в 1А напряжение снизилось с 5.2 В до 4.1 В за 7 часов. Если есть ещё варианты источников питания, которые довольно дешёвые, и способны работать от -40 до +60 градусов Цельсия, я их с радостью рассмотрю.
  4. Тоже хочу перейти на 9В, тогда DC-DC подобранные смогут работать уже во всем диапазоне, от 9 до 4.5В, а не от 6 до 4.5В. Если оставить только 2 параллельно, то ток допустимый будет не больше 4А, может быть маловато. Проблема с оптимизацией в том, что ТЗ дано сильно приблизительное. Нет ещё всего того, что будет от этого блока работать. Просто прикинул тут кто-то, что потребление будет примерно вот такое, и задача стоит его обеспечить.
  5. 3 группы параллельно, в каждой группе 2 последовательно. Не хватает на 8 часов работы. Поэтому и ищу преобразователь с низким входным напряжением.
  6. Именно одноразовое изделие. Для военных.
  7. Руководство хочет ограничиться 6 элементами. По конструктивным и экономическим соображениям. Поэтому и пытаюсь понять, что можно из этого выжать.
  8. Уважаемые коллеги, я тоже уже прикидывал цифры, и мне всё это не нравится. Тоже упёрся примерно в 7-8 А по потреблению из батарей, даже если их разряжать лишь до 4.5В. Я сам склоняюсь к мысли, что без перехода на 12В шансов сделать такой источник нет. Но спросил на всякий случай у вас, вдруг я где-то ошибся.
  9. Нагрузка - микроконтроллер, УКВ передатчик и приемник.
  10. Здравствуйте. Возникла задача создать источник питания с выходными параметрами 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 повысить нет возможности, это будет слишком много батарей. Прошу помочь советом, вдруг кто-то уже делал нечто подобное.
  11. Tibman

    STM32 и BME280

    Да, всё верно. Из функции отправляя temper_float в терминал, показывается правильное значение, temper_float = 21.68. А возвращенное из функции через return аналогичное значение отображается через main как temper_float=1101885568.00. temper_int объявлена ранее в файле с функцией.
  12. Tibman

    STM32 и BME280

    Ой, точно, ошибся. Спасибо. Теперь функция имеет следующий вид: 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);
  13. Tibman

    STM32 и BME280

    Переписал в очередной раз функцию расчета температуры: 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-тичное значение, да ещё и дробное.
  14. Tibman

    STM32 и BME280

    Спасибо, действительно это отличный способ убедиться в правильности вывода в терминал. Просто вывел через терминал дробное значение: 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 сразу перевести в десятичную систему, а потом умножать и делить, то результат очень похож на правду. А если произвести все расчеты в шестнадцатиричной системе, а потом переводить в десятичную, то получается ерунда, хотя и не такая, как выводится в терминал.
×
×
  • Создать...