Измерение температуры термистора

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 31 мар 2021.

  1. Yerabdi

    Yerabdi Гик

    Здравствуйте всем, по пробовал измерить температуру термистора по формуле Стейнхарта все прекрасно работает. Но проблема в том что расчет измерении занимает 400 микросекунд что очень долго может есть какие то другие варианты.Заранее спасибо всем
    Код (C++):
    float average=0,steinhart=0;
       uint16_t SERIESRESISTOR=0,THERMISTORNOMINAL=0,BCOEFFICIENT=0,TEMPERATURENOMINAL=0;
       if (count_temp >= 100)//zahodit kazhdi 100 milisecund
      {
        select_temp_sensor=eeprom_read_byte(233);
        //select_temp_sensor=0 termistor 2000(25C)
        if (select_temp_sensor == 0)
        { SERIESRESISTOR=10000,THERMISTORNOMINAL=2000,BCOEFFICIENT=3076,TEMPERATURENOMINAL=25;}
       //select_temp_sensor=1 termistor 5000 (25C)
        if (select_temp_sensor == 1)
        { SERIESRESISTOR=10000,THERMISTORNOMINAL=5000,BCOEFFICIENT=3950,TEMPERATURENOMINAL=25;}
     
         average=(float);
         average = 1023 / average - 1;
         average = SERIESRESISTOR / average;
         steinhart = average / THERMISTORNOMINAL; //(R/Ro)
         steinhart = log(steinhart); // ln(R/Ro)
         steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
         steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
         steinhart = 1.0 / steinhart; // инвертируем
         steinhart -= 273.15; // конвертируем в градусы по Цельсию
         temp=steinhart;
     
  2. vvr

    vvr Инженерище

    и это время для вас критично ?
     
  3. akl

    akl Гуру

    заранее по формуле составить график в экселе, из этого сделать готовую таблицу и вбить ее в ардуино, которое уже будет не считать, а подставлять в таблицу и получать готовый ответ

    а лучше даже не большую таблицу, а разбить график на штук 10 условно линейных участков чтобы ардуина в зависимости от диапазона подставляла текущую температуру не в настоящую формулу, а в приближенную линейную.
     
    Последнее редактирование: 31 мар 2021
  4. parovoZZ

    parovoZZ Гуру

    взять другую архитектуру или проц побыстрее.
     
  5. Vovka

    Vovka Гик

    на крайний случай вычисления разбить на шаги
     
  6. akl

    akl Гуру

    кстати да, нафига при каждом вызове функции считывать что-то из еепром? можно сделать это заранее и сэкономить немало микросекунд
     
  7. parovoZZ

    parovoZZ Гуру

    Это разве долго? В AVR - нет.
     
  8. akl

    akl Гуру

    да, точно. пишет медленно, а читает быстро. Но что тогда там у ТС занимает 400 мкс? операции с флоат и прочие логарифмы?
     
  9. Yerabdi

    Yerabdi Гик

    вот операции с флоатом и логарифмы занимает долгое время
     
  10. akl

    akl Гуру

    значит надо посчитать всё заранее в экселе и запилить в ардуину через progmem
     
  11. parovoZZ

    parovoZZ Гуру

    и какой смысл в термисторе? Проще тогда поставить LM35.
     
  12. akl

    akl Гуру

    а какой смысл измерять температуру с частотой 3Кгц? может у него там термоядерный реактор или еще че
     
  13. parovoZZ

    parovoZZ Гуру

    ой ли?
    Код (C++):
    if (count_temp >= 100)//zahodit kazhdi 100 milisecund
     
  14. parovoZZ

    parovoZZ Гуру

    термистор применяют там, где нужна точность, которую не могут дать интегральные датчики. А ты предлгаешь таблицу какую-то...
     
  15. akl

    akl Гуру

    но 0,4 миллисекунды на расчеты его почему-то не устраивает.

    таблица может теоретически дать любую точность - зависит только от количества памяти которую она займет
     
  16. parovoZZ

    parovoZZ Гуру

    Может, у него ещё какой-то процесс происходит? Потому и не устраивает.
     
  17. akl

    akl Гуру

    тогда такой процесс надо на прерываниях делать, чтобы он в любой момент мог прервать эти медленные расчеты и беспрепятственно произойти
     
  18. parovoZZ

    parovoZZ Гуру

    Как вариант. Только придётся уже внешнюю флешку прицеплять.
     
  19. akl

    akl Гуру

    вряд ли ТСу нужна точность больше чем 0,01 градус. тогда можно использовать таблицу с шагом в 0,1 градус, а в промежутках интерполировать линейно.
     
  20. akl

    akl Гуру

    хотя, я так понял, используется ардуиновское АЦП, то есть все равно максимально будет 1023 значения, то есть весь график укладывается в 1023 ячейки типа инт (точность 0,01 градус помножено на 100), то есть 2 килобайта.