Металл2024 Реклама
Метобр2024 Реклама

Цепляем AD22100 к RAMPS или что я сделал не так?

Чиффа
Идет загрузка
Загрузка
08.09.2015
3083
12
Вопросы и ответы
Всем доброго времени суток!

Так совпало, что в свободное время я занимаюсь допиливанием своего домашнего 3D принтера и у меня как раз завалялся датчик температуры AD22100STZ с диапазоном измерения -50..+150 °С.
Цепляем AD22100 к RAMPS или что я сделал не так?
и уж очень мне захотелось его поставить вместо терморезистора стола. Чем мне не понравился обычный китайский термистор? Да тем, что верить ему нельзя, а калибровать лень да и негде, а я хочу знать точную температуру кроватки. В общем, просто моя блажь, да и по началу все казалось просто - подцепить на свободный АЦП вход датчик, подправить чуток код и профит...

Первый мой промах заключался в том, что свободных аналоговых входов, как оказалось, нет. Совсем нет, вот кусок схемы RAMPS 1.4:
Цепляем AD22100 к RAMPS или что я сделал не так?
все они задействованы. Ну как можно было занять все АЦП входы? Как, Карл? Ладно, простого пути не вышло, придется пилить плату... Дело в том, что выходным сигналом AD22100STZ является напряжение, а не сопротивление как у терморезистора и нет необходимости в схеме делителя напряжения в которую включаются термисторы. Итак, смотрим опять схему RAMPS:
Цепляем AD22100 к RAMPS или что я сделал не так?
видим уже упомянутую схему делителя напряжения с демпфирующим (???) конденсатором на каждом канале измерителя температуры. Нам нужно убрать резистор и конденсатор, подсоединить выход датчика напрямую к ноге ардуины и, естественно, запитать его. Ищем что ломать: в прошивке (Marlin) в pins.h забиты конфигурации выходов ардуины под различные платы, в части RAMPS есть строчка

#define TEMP_BED_PIN 14

смотрим на схему, на аналоговый вход с номером 14 приходит Thermistor1. Значит отпаиваем резистор, что звонится с 4 контактом колодки термисторов, и конденсатор, минус которого с 3. Подпаиваем AD22100 к освободившимся контактам (даташит в помощь):
Цепляем AD22100 к RAMPS или что я сделал не так?
Заливаем тестовый скетч:

float Temp;

int raw=0;

void setup() {

Serial.begin(9600);

}

void loop()

{

raw= analogRead(14);

Serial.print(raw);

Serial.print(' ' );

Temp= (raw/1024.0*5.0-1.375)/22.5*1000.0;

Serial.println(Temp);

delay(1000);

}



и... все работает))) по RS идут коды АЦП и температура 25 °С, зажав в кулак, можно догнать до 34 °С. Пора насиловать прошивку принтера... Сразу скажу, с Marlin-Development у меня не вышло, долго мучился, температура скакала непонятно как, да и вообще, она у меня температуру нормально не показывала, до этого момента я не обращал на это внимание, т.к. датчиков не подсоединял. Поискал на гитхабе, скачал первую попавшуюся и понеслось...

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

1) определил в настройках #define TEMP_SENSOR_BED -5 (все что с плюсом считается термистором, как я понял)

2) в Configuration_adv.h добавил:

#if TEMP_SENSOR_BED == -5

#define BED_USES_AD22100

#endif

3) в temperature.cpp в функцию analog2tempBed(int raw) добавил:

#elif defined BED_USES_AD22100

return ((raw/1024.0*5.0-1.375)/22.5*1000.0);

Залив получил, что температура в комнате 1324 °С, что по мне, так жарковато. Датчик на нагрев реагирует, формула верная, косяк где-то в вычислении этого самого raw значения, он же 'current_temperature_bed_raw'. Прикинул на листочке разницу в кодах, получилось, что такое значение температуры получается, если значение raw где-то в 16 раз больше. Изменил формулу на (raw/1024.0/16.0*5.0-1.375)/22.5*1000.0, получил нормальную комнатную температуру, греется тоже нормально...

Так вот, вопрос в том что не так с оригинальной формулой, почему при помощи нее не получается подсчитать температуру?
Ответы на вопросы
Кремень КБ Реклама
Кремень КМ Реклама