Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Control two servo with two potentiometers

Status
Not open for further replies.

mr_l

Newbie level 5
Joined
Sep 16, 2011
Messages
10
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,372
Hello!
I'm trying to write code to control two servo with two potentiometers
Devices that I use is: microcontoller atmega88, breadboard, two servo Futaba S3003 and Elsy AVRUSB500 programmers.
Everything is properly connected but my code is not working as it should.
What happens when I try to control the servo is that only one potentiometer controls both servos.
Can someone tell me what is wrong in my code and how to solve this problem??
Thanks in advance here is my cod:

Code:
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>

void ADC_init(void);
void Tim_init(void);

unsigned int ADC_read(unsigned char);

int main(void)
{

    Tim_init(); // Initialization of Timer1

    DDRB |= 0b00000111;// Set PB1 and PB2 as outputs
	TCCR1A |= (1<<COM1A1);  //  PWM on port B1 - non-inverted compare mode 2
    TCCR1A |= (1<<COM1B1);   //  PWM on port B2 - non-inverted compare mode 2
    
	TCNT1 = 0;

	OCR1A = 1500;
	OCR1B = 1500;

    TIMSK1 |= (1<<OCIE1A);
	TIMSK1 |= (1<<OCIE1B);

	ADC_init();	// Initialization of ADC	


     while (1)
	 {
    
     if (TIFR1 & (1 << OCF1A)) 
        {
           OCR1A = ADC_read(0);
        }
	  
	    if (TIFR1 & (1 << OCF1B)) 
        {
           OCR1B = ADC_read(1);
        }
      
	  }

	
}

void Tim_init(void)
{

    TCCR1A = 0;     // disable all PWM on Timer1 
	ICR1 = 19999;   // frequency  20ms

	
	TCCR1A = (1<<WGM11);  //  Timer 1 for Fast PWM mode via ICR1, with no prescaling
	TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS10) ;
	
}

void ADC_init(void)		// Initialization of ADC
{
	ADMUX=(1<<REFS0);	// AVcc with external capacitor  AREF
	ADCSRA=(1<<ADEN)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);	// Enable ADC and set Prescaler division factor as 128
}
 
unsigned int ADC_read(unsigned char ch)
{
	ch= ch & 0b00000011;		// Set chanel 1 or 2
	ADMUX |= ch;				// selecting channel
 
	ADCSRA|=(1<<ADSC);			// start conversion
	while(!(ADCSRA & (1<<ADIF)));	// waiting for ADIF, conversion complete
	ADCSRA|=(1<<ADIF);			// clearing of ADIF
 
	return ((ADCL|(ADCH<<8))*8);
}
 
Last edited:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top