Anda di halaman 1dari 7

2014

PENS

Fernando Ardilla
Iwan Kurnianto Wibowo

[ Pemrograman STM F -Discovery ]


PWM Menggunakan Timer STM32F407VG
Pulse Width Modulation menggunakan Timer pada
STM F 07VG

Tujuan
Setelah menyelesaikan modul ini, peserta mampu:
 Menjelaskan bagaimana cara menghasilkan PWM berdasarkan hardware timer
 Menjelaskan bagaimana cara menggunakan mode PWM dan fitur yang tersedia

Dasar Teori
Pada praktikum ini akan ditunjukkan bagaimana cara mengonfigurasi hardware timer STM32
agar menghasilkan sinyal output berupa PWM dengan lebar pulsa yang dapat diatur. PWM biasa
digunakan untuk mengontrol kecepatan motor dan kecerahan lampu. Hardware timer STM32 adalah
blok hardware terpisah yang dapat menghitung dari 0 hingga nilai yang diberikan dan memicu beberapa
event diantara nilai hitungan tersebut. Ketika nilai counter mencapai 0, maksimum atau sebuah nilai
pembanding (compare value) yang didefinisikan setiap channel, nilai output channel dapat berubah.
Berbagai pilihan konfigurasi menentukan event mana yang mengubah nilai dan bagaimana hal itu
berubah.
Timer 4 STM32F4 Discovery mempunyai empat channel yang dapat digunakan sebagai PWM
output yaitu TIM4_CH1-4. Pada board STM32F4 Discovery terdapat user LED yang terhubung pada port
yang sama dengan alternate function TIM4_CH1-4 seperti ditunjukkan pada tabel 1 dan gambar 1.
Skematik LED menunjukkan bahwa LED dirangkai active high. Jika diberikan kondisi high maka LED
menyala. Dengan demikian kecerahan LED dapat dikontrol menggunakan PWM mode 1 up-counting.

Tabel 1. Channel Output Timer 4


PORT Alternate Function #2 User LED On Board
PD12 TIM4_CH1 Green
PD13 TIM4_CH2 Orange
PD14 TIM4_CH3 Red
PD15 TIM4_CH4 Blue
Gambar 1. Skematik User LED
Blok diagram general-purpose timer yang berhubungan dengan channel output ditunjukkan pada gambar 2.

Gambar 2. Blok diagram general-purpose timer STM32F407VG


Timer PWM Mode
Timer dapat menghasilkan PWM dengan frekuensi yang ditentukan oleh nilai register TIM_ARR
atau period dan duty cycle yang ditentukan oleh nilai register TIMx_CCRx. Masing-masing channel PWM
berdiri secara independen. Ouput timer dihubungkan ke periferal OC-Output Compare, yang akan
memberikan output low atau high berdasarkan perbandingan antara nilai TIMx_CCRx dan posisi counter
TIMx_CNT. Polaritas OC dapat diatur, ketika terjadi Capture Compare, apakah sinyal berubah dari high
ke low atau low ke high. Bila di-set TIM_OCPolarity(default), output akan dimulai dengan kondisi high
dan akan berubah menjadi low ketika terjadi Capture Compare. Terdapat dua mode PWM yaitu PWM
mode 1 dan PWM mode 2.
PWM mode 1 (OC1M=110)
 Dalam up-counting, channel aktif selama TIMx_CNT<TIMx_CCRx, selebihnya tidak aktif
 Dalam down-counting, channel aktif selama TIMx_CNT>TIMx_CCRx, selebihnya tidak aktif
PWM mode 2 (OC1M=111)
 Dalam up-counting, channel aktif selama TIMx_CNT>TIMx_CCRx, selebihnya tidak aktif
 Dalam down-counting, channel aktif selama TIMx_CNT<TIMx_CCRx, selebihnya tidak aktif
Aktif ketika OCREF=1, tidak aktif ketika OCREF=0. Pada PWM mode 1 atau 2, level OCREF berubah hanya
ketika hasil dari perbandingan berubah atau ketika output compare mode berga ti dari ode frozen
ke ode PWM

Value

Period (TIMx_ARR)
TIMx_CCR TIM_CNT

Time
High TIM_CH

PWM output

Low

Gambar 3. Sinyal PWM mode 1

Dalam membangkitkan sinyal PWM, ada dua besaran yang harus diperhatikan, yaitu frekuensi dan duty
cycle PWM. Mengacu pada dasar pembangkitan PWM, yaitu operasi timer, maka frekuensi PWM dapat
dihitung dengan rumus :
Frekuensi PWM = TIM_CLK/((PSC+1)*(ARR+1))

Dimana :
TIM_CLK = timer clock input
PSC = register prescaler 16-bit
ARR = register autoreload 16/32

Catatan:
1. Jika prescaler APB = 1, maka frekuensi clock timer(TIM_CLK) di-set sama dengan frekuensi APB
bersangkutan dimana timer terhubung.
2. Jika prescaler APB tidak sama dengan 1, maka frekuensi clock timer (TIM_CLK) bernilai 2x
frekuensi APB bersangkutan dimana timer terhubung.

Percobaan
Peralatan
1. Board STM32F407VG Discovery
2. USB to Serial TTL

Prosedur sub praktikum 1


1. Buatlah project baru pada Keil uVision 5 seperti pada panduan sebelumnya. Pastikan komponen
yang digunakan pada Manage Run-Time Environtment” adalah:
 CMSIS | CORE
 Device | Startup
 Device | StdPeriph Drivers | USART, RCC, GPIO, Framework, TIM
2. Lakukan inisialisasi USART beserta fungsi-fungsi pendukung seperti panduan sebelumnya.
3. Lakukan inisialisasi TIM4 sebagai PWM mode 1 non inverting output dengan frekuensi 1 KHz dan
jangkauan nilai PWM 0-100.

void TIM4_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_PCLK1Config(RCC_HCLK_Div16);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12, GPIO_AF_TIM4); //pwm ch1
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13, GPIO_AF_TIM4); //pwm ch2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14, GPIO_AF_TIM4); //pwm ch3
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15, GPIO_AF_TIM4); //pwm ch4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |


GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&GPIO_InitStructure);

//fpwm=(10.5MHz*2)/(210*100)=1000Hz
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 210-1;
TIM_TimeBaseInitStruct.TIM_Period = 100-1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);
TIM_Cmd(TIM4,ENABLE);

TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //mode non inverting
TIM_OCInitStruct.TIM_Pulse = 0;
TIM_OC1Init(TIM4,&TIM_OCInitStruct);
TIM_OC2Init(TIM4,&TIM_OCInitStruct);
TIM_OC3Init(TIM4,&TIM_OCInitStruct);
TIM_OC4Init(TIM4,&TIM_OCInitStruct);
TIM_Cmd(TIM4,ENABLE);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);
TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);
TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);
TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);
}

4. Panggil fungsi-fungsi yang telah dibuat pada main program.


int main(void)
{
char buffer[32];
SysTick_Init();
USART_Config();
TIM4_Config();
USART_puts("\n\rPWM Start");
for(;;)
{
TIM_SetCompare1(TIM4,10);
TIM_SetCompare2(TIM4,10);
TIM_SetCompare3(TIM4,10);
TIM_SetCompare4(TIM4,10);
delay_ms(1000);

TIM_SetCompare1(TIM4,80);
TIM_SetCompare2(TIM4,80);
TIM_SetCompare3(TIM4,80);
TIM_SetCompare4(TIM4,80);
delay_ms(1000);
}
}

5. Amati kedip LED pada board. LED blinking dengan nyala yang redup(10%) dan terang(80%). Nilai
PWM berkisar antara 0 hingga nilai period.

Tugas sub praktikum 1


Buatlah sistem yang dapat mengontrol kecerahan 4 LED. Masing-masing LED dikontrol oleh komputer
berupa Graphic User Interface melalui port serial.

Mengakhiri praktikum

Anda mungkin juga menyukai