roboforum.ru

Технический форум по робототехнике.

 

ZX-DCM2 от куда подать ШИМ?

Резисторы, транзисторы, конденсаторы, микросборки, чип компоненты ...
Вопросы согласования управляющих модулей с периферией.

ZX-DCM2 от куда подать ШИМ?

Сообщение NorthStar » 13 сен 2010, 13:08

Добрый день!
У меня есть комплект 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, памятью и кучей счетчиков у меня пока ума не хватает.
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

Re: ZX-DCM2 от куда подать ШИМ?

Сообщение Radist » 13 сен 2010, 20:41

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

Re: ZX-DCM2 от куда подать ШИМ?

Сообщение NorthStar » 13 сен 2010, 21:49

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

Re: ZX-DCM2 от куда подать ШИМ?

Сообщение Angel71 » 13 сен 2010, 22:29

Аватара пользователя
Angel71
 
Сообщения: 9231
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: ZX-DCM2 от куда подать ШИМ?

Сообщение NorthStar » 14 сен 2010, 22:31

В итоге я родил вот такой код (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 подавать.
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47


Вернуться в Электроника, электротехника

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

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

Mail.ru counter