Показано с 1 по 10 из 71

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

    По умолчанию Re: Как точно вычислить температуру со штатного датчика двигателя?

    В массиве Temp1[Temp1Count][2] PROGMEM = {{0,40}, {5,80}, {26,200}, {42,300}, {70,400}}
    находятся соответствия значений для аппроксимации. Для значения 0 результат - 40. Для 5 - 80. И так далее. Соответственно, для входного значения 1, выходное значение должно быть 48. Для 2 - 56, для 5 - 80.

    Вообще я бы рекомендовал любые алгоритмы тестировать и отлаживать в каких-нибудь средах разработки (можно не привязанных к микроконтроллерам). Тем более, что С - он и в африке С (wiring - это С с несколькими функциями и макросами). В среде ардуино отсутствует возможность отладки, поэтому в ней невозможно разработать что-либо сложное.

    Есть куча проблем, с которыми можно столкнуться: в реализации С для микроконтроллеров AVR отсутствует контроль результата на предмет его попадания в допустимый диапазон значений переменной. К примеру, если написать
    uint8_t i; // это восьмибитая беззнаковая переменная. значения 0..255
    i=200;
    i=i+150;
    то i будет равно 94. И никаких ошибок в процессе работы программы не возникнет, ибо ошибки банально некуда выдавать.

    Но это еще ладно, такую ситуацию можно предусмотреть и ею пользоваться. А можно обратиться в массив по некорректному индексу:
    int16_t ar[10];
    uint16_t i=15;
    uint16_t j;
    j=ar[i];
    И эта ситуация, понятная компилятору на стадии компиляции не вызывает предупреждений.
    Поэтому очень рекомендую все минимально сложные куски кода отлаживать проходом по коду в отладчике и просмотром переменных.

    (добавлено)
    В массиве первое значение - считанное значение считанное с датчика (при помощи того же AnalogRead() ), второе - выходное значение температуры.
    Да, учти, что при подсчете значения не должно произойти переполнения uint16 - у него максимальное значение 65536. Либо в формуле расчета надо принудительно производить расчет в 32х битах.
    Имеется ввиду эта строка:
    RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp);
    При вычислении (OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp) а конкретно - при вычислении произведения может произойти переполнение через 65535. В Сях тип выражения берется из первого участника выражения.
    Последний раз редактировалось SBorovkov; 10.08.2010 в 01:06.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •