Minggu, 14 April 2013

Kendali kecepatan motor dc dengan PWM menggunakan program cvavr

Mengatur kecepatan motor dc dapat dilakukan dengan berbagai cara, salah satunya yaitu dengan menggunakan program. Disini saya akan langsung memberikan langkah-langkah untuk mengatur kecepatan motor dc menggunakan program. Program yang digunakan adalah code vision avr. Berikut ini langkah-langkahnya beserta simulasinya menggunkan ISIS Professional.

1. Buka CVavr lalu ikuti langkah-langkah berikut

 

PORTD sebagai output ( lihat gambar )

2. Buka aplikasi ISIS Professional lalu rangkai seperti dibawah ini.




Komponen yang digunakan adalah driver motor LM298, motor dan ic at8535

3. Program

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 2/10/2013
Author  : 
Company : 
Comments: 


Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>


unsigned char xcount,lpwm,rpwm ;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
xcount++;
if (xcount <= lpwm){PORTD.4=1;}
else {PORTD.4=0;}
if (xcount <= rpwm){PORTD.5=1;}
else {PORTD.5=0;}
TCNT0 = 0XFF;
}

// Declare your global variables here
void maju ()
{
lpwm=150;rpwm=150;
PORTD.2=1 ;PORTD.3=0 ;
PORTD.6=1 ;PORTD.7=0 ; 
void kiri ()
{
lpwm=150;rpwm=200;
PORTD.2=1 ;PORTD.3=0 ;
PORTD.6=1 ;PORTD.7=0 ;
}

void kanan ()
{
lpwm=200;rpwm=150;
PORTD.2=1 ;PORTD.3=0 ;
PORTD.6=1 ;PORTD.7=0 ; 
}

void berhenti()
{
PORTD=0x00;
}



void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0xFF;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11059.200 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here     
 maju();
delay_ms(500);
kiri();
delay_ms(500);
kanan();
delay_ms(500);
berhenti ();
                     
      }    
}
               




Kamis, 11 April 2013

Fload Detection menggunakan MIDE-51

Fload detection merupakan alat untuk menditeksi banjir, alat ini sangat mudah dibuat karena hanya menggunkan komponen - komponen yang sederhana. Alat ini menggunakan Mikon at89S51 sebagai otak pengeksekusi perintah input/output. Sensor yang digunakan dalam alat ini adalah papan PCB yang dibentuk seperti dibawah ini.


Sebagai indikator untuk alat ini menggunakan 3 buah LED dan buzzer, ketiga komponen tersebut yang akan digunakan sebagai penunjuk kondisi air yang kondisinya telah ditentukan kedalam mikon.

Berikut ini langkah - langkah simulasi alat menggunakan ISIS Proteus.

1. Buka Proteus lalu susun rangkaian seperti ini.


2. Program menggunakan MIDE-51

$mod51
org 0h

awal :mov a,p2
cjne a,#11111111b,sensor1
acall delay
sjmp mati

sensor1 :mov a,p2
cjne a,#11110111b,sensor2
acall delay
sjmp hij
sensor2 :mov a,p2
cjne a,#11111011b,sensor3
acall delay
sjmp kun
sensor3 :mov a,p2
cjne a,#11111101b,sensor4
acall delay
sjmp mer
sensor4 :mov a,p2
cjne a,#11111110b,sensor12
acall delay
sjmp buz
 
sensor12 :mov a,p2
cjne a,#11110011b,sensor123
acall delay
sjmp hijkun
 
sensor123 :mov a,p2
cjne a,#11110001b,sensor1234
acall delay
sjmp hijkunmer
 
sensor1234 :mov a,p2
cjne a,#11110000b,awal
acall delay
sjmp hijkunmerbuz
 
 
mati :mov p1,#11111111b
sjmp awal

hij :mov p1,#11111110b
sjmp sensor1
kun :mov p1,#11111101b
sjmp sensor2
mer :mov p1,#11111011b
sjmp sensor3
buz :mov p1,#11110111b
sjmp sensor4
 
hijkun :mov p1,#11111100b
sjmp sensor12

hijkunmer :mov p1,#11111000b
sjmp sensor123
 
hijkunmerbuz :mov p1,#11110000b
sjmp sensor1234
delay :mov r0,#07h
ulang :djnz r2,ulang
djnz r1,ulang
djnz r0,ulang
ret
 
 
end




Rabu, 10 April 2013

Simulasi kendali motor servo menggunakan aplikasi Proteus dan program Cvavr

Secara singkat motor servo merupakan motor yang dapat diatur derajat perputarannya. Motor servo ada 2 jenis yaitu motor servo yang hanya dapat bergerak 180 derajat dan motor servo yang dapat bergerak 360 derajat. Cara menentukan derajat perputaran motor servo dapat ditentukan dengan rumus sbb:

a.  max 180 --> [( max control pulse - min control pulse) / 180 ] * Derajat yang diinginkan

b. max 360 -->  [( max control pulse - min control pulse) / 360 ] * Derajat yang diinginkan

Kendali derajat motor servo berupa pulsa delay dalam us ( mikro secon ) dengan pulsa delay maksimum sebesar 20000 us.

Dibawah ini langkah - langkah simulasi motor servo menggunakan proteus dan program cvavr.

1. Buka program cvavr lalu ikuti langkah berkut

















2. Buka Proteus lalu rangkai seperti berikut

 motor servo 1 ( port a.0)

  motor servo 2 ( port a.1 )

 pengaturan pada mikon

 


3. Program

Program ini simulasi untuk menggerakan motor servo max 360 derajat dan 180 derajat.

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 10/18/2012
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h> 
#include <delay.h>

// Declare your global variables here

void main(void)
{
PORTA = 0x00;
DDRA = 0x01;

// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      PORTA.0=1;  
      delay_us(2000); 
      PORTA.0=0;
      delay_us(18000); 
      PORTA.1=1;  
      delay_us(1000); 
      PORTA.1=0;
      delay_us(19000);
      
    
     


      
      
      
      
      // Place your code here

      };
}



Sensor robot LIne Follower menggunakan ADC menggunakan ATMEGA 8935 dan CVAVR

ADC ( analog digital converter ) yaitu mengubah sinyal analog menjadi sinyal digital. Robot line follower menggunakan sensor cahaya sebagai input pendeteksi garis baik garis putih atau hitam sesuai kondisi yang diinginkan. Sensor Line follower biasanya menggunakan foto dioda dan SB. Pada sistem line follower biasanya output dari sensor masuk ke comperator ( IC 324, IC 339 dll ).

Pada ic atmega 8535 mempunyai pin untuk conversi analog to digital yaitu terletak pada pinA0 - pinA7. 
rumus ADC [ (Vin + 1024)/Vreff  --> 10 bit atau  (Vin + 256)/Vreff  --> 8 bit].

Sebagai simulasi kita gunakan program Proteus.
Langkah - langkah :
1. Buka program cvavr lalu ikuti langkah berikut

2. Buka aplikasi proteus, lalu susun rangkaian seperti dibawah ini.
    IC atmega 8535, Led, dan POT-HG ( var-res)


3. Program
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 3/24/2013
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x60 

int reff = 150 ;

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here 


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x82;
SFIOR&=0xEF;

while (1)
      {  
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000000;}
      if ((read_adc(0)>= reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000001;}
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000010;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000100;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)>= reff)){PORTD = 0b000001000;}
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000110;}
      if ((read_adc(0)>= reff)&&(read_adc(1)>= reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000011;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)>= reff)&&(read_adc(3)>= reff)){PORTD = 0b000001100;} 
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)>= reff)){PORTD = 0b000001110;}
      if ((read_adc(0)>= reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000111;}
      
      
      // Place your code here

      };
}