Академический Документы
Профессиональный Документы
Культура Документы
PERCOBAAN 3
ADC (ANALOG TO DIGITAL CONVERTER)
I.
Tujuan
1. Mahasiswa mengetahui fungsi dari ADC dari mikrokontroller
2. Mahasiswa dapat mengaplikasikan program untuk mikrokontroller ARM pada
software uVision dan STM32 CubeMX
3. Mahasiswa bisa mengintegrasikan antara ADC dengan LCD untuk
menampilkan nilai ADC yang terbaca
II.
Dasar Teori
ADC (analog to digital converter) adalah komponen elektronika yang befungsi
uuntuk mengubah (mengkonversi) besaran analog menjadi besaran digital.
Komponen ini mutlak diperlukan bila mikrokontroller dihubungkan dengan sebuah
sensor yang keluarannya (output) mempunyai besaran analog, sedangkan yang
dibaca dan diolah oleh sebuah mikrokontroller adalah data yang digital.
Analog-to-digital converters (ADCs)
Three 12-bit analog-to-digital converters are embedded and each ADC shares up
to 16 external channels, performing conversions in the single-shot or scan mode.
In scan mode, automatic conversion is performed on a selected group of analog
inputs. Additional logic functions embedded in the ADC interface allow:
Simultaneous sample and hold
Interleaved sample and hold
The ADC can be served by the DMA controller. An analog watchdog
feature allows very precise monitoring of the converted voltage of one, some or all
selected channels. An interrupt is generated when the converted voltage is
outside the programmed thresholds. To synchronize A/D conversion and
timers, the ADCs could be triggered by any of TIM1, TIM2, TIM3, TIM4, TIM5,
or TIM8 timer.
The formula above (Equation 1) is used to determine the maximum external impedance
allowed for an error below 1/4 of LSB. N = 12 (from 12-bit resolution) and k is the number of
sampling periods defined in the ADC_SMPR1 register.
IV.
Gambar Rangkaian
LCD
2x16
VC
C
VCC
PB 1
PB
2
PB
3
PB
4
PB
5
PB
6
PE
8
PE9
.
.
.
.
.
PD 0 7
ARM
STM32
F4
PE
14
PE
15
PB
1
PB
2
PC
1
LDR2
LM35
1
PC
2
POT 1
PC
3
POT
2
PC
4
PC
5
PB
7
LDR1
POT 3
PB
8
LM35 2
V.
Algoritma
Percobaan 1
Tampilkan nilai ADC dari potensio 1 dan potensio 2 ke dalam LCD
VI.
Percobaan 2
1. Jika PB 1 ditekan maka akan tampil angka 0 100 lux pada LCD
2. Jika PB 2 ditekan maka akan tampil angka 0 100 lux pada LCD
3. Jika PB 3 ditekan maka pada layar LCD kosong (clear)
4. Jika PB 4 ditekan maka akan tampil angka 0 50 oC pada LCD
5. Jika PB 5 ditekan maka akan tampil angka 0 100 V pada LCD
6. Jika PB 6 ditekan maka akan tampil angka 0 5 A pada LCD
7. Jika PB 7 ditekan maka akan tampil angka 0 1000 rpm pada LCD
8. Jika PB 8 ditekan maka akan tampil angka 0 100 oC pada LCD
Flow Chart
Percobaan 1
STAR
T
Tampilkan nilai
ADC [4] dan
ADC [5]
IV.
Gambar Rangkaian
EN
D
Percobaan 2
START
Tampilkan
0 100 lux
PB1
PB2
Tampilkan
0 100 lux
PB3
LDC Clear
PB4
Tampilkan
0 50 oC
PB5
Tampilkan
0 100 V
PB6
PB7
Tampilkan
05A
Tampilkan
0 1000 rpm
Tampilkan
0 100 oC
PB8
EN
D
VII.
Langkah Percobaan
1. Lakukan inisialisasi pin pin pada ARM menggunakan STM32 CubeMX
2. Lakukan aktivasi RCC menggunakan HSE crystal
3. Jadikan PIND 0 sampai PIND 7 sebagai GPIO Output yang nantinya
dihubungkan dengan LCD 2x16
4. Jadikan PINE 8 sampai PINE 15 sebagai GPIO Input yang nantinya
dihubungkan dengan push button
5. Lakukan aktivasi pin ADC 1 mulai IN 8 sampai 15 melalui pheriperal
9. Pilih Parameter setting kemudian lakukan enable pada ADC etting yaitu scan
convertion mode, continous convertion mode dan DMA continou request.
Lakukan pengubahan Number of convertionmenjadi 8 karena kita
menggunakan 8 channel ADC dan lakukan pengubahan pada RANK yaitu
10. Lakukan pelabelan pada GPIO setting dengan mengisi nama pada user label
jika memang diperlukan dan kemudian aplly dan klik OK
11. Lakukan setting GPIO dengan mengubah PIND 0 sampai PIND 7 dengan
mode FAST dan PINE8 sampai PINE15 dengan mode pull down.
12. Setelah selesai melakukan semua setting maka langkah selanjutnya adalah
Generate Code dan buka Project
VIII.
Program
Percobaan 1
#include "stm32f4xx_hal.h"
#include "lcd_character.h"
#include "stdio.h"
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
IO uint16_t Nilai_ADC [8];
int main(void)
{
char simpan[20];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
lcd_init();
HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &Nilai_ADC,8);
while (1)
{
sprintf(simpan,"P1=%4d P2=%4d",Nilai_ADC[5] ,Nilai_ADC[5]);
lcd_gotoxy(0,0);
lcd_puts(simpan);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION12b;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 8;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_11;
sConfig.Rank = 4;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_12;
sConfig.Rank = 5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_13;
sConfig.Rank = 6;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_14;
sConfig.Rank = 7;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_15;
sConfig.Rank = 8;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
void MX_DMA_Init(void)
{
DMA2_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIOH_CLK_ENABLE();
GPIOC_CLK_ENABLE();
GPIOB_CLK_ENABLE();
GPIOD_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif
Percobaan 2
#include "stm32f4xx_hal.h"
#include "lcd_character.h"
#include "stdio.h"
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
IO uint16_t Nilai_ADC [8];
int main(void)
{
char kata[20], simpan[20];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
lcd_init();
HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &Nilai_ADC,8);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_8))
{
sprintf(simpan,"LDR 1= %3d lux
",((Nilai_ADC[0]*100)/4095));
sprintf(kata,"Sensor Cahaya
");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_9))
{
sprintf(simpan,"LDR 2= %3d lux
",((Nilai_ADC[1]*100)/4095));
sprintf(kata,"Sensor Cahaya
");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_10))
{
lcd_clear();
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_11))
{
sprintf(simpan,"LM35 1= %2d C
",((Nilai_ADC[3]*50)/4095));
sprintf(kata,"Sensor Suhu
");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_12))
{
sprintf(simpan,"POT 1= %3d V
",((Nilai_ADC[4]*100)/4095));
sprintf(kata,"Sensor Tegangan ");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_13))
{
sprintf(simpan,"POT 2= %1d A
",((Nilai_ADC[5]*5)/4095));
sprintf(kata,"Sensor Arus
");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14))
{
sprintf(simpan,"POT 3= %4d rpm ",((Nilai_ADC[6]*1000)/4095));
sprintf(kata,"Sensor Kecepatan");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_15))
{
sprintf(simpan,"LM35 1= %3d C
",((Nilai_ADC[7]*100)/4095));
sprintf(kata,"Sensor Suhu
");
lcd_gotoxy(0,0);
lcd_puts(kata);
lcd_gotoxy(0,1);
lcd_puts(simpan);
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION12b;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 8;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_11;
sConfig.Rank = 4;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_12;
sConfig.Rank = 5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_13;
sConfig.Rank = 6;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_14;
sConfig.Rank = 7;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_15;
sConfig.Rank = 8;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
void MX_DMA_Init(void)
{
DMA2_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIOH_CLK_ENABLE();
GPIOC_CLK_ENABLE();
GPIOB_CLK_ENABLE();
GPIOD_CLK_ENABLE();
GPIOE_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif
IX.
Analisa
Angka 8 pada perintah tersebut mengartikan bahwa jumlah ADC yang diguakan
adalah sebanyak 8 chanel.
X.
Kesimpulan
1. ADC adalah sebuah konverter yang digunakan untuk mengubah besaran analog
menjadi besaran digital
2. Pada ARM STM32F4 terdapat beberapa chanel ADC salah satunya
terletak
pada PINB1, PINB2 dan PINC0 sampai dengan PINC5
3. Tidak semua PIN pada mikrokontroller ARM bisa digunakan sebagai ADC