Atmega48, Сервопривод постоянно вертится.

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

Здравствуйте. Изучаю аппаратную ШИМ в микроконтроллерах Atmega и на примере Atmega48 решил попробовать поуправлять сервоприводом SG90. Этикетки на серве нет, но по виду похоже, что это именно этот привод. Нагуглил, что данная серва управляется ШИМом длительностью от 500 мкс до 2100 мкс и периодом 20 мс. Все подключил, покурил даташит к атмеге 48, написал вот такой код:

Код: Выделить всё

#define F_CPU 8000000UL // 8 Mhz

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    PORTB = 0;
    DDRB = (1 << PB1);

    TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
    TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);

    TCNT1 = 0;
    ICR1 = (uint16_t)(20000.0 / ((64.0 / F_CPU) * 1000000.0)); // 20ms PWM period
    OCR1A = 0;

    for (;;)
    {
        OCR1A = 63; // 504 mcs
        _delay_ms(1000);
        OCR1A = 163; // 1304 mcs
        _delay_ms(1000);
        OCR1A = 262; // 2094 mcs
        _delay_ms(1000);
    }
}
а в итоге - серва сначала достаточно быстро крутится в одну сторону, через секунду с такой же скоростью в другую сторону, а затем снова реверс, но уже с пониженной скоростью.

Фьюз биты выставил такие: (E:FF, H:DF, L:E2). От дефолта отличаются тем, что выключен бит делителя тактовой частоты на 8. То есть, если я правильно понимаю, микроконтроллер работает от внутреннего генератора с частотой 8 МГц.

Сверяясь с даташитом, я попытался установить таймер в режим Fast PWM, таймер должен тикать до значения ICR1. Предделитель 64. Подскажите, пожалуйста, что я неправильно понимаю и почему серва не поворачивается в заданную позицию и не останавливается.

Спасибо!
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Попробовал Ваш код в протеусе. Все работает. Ширина импульса управления обычно от 1мс до 2мс. Так что попробуйте убрать 0.5мс из кода. Обязательно проверьте питание, серва потребляет относительно большой ток, особенно пусковой. Возможно все дело в питании или схеме.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3180983#p3180983"]Попробовал Ваш код в протеусе. Все работает. Ширина импульса управления обычно от 1мс до 2мс. Так что попробуйте убрать 0.5мс из кода. Обязательно проверьте питание, серва потребляет относительно большой ток, особенно пусковой. Возможно все дело в питании или схеме.[/uquote]

Запитываю от источника 5 вольт, 700 мА может выдать тока. Серва и атмега, соответственно, запитываются параллельно от одного источника, больше ничего, ни резисторов, ничего, тупо провода. Прогу скомпилил с ключом оптимизации -Os. Убрал 504 микросекунды, один хрен, теперь сначала быстро вертится в одну сторону, потом помедленнее в другую, и так циклично. Не понимаю, в чем проблема
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Не понимаю, в чем проблема
Может в серве?
Осцилл есть? С ним было бы все намного проще.

Существуют сервы многооборотные, может у Вас такая?

Добавлено after 1 minute 33 seconds:
Сделайте паузы не секунда, а 10 например. Поглядите разницу.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 43960
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

[uquote="G-VIRUS",url="/forum/viewtopic.php?p=3180966#p3180966"]а в итоге - серва сначала достаточно быстро крутится в одну сторону, через секунду с такой же скоростью в другую сторону, а затем снова реверс, но уже с пониженной скоростью.[/uquote]
Нормальная серва крутится всего чуть больше, чем на 90 градусов в одну или в другую сторону от "среднего" положения.. По вашему описанию- впечатление такое, что у вас серва крутится "вкруговую", если это так, то у вас, либо серва НЕ ТАКАЯ, либо она у вас неисправна, например, шестерня привода резистора не крутит сам резистор.
http://akizukidenshi.com/download/ds/towerpro/SG90.pdf
Реклама
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3181066#p3181066"]
Не понимаю, в чем проблема
Существуют сервы многооборотные, может у Вас такая?[/uquote]

Не могу сказать. А как бы ее поведение отличалось от обычной? Просто я вот поменял задержку на 10 секунд и она теперь 10 секунд вертится в одну, 10 - в другую сторону. К сожалению, осциллографа нет :(
Вы можете подсказать какую-нибудь конкретную модель сервопривода, на котором можно было бы сделать тест? А то может и правда проблема в серве этой

Добавлено after 2 minutes 56 seconds:
[uquote="АлександрЛ",url="/forum/viewtopic.php?p=3181088#p3181088"][uquote="G-VIRUS",url="/forum/viewtopic.php?p=3180966#p3180966"]а в итоге - серва сначала достаточно быстро крутится в одну сторону, через секунду с такой же скоростью в другую сторону, а затем снова реверс, но уже с пониженной скоростью.[/uquote]
Нормальная серва крутится всего чуть больше, чем на 90 градусов в одну или в другую сторону от "среднего" положения.. По вашему описанию- впечатление такое, что у вас серва крутится "вкруговую", если это так, то у вас, либо серва НЕ ТАКАЯ, либо она у вас неисправна, например, шестерня привода резистора не крутит сам резистор.
http://akizukidenshi.com/download/ds/towerpro/SG90.pdf[/uquote]

Да, именно так и делает - крутится, как обычный моторчик, ШИМом почему-то регулируется только скорость и направление. А по внешнему виду прям копия этой, что вы показали
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

АлександрЛ писал(а):Нормальная серва крутится всего чуть больше, чем на 90 градусов
Бывают на большие углы и многооборотные.

G-VIRUS, серву то откуда взяли? Я в инете видел переделки сервы, по сути превращающую ее в мотор-редуктор. Попробуйте скорректировать код. Сделайте чтобы скважность ШИМ плавно менялась от 1 до 2 мс. Возможно найдете нулевое положение, т.е. при котором "серва" не крутится и чем дальше от нее тем быстрее крутится.

Добавлено after 3 minutes 17 seconds:
Разберите серву. Возможно спилен ограничитель на шестеренке и отключен потенциометр обратной связи.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3181099#p3181099"]
АлександрЛ писал(а):Нормальная серва крутится всего чуть больше, чем на 90 градусов
Бывают на большие углы и многооборотные.

G-VIRUS, серву то откуда взяли? Я в инете видел переделки сервы, по сути превращающую ее в мотор-редуктор. Попробуйте скорректировать код. Сделайте чтобы скважность ШИМ плавно менялась от 1 до 2 мс. Возможно найдете нулевое положение, т.е. при котором "серва" не крутится и чем дальше от нее тем быстрее крутится.

Добавлено after 3 minutes 17 seconds:
Разберите серву. Возможно спилен ограничитель на шестеренке и отключен потенциометр обратной связи.[/uquote]

Давно покупал где-то, даже не помню, валялась с тех пор. Но я с ней ничего не делал, должна быть обычной, без модификаций. Сделал плавное изменение скважности, от сильного вращения к слабому, потом не крутится примерно на 1496 микросекундах, потом делается реверс и ускоряется вращение.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ну может такие есть без переделок.

Разберите. Поглядите что внутри, особенно обратите внимание на потенциометр. Может механический ограничитель есть не во всех, а потенциометр почему-то не крутится.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3181111#p3181111"]Ну может такие есть без переделок.

Разберите. Поглядите что внутри, особенно обратите внимание на потенциометр. Может механический ограничитель есть не во всех, а потенциометр почему-то не крутится.[/uquote]

Хорошо, спасибо, завтра попробую разобрать. Отпишусь здесь о результатах.
Друг Кота
Аватара пользователя
Сообщения: 43960
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

[uquote="G-VIRUS",url="/forum/viewtopic.php?p=3181110#p3181110"]Давно покупал где-то, даже не помню, валялась с тех пор. Но я с ней ничего не делал, должна быть обычной, без модификаций. Сделал плавное изменение скважности, от сильного вращения к слабому, потом не крутится примерно на 1496 микросекундах, потом делается реверс и ускоряется вращение.[/uquote]Либо серва переделана, либо такая была изначально- что- то типа "мотор- редуктора" - а 1,5 ms это "нейтраль" - когда НОРМАЛЬНАЯ серва встаёт в среднее положение
Родился
Сообщения: 9
Зарегистрирован: Ср мар 30, 2011 18:55:28

Сообщение G-VIRUS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3181111#p3181111"]Ну может такие есть без переделок.

Разберите. Поглядите что внутри, особенно обратите внимание на потенциометр. Может механический ограничитель есть не во всех, а потенциометр почему-то не крутится.[/uquote]

В общем, видимо, была проблема в сервоприводе, я воткнул другую, и она работает так, как нужно. Эту разобрал, в ней просто моторчик, шестерни и микроконтроллер маленький. И по идее все. Ну, в общем, я все понял, всем спасибо, тема закрыта.
Ответить

Вернуться в «AVR»