Minggu, 23 Juni 2013

Penguat Logaritmik

Rangkaian penguat logaritmik merupakan rangkaian penguatan untuk Vout =  log (Vin).
Rangkaian penguat logaritmik ini terdiri dari beberapa opamp.

Inilah adalah hasil keluaran sinyal output dengan simulasi menggunakan Pspice.

Selain itu juga bisa disimulasikan dengan Proteus.

Dari kedua simulasi didapat hasil Vout = log(Vin) = log(10 volt) = 1 volt.

Teka Teki Logika

Ada 5 buah rumah yang masing-masing memiliki warna berbeda. Setiap rumah dihuni satu orang pria dengan kebangsaaan yang berbeda-beda. Setiap penghuni rumah menyukai jenis minuman tertentu, merokok satu merk rokok tertentu dan memelihara satu jenis hewan tertentu.
Tak satupun dari kelima orang itu yang minum minuman yang sama, merokok satu merk rokok yang sama, dan memelihara hewan yang sama seperti penghuni yang lain.
PERTANYAAN : Siapakah Yang memelihara IKAN?
PETUNJUK:
* Orang Inggris tinggal di dalam rumah berwarna merah
* Orang Swedia memelihara anjing
* Orang Denmark senang minum teh
* Rumah berwarna putih terletak tepat disebelah kiri rumah berwarna coklat
* Penghuni rumah berwarna putih senang minum kopi
* Orang yang merokok PallMall memelihara burung
* Penghuni rumah yang terletak ditengah-tengah senang minum susu
* Penghuni rumah berwarna kuning merokok Dunhill
* Orang Norwegia tinggal di rumah paling pertama
* Orang yang merokok Marlboro tinggal di sebelah orang yang memelihara kucing
* Orang yang memelihara kuda tinggal di sebelah orang yang merokok Dunhill
* Orang yang merokok Winfield senang minum bir
* Di sebelah rumah berwarna biru tinggal orang Norwegia
* Orang Jerman merokok Rothmans
* Orang yang merokok Marlboro bertetangga dengan orang yang minum air.
Albert Einstein menyusun teka-teki ini pada abad lalu. Dia menyatakan, 98% penduduk dunia tidak mampu memecahkan teka-teki ini. Apakah anda termasuk yang 2%?
keyword:
Kuning, Biru , Merah, Putih, Coklat, Norwegia, Denmark, Inggris, Jerman, Swedia, Air, Teh, Susu, Kopi, Bir, Kucing, Kuda, Burung, Ikan, Anjing, Dunhill, Marlboro, Pallmall, Rothmans, Winfield

Fitur ADC STM32F100

ADC (Analog Digital Converter)

Things to remember that bit of ADC on STM32 is 12 bit. 2^12 = 4096.

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"

ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

void RCC_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1 , ENABLE);
}

void GPIO_config(void)
{
//ADC1
GPIO_InitStructure.GPIO_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_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void ADC_config(void)
{
//clock ADC (max 14MHz --> 24/2=12MHz)
RCC_ADCCLKConfig (RCC_PCLK2_Div2);

//ADC Init
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 6;
ADC_Init ( ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 3,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3, 4,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 5,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5, 6,ADC_SampleTime_239Cycles5);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd (ADC1,ENABLE);

//ADC_ITConfig(ADC1,ADC_IT_EOC, ENABLE);

// calibration
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

//conversion
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

uint16_t ADC_ConvertedValue[6];
void DMA_config (void)
{
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 6;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA_Cmd(DMA1_Channel1, ENABLE);
}

sprintf(kata2,"%d %d %d %d %d %d \n\r", \
ADC_ConvertedValue[0],ADC_ConvertedValue[1],ADC_ConvertedValue[2], \
ADC_ConvertedValue[3],ADC_ConvertedValue[4],ADC_ConvertedValue[5]);
usart_puts(kata2);

Jumat, 21 Juni 2013

Using USART on STM32F100

Fitur USART (Universal Synchoronous Asynchronous Receiver Transmitter)

Kali ini saya akan ngebahas tentang penggunaan fitur USART pada STM32F100. Untuk menghubungkan mikonkontroler dengan PC, saya gunakan board FTDI dengan FT232 untuk komunikasi serialnya. Untuk menghubungkannya, cukup dengan menghubungkan pin TX, RX dan GND dari mikrokontroler ke FTDI.
USART pada STM32F100 ada tiga buah USART1, USART2, USART3, bebas mau nggunain yang mana aja yang penting pin di mikro-nya sesuai. Kalo misalnya kita gak pengen nggunain pin bawaan dari mikronya karena udah digunain buat fitur lain, kita bisa pindah fitur USART tersebut ke pin yang lain, yang bukan pin bawaan dari mikronya, pakai fitur REMAP sesuai tabel dari datasheet mikronya. USART yang bisa di-remap pada STM32F100 yaitu USART1 dan USART3. 
Inisialisasi awal yang wajib ditulis adalah
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include <stdio.h> 
 dan jangan lupa untuk mencentang tiap library tersebut pada repository-peripheral (untuk compiler coocox). Setelah itu, inisialisasi juga utuk clocknya dari tiap fitur (GPIO, USART) dan inisialisasi pin-pin pada port apa saja yang digunakan baik untuk USART ataupun I/O.

Next, ikutian aja listing program berikut ini.
char kata2[16];
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
Untuk inisialisasi pengaturan gunakan ini.
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
Untuk mengaktifkan clock tiap fiturnya gunakan void berikut ini.
void RCC_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}
 Untuk konfigurasi pin input dan output-nya gunakan void ini.
void GPIO_config(void)
{
//USART TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE );
Selanjutnya lakukan konfigurasi untuk fitur USART seperti berikut ini.
void USART_config(void)
{
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = \
        USART_HardwareFlowControl_None;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Cmd(USART3, ENABLE);
}

Untuk menggunakan fitur USART dapat kita gunakan sprintf, puts dan lainya pada void main berikut ini.
RCC_config();
GPIO_config();
USART_config();
setvbuf( stdout, 0, _IONBF, 0 );
unsigned int i=0;
while(1)
{
if (i<=1000)
    {
       sprintf(kata2,"Hitungan ke- %d \n\r", i );
       usart_puts(kata2);
       i++;
      delay(66);
      }
else i=0;
}
Untuk nampilin hasilnya, agan2 bisa pake hyperterminal, terminal bawaan dari arduino, terminal bawaan dari codevision ato bikin aplikasi sendiri, ato pake yang lainya.

Catatan penting : Jangan centang Retarget Printf pada repository-peripherals. Setelah itu pada configuration-link  pilih library use nano C library, centang printf float dan scan float. Kemudian pada Linked Library pilih add dan ketik "m" (tanpa tanda petik). Selain itu, hilangkan tanda centang pada Enable LTO. Semoga bisa jalan di PC agan2.

Untuk usart_puts - nya, tambahkan void berikut ini.
void usart_putchar(char c)
{
uint8_t ch;
ch = c;
USART_SendData(USART3, (uint8_t) ch);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) {}
}
void usart_puts(char *data)
{
int i=0;
int n = strlen(data);
for(i=0;i<n;i++)
{
usart_putchar(data[i]);
}
}
Jika berfungsi sebagai receiver, agan2 bisa pake void GetChar berikut ini.
char GetChar()
{
    uint8_t ch;
    ch = USART_ReceiveData(USART3);
    return ch;
}
Untuk aplikasinya bisa pake ini.
bInChar[0] = GetChar();
if (GetChar()==85)
{
GPIOC->ODR = GPIO_Pin_9;
delay(100000);
}
else if (GetChar()==0)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
        }
Untuk inisialisasi delay dan GPIO port C, agan2 bisa cek postingan sebelumnya.

Selain cara yang udah dibahas, ada juga cara lain seperti berikut ini.
const unsigned char menu[] = " Welcome to CooCox! \r\n";
UARTSend(menu, sizeof(menu));
Kemudian tambahkan void berikut ini.
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
    // Loop while there are more characters to send.
    while(ulCount--)
    {
        USART_SendData(USART3, (uint16_t) *pucBuffer++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
        {
        }
    }
}
Pada dasarnya, kedua cara tersebut memiliki penggunaan comand yang sama yaitu USART_SendData dan USART_GetFlagStatus.

Ok, sekian duu gan penjelasannya.
Semoga bermanfaat.
Thanks.
"Orang boleh pandai setinggi langit, tapi selama ia tak menulis, ia akan hilang di dalam masyarakat dan dari sejarah" Pramoedya Ananta Toer (Rumah Kaca, hlm. 352)