помогите создать сигнал
|
|
rrjcnz | Дата: Пятница, 11.11.2011, 17:02 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Offline
| Здравствуйте. помогите добиться сигнала для управления сервоприводом, желательно на attiny2313. Вот ссылка на информацию по серво приводу http://vtpablos.narod.ru/robots/servotester/
Сообщение отредактировал rrjcnz - Пятница, 11.11.2011, 17:03 |
|
| |
HiSER | Дата: Суббота, 12.11.2011, 00:43 | Сообщение # 2 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| В чем собственно вопрос?
|
|
| |
rrjcnz | Дата: Суббота, 12.11.2011, 01:48 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Offline
| Нужно управлять сервоприводом при помощи 3-х кнопок (в дальнейшем возможно будет прогамма добавляться и число приводов увеличиваться): первая сдвигает пошагово на несколько градусов в лево, вторая возвращает сервопривод в среднее положение, третья сдвигает пошагово на несколько градусов в право. Пытался что-то сделать при помощи таймеров и ШИМ-ов, но ничего не получилось. подскажите пожалуйста как это сделать. Я в этом деле новичок по этому если можно объясните по подробней.
|
|
| |
HiSER | Дата: Суббота, 12.11.2011, 14:15 | Сообщение # 4 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: 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
Статус: Offline
| Перед тем как пробовать мой код ты его изучал? или просто скопировал и все? В комментариях есть расчеты...
Сообщение отредактировал HiSER - Воскресенье, 13.11.2011, 04:56 |
|
| |
rrjcnz | Дата: Воскресенье, 13.11.2011, 21:57 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: 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
Статус: Offline
| Надо будет чем-то измерять период, а первый таймер уже занят. Можно попробовать на нулевом.
Сообщение отредактировал HiSER - Воскресенье, 13.11.2011, 23:23 |
|
| |
rrjcnz | Дата: Понедельник, 14.11.2011, 16:15 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Offline
| А как он измеряется? По какому принципу? У меня была идея сделать нулевой таймер с периодом одна (или 10) микросекунда и просто считать сколько периодов пройдёт от начала до конца положительного сигнала.
Сообщение отредактировал rrjcnz - Понедельник, 14.11.2011, 16:19 |
|
| |
HiSER | Дата: Понедельник, 14.11.2011, 19:02 | Сообщение # 10 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Можно сначала измерить частоту сигнала, а потом мерить скважность.
|
|
| |
rrjcnz | Дата: Вторник, 15.11.2011, 17:47 | Сообщение # 11 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Offline
| А можете помочь с реализацией этого всего? Было бы не плохо если бы на нулевом таймере. Но и от объяснения на первом таймере или на каком-то другом МК не откажусь.
|
|
| |
HiSER | Дата: Среда, 16.11.2011, 00:43 | Сообщение # 12 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Времени сейчас нет. И на сайте есть пример частотомера.
Сообщение отредактировал HiSER - Среда, 16.11.2011, 00:44 |
|
| |