بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

DAC bekerja berkebalikan dengan ADC, DAC akan mengubah nilai digital menjadi nilai analog (dalam hal ini tegangan) yang sesuai, dengan tegangan DAC 3.3V maka DAC STM32  bisa diprogram untuk mengeluarkan tegangan analog dari 0 sampai 3.3V dalam resolusi 12 bit. DAC juga bisa diprogram secara langsung untuk menghasilkan sinyal noise dan gelombang segitiga, pustaka HAL sudah menyediakan fungsi untuk itu. Tutorial berikut akan menunjukan bagaimana DAC yang dimiliki oleh STM32F207 menghasilkan tegangan DC dari 0 – 3,3V. Tegangan yang dihasilkan diatur oleh 2 buah saklar yang akan menaikan atau menurunkan tegangan yang dihasilkan.

Pengaturan DAC

DAC menggunakan DAC channel 2 (pin PA5) dan 2 buah saklar terhubung ke pin PG0 dan PG1. Oleh karena dicontoh program ini hanya akan menghasilkan sinyal DC, maka pemicu (trigger) tidak digunakan.

void MX_DAC_Init(void)
{
  DAC_ChannelConfTypeDef sConfig = {0};

  /** DAC Initialization 
  */
  hdac.Instance = DAC;
  if (HAL_DAC_Init(&hdac) != HAL_OK)
  {
    Error_Handler();
  }
  /** DAC channel OUT2 config 
  */
  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
}

Setelah diinisialisasi, DAC belum mengeluarkan tegangan karena proses konversi belum dimulai dan register datanya belum diisi. Dalam contoh program ini, DAC akan diprogram untuk bekerja di 8 bit (0 – 255). Sesaat setelah proses inisialisasi, data register dengan nilai 127 sehingga ketika konversi dimulai, pin DAC akan mengeluarkan tegangan DC sekitar 1,6V.

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC_Init();
  /* USER CODE BEGIN 2 */
  DAC_Value = 127;
  if(HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_8B_R, DAC_Value) != HAL_OK)
  {
    /* Setting value Error */
    Error_Handler();
  }

  /*##-4- Enable DAC Channel1 ################################################*/
  if(HAL_DAC_Start(&hdac, DAC_CHANNEL_2) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

Di loop utama, program akan membaca 2 buah saklar, jika KEY1 ditekan, maka nilai DAC akan dinaikan 20, sedangkan jika KEY2 yang ditekan, nilai DAC akan dikurangi 20. Jika salah satu saklar ditekan, flag KeyPressed akan bernilai 1. Proses pembacaan saklar, tentu saja, menggunakan anti bounching dengan delay.

//Read Up Key
  if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)){
    keypresstimer=0;
    while(!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)){
      keypresstimer++;
      HAL_Delay(1);
    }
    if(keypresstimer>10){
      KeyPressed=1;
      DAC_Value+=20;
    }
  }

  if(!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)){
     keypresstimer=0;
     while(!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)){
       keypresstimer++;
	 HAL_Delay(1);
	}
	if(keypresstimer>10){
	  KeyPressed=1;
	  DAC_Value-=20;
	 }
  }

Ketika ada saklar yang ditekan, register data DAC akan diisi dengan variabel DAC_Value, dan kemudian proses konversi akan dimulai lagi. Oleh karena DAC bekerja di 8 bit, maka tegangan DC yang dihasilkan adalah:

Jika diinginkan DAC bekerja di resolusi 12 bit, tinggal mengganti parameter DAC_ALIGN_8B_R dengan DAC_ALIGN_12B_R saat memanggil fungsi HAL_DAC_SetValue. Dan pembagi di rumus tegangan DAC akan menjadi 4095.

if(KeyPressed){
  if(HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_8B_R, DAC_Value) != HAL_OK)
    {
      /* Setting value Error */
      Error_Handler();
    }

  if(HAL_DAC_Start(&hdac, DAC_CHANNEL_2) != HAL_OK)
    {
	/* Start Error */
	Error_Handler();
    }

   KeyPressed=0;

  }

Leave a Reply

Your email address will not be published.