Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 104 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер. В таблице прескалеров AVR (ATmega328P/ATmega2560 напр.) при настройке 16-битных таймеров есть режим "внешний источник синхронизации Tn_FALLING/Tn_RISING и лапа на микроконтроллере для подключения этого самого источника синхронизации Tn. Вопрос - как можно использовать такой прескалер, при каких режимах, с какими прерываниями. Гуглил про "внешний источник синхронизации Tn_FALLING/Tn_RISING" - информации не очень много. Может кто накинет простой примерчик.
В таблице прескалеров AVR (ATmega328P/ATmega2560 напр.) при настройке 16-битных
Не только. В 328-й с 8-битным Т0 это тоже работает. В 2560 не смотрел, ни к чему пока.
Цитата:
таймеров есть режим "внешний источник синхронизации
Нету там внешнего источника синхронизации! Есть внешний источник тактовой частоты. А синхронизация делается с внутренней тактовой частотой ядра, чтобы пользователь не пытался подать на входы Т0/Т1 частоту выше внутренней.
Цитата:
Вопрос - как можно использовать такой прескалер, при каких режимах, с какими прерываниями.
Во всех режимах, со всеми прерываниями.
Цитата:
Гуглил про "внешний источник синхронизации Tn_FALLING/Tn_RISING" - информации не очень много.
Чего там гуглить-то??? Всё расписано в даташите, глава 17 (T0&T1 Prescalers), 15 (8-bit T0) и 16 (16-bit T1). Ну подали тактовую частоту не изнутри, а снаружи, вот и все дела.
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 104 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Вы правы. Сам себя немного запутал. Протеус виноват. Не показывал в режиме реального времени. Взял симулятор полегче SimulIDE и картина прояснилась. Просто тестирую библиотечку (ссылка на мой Google-диск) TimerHelpers.h. Все режимы проверил, а на таком застрял. Оказывается все очень просто.
timer1.setMode<TimerControlRegister::TCCR_1A, TimerControlRegister::TCCR_1B>(); TCNT1 = 0; // 256 max
OCR1A = 200; OCR1B = 200;
while (1) { }
return 0; }
Страница оригинала Timers and counters Файла отсюда ->TimerHelpers.zip. Я лишь применил приемы метапрограммирования, строгой типизации ну и ещё там чего.. Вроде как фурычит, да и ничего в коде менять не надо при изменении микроконтроллера. Применимо для ATmega328P/ATmega2560. AtmelStudio -std=c++14.
Проблема заключается в том, что меняя переменную fG частота на ножке PB0 остается одной и той же(244Гц), хотя я и меняю значение переменной, участвующей в расчете значения регистра сравнения OCR1A. Формула расчета тоже довольно простая, взята из даташита. На данный момент я бы хотел решить 2 проблемы: 1) Возможность задания частоты переменной fG. 2) Возможность задания выхода частоты с МК переменной nG. PS: значение переменных nG и fG будут менятся по SPI(код еще не написал), интересен сам принцип подобной организации задержек. Спойлер
warptred12, у тебя обновление регистров не там записано, или в ветвление их внеси или из цикла убери... а флоаты там действительно нужны? как-никак 75% флеша поели....
Добавлено after 3 minutes 28 seconds: да, и строка OCRnx_calc = ceil((TimDiv/Foc) - 1); не нужна... хватит и OCRnx_calc = TimDiv; наверно... если я правильно понял замысел
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
warptred12, у тебя обновление регистров не там записано, или в ветвление их внеси или из цикла убери... а флоаты там действительно нужны? как-никак 75% флеша поели....
Добавлено after 3 minutes 28 seconds: да, и строка OCRnx_calc = ceil((TimDiv/Foc) - 1); не нужна... хватит и OCRnx_calc = TimDiv; наверно... если я правильно понял замысел
Ну как-то так получается, ceil'ом хотел знаки убрать после запятой, но они же и так должны по идее отпасть. Но результат получается все тот же, 244 герца. Уже несколько дней вожусь с этой шляпой, не могу понять, что не так. Можете объяснить где в коде должны обновляться регистры?
есть 2 варианта 1) если при вводе недопустимо маленькой частоты (например 0) нужно остановить генерацию то нужно вынести за пределы цикла (просто перенести закрывающую цикл скобку на 3 строки вверх)Спойлерпримерно так... поправил ф-ю не пытаясь её оптимизировать.
2) если при вводе недопустимо маленького значения его нужно проигнорировать, то обновление регистров надо внести в условие, но поставить надо до брейка, а не после.
Добавлено after 5 minutes 30 seconds: второй вариант вашего кода совсем негоден - там условие не выполнится никогда, т.к. переменная просто переполнится
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
есть 2 варианта 1) если при вводе недопустимо маленькой частоты (например 0) нужно остановить генерацию то нужно вынести за пределы цикла (просто перенести закрывающую цикл скобку на 3 строки вверх)Спойлерпримерно так... поправил ф-ю не пытаясь её оптимизировать.
2) если при вводе недопустимо маленького значения его нужно проигнорировать, то обновление регистров надо внести в условие, но поставить надо до брейка, а не после.
Добавлено after 5 minutes 30 seconds: второй вариант вашего кода совсем негоден - там условие не выполнится никогда, т.к. переменная просто переполнится
ваш вариант помог, спасибо, а как мне в прерывании
а как надо дёргать? nG это номер ноги или маска? задействован весь порт? обнулять неиспользуемые ноги надо? (в момент переключения ноги там ведь и 1 может остаться)
Добавлено after 3 minutes 15 seconds: ПС: 1) не цитируй прошлое сообщение, ответ итак подразумевает, что он следует за прошлым сообщением. 2) не цитируй всё сообщение, допустимо выделять только главную мысль (иногда допустимо выделять г.м. и в прошлом сообщении) за полное цитирование могут забанить.
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
я хочу чтобы в зависимости от значения переменной nG частота генерировалась на определенной ножке контроллера, напрмер: при nG=0, мы генерируем частоту заданную пременной fG на ножке PB0, при этом все остальные ножки отключаются, при nG=1 на ножке PB1 и тд.
Добавлено after 1 minute 3 seconds: nG придётся сделать глобальной (локальное в майн её объявление убери)
Добавлено after 11 minutes 1 second: для экономии времени в прерывании желательно маску msc вычислять за его пределами, например написать ф-ю её обновления (ф-ю переключатель пина) и вызывать её.
Добавлено after 3 minutes 23 seconds: тогда это будет выглядеть так:Спойлер
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
При симуляции в протеусе, напряжение есть только на выводе PB0, но на пинах, заданных переменной nG - напряжения нет, но на их выводах есть частота. Это протеус шалит или так и должно быть ? Так же при задании переменной fG частот 0, 1, 2, 3 на выходе получается частоты 4, 5, 4.5, 14 Гц соответственно, а должны быть частоты 0, 1, 2, 3 Гц. Может быть у вас будут какие нибудь мысли по этому поводу. Откорректированный код прикрепляю ниже.
Добавлено after 59 seconds: длинные портянки стоит заворачивать в спойлер, так проще потом ориентироваться на странице
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Извините, за глупый вопрос - я с АВР-ами не работал, но тут есть множество народу, которые на них собаку сгрызли. И, надеюсь, меня могут направить в нужную сторону, чтобы я смог решить маленькую задачку, не изучая эти древние микроконтроллеры досконально.
Так вот, есть робот на старой ArduinoNANO. Среда ардуина считает его как ATmega328P. Хочу снять механические характеристики - зависимость скорости от "приложенного напряжения". Напряжение устанавливается функцией
Ну и по схеме они подключены к A9-A10. Частота ШИМ настраивается записью в TCCR1B - это первый таймер?
Так, теперь как измерить скорость? у моторов есть два датчика холла которые объединены исключающим ИЛИ и заведены на D2, D3 (левый/правый) и один из дачиков заведен отдельно на D4, D5 (тоже левый/правый). Можно ли при таком включении задействовать какой из таймеров с захватом, чтобы измерить периоды импульсов (хотя бы одного колеса!). В самом роботе тахометры дают просто прерывание по перепаду уровня и просто считается расстояние (не скорость!).
Ожидаемая частота импульсов: максимальные обороты моторов около 30 тысяч в минуту, т.е. 500 оборотов в секунду и магнитный диск имеет 6 полюсов - т.е. 3000 отсчетов в секунду.
Беглый просмотр даташита мне оптимизма насчет таймера 0 и 2 не дал. Похоже, единственная надежда на один канал захвата таймера 1...
Можно использовать захват, если в качестве формирования периода ШИМ не выбран режим с использованием регистра ICR1. В Вашем случае выражение определения скорости вращения S[1/мин]=(60/6)*Fo*Nx/nox, где Fo- частота тактирования таймера 1 Nx- число периодов измеряемой скорости за время измерения nox- число периодов частоты тактирования за время прохождения Nx. Определив числитель константой, нужно просто определить nox. Например Fo=16000000 Nx=1 p_pwm=3333 период ШИМ начальное значение ICR1=1253 конечное значение ICR1=3253 число полных периодов p_pwm=1 nox= -1253+3333+3253=5333 S[1/мин]=160000000/5333~30'001,8
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения