Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Аппаратный ШИМ на ATtiny2313
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
bfrogg
Здравствуйте. Нужно сделать аппаратный ШИМ на Attiny2313. Немного почитал разные источники и вроде сделал 8-битный Fast PWM. Проверьте все ли правильно. Если да, то как мне сделать ФНЧ для этого ШИМа.

Вообще задача состоит в том, чтобы управлять скоростью моторчиков у "робота".

Код
   #define F_CPU 8000000UL  // указываем частоту в герцах
  
   #include <avr/io.h>
   #include <util/delay.h>

int main(void) // начало основной программы
{
  
   TCCR1A = (1<<COM1B1) | (1<<WGM10);
   TCCR1B = (1<<WGM12) | (1<<CS10);
   OCR1B = 50;
   DDRB |= (1<<PB4);
  
}
kovigor
Цитата(bfrogg @ Mar 5 2011, 19:31) *
Здравствуйте. Нужно сделать аппаратный ШИМ на Attiny2313. Немного почитал разные источники и вроде сделал 8-битный Fast PWM. Проверьте все ли правильно. Если да, то как мне сделать ФНЧ для этого ШИМа.

Вообще задача состоит в том, чтобы управлять скоростью моторчиков у "робота".


1. А кто ж его проверять-то будет, кроме вас ? Вы же не школьник, чтобы за вами задания домашние проверять. В железе работает ? Ну, тогда все в порядке ...
2. Читаем Трамперта, главу 4, там это подробно и обстоятельно расписано:

http://lord-n.narod.ru/walla.html

3. А что за моторчик ? Они ведь очень разные есть ...
ut1wpr
Цитата(bfrogg @ Mar 5 2011, 19:31) *
Здравствуйте. Нужно сделать аппаратный ШИМ на Attiny2313. Немного почитал разные источники и вроде сделал 8-битный Fast PWM. Проверьте все ли правильно. Если да, то как мне сделать ФНЧ для этого ШИМа.
Вообще задача состоит в том, чтобы управлять скоростью моторчиков у "робота".
Каких моторчиков? Их физика? STEP? BLDC? Иные?
bfrogg
1. Не хочется делать глупых ошибок в программной части, чтобы потом не думать не напаял ли я что нибудь криво. Пробовал симулировать в Протеусе, вроде работает, но ФНЧ никак не получается сделать - не хватает знаний. Вообще оправданно ли это, или инерция моторчика сама будет как интегратор?
2. Моторчики выдрал с игрушечных машинок, работали от двух пальчиковых батареек. Никаких опознавательных знаков нет. Наверное BLDC
3. В каком смысле физика моторчиков? Вообще какие параметры нужно указать?
4. ФНЧ идет по идее после драйвера двигателей L293D. Питание схемы робота 4.5 В. Моторчики крутятся слишком быстро, поэтому робот со своей задачей не справляется, вылетает с трека.
kovigor
Цитата(bfrogg @ Mar 5 2011, 20:03) *
1. Не хочется делать глупых ошибок в программной части, чтобы потом не думать не напаял ли я что нибудь криво. Пробовал симулировать в Протеусе, вроде работает, но ФНЧ никак не получается сделать - не хватает знаний. Вообще оправданно ли это, или инерция моторчика сама будет как интегратор?
2. Моторчики выдрал с игрушечных машинок, работали от двух пальчиковых батареек. Никаких опознавательных знаков нет. Наверное BLDC
3. В каком смысле физика моторчиков? Вообще какие параметры нужно указать?
4. ФНЧ идет по идее после драйвера двигателей L293D. Питание схемы робота 4.5 В. Моторчики крутятся слишком быстро, поэтому робот со своей задачей не справляется, вылетает с трека.


1. А придется. Иначе вы не научитесь. Протеус в помойку. Спаяйте макетку и вперед.
2. Два вывода ? Почти наверняка это обычный коллекторный двигатель. Материалов о том, как им управлять ШИМом, в сети предостаточно. BLDC - едва ли у вас BLDC. BLDC, например, ставят в авиамодели, но никак не в копеечные машинки.
3. Вам, похоже, редуктор нужен, а не ШИМ. Хотя если мощности хватит, то почему бы и нет ?
Smoky
Цитата(bfrogg @ Mar 5 2011, 21:03) *
Моторчики крутятся слишком быстро, поэтому робот со своей задачей не справляется, вылетает с трека.


Ну дык и регулируйте обороты моторчика значением регистра OCR1B.
314
Инерция движков сама по себе отличный ФНЧ.
bfrogg
Цитата(дымок @ Mar 5 2011, 19:13) *
Ну дык и регулируйте обороты моторчика значением регистра OCR1B.

Это я понимаю. Мне важно узнать, все ли будет работать.

Цитата(314 @ Mar 5 2011, 22:14) *
Инерция движков сама по себе отличный ФНЧ. Только схемку выходного каскада изобразите правильно, дабы выходной ключ ЭДСом самоиндукции якоря не выбивало.

Не понял насчет схемки выходного каскада. Что там можно неправильно изобразить?

И сразу вопрос относительно ФНЧ. Пусть в этом случае они не нужны. Сколько я не пытался смоделировать в протеусе этот фильтр, у меня все время все напряжение падало на резисторе. На лекциях давали, что для хорошего интегрирования, нужно чтобы постоянная времени цепи была много больше тау импульса. Время импульса 32 мс. Вообще какие номиналы резистора и конденсатора надо брать?

Цитата(kovigor @ Mar 5 2011, 19:10) *
3. Вам, похоже, редуктор нужен, а не ШИМ. Хотя если мощности хватит, то почему бы и нет ?

Редуктор есть кстати
314
Цитата
Не понял насчет схемки выходного каскада. Что там можно неправильно изобразить?

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

В Вашем случае RC-фильтр вообще не приемлем, если очень хочется, то ставьте LC фильтр, но можете попасть на колебания скорости в каких-то точках из-за резонансных эффектов, а может и нормально пройти. Реально лучше напрямую, без фильтров.
А если надумаете ставить RC-фильтр, то просто поставьте резистор последовательно с двигателем, даже без конденсатора, и подберите его номиналом требуемую скорость (почти шутка).
bfrogg
Цитата(314 @ Mar 5 2011, 22:38) *
В Вашем случае RC-фильтр вообще не приемлем, если очень хочется, то ставьте LC фильтр, но можете попасть на колебания скорости в каких-то точках из-за резонансных эффектов, а может и нормально пройти. Реально лучше напрямую, без фильтров.
А если надумаете ставить RC-фильтр, то просто поставьте резистор последовательно с двигателем, даже без конденсатора, и подберите его номиналом требуемую скорость (почти шутка).

Мне уже не хочется ставить сюда фильтры. Уже понял. Просто хочется узнать, что я делал неправильно и какие номиналы нужно брать.
314
Не зная что Вы конкретно делали, схемы, которую Вы собрали, и что конкретно у Вас не получилось невозможно сказать что Вы делали неправильно и какие номиналы неизвестно чего надо брать.
=GM=
Настройки у вас правильные, возможно, в дальнейшем придётся подобрать частоту шим. И надо бы после настроек поставить какой-нибудь цикл, иначе непонятно, что делает программа.

Смело подключайте OCR1B к входу первого полумоста и выбор направления ко входу второго полумоста.
bfrogg
Цитата(=GM= @ Mar 6 2011, 00:34) *
Настройки у вас правильные, возможно, в дальнейшем придётся подобрать частоту шим. И надо бы после настроек поставить какой-нибудь цикл, иначе непонятно, что делает программа.

Смело подключайте OCR1B к входу первого полумоста и выбор направления ко входу второго полумоста.

Подбирать частоту ШИМ или его скважность?

Второе не понял
314
Второе зависит от того, какую Вы собрали схему, с реверсом или без, с тормозом или без и т.д. и т.п. Теперь каждый преставляет Вашу схему в силу своей фантазии, но фантазии разных людей обычно не совпадают...
=GM=
Цитата(bfrogg @ Mar 6 2011, 07:37) *
Подбирать частоту ШИМ или его скважность?

Скажность у вас - это, грубо говоря, педаль газа, т.е. скорость движения вашего робота. МК должен более-менее плавно нажимать на эту "педаль". Частота шим у вас порядка 8000/256=31 кГц. Если всё нормально работает, не искрит, не шумит в эфире, не греется, нормальный кпд, то и делать ничего не надо.

Покажите схему вашего устройства от МК до двигла.
777777
Цитата(314 @ Mar 5 2011, 22:14) *
Инерция движков сама по себе отличный ФНЧ.

Только не забывайе про диод параллельно двигателю через который будет течь ток в те моменты когда транзистор закрыт.
=GM=
У товарища стоит готовый мост, даже два - L293D, никакого диода параллельно двигателю ставить не надо, при реверсе диод благополучно сгорит. В L293D стоят встроенные диоды параллельно каждому ключу.
bfrogg
Код
   #define F_CPU 8000000UL  // указываем частоту в герцах
  
   #include <avr/io.h>
   #include <util/delay.h>

int main(void) // начало основной программы
{
           while (1) {  // Бесконечный цикл

        // ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА

        if (!(PIND & _BV(PD1))) // проверить "0" на линии 1 порта D
        {
            TCCR1A = (1<<COM1B1) | (1<<WGM10);
         TCCR1B = (1<<WGM12) | (1<<CS10);
         OCR1B = 100;
         DDRB |= (1<<PB4);
        }
        else
        {
         TCCR1A = (1<<COM1A1) | (1<<WGM10);
         TCCR1B = (1<<WGM12) | (1<<CS10);
         OCR1A = 100;
         DDRB |= (1<<PB3);
        }
        }

  
}



http://myrobot.ru/stepbystep/r_firstbot2.php - делаю на основе этой статьи
=GM=
Если аргумент оператора IF равен ДА, то вы включаете двигатель1, если НЕТ, то включаете двигатель2, но при этом двигатель1 надо бы выключить, разве нет?

314
Лучше не выключать, а менять скорости, один двигатель быстрее, а второй медленнее. Разницу скоростей нужно подобрать по опыту.
=GM=
Это уже детали, смысл моего сообщения был в том, что если в начале программы сработало одно условие, и включился один двигатель, то робот начнёт двигаться по кругу. Пусть в некий момент наступит другое условие, включится второй двигатель, но первый-то не выключится. И второй тоже, несмотря на смену условий. Вместо того, чтобы следить за линией робот поедет куда глаза глядят...
bfrogg
Код
/****************************************************************
ПРИМЕР 4 :: ПРОСТЕЙШИЙ АЛГОРИТМ СЛЕДОВАНИЯ ПО ЛИНИИ :: MYROBOT.RU
*****************************************************************/

#include <avr/io.h>

int main(void) // начало основной программы
{
  
   DDRB = 0xff; // все выводы порта B сконфигурировать как выходы
   DDRD = 0x00; // все выводы порта D сконфигурировать как входы


   PORTD = 0xff; // установить "1" на всех выводах порта D,
         // включаем подтягивающие резисторы

        while (1) {  // Бесконечный цикл

        // ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА

        if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
        {
                    // ---- включаем левый мотор, останавливаем правый -----

                    TCCR1A = (1<<COM1B1) | (1<<WGM10);
                    TCCR1B = (1<<WGM12) | (1<<CS10);
                    OCR1B = 100;
                    DDRB |= (1<<PB4);
                    DDRB |= (0<<PB3);

                    // -----------------------------------------------------
        }
        else
        {
                        // ---- останавливаем левый мотор, включаем правый -----

                    TCCR1A = (1<<COM1A1) | (1<<WGM10);
                    TCCR1B = (1<<WGM12) | (1<<CS10);
                    OCR1A = 100;
                    DDRB |= (1<<PB3);
                    DDRB |= (0<<PB4);

                        // -----------------------------------------------------
        }


        } // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы


Вроде работает, однако есть 2 проблемы

1: алгоритм срабатывает, если я проводком ведущим к PD1 тыкаю на минус. Фотодатчики как то не управляют работой)
2: с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот
ae_
Цитата(bfrogg @ Mar 12 2011, 05:51) *
...
2: с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот

Как можно узнать куда поворачивать, если сигнал с фотоэлемента только один?
Куда отклонилась машина, влево или вправо, если пропал сигнал?
Что бы следить за линией, нужно минимум 2 аналоговых фотоэлемента, один слева, другой справа.
Расположить их так, чтобы каждый видел 50% ширины линии.
Сигнал с фотоэлементов снимать аналоговый, к двигателям сигнал управления подавать пропорционально освещённости датчиков крест-накрест, т.е. чем ярче видит линию левый датчик, тем быстрее крутить правым двигателем.
Другой вариант - поставить 3 логических фотоэлемента (да/нет, есть линия/нет линии), один в центре, два по бокам от него.
Если едем ровно - сигнал есть только на центральном датчике. ушли в сторону - сигнал появится на боковом датчике и далее может совсем пропасть.
Запомнив, в какую сторону сбилась машина, управляем двигателями, что бы вернуть её на линию.
bfrogg
Цитата(ae_ @ Mar 12 2011, 05:48) *
...

http://myrobot.ru/stepbystep/el_simple_robot_for_line.php
314
Цитата
алгоритм срабатывает, если я проводком ведущим к PD1 тыкаю на минус. Фотодатчики как то не управляют работой)

Возьмите вольтметр и померяйте напряжение на PIND,1 в момент, когда фотодатчик над полосой и когда в стороне от полосы и увидите, проблема в датчике или программе.

Цитата
с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот

А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4);
Цитата
Что бы следить за линией, нужно минимум 2 аналоговых фотоэлемента, один слева, другой справа.

Это просто детская игрушка, Вы еще видеокамеру предложите поставить, с распознованием образов, чтоб хозяина узнавал и за ним ездил sm.gif
ae_
Цитата(bfrogg @ Mar 12 2011, 15:10) *

Если управлять роботом по такому алгоритму:
Нажмите для просмотра прикрепленного файла
то МК легко может "сойти с ума" при очередном манёвре, если робот проедет чуть дальше в сторону линии и пересечёт её уже с обратной стороны.
В этом случае условия движения поменяются на обратные.

Предлагаю реализовать такой алгоритм движения:
Нажмите для просмотра прикрепленного файла
bfrogg
ae, спасибо за идею!

Цитата(314 @ Mar 12 2011, 21:21) *
А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4);

Один из вариантов написания, присваивание работает
demiurg_spb
Цитата(314 @ Mar 12 2011, 21:21) *
А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4);
Нет. Вот так правильно:
Код
DDRB &= ~(1<<PB4);
314
Цитата
Нет. Вот так правильно:

Ну пусть так (все равно sbi-cbi предпочитаю), а в варианте ТС работать-то будет?
bfrogg
Проблема в программе. В моей схеме МК работает на удивление нестабильно. Банальная программа по вращению моторами туда сюда без каких либо датчиков работает ужасно (то есть один мотор вращается от 4 до 10 секунд, потом другой вращается сколько хочет, когда оба должны поочередно работать 1 секунду). В схему поставил стабилизатор напряжения на 5 вольт. Питание 6 вольт. Может мне воспользоваться каким нибудь из этих советов? http://myrobot.ru/articles/mc_stab.php

Вообще схема без МК спаяна без ошибок - все проверил тестером, двигатели вращаются когда надо (L293D не подводит)

Еще ламерский вопрос. МК может испортиться от питани 6 вольт напрямую?
kovigor
Цитата(bfrogg @ Mar 20 2011, 23:19) *
В схему поставил стабилизатор напряжения на 5 вольт.
Еще ламерский вопрос. МК может испортиться от питани 6 вольт напрямую?


1. Для 7805 +6В мало. См. описание на вашу микросхему. Кажись, минимум 7В, а лучше - 8.
2. Имеет полное право испортиться. Например, для tiny2313 макс. напряжение не должно превышать 6В.
3. Нестабильность м.б. связана с плохой разводкой платы и (или) бросками тока в линиях питания при включении/выключении двигателей. Если можно, то подключите плату с МК к зажимам аккумулятора отдельными проводами (т.е., не теми, по которым ток идет к двигателям или к их драйверу) ...
nk@
Коллекторный двигатель гонит серьезную помеху по питанию, посему неудачная разводка платы может свести все усилия на нет.
Возьмите осциллограф и проверьте питание МК. В качестве теста запитайте силовую часть от отдельного источника, и скорее всего, у Вас все заработает.
Несколько советов по схематике:
1. LC фильтр по питанию МК.
2. Увеличить толщину земляных цепей.
bfrogg
На днях попробую раздельное питание. Осциллографа нет.

Вопрос по разводке. Ниже мое художество (не очень аккуратное)) примерно как спаяно. Скажите, это плохая разводка)?
kovigor
Цитата(bfrogg @ Mar 21 2011, 19:41) *
Скажите, это плохая разводка)?


Отвратительная

Как минимум, открываем "Микропроцессорные структуры" Шевкопляса и штудируем соотв. раздел:

http://lord-n.narod.ru/walla.html

Можете еще почитать вот это:

http://www.atmel.com/dyn/resources/prod_do...nts/doc1619.pdf

Без изучения азбуки дальше обсуждать нечего ...
nk@
У Вас L293 неправильно включена. Ноги 7, 10 в воздухе висят? Внимательно даташит почитайте. Если езда планируется только вперед, то на землю их повесьте. Если реверс планируется, то подключите их к любому свободному порту. Тогда в случае подачи 1 на эти ноги, можно заставить двигатель вращаться в другую сторону. ШИМ при этом будет работать "наоборот" - большему значению будут соответствовать меньшие обороты.
Вот пример:

CODE

/*Ноги 7, 10 L293 подключены к PB0*/
void set_pwm(uint16_t valueL, uint16_t valueR, uint8_t direction)
{
DDRB |= 0x1; // set PB0 as output
if(direction)
{
OCR1A = valueL;
OCR1B = valueR;
PORTB &= 0xFE; // set PB0=0
}
else
{
OCR1A = 0xFFFF - valueL;
OCR1B = 0xFFFF - valueR;
PORTB |= 0x1; // set PB0=1
}

}



Насчет питания: подайте ваше основное питание непосредственно на L293, tiny2313 запитайте через стабилизатор,
при этом подайте питание на стабилизатор через дроссель на 100мкГн, короче сделайте LC фильтр. Также LM7805 требует конденсаторов емкостью не менее 2.2мкФ на входе и выходе. Если будете ставить электролиты, то возьмите на 20мкФ х 16В.
Все свободное место на плате - землей "залейте". Не жалейте меди sm.gif
Параллельно двигателям поставьте конденсаторы на 0.1 - 1 мкФ, керамику.
Вроде все wacko.gif
Disha
В общем вопрос похожий. Поэтому новую тему создавать не стал. Помогите с исходником. Сделана плата на SOIC tinny 2313. С кварцем 7,3728. Питание 3В. 15 ножка (OC1A) через транзистор управляет ИК диодом. Есть ИК маяк, работу которого нужно повторить этой схемой. Последовательность импульсов эталонного маяка довольно сложная. Пачка из N импульсов (длительностью Т1) - такая же пауза (Т1), нужно 15 таких пачек с паузами Т2 (Т2 кажется кратно Т1), затем пауза длительностью Т3 (тоже кратная Т1). Меня хватило только помигать светодиодом. Программный ШИМ и работу с таймерами осилить не смог. (((
TSerg
Браться надо за то, что можете, а не за то, что хочется, а иначе - это заказ на работу.
Disha
Цитата(TSerg @ Dec 13 2013, 14:45) *
Браться надо за то, что можете, а не за то, что хочется, а иначе - это заказ на работу.

Могу и заплатить, Вы возьметесь?? Это не для промышленного производства, сразу оговариваюсь. Это разовое решение, для игрушки-робота. Но хочу именно исходник, без ассемблера и готовых бинарников, иначе так и не научусь. Украина, Киев. Спс.
Disha
додаток

Цитата(TSerg @ Dec 13 2013, 15:04) *

Что я по этой ссылке должен был увидеть??
TSerg
- тему "Предлагаю работу".
kovigor
Цитата(Disha @ Dec 13 2013, 16:08) *
Меня хватило только помигать светодиодом.

Тут, похоже, ШИМ не обязателен, достаточно просто функций delay_ms() и delay_us(). Это я о CodeVision. 300 мкС с помощью последней функции получить - раз плюнуть. Думаю, так будет даже проще, чем с аппаратным ШИМ.
Еще вариант: в обработчике прерывания от таймера (прерывание возникает каждые 150 мкС) реализовать простейший цифровой автомат, управляющий ножкой.
Еще вариант: тот же автомат, но управляемый таблицей состояния ножки, заданной в виде массива. Этот вариант, возможно, будет наилучшим. Один бит - одно состояние.
Задача несложная.
И с ШИМ никаких особых проблем нет, тем более сейчас есть масса книг по AVR на русском ...
Disha
Цитата(kovigor @ Dec 13 2013, 16:02) *
Тут, похоже, ШИМ не обязателен, достаточно просто функций delay_ms() и delay_us(). Это я о CodeVision. 300 мкС с помощью последней функции получить - раз плюнуть. Думаю, так будет даже проще, чем с аппаратным ШИМ.
Еще вариант: в обработчике прерывания от таймера (прерывание возникает каждые 150 мкС) реализовать простейший цифровой автомат, управляющий ножкой.
Еще вариант: тот же автомат, но управляемый таблицей состояния ножки, заданной в виде массива. Этот вариант, возможно, будет наилучшим. Один бит - одно состояние.
Задача несложная.
И с ШИМ никаких особых проблем нет, тем более сейчас есть масса книг по AVR на русском ...

Я не зря писал что Т2 и Т3 кратны Т1. Самые короткие импульсы это грубо говоря несущая (частоту которой я точно не знаю) около 40 кГц. Я думал ее организовать с помощью ШИМ чтоб подбирать было легче и точнее. А потом уже отсчитывая нужное кол-во коротких импульсов формировать все крупные последовательности (там только колво импульсов несущей нужно подставлять). Именно с помощью массива. спс
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.