Технический форум по робототехнике.
Korbofos » 20 сен 2011, 09:19
Не могу разобраться в чём проблема
Взял код (из робовики) управления сервами при помощи 4017 счётчика
- Код: Выделить всё • Развернуть
uint16_t servo_position[9] = {3000 //для среднего положения
volatile uint32_t i;
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
static uint8_t current_servo = 1;
static uint16_t pause = 40000;
TCCR1A |= _BV(FOC1A);
if (current_servo == 9) {
current_servo = 0;
OCR1A += pause;
pause = 40000;
} else {
OCR1A += servo_position[current_servo];
pause -= servo_position[current_servo];
current_servo++;
}
}
Переделал все значения под частоту 7.3728
в итоге получилось
- Код: Выделить всё • Развернуть
interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static char current_servo=1;
static unsigned int pause = 18432;
TCCR3C|=(1<<FOC3C);
if (current_servo == 9)
{
current_servo = 0;
OCR3C += pause;
pause = 18432;
}
else
{
OCR3C+=servo_position[current_servo];
pause -= servo_position[current_servo];
current_servo++;
}
}
servo_position[9]={1382 //среднее положение
Пред делитель счётчика на 8
Серва работает некорректно дергается сдвигается в сторону при заданном среднем
положении
Подскажите где ошибка?
avr123.nm.ru » 20 сен 2011, 09:55
Форму и время сигналов посмотрите в PROTEUS или осцилом
Korbofos » 20 сен 2011, 11:07
Протеус кажет.
Но как так (1<<FOC3C) бит принудительного сброса?
Добавлено спустя 2 минуты 1 секунду:
Может посмотреть в железе осцилупой? Но чё то боюсь своими кривыми руками лезть...
- Вложения
-
- pr.JPG (15.06 КиБ) Просмотров: 2707
avr123.nm.ru » 20 сен 2011, 13:03
Вот длинющий импульс похоже и колбасит вашу серву.
переключите осцил PROTEUS в режим DC пост. ток и покрупней покажите цену деления по времени укажите.
Korbofos » 20 сен 2011, 14:31
Счётчик неправильно считает?
- Код: Выделить всё • Развернуть
#define OCR3C (*(unsigned int *) 0x82) //прописал сам как 16 битовую переменную может //здесь косяк?
//файл mega128.h
#define OCR3CL (*(unsigned char *) 0x82)
#define OCR3CH (*(unsigned char *) 0x83)
//--------------------------------
TCCR3C|=(1<<FOC3C);
if (current_servo == 9)
{
current_servo = 0;
OCR3C += pause;
pause = 18432;
}
else
{
OCR3C+=servo_position[current_servo];
pause -= servo_position[current_servo];
current_servo++;
}
проект выложить?
- Вложения
-
avr123.nm.ru » 20 сен 2011, 14:47
Давно пора. Вам нужны импульсы шириной 1500 мкС каждые 20000 мкС а у вас меандр похоже. Время примерное.
Korbofos » 20 сен 2011, 14:56
Вот оно.
- Вложения
-
- ADC.rar
- (127.82 КиБ) Скачиваний: 0
avr123.nm.ru » 20 сен 2011, 14:59
А где у вас 4017 ?
добавил 4017 - servo импульсы стали нормальные, но все слишком долго даже при 8 МГц такта.
- Вложения
-
- servo_avr_hc4017.rar
- (253.53 КиБ) Скачиваний: 0
-
Korbofos » 20 сен 2011, 15:22
Дк выходящий сигнал с мк уже не тот.
Добавлено спустя 1 минуту 27 секунд:avr123.nm.ru писал(а):А где у вас 4017 ?
добавил 4017 - servo импульсы стали нормальные, но все слишком долго даже при 8 МГц такта.
Пересчитать?
Добавлено спустя 9 минут 31 секунду:Почему 1 на выходе сразу не сбрасывается(обведено кружком)?
TCCR3C|=(1<<FOC3C); Этот бит в прерывании сразу должен сбрасывать 1 в 0.
- Вложения
-
-
Korbofos » 20 сен 2011, 20:01
Почему то не срабатывает сброс ножки в 0??????
- Код: Выделить всё • Развернуть
TCCR3C|=(1<<FOC3C);
ALHIMIK » 20 сен 2011, 20:31
потому что CVAVR
сам с таким сталкивался , решение которое нашел - дёргать лапки программно
avr123.nm.ru » 20 сен 2011, 20:37
Korbofos писал(а):Почему то не срабатывает сброс ножки в 0??????
- Код: Выделить всё • Развернуть
TCCR3C|=(1<<FOC3C);
Дак в PROTEUS разверните АСМ подстрочник под Си кодом и посмотрите почему.
Korbofos » 20 сен 2011, 21:06
Asm я незнаю
avr123.nm.ru » 20 сен 2011, 21:08
Значит снова выкладывайте прожект.
Korbofos » 20 сен 2011, 21:11
Вот.
- Вложения
-
- ADC.rar
- (129.94 КиБ) Скачиваний: 0