roboforum.ruТехнический форум по робототехнике. |
|
|
/*
таймер запущен на переполнение 0,05 мс (50 мкс)
*/
// считаем скоко прошло 1 мс = 20 * ms (20 позиций сервы)
// стартуем текущую серву
if(ms_servo == 0)
output_high(port_servo[cur_servo]);
ms_servo++; //сколько времени она проработала
if(ms_servo == 20 + pos_servo[cur_servo]) // если 1 мс (20 раз таймер сработал) + позиция выключаем
output_low(port_servo[cur_servo]);
if(ms_servo == INTERVAL) // ждем до ms * 0.05 = 2 мс (2000 мкс) и переключаемся на след серву
{
output_low(port_servo[cur_servo]); //выключаем, вдур раньне невыключилась
cur_servo ++;
ms_servo = 0;
if(cur_servo > 9) // 10 серв раз должно прокрутится NUM_SERV -1
cur_servo = 0;
}
// считаем скоко прошло 1 мс = 20 * ms (20 позиций сервы)
// стартуем текущую серву
if(ms_servo1 == 0)
output_high(port_servo[cur_servo1]);
ms_servo1++; //сколько времени она проработала
if(ms_servo1 == 20 + pos_servo[cur_servo1]) // если 1 мс (20 раз таймер сработал) + позиция выключаем
output_low(port_servo[cur_servo1]);
if(ms_servo1 == INTERVAL) // ждем до ms * 0.05 = 2 мс (2000 мкс) и переключаемся на след серву
{
output_low(port_servo[cur_servo1]); //выключаем, вдур раньне невыключилась
cur_servo1 ++;
ms_servo1 = 0;
if(cur_servo1 > 19) // 10 серв раз должно прокрутится NUM_SERV -1
cur_servo1 = 10;
}
#int_timer2
void isr_timer2(void)
{
// вырубаем по прошествию нужного времени (0 - 1мс + 1мс = от 1 до 2 мс)
output_low(port_servo[prev_serv]);
disable_interrupts(INT_TIMER2);
prev_serv = cur_servo;
cur_servo ++; // следующая серва 2 1
if(cur_servo > NUM_SERV-1)
cur_servo = 0;
}
// общее время сервы, настроено на 1 мс
#int_timer0
void isr_timer0(void)
{
set_timer0(START_TIMER0);
//стартуем новую серву раз в 1 мс 1
output_high(port_servo[cur_servo]);
// когда наступила следующая серва надо запустить остановку предыдущей во втором таймере
// во втором таймере отключаем по позиции
clear_interrupt(INT_TIMER2);
setup_timer_2(T2_DIV_BY_4, pos_servo[prev_serv], 5);
set_timer2(0);
enable_interrupts(INT_TIMER2);
}
T1OVF
{
if(++cnt>100) // точность - 100 положений
{
cnt=0;
перестраиваем таймер на медленный счет (большой делитель) и устанавливаем подходящее TCNT чтобы он сработал через 18мс
}
else
{
перестраиваем таймер на быстрый счет (цикл вызова 2мс/100 положений = 20 мкс)
if(cnt=1) // точность - 100 положений
{
cnt=0;
Srv1=1; // подаем сигнал на сервы
Srv2=1;
...
SrvN=1;
}
if(Srv1Pos<cnt) Srv1=0;
if(Srv2Pos<cnt) Srv2=0;
...
if(SrvNPos<cnt) SrvN=0;
}
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2