2016-06-19 5 views
-1

Ich werde nicht Ihre Zeit verschwenden, und posten Sie einfach den Code zusammen mit der ErklärungServos nicht richtig auf AVR läuft

#define F_CPU 8000000UL 

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

int main(void){ 
    sei(); //Enable interrupts 
    DDRB = (1 << PORTB3);//Set pin P3 as an output and other pins as inputs 
    //PORTB = 0xff; 
    DDRA = (1 << PORTA7);//Set pin A7 as an output and other pins as inputs 
    //PORTA = (1 << PORTA7); 
    TCCR0 = (1 << WGM00) | (1 << WGM01) | (1 << COM01);//Enable PWM, and configure Timer 
    TIMSK = (1 << TOIE0);//Enabling an interrupt 
    OCR0 = 255;//Setting comparison value for the Output compare unit 
    TCCR0 |= (0b110 << CS00);//Selecting the clock as the falling edge on a certain pin 

    while(1){ 
    /* 
    * The portion of the code creates a square wave with a period of 39 us, which means that the falling edge occurs at a period of 78us, and since the output period of 
    * the PWM is 50Hz for a servo, that fits perfectly (1/(79*10^-6 * 256) ~ 50), but for some reason, the servo doesn't move...*/ 
     PORTA ^= (1<< PORT7); 
     _delay_us(39); 
    } 
} 

Also, was ist das Problem ?? Ich habe nicht wirklich ein Oszilloskop, um die Frequenz zu messen, also bitte mich nicht, das zu tun, aber eine merkwürdige Sache, die ich bemerkte, war, dass die Spannung über den Servo-Stromkabeln 2,7 V betrug, wenn es 5 V hätte sein sollen , aber die Stromversorgung selbst lieferte 5V, und dies geschah nur, wenn ich den Signalstift an den PWM-Pin angeschlossen habe, und es geschah unabhängig davon, ob die 5V-Schiene mit dem Servo verbunden war oder nicht ... Irgendwelche Ideen, was das Problem ist ist ??

+0

Wenn du gehst, um mich zu downvote, sagen Sie mir den Grund ... –

Antwort

0

Ihr PWM-Ausgang hat einen Tastgrad von 50%, so dass die effektive Port-Ausgangsspannung bei Messung mit einem Voltmeter von 5 V auf 2,5 V reduziert wird. Unter der Annahme, dass Sie die Spannung gegen Erde messen, macht es keinen Unterschied, ob 5V Stromleitung an das Servo angeschlossen ist, aber es wird einen Unterschied machen, wenn das PWM Signal nicht angeschlossen ist.

Wenn das Servo bidirektional ist, ist es möglich, dass das 50% Tastverhältnis es stationär hält - versuchen Sie ein anderes Tastverhältnis, es sieht so aus, als hätten Sie die PWM-Periode fest programmiert und den Ausgang jede halbe Periode invertiert. Probieren Sie etwas wie

PORTA ^= (1<< PORT7); 
_delay_us(28); 
PORTA ^= (1<< PORT7); 
_delay_us(50); 
+0

Sie haben es falsch, geht das Signal auf PORTA zu T0, die die Taktquelle für den Timer ist –

+0

Auch, \t Es ist eine 100% Einschaltdauer, da OCR0 ist ein 8-Bit-Register, aber hatte die Spannung zwischen dem PWM-Pin (PB3) und GND, hätte es Sinn gemacht, aber in diesem Fall ist es zwischen + und - Power-Pins des Servos, das ist kein gutes Zeichen ... und ja die Gründe sind alle zusammen gebunden –

+0

Nun, das ist eine seltsame Art und Weise es zu tun. Verwenden einer Software-Schleife, um einen Timer zu steuern. –