2016-06-19 45 views
-1

Я не собираюсь тратить свое время, и просто разместить код вместе с объяснениемсерво не работает должным образом на AVR

#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); 
    } 
} 

Итак, в чем проблема ?? У меня на самом деле нет осциллографа для измерения частоты, поэтому не просите меня об этом, но особенная вещь, которую я заметил, это то, что напряжение на силовых проводах сервопривода составляло 2,7 В, когда должно было быть 5 В , но сам источник питания обеспечивал 5 В, и это произошло только тогда, когда я подключил сигнальный штырь к штырю ШИМ, и это произошло независимо от того, была ли подключена рельс 5 В к сервомеханизму или нет ... Любые идеи о том, что проблема является??

+0

Если вы собираетесь downvote мне, скажи мне причину ... –

ответ

0

Ваш выход PWM имеет 50% -ный рабочий цикл, поэтому эффективное выходное напряжение порта уменьшается с 5 до 2,5 вольт при измерении с помощью вольтметра. Предполагая, что вы измеряете напряжение против земли, это не будет иметь никакого значения, если к сервоусилителю подключена линия питания 5 В, но будет иметь значение, если сигнал ШИМ не подключен.

Если сервопривод двунаправленный, то возможно, что 50% -ный рабочий цикл удерживает его неподвижным - попробуйте другой рабочий цикл, похоже, что вы жестко закодировали период ШИМ, инвертируя выход каждый полупериод. Попробуйте что-то вроде

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

Вы получили это неправильно, сигнал на PORTA переходит к T0, который является источником синхронизации для таймера –

+0

Кроме того, \t Это 100% -ный dutycycle, так как OCR0 является 8-битным регистром, но если напряжение было между штырем PWM (PB3) и GND, это имело бы смысл, но в этом случае оно находится между символами + и - силовые контакты сервопривода, что НЕ является хорошим знаком ... и да, все основания связаны –

+0

Ну, это странный способ сделать это. Использование программного цикла для управления таймером. –

 Смежные вопросы

  • Нет связанных вопросов^_^