~~DISCUSSION:off~~ ====== PELTIER ====== {{ :škola:předměty:mi-aak:final.jpg?nolink&300|}}Přípravek MI-PVS-PELT představuje jednoduchý regulační obvod pro regulaci teploty kapaliny. Tato kapalina je umístěna uvnitř v hliníkové nádobě a její teplota je ovlivňována pomocí peltiérova článku. Po přípravku jsou rozmístěny tři druhy teplotních senzorů, které pomáhají kontrolovat teplotu článku a samotné kapaliny. Pro ovládání je možné použít sériové rozhraní RS232 a mechanického rotačního enkodéru. ===== Literatura ===== *[[https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf|DS18B20 - Programmable Resolution 1-Wire Digital Thermometer]] * [[http://www.nxp.com/documents/data_sheet/LM75A.pdf|LM75A - Digital temperature sensor and thermal watchdog]] * [[https://www.gme.cz/data/attachments/dsh.530-109.1.pdf|PT100 - Specification of PT Thermal Sensor]] * NORDIC nRF51822 mkit ===== Zapojení a ovládání HW ===== ==== 1-Wire ==== Zapojení 1 - Wire ^ Pin ^ Funkce ^ Poznámka ^ | P0_29 (IN/OUT) | DATA | Žádné zařízení není napájené z datového vodiče | 1 - Wire teploměry Zapojení 1 - Wire ^ Adresa ^ Zařízení ^ Specifikace ^ Umístění ^ | 0x28,0xee,0x63, 0x73, 0x1f,0x16, 0x02, 0xb4 | DS18B20 | spec | Peltiérův článek, uvnitř boxu | | 0x28, 0xFF, 0x15, 0xe6, 0x64, 0x15, 0x03, 0x6c | DS18B20 | spec | Uvnitř kapaliny | ==== I2C ==== Zapojení I2C ^ Pin ^ Funkce ^ | P0_22 (IN/OUT) | SDA | | P0_20 (IN/OUT) | SCL | | P0_12 (IN/OUT) | Výstup teplotního hlídače LM75A umístěného na chladiči | ^ Adresa ^ Zařízení ^ Specifikace ^ Umístění ^ | 0x48 | LM75A | spec | Chladič | | 0x49 | LM75A | spec | DPS (není osazen) | ==== Analog ==== Zapojení analogových zařízení ^ Pin ^ Zařízení ^ Specifikace ^ Umístění ^ | P0_1 (ANALOG IN) | PT100 | spec | Peltérův článek, vně boxu | | P0_3 (ANALOG IN) | PT100 | spec | Chladič | Hodnoty nutné k výpočtu elektrického odporu teplotního senzoru: ^ Název ^ Značení ^ Hodnota ^ | Vstupní napětí | U_{VCC} | 2,9 V | | Hodnota měřícího resistoru | R_m | 4600 Ω | | Zesílení operačního zesilovače | A | 23 | Pro korekci případného offsetu operačního zesilovače byly na DPS umístěny dva trimry. Měřící piny offsetu jsou umístěny pod mini usb konektorem. Pro správnou funkčnost by napětí na pinech PT1 a PT1- (PT2 a PT2-) mělo být stejné. Výpočet napětí na teplotním senzoru U_{PT} provedeme následujícím vztahem U_{PT} = \frac{V_{adc} \cdot U_{VCC}}{A} kde V_{adc} je hodnota z AD převodníku mezi 0 a 1. Výpočet elektrického odporu teplotního senzoru R_T: R_{T} = \frac{U_{PT} \cdot R_m }{U_{VCC} - U_{PT}} ==== Ovládací prvky ==== ^ Pin ^ Funkce ^^ | P0_9 | TX | Sériové rozhraní RS232 | | P0_11 | RX | ::: | | P0_21 | Kanál A | Kvadraturní dekodér | | P0_23 | Kanál B | ::: | ==== Řízení Peltiérova článku ==== **Pozor na přehřívání článku!** V módu chlazení dojde k přehřátí článku přibližně za 10 minut, pokud není zapnutý ventilátor. Při módu ohřevu může dojít k přehřátí už po několika sekundách, pokud nebude uvnitř vložená hliníková nádoba na vodu. **Nikdy nezapínejte ohřev na 100 % výkon.** Dojde k přehřátí článku, které by mohlo vést k jeho zničení. Bezpečný výkon v režimu ohřevu je pro ladění 40%. ^ Pin ^ Funkce ^ Ovládání ^^ | P0_24 (OUT) | Ovládání výkonu článku pomocí PWM | Žádný výkon | 0 | | ::: | ::: | Maximální výkon | 1 | | P0_29 (OUT) | Přepínání polarity proudu | Chlazení | 0 | | ::: | ::: | Ohřev | 1 | | P0_30 (OUT) | Ovládání ventilátoru | Zapnuto | 0 | | ::: | ::: | Vypnuto | 1 | ===== API ===== ==== Čtení senzorů ==== Pro ovládání senzorů byla vytvořen abstraktní třída CSensor a třídy reprezentující teplotní senzory z této třídy dědí. Jedná se o: * CDS18B20 * CLM75A * CPT100 Ukázka použití API pro čtení ze senzorů. Serial s(p9, p11); CSENSOR * sensor = new CDS18B20(p29, "DS18B20", & s); float temperature = sensor -> Read(); ==== Kvadraturní Dekodér ==== Kvadraturní dekodér je reprezentován třídou CQdec. Tato třída je vytořena pomocí návrhového vzoru singleton. Tím je zajištěno, že nedojde k výskytu dvou instancí této třídy v jednom kódu. Její inicializace probíhá pomocí metody CQdec * Get_Instance( PinName channel_A, PinName channel_B, uint32_t prescaler, void (* callback)( int ) = NULL)); Jedná se o tzv. singleton konstruktor. Při druhém zavolání této funkce v jednom programu bude vrácen nulový ukazatel. Dekodér je reprezentován pomocí vnitřního čítače. Při otáčení napravo hodnota v čítači roste, nalevo zase klesá. Jelikož enkodér vygeneruje při otočení o jednu pozici více pulsů, je třeba v singleton konstruktoru předat také hodnotu předděličky pulsů. V signleton konstruktoru je předáván také ukazatel na callback funkci, která se zavolá v přerušovací rutině od dekodéru při otočení. Jako parametr je této funkci předána změněná hodnota vnitřního čítače. //callback pro udalost na kvadraturnim dekoderu. Serial s(p9, p11); void event( int counter_value ); { s.printf("Hodnota citace dekoderu je: %d\r\n", counter_value); } int main( void ) { CQdec * QDec1 = Get_Instance(p21, p23, 2, event); while(1); }