Freescale HCS08

Firma Freescale nabízí ve svém PR programu možnost zdarma si objednat několik kusů mikrokontrolérů a jiných součástek. Jak jsem již dříve zmiňoval v návodu na Programátor OSBDM, produkty této značky jsou promyšlené a kvalitní, zejména pokud se jedná o mikrokontroléry. Možnost debugovat oživený hardware přímo v zapojení a za použití pouhých čtyř vodičů navíc - to mnoho výrobců nenabízí.

 

Většina nových typů mikrokontroléru HCS08 nabízí jako zdroj hodinového kmitočtu možnost použití vnitřního oscilátoru nebo externího nízkofrekvenčního krystalu, obvykle na frekvenci 32 768Hz (tato nízká frekvence je  z důvodu omezení možného rušení). Následně je pomocí FLL obvodu signál převeden na pracovní frekvenci až 40 MHz.

 

Podle produktové řady nabízí mikrokontroléry různé periferie. Standardem bývají AD převodníky, porty I2C,SPI a asynchronní kanál SCI (u jiných výrobců značen jako UART). Některé typy obsahují modul pro hardwarové řízení multiplexované klávesnice a RTCmodul. Nejmodernější řada osmibitů JM je navíc vybavena nativním rozhraním USB 2.0.

 

Další komponenty

Již deší dobu jsem vlastnil tlakové čidlo Intersema MS5534B, které umožňuje měřit atmosférický tlak s přesností jednoho metru. Rovněž obsahuje vestavěné čidlo teploty, jehož výsledky slouží ke kompenzaci změřeného tlaku.Vše je kompletně zapouzdřeno společně s 15-bitovým AD převodníkem a komunikace probíhá přes digitální SPI rozhraní.

 

Pro připojení k PC byl zvolen prostý převodník USB<=>RS232 FT232RL, jehož zapojení je možné nalézt na stránkách výrobce www.ftdichip.com.

 

Schéma zapojení a konstrukce

Jako řídicí mikrokontrolér byl zvolen obvod MC9S08SH32 v pouzdře SOIC 28, jenž je levný a poskytuje základní možnosti, které však bohatě vystačují. Procesor nabízí 32kB paměti Flash a 1kB RAM. Při použití doporučeného krystalu je frekvence vynásobena 1024x na hodnotu asi 33MHz. S použitím předděličky je rovněž možné generovat přesný kmitočet 1Hz, který je velmi důležitý v situacích, kdy potřebujeme zobrazovat uplynulý čas.

 

Z mikrokontroléru jsou vyvedeny porty Rx a Tx asynchronního kanálu, takže je možné jej připojit do PC jednoduše buď přes RS232 rozhraní, nebo USB převodník. Pro možnost debugování v aplikaci bylo využito čtyřvývodové sběrnice k tomuto účelu určené.

 

img

Programové vybavení

Pro vývoj bylo použito studio CodeWarrior, které je přímo určeno pro práci s mikrokontroléry Freescale. Toto prostředí umožňuje programování v jazycích Asembler a C (pro kód byl  zvolen jazyk C). Kvůli odrušení okolního šumu a potlačení rozptylu vestavěného AD převodníku byl do obslužného programu přidán jednoduchý Kalmanův filtr prvního řádu. Tento filtr slouží jako vylepšený odhad plovoucího průměru a svižně reaguje na rychle se měnící signály.

 

Popis programu

  • Hlavní program se skládá z částí inicializace jednotlivých zařízení a inicializace časovače a následně nekonečné smyčky, která si každou vteřinu vyžádá data ze snímače tlaku a výsledné údaje poté zpracuje. Před přechodem do nekonečné smyčky program čeká přibližně sekundu. Tato doba je z důvodu ustálení napětí na snímači. V programu bylo potřeba inicializovat tyto periferie:
  • Zdroj hodinového signálu je na externím krystalu. Ten pracuje na frekvenci 32,768kHz a interním závěsem se násobí hodnotou 1024.
  • Sběrnice SCI pro přenos informací do počítače (RS232) má přenosovou rychlost 19200Bd. Při každém přenosu se odesílá 32 znaků dlouhý buffer v tomto formátu:  
    [cislo_mereni] [tlak_hPa] [teplota_C] [vyska_m] [počet_mereni]
  • Sběrnice SPI pro komunikaci s tlakovým čidlem je nastavena na kmitočet 250kHz bez využití přerušení.
  • Časovač T1 funguje v režimu PWM s přerušením při přetečení a pracovním cyklem 50%. Tlakové čidlo totiž vyžaduje externí zdroj kmitočtu na 32,768kHz. Při přetečení se inkrementuje proměnná, která dále generuje takt 1Hz pro odesílání dat na sériovou linku.

 

Získání dat ze snímače tlaku

Získání aktuálního tlaku a teploty probíhá pomocí funkce ms5534_read(ushort code). Funkci se jako parametr předá řetězec identifikující operaci, kterou chceme, aby čidlo provedlo. Pomocí operátoru switch se rozhodne, o jakou operaci se jedná, a provedou se potřebné kroky. Do čidla se nahraje adresa a poté se přečtou dva bajty obsahující návratovou hodnotu z čidla.

 

Data, která získáme z barometrického čidla, je nutné kompezovat a přepočítat do jednotek, které jsou požadovány dalšími funkcemi. Teplota je převáděna na stupně Celsia a atmosférický tlak na hekto Pascaly. O tento přepočet se stará funkce ms5534_calc_tp(uint d2_arg, uint d1_arg, float* temperature, float * pressure).


Získanou hodnotu tlaku je nutné přepočítat na výšku. Náš výškoměr neudává přesnou nadmořskou výšku, ale tzv. letovou hladinu. O přepočet tlaku na letovou hladinu se stará funkce compute_altitude(float P). Pro přepočet je použit vzorec:

Vzorec

Kalmanův filtr

Data bylo rovněž nutné vyfiltrovat, k čemuž slouží jednoduchý Kalmanův filtr prvního řádu. Tento filtr pracuje na principu adaptivního odhadu plovoucího průměru, přičemž uvažuje (ne)důvěryhodnost aktuálně naměřené hodnoty oproti predikci.

 

/*
*Zakladni struktura pro uchovani historie Kalmanova filtru
*/

typedef struct { //Nasledujici predpovezena hodnota float predict; //Aktualni vyprumerovana hodnota float value; //Prirustek noveho mereni float diff; //Ucinnost filtrovani - hladkost //cim vetsi R, tim nizsi kmitocty jsou propusteny float R; } kalman;

/* Inicializace filtru na pocatecni hodnotu a zadanou hladkost
* @param obj - Ukazael na objekt, ktery se ma inicializovat
* @param value - Pocatecni hodnota
* @param R - Nastavena hladkost
*/

void kalman_init(kalman* obj,float value,float R) { //vaha pocatecniho stavu obj->predict=value; obj->value=value; obj->diff=0.0f; obj->R=R; }
/*
*Funkce se zavola vzdy po obdrzeni nove hodnoty z cidla
* @param obj - Ukazatel na objekt, jehoz nova hodnota ovlivnuje
* @param value - Nova hodnota z cidla
* @return - Vysledek po provedeni filtrace
*/

float kalman_update(kalman* obj, float value) { float tmp,newvalue; //Predikce noveho stavu // predikce = stavajici_hodnota + smernice(diference) obj->predict = obj->value + obj->diff; //Odecteni aktualne namerene hodnoty a zjisteni, //jak daleko je od idealni pozice tmp = value - obj->predict; //Vypocitani vahy aktualniho mereni tmp=fabs(tmp); tmp = tmp / (tmp + obj->R);
//Vypocet navratove hodnoty podle neduvery nactene hodnoty newvalue = obj->value + tmp * (value - obj->value) ; obj->diff = newvalue - obj->value; obj->value = newvalue; return newvalue; }

 

Výstupy

Následující graf zachycuje měření, kdy byl výškoměr připojen k notebooku po celou dobu cesty z Brna do kopců u Letovic. Z výstupu Hyperterminálu jsem jednoduše extrahoval data do souboru CSV a ten již nebyl problém zpracovat v Excelu. Na vodorovné ose počet sekund od počátku měření, na svislé ose výsledná letová hladina.

 

Záznam průběhu výšky, cesta autem z Brna do Letovic

 

img
Záznam průběhu výšky, cesta autem z Brna do Letovic

 

 

Ke stažení

Schéma výškoměru (soubor Eagle .sch)

Projekt CodeWarrior se zdrojovými kódy - Výškoměr s výstupem do PC

Velké schéma výškoměru