Среда, 24.04.2024, 19:46
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по МК » помогите создать сигнал
помогите создать сигнал
rrjcnzДата: Пятница, 11.11.2011, 17:02 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Здравствуйте. помогите добиться сигнала для управления сервоприводом, желательно на attiny2313.
Вот ссылка на информацию по серво приводу
http://vtpablos.narod.ru/robots/servotester/


Сообщение отредактировал rrjcnz - Пятница, 11.11.2011, 17:03
 
HiSERДата: Суббота, 12.11.2011, 00:43 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
В чем собственно вопрос?
 
rrjcnzДата: Суббота, 12.11.2011, 01:48 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Нужно управлять сервоприводом при помощи 3-х кнопок (в дальнейшем возможно будет прогамма добавляться и число приводов увеличиваться): первая сдвигает пошагово на несколько градусов в лево, вторая возвращает сервопривод в среднее положение, третья сдвигает пошагово на несколько градусов в право. Пытался что-то сделать при помощи таймеров и ШИМ-ов, но ничего не получилось. подскажите пожалуйста как это сделать. Я в этом деле новичок по этому если можно объясните по подробней.
 
HiSERДата: Суббота, 12.11.2011, 14:15 | Сообщение # 4
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Code

//Устанавливаем пин на выход
DDRB.3=1;
//Сбрасываем счетчик таймера
TCNT1H=0;
TCNT1L=0;
//Настраиваем шим на частоту 50Hz
//500000/50-1=9999=0x270f
ICR1H=0x27;
ICR1L=0x0f;
//Скважность шим получается 0-9999 (0-100%)
//Период у нас 20ms
//20/10000=0.002
//скважность 0.9ms, 0.9/0.002-1=449
//скважность 1.5ms, 0.9/0.002-1=749
//скважность 2.1ms, 0.9/0.002-1=1049
//устанавливаем 1.5ms, 749=0x02ed
OCR1AH=2;
OCR1AL=0xed;
//Запускаем таймер с делителем 2
//При частоте МК 4MHz, частота таймера 500KHz
//Ставим режим Fast PWM top = ICR
//Выход OC1A, не инверсный
TCCR1A=0x82;
TCCR1B=0x1a;
 
rrjcnzДата: Суббота, 12.11.2011, 19:14 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Получилось :). Спасибо.

Добавлено (12.11.2011, 19:14)
---------------------------------------------
Получилась вот такая программа
Code

#include <tiny2313.h>

void main(void)
{

// Port A initialization
// Func2=In Func1=In Func0=In   
// State2=P State1=P State0=P   
PORTA=0x07;
DDRA=0x00;

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

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

TCNT1H=0;   
TCNT1L=0;

TCCR1A=0x82;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x27;   
ICR1L=0x0f;
OCR1AH=2;   
OCR1AL=0xed;    
OCR1BH=0x00;
OCR1BL=0x00;

while (1)
    {
        // Place your code here
        if(PIND.0==0) //кайнее левое положение
        {
        OCR1AH=1;   
        OCR1AL=0xc1;
        }    
                
        if(PIND.1==0) //среднее положение
        {
        OCR1AH=2;   
        OCR1AL=0xed;
        }       
          
        if(PIND.2==0) //крайнее правое положение
        {
        OCR1AH=4;   
        OCR1AL=19;
        }
    }
}

сейчас у сервопривода только 3 положения : крайнее левое, среднее и крайнее правое. а мне нужно что б при включении сервопривод становился в среднее положение (сейчас он так и делает) и при нажатии кнопки "в право" сервопривод сдвигался не в крайнее правое положение а сдвигался на небольшой угол в право, при следующем нажатии на эту кнопку сервопривод двигался ещё правее и так далее до крайнего положения то-есть скважность должна меняться 1.5=>1.6=>1.7=>...=>2.1(чем меньше шаг тем лучше). аналогично и в лево.


Сообщение отредактировал rrjcnz - Воскресенье, 13.11.2011, 00:35
 
HiSERДата: Воскресенье, 13.11.2011, 04:54 | Сообщение # 6
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Перед тем как пробовать мой код ты его изучал? или просто скопировал и все?
В комментариях есть расчеты...


Сообщение отредактировал HiSER - Воскресенье, 13.11.2011, 04:56
 
rrjcnzДата: Воскресенье, 13.11.2011, 21:57 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Кажется получилось. Так должно быть?
Code

#include <tiny2313.h>
#include <delay.h>

// Declare your global variables here

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In  
// State2=P State1=P State0=P  
PORTA=0x07;
DDRA=0x00;

// Port B 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  
PORTB=0x00;
DDRB=0xFF;

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 500,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// 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=0xA2;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x27;
ICR1L=0x0F;
OCR1AH=0x02;
OCR1AL=0xED;
OCR1BH=0x02;
OCR1BL=0xED;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

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

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

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

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

while (1)
  {
       if(PIND.0==0&OCR1A>449)
       {
       OCR1A--;
       delay_ms(10);
       }  
        
        if(PIND.1==0)
       {
       OCR1A=749;
       }
        
        if(PIND.2==0&OCR1A<1049)
       {
       OCR1A++;  
       delay_ms(10);
       }    
        
        
        if(PIND.3==0&OCR1B>449)
       {
       OCR1B--;
       delay_ms(10);
       }  
        
        if(PIND.4==0)
       {
       OCR1B=749;
       }
        
        if(PIND.5==0&OCR1B<1049)
       {
       OCR1B++;  
       delay_ms(10);
       }
  }     
}


Здесь у меня управление двумя сервоприводами. И ещё созрел такой вопрос можно ли в этой же программе (на этой же микросхеме) сделать такую штуку, которая будет определять скважность входящего сигнала (сигнал такой же как и на управлении сервоприводами)?
 
HiSERДата: Воскресенье, 13.11.2011, 23:22 | Сообщение # 8
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Надо будет чем-то измерять период, а первый таймер уже занят. Можно попробовать на нулевом.

Сообщение отредактировал HiSER - Воскресенье, 13.11.2011, 23:23
 
rrjcnzДата: Понедельник, 14.11.2011, 16:15 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
А как он измеряется? По какому принципу? У меня была идея сделать нулевой таймер с периодом одна (или 10) микросекунда и просто считать сколько периодов пройдёт от начала до конца положительного сигнала.

Сообщение отредактировал rrjcnz - Понедельник, 14.11.2011, 16:19
 
HiSERДата: Понедельник, 14.11.2011, 19:02 | Сообщение # 10
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Можно сначала измерить частоту сигнала, а потом мерить скважность.
 
rrjcnzДата: Вторник, 15.11.2011, 17:47 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
А можете помочь с реализацией этого всего? Было бы не плохо если бы на нулевом таймере. Но и от объяснения на первом таймере или на каком-то другом МК не откажусь.
 
HiSERДата: Среда, 16.11.2011, 00:43 | Сообщение # 12
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Времени сейчас нет.
И на сайте есть пример частотомера.


Сообщение отредактировал HiSER - Среда, 16.11.2011, 00:44
 
Форум » Микроконтроллеры » Вопросы по МК » помогите создать сигнал
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz