Да, я аппаратный и имел в виду... видимо непонятно написал (в пункте 1)...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
2й таймер настроен неправильно... да и не нужен 2й таймер для этой задачи... ______ 1) настрой любой (пусть будет Т1) на 1кГц с режимом PWM и с генерацией прерывания выход PWM (ШИМ) будет управлять зарядкой, а самим этим режимом будет управлять соответствующий ему регистр OCR. Т.е. режимом зарядки теперь можно управлять, изменяя OCR. 2) т.к. прерывание вызывается с частотой 1кГц, то этим можно воспользоваться - в прерывании инкрементировать переменную i (счетчик) и сравнивать её с 2мя константами С1=заполнение, С2=1000. если i<C1 OCR=x иначе OCR=0; //(включение-отключение импульсов, х-ширина "иголок" заряда) если i>C2 i=0; //(перезапуск программного счетчика.)
Да я понял вас, аппаратный шим, реализовывал дрыганог/ программный шим думал там меньше нагружу мк. А почему не правильно таймер2 настроил, просто для себя так сказать докапаться по полной?
у тебя написано тактирование 250кГц из такой частоты 8 битным таймером 35 Гц не получить... хотя, ты получаешь более высокую частоту и дожимаешь её программным счетчиком... но тогда что мешает взять в качестве опоры прерывания таймера Т1?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
250 кГц - это уже счётчик Т2 (делителей там дальше уже нет...)250000/35=7142, 8 битный таймер до стольки считать не умеет... а частота всего МК = 8 МГц, вот таймер и тикает на 8М/32=250к
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
у тебя написано тактирование 250кГц из такой частоты 8 битным таймером 35 Гц не получить... хотя, ты получаешь более высокую частоту и дожимаешь её программным счетчиком... но тогда что мешает взять в качестве опоры прерывания таймера Т1?
не понимаю вообще 16 битный таймер, и как "дожимать" тем более... как вычислить OCR1A хотя бы 1kHz. 1 kHz опытным путем добился на выходе мк... мои рассуждения такие: 8000000Hz/(2^16=65536)/9)=1098Hz, где 9 это TCCR1B=0x09; или из теории сухой о 16 битных таймера "даный регист TCCR отвечает за установку делителя, чтобы таймер не так быстро считал, также он отвечает (вернее его определённые биты) за установку определённого режима", TCCR1A и TCCR1B правильно ли я указал?
neid, для расчетов не шибко важно, какой разрядности таймер. Просто у него расширяется диапазон. Есть частота тика таймера, которая в общем случае для старых мег = частоте меги / предделитель. Это 1 тик таймера. А максимум тиков до переполнения равно 2 в степени разрядности. Но максимум (TOP) может ограничиваться и меньшим значением, главное что не большим. И иметь промежуточные значения (OCR), по достижению которых что-то происходит (прерывание или изменения состояния пина).
Добавлено after 26 minutes 10 seconds: Lilia, см главу 10.3.2 - 10.3.3 ДШ. По умолчанию CLK_PER делится на 6 от MAIN_CLK. Т.е. при основной частоте 20 МГц, периферия будет работать на 3.3 МГц, поэтому и неподходит. Кстати с CMP = 0x14, частота должна выходить в этом случае 4 кГц, а не 5. А так-то расчет верен. Просто выставьте предделитель CLK_PER в 1 в регистрах CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLB.
я вот понял, попробую "перевести"... есть исходная частота (8 МГц), есть делители на входе таймера, они как редуктор тормозят входную тактовую частоту в сколько-то (настраивается) раз, т.е таймер может тикать как на частоте 8 МГц, так и в какоето целое число раз (набор доступных делителей смотри в ДШ). каждый тик таймера увеличивает его счетчик на 1, но таймер не может считать вечно, когдато он переполнится (так-же как переворачиваются 999999 в 000000 на спидометре автомобиля...) то, как долго таймер может не переполняться как-раз и определяется его разрядностью (так-же как и в спидометре количеством счетных колёс)... _____________ теперь о применении на практике: тебе надо добиться, используя доступные значения делителя, чтобы счетчик тикал с частотой в целое число раз больше требуемой, но чтобы это число вместилось в разрядность таймера (для 8 битных это 256, для 16 битных - 65536 (2^16) ) тебе надо 1кГц это в 8000 раз меньше 8 МГц (число целое, и не больше 65536 - значит его можно использовать для Т1) (делитель при этом =1) также для Т1 пойдут делители на 8 и на 64, а вот для 8 битных таймеров пойдет только делитель на 64 т.к. только (8000/64)<256 и ещё целое (при следующем доступном делителе 256 уже получается 31,25 кГц) допустим мы оставили делитель 1, значит чтобы прошла 1мс таймер должен сосчитать от 0 до 7999, 7999 = 1F3F (HEX) осталось сделать так, чтобы счетчик считал до этого числа и перезапускался для этого есть режим СТС, но он нам не подходит, т.к. нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход.... нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём. также надо включить прерывание по совпадению А, чтобы при каждом обороте таймера ЦП контроллера об этом узнавал. Вот, собственно и вся настройка таймера...
Добавлено after 7 minutes 29 seconds: neid, ещё я очень рекомендую скачать программу Algorithm Builder (v5.44)в ней зоздать и настроить проект: Файл->новый..... проект->проект оптионс (тут выбрать свой МК и задать его тактовую) потом кликнуть на красную "S" выбрать таймер/счетчик1 и поковыряться с его параметрами, и, думаю сразу станет понятней его работа...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Добавлено after 26 minutes 10 seconds: Lilia, см главу 10.3.2 - 10.3.3 ДШ. По умолчанию CLK_PER делится на 6 от MAIN_CLK. Т.е. при основной частоте 20 МГц, периферия будет работать на 3.3 МГц, поэтому и неподходит. Кстати с CMP = 0x14, частота должна выходить в этом случае 4 кГц, а не 5. А так-то расчет верен. Просто выставьте предделитель CLK_PER в 1 в регистрах CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLB.
Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. .
В этом режиме он, видимо, и не будет срабатывать, т.к. в FRQ режиме значение TOP определяется регистром CMP0 (таблица 20-7 даташита).
Не поняла. Я и хочу, чтобы СМР0 было TOP. И хочу чтобы по достижению TOP было прерывание, чтобы подсчитывать время для выходного сигнала. Или это можно только через события организовать?
Lilia, т.к. достижение TOP и есть переполнение таймера, срабатывает соб-но оно. Если бы срабатывали оба, в этом случае CMP0_vect срабатывало бы в то же время абсолютно.
Lilia, т.к. достижение TOP и есть переполнение таймера, срабатывает соб-но оно. Если бы срабатывали оба, в этом случае CMP0_vect срабатывало бы в то же время абсолютно.
Я всегда думала, что переполение - это достижение максимального значения по разрядности. Для таймера 16бит - это 65 635.
Lilia, переполнение - это достижение TOP значения. В некоторых режимах оно равно максимальной разрядности таймера, но во многих других может снижаться. В общем-то тоже самое я писал чуть выше другому человеку для старых вариантов AVR: https://radiokot.ru/forum/viewtopic.php ... 4#p3959644 Смысл не изменился. В данном режиме согласно ДШ TOP = CMP0. Таймер считает от 0 до TOP (CMP0) и начинает с нуля. Это и есть момент переполнения. Иначе оно бы никогда у вас не достигалось. Если вам нужно шагать до 65535 (максимальное значение разрядности таймера называется MAX, эти определения есть в разделе 20.3.1 ДШ), то вам нужен другой режим таймера.
Добавлено after 5 minutes 25 seconds: Описание прерываний:
0x00 OVF Overflow and compare match interrupt The counter has reached its top value and wrapped to zero.
Lilia, переполнение - это достижение TOP значения. В некоторых режимах оно равно максимальной разрядности таймера, но во многих других может снижаться. В общем-то тоже самое я писал чуть выше другому человеку для старых вариантов AVR: https://radiokot.ru/forum/viewtopic.php ... 4#p3959644 Смысл не изменился. В данном режиме согласно ДШ TOP = CMP0. Таймер считает от 0 до TOP (CMP0) и начинает с нуля. Это и есть момент переполнения. Иначе оно бы никогда у вас не достигалось. Если вам нужно шагать до 65535 (максимальное значение разрядности таймера называется MAX, эти определения есть в разделе 20.3.1 ДШ), то вам нужен другой режим таймера.
Добавлено after 5 minutes 25 seconds: Описание прерываний:
0x00 OVF Overflow and compare match interrupt The counter has reached its top value and wrapped to zero.
Да, вижу. Если б это было так, все было бы прекрасно и все работало уже как надо. Но частота прерываний OVF выше (период ~0,05мс) и не зависит от значения CMP0 к сожалению.
Но в действительности ISR (TCA0_CMP0_vect) не срабатывает. .
В этом режиме он, видимо, и не будет срабатывать, т.к. в FRQ режиме значение TOP определяется регистром CMP0 (таблица 20-7 даташита).
Не поняла. Я и хочу, чтобы СМР0 было TOP. И хочу чтобы по достижению TOP было прерывание, чтобы подсчитывать время для выходного сигнала. Или это можно только через события организовать?
Здесь надо понимать, как таймер взводит флаги на значения счётчика таймера. А флаги взводятся не в момент совпадения / переполнения / обнуления, а только в следующем такте таймера.
Да, вижу. Если б это было так, все было бы прекрасно и все работало уже как надо. Но частота прерываний OVF выше (период ~0,05мс) и не зависит от значения CMP0 к сожалению.
Потому, что флаги в прерывании автоматически не сбрасываются. Их надо сбрасывать программно. Поэтому как только МК покидает обработчик прерывания, он выполняет одну инструкцию основного кода и опять уходит в прерывание.
Надо не думать и даже не предполагать, а внимательно читать даташит. И это простой синхронный таймер А. А асинхронный таймер D вообще способен вынести мозг.
я вот понял, попробую "перевести"... есть исходная частота (8 МГц), есть делители на входе таймера, они как редуктор тормозят входную тактовую частоту в сколько-то (настраивается) раз, т.е таймер может тикать как на частоте 8 МГц, так и в какоето целое число раз (набор доступных делителей смотри в ДШ). каждый тик таймера увеличивает его счетчик на 1, но таймер не может считать вечно, когдато он переполнится (так-же как переворачиваются 999999 в 000000 на спидометре автомобиля...) то, как долго таймер может не переполняться как-раз и определяется его разрядностью (так-же как и в спидометре количеством счетных колёс)... _____________ теперь о применении на практике: тебе надо добиться, используя доступные значения делителя, чтобы счетчик тикал с частотой в целое число раз больше требуемой, но чтобы это число вместилось в разрядность таймера (для 8 битных это 256, для 16 битных - 65536 (2^16) ) тебе надо 1кГц это в 8000 раз меньше 8 МГц (число целое, и не больше 65536 - значит его можно использовать для Т1) (делитель при этом =1) также для Т1 пойдут делители на 8 и на 64, а вот для 8 битных таймеров пойдет только делитель на 64 т.к. только (8000/64)<256 и ещё целое (при следующем доступном делителе 256 уже получается 31,25 кГц) допустим мы оставили делитель 1, значит чтобы прошла 1мс таймер должен сосчитать от 0 до 7999, 7999 = 1F3F (HEX) осталось сделать так, чтобы счетчик считал до этого числа и перезапускался для этого есть режим СТС, но он нам не подходит, т.к. нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход.... нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём. также надо включить прерывание по совпадению А, чтобы при каждом обороте таймера ЦП контроллера об этом узнавал. Вот, собственно и вся настройка таймера...
Добавлено after 7 minutes 29 seconds: neid, ещё я очень рекомендую скачать программу Algorithm Builder (v5.44)в ней зоздать и настроить проект: Файл->новый..... проект->проект оптионс (тут выбрать свой МК и задать его тактовую) потом кликнуть на красную "S" выбрать таймер/счетчик1 и поковыряться с его параметрами, и, думаю сразу станет понятней его работа...
codevision тоже симулирует. но в протеусе получаются совсем другие периоды. неделю копаюсь.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения