- Gerekli malzemeler
- STM8S103F3P6 üzerinde ADC
- STM8S'de ADC Değerlerini Okumak ve LCD'de Göstermek İçin Devre Şeması
- STM8S103F3P6 için ADC Kitaplığı
- STM8S Programı Analog Voltajı Okumak ve LCD'de Göstermek
- STM8S Kullanarak İki Potansiyometreden Analog Voltaj Okuma
STM8S Mikrodenetleyici Eğitimlerimizi takip eden sıradan bir okuyucuysanız, son eğitimimizde 16x2 LCD ile STM8'ler arasında nasıl arayüz oluşturacağımızı öğrendiğimizi bilirsiniz. Şimdi, bu eğitimde devam ederek, STM8S103F3P6 Mikrodenetleyicimizdeki ADC özelliğini nasıl kullanacağımızı öğreneceğiz. ADC, değişen voltaj, akım, sıcaklık, nem vb.
Bildiğimiz gibi "Dijital cihazlarla analog bir dünyada yaşıyoruz" yani rüzgar hızı, ışık yoğunluğu, sıcaklık gibi çevremizdeki her şey ve hız, hız, basınç gibi uğraştığımız her şey doğası gereği analogdur. Ancak mikrodenetleyicilerimiz ve mikro işlemcilerimiz dijital cihazlardır ve Analogdan Dijitale Dönüştürücüler (ADC) adı verilen önemli bir çevre birimi olmadan bu parametreleri ölçemeyeceklerdir. Bu yazımızda COMIC C derleyicisi ile STM8S Microcontroller üzerinde ADC'yi nasıl kullanacağımızı öğrenelim.
Gerekli malzemeler
Bu yazıda, iki potansiyometreden iki analog voltaj değerini okuyacağız ve ADC değerini 16x2 LCD ekranda görüntüleyeceğiz. Bunu yapmak için aşağıdaki bileşenlere ihtiyacımız olacak.
- STM8S103F3P6 Geliştirme kurulu
- ST-Link V2 programcısı
- 16x2 LCD
- Potansiyometreler
- Bağlantı telleri
- 1k direnç
STM8S103F3P6 üzerinde ADC
Birçok ADC türü vardır ve her mikrodenetleyicinin kendi spesifikasyonları vardır. STM8S103F3P6'da 5 Kanallı ve 10 bit çözünürlüklü bir ADC'ye sahibiz ; 10 bit çözünürlük ile 0'dan 1024'e kadar dijital değeri ölçebileceğiz ve 5 kanallı bir ADC, Mikrodenetleyicide ADC'yi destekleyebilecek 5 pinimiz olduğunu belirtir, bu 5 pin aşağıdaki resimde vurgulanmıştır.
Gördüğünüz gibi, bu beş pinin (AIN2, AIN3, AIN4, AIN5 ve AIN6) tümü diğer çevre birimleriyle çoklanmıştır, yani sadece bir ADC pini gibi davranmanın dışında, bu pimler aynı zamanda örneğin pin 2 ve 3 (AIN5 ve AIN 6) sadece ADC için kullanılamaz, aynı zamanda seri iletişim ve GPIO fonksiyonları için de kullanılabilir. Her üç amaç için de aynı pimi kullanmanın mümkün olmayacağını unutmayın, bu nedenle bu iki pini ADC için kullanıyorsak, o zaman seri iletişim gerçekleştiremeyeceğiz. STM8S103P36 için diğer önemli ADC özellikleri, veri sayfasından alınan aşağıdaki tabloda bulunabilir.
Yukarıdaki tabloda, Vdd çalışma voltajını ve Vss toprağı temsil etmektedir. Dolayısıyla, geliştirme kartımızdaki durumumuzda, mikrodenetleyicimiz 3.3V'de çalışıyor, geliştirme kartı devre şemasını STM8S öğreticisine başlarken kontrol edebilirsiniz. Çalışma voltajı olarak 3.3V ile ADC saat frekansımız 1 ila 4MHz arasında ayarlanabilir ve dönüştürme voltajı aralığımız 0V ila 3.3V arasındadır. Bu, 10 bitlik ADC'mizin 0V (Vss) sağlandığında 0 okuyacağı ve 3.3V (Vdd) sağlandığında maksimum 1024 okuyacağı anlamına gelir. Gerekirse MCU'nun çalışma voltajını değiştirerek bu 0-5V'u kolayca değiştirebiliriz.
STM8S'de ADC Değerlerini Okumak ve LCD'de Göstermek İçin Devre Şeması
Bu projede kullanılan tam devre şeması aşağıda verilmiştir, daha önce tartıştığımız STM8S LCD öğreticisine çok benzer.
Gördüğünüz gibi, LCD dışındaki tek ek bileşenler iki potansiyometre POT_1 ve POT_2 . Bu kaplar, daha önce pinout görüntüsünde tartışıldığı gibi ANI2 ve ANI6 pinleri olan PC4 ve PD6 bağlantı noktalarına bağlanır.
Potansiyometreler, değiştirdiğimizde analog pinlerimizde 0-5 V alacak şekilde bağlanmıştır. Kontrol cihazımızı bu analog gerilimi dijital değerde (0 ila 1024) okuyacak ve LCD ekranda görüntüleyecek şekilde programlayacağız. Daha sonra eşdeğer voltaj değerini de hesaplayıp LCD'de görüntüleyeceğiz, kontrolörümüzün 3.3V ile güçlendirildiğini hatırlayacağız, bu nedenle ADC pinine 5V sağlasak bile sadece 0V ila 3.3V okuyabilecektir..
Bağlantılar yapıldıktan sonra, donanımım aşağıda gösterildiği gibi görünüyor. Sağda iki potansiyometreyi ve solda ST-link programlayıcıyı görebilirsiniz.
STM8S103F3P6 için ADC Kitaplığı
STM8S'de ADC işlevlerini programlamak için, SPL kitaplıklarıyla birlikte Cosmic C derleyicisini kullanacağız. Ancak süreçleri kolaylaştırmak için GitHub'da bulunan aşağıdaki bağlantı ile başka bir başlık dosyası yaptım.
STM8S103F3P6 için ADC kitaplığı
Ne yaptığınızı biliyorsanız, yukarıdaki kodu kullanarak bir başlık dosyası oluşturabilir ve bunu proje sayfanızdaki "dosyaları dahil et" dizinine ekleyebilirsiniz. Aksi takdirde, programlama ortamınızı ve derleyicinizi nasıl kuracağınızı öğrenmek için STM8S eğitimine başlama bölümünü izleyin. Kurulumunuz hazır olduğunda, IDE'niz, en azından kırmızı ile çevrili olanlar olmak üzere aşağıdaki başlık dosyalarına sahip olmalıdır.
Yukarıdaki başlık dosyası ADC_Read () adlı bir işlevden oluşur. Bu işlev, herhangi bir pimden ADC değerini almak için ana programınızda çağrılabilir. Örneğin, ADC_Read (AN2) sonuç olarak AN2 pinindeki ADC değerini döndürecektir. İşlev aşağıda gösterilmiştir.
işaretsiz int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int sonuç = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ETKİN); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); sonuç = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Gördüğünüz gibi, bu işleve sekiz parametre aktarabiliriz ve bu ADC'nin nasıl yapılandırıldığını tanımlar. Yukarıdaki kütüphane kodumuzda, dönüşüm modunu sürekli olarak ayarladık ve ardından bir parametreyle geçen kanal numarasını aldık. Ve sonra denetleyicimizin CPU frekansını varsayılan olarak ayarlamamız gerekir (harici bir kristal bağlamadıysanız), STM8S'niz 16Mhz dahili osilatör ile çalışacaktır. Bu nedenle ön ölçekleyici değeri olarak " ADC1_PRESSEL_FCPU_D18 " den bahsettik. Bu işlevin içinde, SPL stm8s_adc1.h başlık dosyası tarafından tanımlanan diğer yöntemleri kullanıyoruz. ADC pinlerini yeniden başlatarak ve ardından ADC çevre birimini başlatmak için ADC1_Init () ile başlıyoruz . Bu işlevin SPL kullanıcı kılavuzundaki tanımı aşağıda gösterilmiştir.
Ardından, harici tetikleyiciyi bir zamanlayıcı kullanarak ayarlıyoruz ve burada kullanmayacağımız için harici tetiklemeyi devre dışı bırakıyoruz. Ve sonra hizalamayı sağa ayarladık ve son iki parametre Schmitt tetikleyicisini ayarlamak için kullanılıyor, ancak bu eğitim için onu devre dışı bırakacağız. Kısaca, ADC'miz harici tetikleyici ve Schmitt tetikleyici devre dışı bırakılarak gerekli ADC pini üzerinde sürekli dönüşüm modunda çalışacaktır. Harici tetikleyicinin veya Schmitt tetikleme seçeneğinin nasıl kullanılacağı hakkında daha fazla bilgiye ihtiyacınız varsa, veri sayfasını kontrol edebilirsiniz, bunu bu eğitimde tartışmayacağız.
STM8S Programı Analog Voltajı Okumak ve LCD'de Göstermek
Main.c dosyasında kullanılan kodun tamamı bu sayfanın altında bulunabilir. Gerekli başlık dosyalarını ve kaynak dosyalarını ekledikten sonra, ana dosyayı doğrudan derleyebilmelisiniz. Ana dosyadaki kodun açıklaması aşağıdaki gibidir. STM8S LCD programını açıklamayacağım çünkü bunu önceki eğitimde zaten tartışmıştık.
Kodun amacı, ADC değerlerini iki pinden okumak ve bunu bir voltaj değerine dönüştürmek olacaktır. Ayrıca LCD üzerinde hem ADC değerini hem de Gerilim değerini göstereceğiz. Bu yüzden, tamsayı biçiminde bir değişkeni alıp LCD'de görüntülemek için onu bir karaktere dönüştüren LCD_Print Var adlı bir işlev kullandım. Değişkendeki her rakamı almak için basit modül (%) ve bölme (/) operatörlerini kullandık ve aşağıda gösterildiği gibi d1, d2, d3 ve d4 gibi değişkenleri yerleştirdik. Daha sonra bu karakterleri LCD'de görüntülemek için LCD_Print_Char işlevini kullanabiliriz.
geçersiz LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Ana işlevin altında, açıklanan dört değişkenimiz var. Bunlardan ikisi ADC değerini (0 ila 1024) kaydetmek için kullanılır ve diğer ikisi gerçek voltaj değerini almak için kullanılır.
işaretsiz int ADC_value_1 = 0; işaretsiz int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Daha sonra, analog voltajı okumak için GPIO pinlerini ve saat yapılandırmasını hazırlamalıyız. Burada sırasıyla PC4 ve PD6 pinleri olan AIN2 ve AIN6 pinlerinden analog voltajı okuyacağız. Bu pimleri aşağıda gösterildiği gibi kayan bir durumda tanımlamalıyız. ADC için saat çevre birimini de etkinleştireceğiz.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT) için Çevresel Saati etkinleştirin; GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Artık pinler hazır olduğuna göre, analog voltajı okumak için sonsuz while döngüsüne girmeliyiz. Başlık dosyamıza sahip olduğumuz için, analog voltajı aşağıdaki satırları kullanarak AIN2 ve AIN 6 pinlerinden kolayca okuyabiliriz.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Bir sonraki adım, bu ADC okumasını (0'dan 1023'e) analog voltaja dönüştürmektir. Bu şekilde, pin AIN2 ve AIN6'ya verilen tam voltaj değerini görüntüleyebiliriz. Analog Voltajı hesaplamak için formüller şu şekilde verilebilir:
Analog Gerilim = ADC Okuma * (3300/1023)
STM8S103F3 denetleyicilerindeki durumumuzda, 10 bit çözünürlüklü bir ADC'ye sahibiz, bu yüzden 1023 (2 ^ 10) kullandık . Ayrıca geliştirmemizde denetleyiciye 3300 olan 3.3V ile güç verir, bu nedenle yukarıdaki formüllerde 3300'ü 1023'e böldük. Yaklaşık 3300/1023 bize 3.226 verecektir, bu nedenle programımızda ADC voltajını kullanarak gerçek ADC voltajını ölçmek için aşağıdaki satırlara sahibiz.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) ADC değeri 1'i 0'a 3300mV'ye dönüştür ADC_voltage_2 = ADC_value_2 * (3.226); // ADC değeri 1'den 0'a 3300mV'ye dönüştür
Kodun kalan kısmı yalnızca bu dört değeri LCD ekranda görüntülemek için kullanılır. Ayrıca, LCD'nin her 500mS'de güncellenmesi için 500ms'lik bir gecikmemiz var. Daha hızlı güncellemelere ihtiyacınız varsa bunu daha da azaltabilirsiniz.
STM8S Kullanarak İki Potansiyometreden Analog Voltaj Okuma
Kodu derleyin ve geliştirme panonuza yükleyin. Herhangi bir derleme hatası alırsanız, daha önce tartışıldığı gibi tüm başlık dosyalarını ve kaynak dosyalarını eklediğinizden emin olun. Kod yüklendikten sonra, “STM8S'de ADC” yazan küçük bir karşılama mesajı görmeli ve ardından aşağıdaki ekranı görmelisiniz.
D1 ve D2 değeri, sırasıyla Ain2 ve AIN6 pinlerinden ADC değerini gösterir. Sağ tarafta, görüntülenen eşdeğer voltaj değerleri de var. Bu değer, sırasıyla pin AIN2 ve AIN6'da görünen voltaja eşit olmalıdır. Aynı şeyi bir multimetre kullanarak kontrol edebiliriz, ayrıca voltaj değerinin de buna göre değişip değişmediğini kontrol etmek için potansiyometreleri değiştirebiliriz.
Eksiksiz çalışma da aşağıdaki videoda bulunabilir. Öğreticiden keyif aldığınızı ve yararlı bir şeyler öğrendiğinizi umuyoruz, herhangi bir sorunuz varsa, aşağıdaki yorum bölümünde bırakın. Ayrıca bir tartışma başlatmak veya başka teknik sorular göndermek için forumlarımızı kullanabilirsiniz.