23.09.2012, 02:28
|
|
Прохожий
Регистрация: 13.08.2012
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Как управлять рулевой сервомашинкй
Всем привет ..
Хочу разобраться с рулевой сервомашинкой, только незнаю как программно реализовать управляющий сигнал (этот который подаэться на управляющий вход сервомашинкы)
я знаю какой должен быть сигнал, а вот как его программно написать незнаю как.. (
Для написания программы пользуюсь CodeVisionAVR V2.05.0, микроконтроллер ATMega16..
Можете просто бросить кусок кода с рус коментариями, или просто объяснить как ее написать ...
|
|
|
|
23.09.2012, 04:11
|
|
Прохожий
Регистрация: 28.08.2012
Адрес: Москва
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: как управлять рулевой сервомашинкй
Очень распространённый вопрос. Гугл на запрос "ATMega PWM servo source" выдал, например, следующее:
с http://extremeelectronics.co.in/avr-...crocontroller/
/************************************************** ****************************
Program to demonstrate the use servo motors with AVR Microcontrollers.
For More Details Visit: http://www.eXtremeElectronics.co.in
Copyright (c) 2008-2010
eXtreme Electronics, India
Servo Motor: Futaba s3003
Servo Control PIN (white): To OC1A PIN
Crystal: 16MHz
LOW Fuse: 0xFF
HIGH Fuse: 0xC9
Compiler:avr-gcc toolchain
Project Manager/IDE: AVR Studio
NOTICE
--------
NO PART OF THIS WORK CAN BE COPIED, DISTRIBUTED OR PUBLISHED WITHOUT A
WRITTEN PERMISSION FROM EXTREME ELECTRONICS INDIA. THE LIBRARY, NOR ANY PART
OF IT CAN BE USED IN COMMERCIAL APPLICATIONS. IT IS INTENDED TO BE USED FOR
HOBBY, LEARNING AND EDUCATIONAL PURPOSE ONLY. IF YOU WANT TO USE THEM IN
COMMERCIAL APPLICATION PLEASE WRITE TO THE AUTHOR.
WRITTEN BY:
AVINASH GUPTA
me@avinashgupta.com
************************************************** *****************************/
#include ‹avr/io.h›
#include ‹util/delay.h›
//Simple Wait Function
void Wait()
{
uint8_t i;
for(i=0;i‹50;i++)
{
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
}
}
void main()
{
//Configure TIMER1
TCCR1A|=(1‹‹COM1A1)|(1‹‹COM1B1)|(1‹‹WGM11); //NON Inverted PWM
TCCR1B|=(1‹‹WGM13)|(1‹‹WGM12)|(1‹‹CS11)|(1‹‹CS10); //PRESCALER=64 MODE 14(FAST PWM)
ICR1=4999; //fPWM=50Hz (Period = 20ms Standard).
DDRD|=(1‹‹PD4)|(1‹‹PD5); //PWM Pins as Out
while(1)
{
OCR1A=97; //0 degree
Wait();
OCR1A=316; //90 degree
Wait();
OCR1A=425; //135 degree
Wait();
OCR1A=535; //180 degree
Wait();
}
}
|
|
|
|
23.09.2012, 04:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: как управлять рулевой сервомашинкй
Сообщение от Андрей1
|
просто бросить кусок кода с рус коментариями, или просто объяснить как ее написать
|
Сообщение от Андрей1
|
бросить кусок кода с рус коментариями, или просто объяснить как ее написать
|
Слишком сложная задача для этого форума.
1. Трудно подобрать именно с русскими каментами (английский не пройдет?)
2. Объяснять просто о сложном, не зная на каком уровне слушатель - пустая затея.
3. Есть спец. форумы по этой тематике. Здесь помогут кратко и емко - ШИМ. Но ведь пойдут другие вопросы, не так ли?
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 23.09.2012 в 04:19.
|
|
|
|
23.09.2012, 19:26
|
|
Прохожий
Регистрация: 13.08.2012
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: как управлять рулевой сервомашинкй
а как мне сделать ШМИ с помощью автоматического генератора в CVAVR?
|
|
|
|
23.09.2012, 20:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: как управлять рулевой сервомашинкй
Сообщение от Андрей1
|
а как мне сделать ШМИ с помощью автоматического генератора в CVAVR?
|
Волшебные слова Буратины на поле Чудес. В стране, ну, в общем, там...
"Крэкс-Пэкс-ШМИкс!"
"Учиться, учиться и еще раз учиться!" (С) ВИЛ
Начните с изучения возможностей примененного (того, что вы решили использовать, или он вас..) МК. В нем есть много интересного, вовнутрях.
Целый мир откроете. Мир таймеров, мир тактов, мир регистров. Сделав из них смесь по своему вкусу можно получить и ШМИ.
Вы хоть что-то знаете? Что-то уже где-то читали?
Или вы считаете, что ряды Фурье запросто в первом класе 3-го сентября можно?..
Извините, но на эту тему, да еще и с AVR стооолько информации везде.
Подбирайте под свой уровень сами. Нам он неизвестен. Впрочем, приблизительно ясно..
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 23.09.2012 в 22:38.
|
|
|
|
23.09.2012, 21:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,069
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: как управлять рулевой сервомашинкй
Сообщение от Андрей1
|
а как мне сделать ШМИ с помощью автоматического генератора в CVAVR?
|
Накл икать.
|
|
|
|
28.09.2012, 16:59
|
|
Частый гость
Регистрация: 04.09.2005
Сообщений: 19
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как управлять рулевой сервомашинкй
Насчет PPM. Имею бесколлекторный двигатель, тот, что используется в моделях. Контроллер двигателя управляется именно PPM. Нужно было его включить. Реализовал на Tiny13. Тактировала сама себя 9,6 МГц. 3 кнопки - стоп, средние обороты, максимальные обороты. Импульсы формировались в прерывании таймера. Функций больше никаких не требовалось - тупо включала-выключала двигатель.
Прерывание таймера:
Код:
|
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0 = 241;
if (f)
{
if (c==a)
{
c=0;
f=!f;
}
}
else
{
if (c==(200-a))
{
c=0;
f=!f;
}
}
PORTB.0=f;
c++;
} |
Основной цикл:
Код:
|
void main(void)
{
CLKPR=0x80;
CLKPR=0x00;
PORTB=0x00;
DDRB=0x01;
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK0=0x02;
#asm("sei")
a=11;
if (PINB.1==0) a=11;
if (PINB.2==0) a=15;
if (PINB.3==0) a=18;
while (1)
{
if (PINB.1==0) a=11;
if (PINB.2==0) a=15;
if (PINB.3==0) a=20;
}
} |
Да, еще...
Код:
|
unsigned int a;
unsigned int c;
bit f; |
__________________
Фарш невозможно провернуть назад,
И мясо из котлет не восстановишь...
|
|
|
|
30.09.2012, 20:10
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Как управлять рулевой сервомашинкй
Сообщение от Barmaley13
|
Прерывание таймера:
Код:
|
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0 = 241;
if (f)
{
if (c==a) с=0;
}
else
{
if (c==(200-a)) c=0;
}
f=!f;
PORTB.0=f;
c++;
}
Основной цикл:
f=1;
while (1)
{
if (PINB.1==0) a=11;
if (PINB.2==0) a=15;
if (PINB.3==0) a=20;
} |
|
В основном цикле надо бы защититься от смены переменной а при любом значении переменной с. Например, при значении (200-а)=189, если значение с станет равным 181, 182,..,188, а переменная а в это время сменится с 11 на 20, то тогда значение (200-а) будет меньше текущего значения с, так что период f=1 будет длиться 65535. Ну и значение f хорошо бы определить перед входом в main на всякий пожарный.
А прерывание можно сделать попроще
Код:
|
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=241;
c++;
if(c==a) PORTB.0=0;
if(c==199)
{
c=0;
PORTB.0=1;
}
} |
Последний раз редактировалось =GM=; 30.09.2012 в 20:17.
|
|
|
|
01.10.2012, 12:48
|
|
Частый гость
Регистрация: 04.09.2005
Сообщений: 19
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как управлять рулевой сервомашинкй
Согласен! Я выложил весь свой код. У меня просто стояла задача включить и выключить мотор... А для более серьезной задачи проверки необходимы.
__________________
Фарш невозможно провернуть назад,
И мясо из котлет не восстановишь...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:08.
|
|