roboforum.ru

Технический форум по робототехнике.
Текущее время: 27 ноя 2024, 10:19

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: ZX-DCM2 от куда подать ШИМ?
СообщениеДобавлено: 13 сен 2010, 13:08 
Не в сети

Зарегистрирован: 13 сен 2010, 12:47
Сообщения: 317
Добрый день!
У меня есть комплект Robopica от IE. Хочу расширить его функции и добавить еще + 4 мотора (2 есть, всего 6). Для этого купил ZX-DCM2 (пока один - на пробу) и разобравшить понял, что вывода ШИМ на PIC-е только 2 и оба они заняты. Выводы свободные для управления есть, а вот где еще 4 источника ШИМ взять?
Может кто-то уже решал эту проблему? Можно взять еще один микроконтроллер, но тут уже проще всю игрушку переделать и посадить на PROPELLER например. Там 16 шим генераторов.
Думаю попробовать вот такую плату купить ZX-SERVO16U - она управляет сервами и генерирует ШИМ. НО как я понял из описания - она рулит только в диапазоне от 0 до 180', те шим произвольной формы создать не получится. Сейчас на ROBOPICе моторчики управляются вот так:
Pwm1_Init(5000);
Pwm2_Init(5000);
Pwm1_Change_Duty(speed);
Pwm2_Change_Duty(speed);
Pwm1_Start();
Pwm2_Start();
Ну и направлением рулить можно.
Переменная speed как раз регулирует ШИМ по ширине от 0 до 255. Так как я бестолковый, то понять какие реально будут параметры сигнала (период, скважность и тп) я не могу.
Тот сигнал, который сервами управляет теоретически должен быть от 0,8 до 3 мкс 1 и 20 мкс 0.
Прошу помочь - соответствует ли ШИМ выдаваемый ZX-SERVO16U тому, который генерирует приведенный мною код?
И если нет, то посоветуйте другое не сложное решение (на одной микросхеме). Самому собрать схему с драйвером RS232, памятью и кучей счетчиков у меня пока ума не хватает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZX-DCM2 от куда подать ШИМ?
СообщениеДобавлено: 13 сен 2010, 20:41 
Не в сети
Аватара пользователя

Зарегистрирован: 01 июл 2009, 08:59
Сообщения: 2254
Откуда: Екатеринбург
прог. языки: асемблер AVR
Сделать еще 4 ШИМ можно программно. На пальцах объясняю алгоритм. Понадобится один таймер, который просто считает и прерывается по переполнению. Считать он будет тактовую частоту до 256. Программно расширяем таймер на 1 байт и делаем программно 4 таймера (задействуем 4 регистра). Еще 4 регистра будут регистрами программного ШИМ. Пусть нужен такой ШИМ: 20, 40, 60, 80. Эти числа лежат в регистрах ШИМ. При каждом прерывании от таймера инкрементируются счетные регистры. Пока они меньше регистров ШИМ - на соответствующих выводах 1, как станут больше - на ногах 0. Вот и все. Правда частота шим на 8 МГц будет 122 Гц. Чтоб ее поднять - после переполнения в таймер записывайте число побольше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZX-DCM2 от куда подать ШИМ?
СообщениеДобавлено: 13 сен 2010, 21:49 
Не в сети

Зарегистрирован: 13 сен 2010, 12:47
Сообщения: 317
Я вроде смысл понял. Только вот ASM я очень плохо знаю (микроконтроллерный - так вообще не знаю), а примеров на microC с прерыванием по таймеру пока не нашел. Так что с реализацией пока не очень. Но спасибо за наводку. Буду копать в этом направлении.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZX-DCM2 от куда подать ШИМ?
СообщениеДобавлено: 13 сен 2010, 22:29 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZX-DCM2 от куда подать ШИМ?
СообщениеДобавлено: 14 сен 2010, 22:31 
Не в сети

Зарегистрирован: 13 сен 2010, 12:47
Сообщения: 317
В итоге я родил вот такой код (microC):

volatile char cCounter; // Счетчик шагов ШИМ.
volatile char pwm_val;

void interrupt()
{

if (T0IF && T0IE)
{
INTCON.T0IF = 0;
cCounter++;
TMR0=200;


if (cCounter>200)
{
cCounter=0;
}
if (cCounter>pwm_val)
{
PORTB.F3=1;
PORTC.F1=1;
PORTC.F2=1;
} else
{
PORTB.F3=0;
PORTC.F1=0;
PORTC.F2=0;
}

}

}



void main()
{
INTCON.GIE=1;
INTCON.T0IE=1;

// Timer0 Registers:
// Prescaler=1:1; TMR0 Preset=251; Freq=1 000,00kHz; Period=1 000 ns
OPTION_REG.T0CS = 0;// bit 5 TMR0 Clock Source Select bit:0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
OPTION_REG.T0SE = 0;// bit 4 TMR0 Source Edge Select bit: 0=low/high / 1=high/low
OPTION_REG.PSA = 1;// bit 3 Prescaler Assignment bit: 0=Prescaler is assigned to the Timer0
OPTION_REG.PS2 = 0;// bits 2-0 PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 = 0;
OPTION_REG.PS0 = 0;
TMR0 = 200; // preset for timer register



TRISB.F3=0;
ANSELH.F0=0; // RB1 ==> Digital IO
ANSELH.F2=0; // RB2 ==> Digital IO
TRISB.F1=0; // Motor B 2A
TRISB.F2=0; // Motor B 2B
TRISD.F0=0; // Motor A 1A
TRISD.F1=0; // MOtor A 1B

TRISC.F1=0;
TRISC.F2=0;

cCounter=0;
PORTD.F0 =0;
PORTD.F1 =1;
PORTB.F1 =0;
PORTB.F2 =1;

while(1)
{
for (pwm_val=0;pwm_val<200;pwm_val++)
{
Delay_ms(25);
}
}
}

Я попробовал разные частоты, но судя по звуку моторчика в режиме перегрузки (не может крутиться) добитья такого же сигнала, как при первом варианте кода, не получилось. При использовании функций pwm звук похож на комариный писк, а у меня гудение. Те при Pwm1_Init(5000); Pwm1_Change_Duty(150); по ощущением частота выше. Я судя по калькулятору вообще больше чем по мегагерцу прерываюсь. Даже при таком раскладе основная программа сильно тормозит.
Подскажите - как частота влияет на работу мотора? Робот движится и регулируется даже когда диод (висит на PORTB.F3) мигает в видимом спектре. Может и этого достаточно?
Какой же всетаки сигнал получается при Pwm1_Init(5000); Pwm1_Change_Duty(150); и при Pwm1_Init(5000); Pwm1_Change_Duty(255); и чем мой отличается? У меня нет осцилографа, а то можно было просто померить.
В любом случае всем спасибо. Теперь можно хоть на все выводы PWM подавать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO