RTOS etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
RTOS etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Haziran 2020 Pazar

Fourier Dönüşümü Kullanılarak Stm32F4 Üzerinde Akort Uygulaması

Bu çalışmada stm32f4 geliştirme bordu ve üzerindeki mp45dt02 mikrofon kullanılarak akort uygulaması yapılmıştır. Test için enstürman olarak 4 telli ukulele seçilmiştir.

Akort cihazı, enstürmanı çalan kişinin önceden enstürmanın ayarlarının doğru şekilde kulağa rahatsızlık gelmeyecek şekilde ayarlamayı sağlar.

Bu çalışmaya başlarken nasıl oluyorda piyasaki akort cihazları doğru notayı buluyor olmasydı. Bunun cevabını Fourierde.

Fourier, periyodik veya periyodik olmayan sinyallerin sinüs ve cosinlerin toplamı olduğunu kanıtlamış. Bizde bu kanııtan yararlanarak stm32f üzerinde çalınan notanın Hz olarak tespitini yaptık. Karşılaştırma için andorid telefona indirilen bir adet akort uygulamaı ile yapıldı ve çalınan telin Hz olarak gösterimi aşağı yukarı neredeyse telefon ile aynı olduğu tespit edilmiştir.

Stm32 üzerinde uygulamaya başlamadan önce MATLAB ortamında önceden kaydedilmiş 4 adet nota üzerinde algoritma ile çalışılmıştır ve daha sonra gömülü tarafa yani stm32 tarafına uygulanmıştır.

MATLAB KODU: https://github.com/hakanaydn/matlab_ukulele_akort

stm32f4 discovery kiti üzerinde bir adet mikrofon bulunmaktadır ve aynı zamanda üzerinde DSP birimi bulunmaktadır. Bu uygulamayı yaparken RTOS dan yararlanılmıştır. Mikrofondan 8khz/16-bit sample alınarak DSP tarafında Fourier alınmış ve daha sonra  HPS algoritmasından geçirilerek asıl frekans belirlenmiştir. Örneğin; bir nota çalındığında(A-notası) FFT'sini alıp matlab'de çizdiriseniz FFT analizinde bir çok sinyal göreceksiniz. Bunlardan biri çalınan notanın frekansı(fundemental frequency). Bunu tespit etmek için HPS( Harmonic Product Spectrum)'dan yararlanılmıştır.



Yukarıdaki resimde FFT analiz kısmında çalınan A notası FFT'si alınmış hali gösterilmektedir. HPS analiz kısmında ise fundemantal freakansı yani çalınan notanın frekansı tespit edilmiştir. A notası 440 Hz'dir. Matlab'de 437.7 Hz olarak tespit edilmiştir.

Geliştirlen bu algoritmada stm32f4 üzerinden denenerek A notası 437.5Hz olarak tespit edilmiştir. Video'yu izlerseniz bunu görebilirsiniz.







İrtibat için
aydinhakan91@gmail.com
















9 Ekim 2017 Pazartesi

STM32 İLE HTU21D HABERLEŞMESİ

STM32 İLE HTU21D HABERLEŞMESİ


HTU21D, sıcaklık ve nem ölçen bir çeşit dijital elektronik sensördür.  Bu sensör, -40 ile 125 sıcaklık derecesi arasında çalışmaktadır.  

Sıcaklık ve Nem değerleri I2C haberleşme protoklü kullanarak stm32f429 entegresi HTU21'den alır. Ve daha sonra sıcaklık ve nem sensörü stm32f429 discovery kiti üzerindeki dokunmatik GLCD'de yazdırılır.
  



STM32 İLE BAĞLANTI PİNLERİ

HTU21D----->STM32
SCL                PA8
SDA               PC9
VCC               VCC
GND               GND


KOD:

#include "htu21d.h"

#define __OKUMA_ZAMANI_MS 250//ms cinsinden

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART5_Init();
  MX_DMA2D_Init();
  MX_FMC_Init();
  MX_I2C3_Init();
  MX_LTDC_Init();
  MX_SPI5_Init();

  /* USER CODE BEGIN 2 */
 BSP_LCD_Init();
 BSP_LCD_LayerDefaultInit(LCD_BACKGROUND_LAYER,LCD_FRAME_BUFFER);
 BSP_LCD_LayerDefaultInit(LCD_FOREGROUND_LAYER,LCD_FRAME_BUFFER);
 BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
 BSP_LCD_DisplayOn();
 BSP_LCD_Clear(LCD_COLOR_WHITE);

  /* Set LCD Demo description */
  BSP_LCD_SetTextColor(LCD_COLOR_RED);
  BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 80);
  BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  BSP_LCD_SetBackColor(LCD_COLOR_RED);
  BSP_LCD_SetFont(&Font24);
  BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"HTU21D", CENTER_MODE);
  BSP_LCD_SetFont(&Font12);
  BSP_LCD_DisplayStringAt(0, 30, (uint8_t *)"Bu projede HTU21D sensorunden", CENTER_MODE);
  BSP_LCD_DisplayStringAt(0, 45, (uint8_t *)"sicaklik ve nem bilgisi", CENTER_MODE);
  BSP_LCD_DisplayStringAt(0, 60, (uint8_t *)"okunarak GLCD yazdirilmistir", CENTER_MODE);

  /* Set the LCD Text Color */
  BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
  BSP_LCD_DrawRect(10, 90, BSP_LCD_GetXSize() - 20, BSP_LCD_GetYSize()- 100);
  BSP_LCD_DrawRect(11, 91, BSP_LCD_GetXSize() - 22, BSP_LCD_GetYSize()- 102);
if(!HTU_begin())
{
HAL_GPIO_WritePin(LD3_GPIO_Port,LD3_Pin,1);
}
BSP_LCD_SetFont(&Font24);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)"SICAKLIK", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, 200, (uint8_t *)"NEM", CENTER_MODE);
TIME=HAL_GetTick();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
if(HAL_GetTick()-TIME>__OKUMA_ZAMANI_MS)
{
//her 1 sn içersinde buraya gir ve htu21'den sicaklik ve nem oku.
//okunan sicaklik ve nem degerini dokunmatik ekrana yazdir.
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
float humd = HTU_readHumidity();
float temp = HTU_readTemperature();
char kelime[15];
sprintf(kelime,"%.3f C",temp);
BSP_LCD_DisplayStringAt(0, 160, (uint8_t *)kelime, CENTER_MODE);
sprintf(kelime,"%% %.3f RH",humd);
BSP_LCD_DisplayStringAt(0, 240, (uint8_t *)kelime, CENTER_MODE);
TIME=HAL_GetTick();
}

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

Kodun tamamı için irtibata geçiniz. Çalışan bir projedir. 



7 Ocak 2017 Cumartesi

RTOS (REAL TIME OPERATING SYSTEM)


RTOS (REAL TIME OPERATING SYSTEM)

Mikrodenetleyiciler, aynı anda bir komut satırını işletebilen entegrelerdir.

 Yukarıda sonuz döngü içine giren mikrodenetleyici ilk olarak birinci komut satırını işler sonra ikinci komutu daha sonra üçüncü komutu işler. Yani işleri sırayla yapar.


Örneğin; ardiuno’da loop fonksiyonun içine iki adet sonsuz döngü yerleştirelim. Mikrodenetleyici ilk sonuz döngüye girdiğinde oranın içindeki komutlaru sırayala işler fakat ikinci sonuz döngüye birinci döngüden çıkamadığı için oradaki görevleri işletemez.  

RTOS, mikrodenetleyicilerin içine gömülen bir işletim sistemidir aynı windows, linux gibi. RTOS’un en önemli özelliği görevleri parelelmiş gibi yapma yeteneği olmasıdır, bu özelliğiyle FPGA benzetebiliriz. Örneğin, Bilgisayarda müzik dinliyorsunuz spotify’de bir yandada internette gazete okuyorsunuz. Bilgisayarda bu işler parlelmiş gibi yapılıyor. İnternette gezereken internet sayfanız donsa bile veya internet sayfanız geç açılsa bile arka tarafta siz şarkınızı gayet akıcı bir şekilde dinliyor olacaksınız. Bu iki görevi yani yazılımda sanki iki farklı while sonsuz döngüsünde olduğunu düşünün. Yani bilgisayar iki farklı sonuz döngüyü aynı anda çalıştırıyor. Aynı bu yapıyı mikrodenetleyicilerdede RTOS sayesinde yaptırabilirz.

RTOS, sayesinde iki veya daha fazla sonsuz döngüyü aynı anda çalıştırabiliriz.




Yukarıdaki resimde RTOS ile çalışan iki farklı sonsuz döngü içersinden alınan iki sinyal görülmektedir.

Birinci sinyal sdkart’a data yazma zamanını, ikinci sinyalde her 6 ms’da ekg devremizden örnekleme aldığımızı düşünelim. Burada yapılan iş 6 ms örnekleme alıp onu sd kart’a yazmak fakat bunu RTOS’suz yaparsak 1.sinyalde A1’den A2’ye kadar lojik bir seviye olmuştur. Yani, sd karta yazma işi uzun sürmüş yaklaşık  60 ms. RTOS’suz yaptığımız düşünürsek 60 ms’de biz 6 adet ekg verisini kaybetmiş oluruz çünkü tek bir sonuz döngü içinde olacak önce ekg datasını okucayacak sonra onu sd kart’a kaydedecek. Kaydetme işi uzun olduğundan okuma yapıyacak ve bu durumda datalar eksik yazılacaktır.

Fakat bunu RTOS kullanarak yaparsak bu başımıza gelmeyecek. İkinci sinyalde de bu görülmektedir. A1 ve A2 süresi uzun sürse bile biz örnekleme alacağız yani datalarımız kaybolamayacak.  Burada iki farklı sonsuz döngü olacak. Birinci döngüde sd karta yazacak, ikinci döngüde örnekleme alacağız kesintisiz.