Zaistniała potrzeba pomiarów temperatury. Niby nic wielkiego, ale... wymagany zakres pomiarowy obejmuje temperatury dodatnie do 300 stopni C. Już w przedbiegach wypadają wszelkiej maści rozwiązania typu sławetny DS1820. No cóż, za wysokie progi. Pozostaje zastosowanie rozwiązania opartego o termoparę. Trochę odstraszyła mnie konieczność budowania jakiegoś „chorego” rozwiązania do przetwarzania sygnału z termopary. Jak pogooglać, to nie jest tak źle. Można przykładowo zastosować układ MAX6675. Stanowi on kompletną obsługę toru pomiarowego. Mało tego, to da się zakupić to w formie już przylutowanej do maleńkiej PCB.Musiałem jedynie zrobić sobie maleńki kabelek, by złącze GOLDPINOWE modułku zintegrować z płytą do eksperymentów, czyli Solderless Breadboard. Na PCB jest nadruk opisujący funkcję poszczególnych pinów złącza, więc nie było żadnego kłopotu by stworzyć możliwość porozumienia ze wspomnianym układem MAX6675 (złącze ma 5 pinów: masa [GND], zasilanie [+5V], wybór układu [CS], sygnał zegarowy do taktowania szeregowej transmisji danych [CLK] oraz dane pomiarowe [SO]).
Środowisko uruchomieniowe oparte jest o moduł M32 (Opis modułu M32), do którego przyłączony jest dwuwierszowy display LCD i wspomniany MAX6675. Szczegóły pokazuje poniższa ilustracja.Zbudowanie środowiska do badań zajęło dosłownie chwilę.W niedzielne popołudnie miałem w pracowni 25.5 stopnia C.Zacząłem podgrzewać atmosferę.I szybko zrobiło się ciepło.Układ MAX6675, oprócz przetwarzania temperatury na bity, ma jeszcze dodatkową cechę (uważam, że istotną). Potrafi zasygnalizować, że nie ma kontaktu z sondą termopary.
Rzeczywiście, odłączenie sondyjest sygnalizowane, i procek może o tym się dowiedzieć (jak zwykle, wiedza to potęga).Implementacja obsługi również nie nastręczała żadnych problemów. W dokumentacji układu jest jasno określone co należy zrobić.Czyli: wystawić sygnał CS do logicznego zera, pomachać 16 razy pinem SCK zgarniając przy opadającym zboczu stan pinu SO. Zastosowana obsługa jest następująca:
Kod: Zaznacz cały
static void DoTheMeasurement ( void )
{
uint8_t Loop ;
uint8_t Data ;
/*-------------------------------------------------------------------------*/
MeasurementData = 0 ;
MeasurementPort &= ~ ( 1 << Thermocouple_CS ) ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
for ( Loop = 0 ; Loop < 16 ; Loop ++ )
{
MeasurementPort |= ( 1 << Thermocouple_SCK ) ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
MeasurementPort &= ~ ( 1 << Thermocouple_SCK ) ;
Data = MeasurementInputPort ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
nop ( ) ;
MeasurementData = MeasurementData << 1 ;
if ( Data & ( 1 << Thermocouple_SO ) )
MeasurementData |= 1 ;
} /* for */ ;
MeasurementPort |= ( 1 << Thermocouple_CS ) ;
MeasurementTechData = MeasurementData ;
MeasurementData = MeasurementData >> 3 ;
} /* DoTheMeasurement */
Załącznik: projekt w AVRSTUDIO:

