Jag har hållit på med ett litet projekt men har fastnat med koden, som inte verkar fungera! Projektet går ut på att m.h.a. en AVR Butterfly så ska två st. servon roteras fram och tillbaka (0-180 grader och tillbaka). Jag använder mig av AVR-studio (med evalueringskiten ATMega 169) för skrivandet av programmet och hittills ser programmet ut på följande sätt:
Kod: Markera allt
/****Servomotor***/
#include<avr/io.h>
#include<stdio.h>
#define F_CPU 1000000UL
#include<util/delay.h>
void init_ADC(void)
{
ADMUX=(1<<REFS0);// referens VCC=5V
ADMUX|= ((1<<ADLAR) | (1<<MUX2));// vänstrjusterat
ADCSRA=0x00;// Clear previous ADC result
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);//Enable ADC, prescaler 8
}
void init_PWM(void)
{
PORTB= 0x00;
DDRB|= ((1<<DDB5) | (1<<DDB6));// PB5/OC1A OCH PB6/OC1B bits of PORTB as output
ICR1= 4999; //TOP
TCCR1A|=((1<<COM1A1) | (1<<COM1B1) | (1<<WGM11));//
TCCR1B|=((1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10));// fast PWM, prescale 64
}
int read_convert(void)
{
while(!(ADCSRA &(1<< ADIF)));//Väntar tills konverteringen är klar
ADCSRA|=(1<<ADIF);//clear ADIF
double number=ADCH;// hämtar ADCH?
double procent;
double position;
for(number=0; number!=255; number++)
{
procent=number/255;
_delay_ms(10);
}
position = 1000+procent*1000;
for(number=255; number!=0; number--)
{
procent=number/255;
_delay_ms(10);
}
position = 1000+procent*1000;
return position;
}
int main(void)
{
init_ADC();
init_PWM();
while(1)
{
ADCSRA |=(1<<ADSC);//Starta conversion
OCR1A=read_convert();//läs konvertering
DDRF=0b00100000;//byter signal till ADC5(pinne 5 portF)
ADCSRA |=(1<<ADSC);//Starta conversion
OCR1B=read_convert();
DDRF=0b00010000;//byter signal till ADC4(pinne 4 portF)
}
}
Här är en liten förklaring till hur jag tänkt med vissa delar som kan vara otydliga samt vad jag skulle kunna behöva ha hjälp med:
Motorerna är kopplade: till pinnar PB5(OC1A) och PB6(OC1B) på port B.
Potentiometrarna är kopplade till PF4(TCK/ADC4) och PF5(TMS/ADC5) på port F.
Med ADCH och konverteringen är jag helt förvirrad nu och jag trodde att för att hämta ADCH så ska man sätta ADLAR = 1.
Ska jag först vänta tills konvertering är klar med while(!(ADCSRA &(1<< ADIF)));//Väntar tills konverteringen är klar och därefter hämta ADCH?
Med loopen "for(number=0; number!=255; number++) " har jag tänkt att number ska löpa från 0,1,2...till 255 så att jag får procent=0.004, 0.008,...., 1. Det behövs till positionerna för servo, som ska ändras från 0 grader till 180; position = 1000 motsvarar 0 grader och position=2000 till 180 grader. Samma princip gäller för den andra loopen "for(number=255; number!=0; number--) " vilket medför att servorna roteras tillbaka till position=1000 (0 grader).
Nu ser jag att procent skulle vara av typen double (och inte int) för att ha värdena 0.004, 0.008, ...., 1, men även denna ändring löser inte det problem jag har med kretsen.
DDRF =0b00100000 är set bit 5 of port F for output, bit 5 på port F har namnet ADC5 (ADC i ATmega169 finns på port F).
DDRF =0b00010000 är set bit 4 of port F for output, bit 4 på port F har namnet ADC4.
“byter till ADC5” : det är tänkt att servo ska roteras efter varandra och inte samtidigt.
Är det något som vet vad problemet är? Vad är det som behöver att fixas?
//Excl