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

STM32 dilengkapi dengan periperal analog yaitu ADC dan DAC 12 bit. ADC bisa digunakan untuk membaca tegangan analog, misal pembacaan sensor dengan keluaran analog. Sedangkan DAC bisa digunakan untuk membangkitkan sinyal analog, misal untuk membangkitkan gelombang sinus, gelombang segitiga atau bahkan sinyal audio.

Dengan ADC yang dimilikinya, STM32 bisa digunakan untuk mengukur tegangan analog. Sensor-sensor yang dipakai di dunia industri banyak menggunakan keluaran analog baik dalam bentuk tegangan maupun arus. Di antara standar keluaran yang pakai adalah keluaran 0-5V dan 0-10V untuk tegangan dan 4-20mA untuk arus.

Tentu saja karena tegangan masukan untuk ADC dibatasi sampai 3.3V (DC), diperlukan rangkaian pengkondisi sinyal untuk menyesuaikan level tegangan yang ke level tegangan yang bisa diterima oleh ADC. Untuk keluaran arus harus diubah juga menjadi tegangan karena ADC hanya bisa mengukur tegangan. Selain itu, jika akan digunakan untuk mengukur tegangan AC, maka tegangan AC tersebut harus diberi tegangan offset agar menjadi tegangan DC.

Untuk pengukuran ADC yang lebih baik, tegangan analog (VDDA dan VSSA) bisa dipisahkan dari tegangan digital. Pada saat merancang PCB juga harus diperhatikan agar jalur-jalur analog tidak bersilangan dengan jalur tegangan frekuensi tinggi, dan sedapat mungkin jalur analog tersebut dilindungi dengan area ground.

Oleh karena tegangan masukan ADC dibatasi sampai 3,3V (sesuai dengan tegangan referensi), maka untuk pengukuran tegangan lebih dari 3,3V diperlukan sebuah rangkaian pengkondisi sinyal (signal conditioning). Rangkaian pembagi tegangan merupakan rangakaian sederhana yang akan mengubah (membagi tegangan) yang lebih besar menjadi tegangan 3.3V atau kurang. Pada saat tegangan keluaran terukur 3,3V maka itulah tegangan maksimal yang masih bisa diukur oleh ADC STM32.

Rangkaian Pembagi Tegangan

Gambar di atas menunjukan rangakaian tegangan yang dipakai dalam tutorial ini. Untuk keamanan bisa ditambahkan diode zenner 3.3V yang dipasang paralel dengan R3, agar menjaga tegangan ke MCU tetap di 3.3V seandainya R1 dan R2 mengalami short circuit. Dengan menerapkan hukum Ohm, tegangan Vout bisa dihitung dengan persamaan:

Vout telah ditentukan di 3,3V begitu juga nilai semua resistor telah diketahui. Maka nilai Vin pada saat Vout bernilai 3,3V bisa dicari dengan persamaan:

Dengan memasukan semua nilai yang diketahui didapat nilai Vin sebesar 15,5V, artinya dengan rangkaian pembagi tegangan tersebut, ADC internal STM32 bisa digunakan untuk mengukur tegangan DC sampai dengan 15,5V. Dengan demikian pembagi tegangan tersebut adalah 15,5/3,3. Nilai pembagi ini bisa juga digunakan untuk mencari nilai Vin:

Lalu bagaimana mengubah nilai ADC (12 bit) menjadi nilai tegangan di Vin?

Pada saat tegangan input ADC mencapai 3,3V maka data ADC akan terbaca maksimal 4095 (12 bit). Sehingga hubungan antara tegangan input ADC dengan nilai ADC bisa dituliskan dengan persamaan:

Atau

Oleh karena Vin ADC adalah Vout, maka

Contoh program menggunakan ADC3 channel 5 yang dipetakan ke GPIO pin PF7 STM32F207. ADC diprogram untuk bekerja di 12 bit dengan mode polling. Proses konversi dipicu melalui software dengan clock di set di 30 MHz. Waktu sampling diatur di 3 siklus dan waktu untuk konversi 12 bit data menjadi 12 siklus. Dengan clock 30 MHz,maka waktu konversi total adalah (12+3)/30 = 0.5 mikro detik.

Pengaturan ADC

Oleh karena ADC diatur untuk terpicu secara software, maka untuk memulai proses konversi, program harus memanggil fungsi HAL_ADC_Start dan melakukan polling sampai proses konversi selesai melalui fungsi HAL_ADC_PollForConversion. Ketika status ADC terbaca konversi telah selesai (End of conversion), nilai ADC dibaca dengan fungsi HAL_ADC_GetValue. Selanjutnya nilai ADC tersebut diubah menjadi nilai tegangan yang terukur dengan rumus yang telah disebutkan di atas dan dikirim ke port serial.

Untuk menghasilkan pembacaan yang stabil, pembacaan ADC mungkin perlu dilakukan berulang-ulang (misal 10 kali) kemudian diambil rata-ratanya baru dikirimkan ke port serial. Teknik pemfilteran mungkin juga diperlukan ketika masukan ADC adalah sensor analog yang sangat sensitif. Misalnya dengan menggunakan teknik filter Kalman dan lain-lain.

while (1)
{

 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
 //Start ADC Conversion
 if (HAL_ADC_Start(&hadc3)!=HAL_OK)
  {
    Error_Handler();
  }

 //Poll ADC, wait until conversion finish
 HAL_ADC_PollForConversion(&hadc3, 10);
 if((HAL_ADC_GetState(&hadc3) & HAL_ADC_STATE_EOC_REG) == HAL_ADC_STATE_EOC_REG)
  {
     //Read ADC Value
    uhADCxConvertedValue = HAL_ADC_GetValue(&hadc3);
  }

  //Convert to actual voltage
  Vin = (float) (uhADCxConvertedValue * 15.5)/4095;
  printf("VIN %.2f\r\n",Vin);
  HAL_Delay(1000);
  }

Contoh program bisa diunduh di sini

Leave a Reply

Your email address will not be published.