Перейти к содержанию

Захват скважности ШИМ


korsaj

Рекомендуемые сообщения

Захватываю период и скважность шим таймером 1 Атмеги8. Но для захвата скважности нужно переключать фронт захвата Наступает такой момент когда скважность либо меньше 1-2% либо больше 98-99% когда в прерывании не успеваю переключить фронт. Захват происходит на следующем периоде, из-за чего скважность вычисляется неверно. Подскажите, может у кого есть опыт или идеи, как на краях принять решение что скважность ШИМ 100%(0%).

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@korsaj , скважность - безразмерная величина, и не может быть меньше 1.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выдержка из даташита:
Measurement of an external signal’s duty cycle requires that the trigger edge is changed after
each capture. Changing the edge sensing must be done as early as possible after the ICR1
Register has been read. After a change of the edge, the Input Capture Flag (ICF1) must be
cleared by software (writing a logical one to the I/O bit location). For measuring frequency only,
the clearing of the ICF1 Flag is not required (if an interrupt handler is used).

Ну и описание бита:
• Bit 6 – ICES1: Input Capture Edge Select
This bit selects which edge on the Input Capture Pin (ICP1) that is used to trigger a capture
event. When the ICES1 bit is written to zero, a falling (negative) edge is used as trigger, and
when the ICES1 bit is written to one, a rising (positive) edge will trigger the capture.

В отличии от внешнего прерывания, для захвата можно использовать лишь одно событие.

Ссылка на комментарий
Поделиться на другие сайты

@korsaj я может плохо помню, но по моему там минимум два входа, для которых можно установить прерывания по тому или другому фронту.

Ссылка на комментарий
Поделиться на другие сайты

Если сделать захват по внешним прерываниям, то теряется время на считывание регистра таймера. Если захват аппаратный (событие на выводе ICP1), то теряется время на переключение фронта. Обработчик на ассемблере.

Но с другой стороны (Если повар нам не врёт),  построив захват на внешних прерываниях, мы всегда будем достигать какого-то минимума и максимума ШИМ который в любом случае не приведет к ошибке.

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Можно решить вопрос несколькими методами:

1. Использовать микроконтроллер как минимум с 2 входами захвата (ICPX), например, ATTINY2313. А в ATMEGA2560 их аж целых 4.

2. Совместно со входом ICP1 использовать вход INT0 или INT1. Соответственно если вам нужно измерить длину паузы, настраиваем вход INTX на задний фронт (спад), а ICP1 на передний фронт (фронт), соответственно при прерывании на входе INTX программа переходит в подпрограмму прерывания и считывается значение таймера-счётчика 1 в регистровую пару X, Y или Z. Оператором sbiw, корректируем показания, вроде 2 цикла входа в прерывание и 1 цикл считывания, вначале считывает регистр TCNT1L, одновременно во временный регистр копируется значение TCNT1H.

Если есть другие прерывания, то даже внутри подпрограммы прерывания можно активировать прерывания оператором sei, чтобы вовремя сработало прерывание по входу INTX. 

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Alex Ferrum сказал:

вроде 2 цикла входа в прерывание и 1 цикл считывания, вначале считывает регистр TCNT1L, одновременно во временный регистр копируется значение TCNT1H.

в даташите четко указано, что проходит 4 цикла от начала возникновения события до перехода к исполнению прерывания.

плюс 1-2 цикла на завершению текущей операции и плюс 2 цикла на джамп из вектора прерывания.

итого 7-8 циклов до начала исполнения подпрограммы прерывания.

а чтение двух регистров таймера - это 2 цикла, а не 1 цикл считывания.

и считывать надо регистры захвата, а не регистры счетчика.

20 часов назад, korsaj сказал:

ШИМ 100%(0%)

7-8 упомянутых мною циклах плюс работа самого прерывания не позволят определить ни 0%, ни 100%.

в зависимости от периода ШИМ эта потеря времени составит ограничение определения минимальной и максимальной ширины импульса.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

@Starichok при прерывании по входу INTX, считывать нужно именно регистры TCNT1L и TCNT1H, а регистры ICR1L и ICR1H считываются при прерывании по входу ICP1.

При чтении TCNT1L и TCNT1H, мы читаем TCNT1L и одновременно, автоматически происходит копирование регистра TCNT1H во временный регистр, через который и осуществляется доступ к регистру TCNT1H. Это нужно чтобы считать оба регистра одновременно. То есть да, это 2 цикла на считывание:

in temp1, TCNT1L;

in temp2, TCNT1H;

Но оба значения считываются из счётных регистров одновременно при операции:

in temp1, TCNT1L;

Соответственно содержимое нижнего регистра считывается в регистр temp1, а содержимое верхнего регистра во временный регистр, из которого оно копируется в регистр temp2 во время операции:

in temp2, TCNT1H;

Соответственно при считывании верхнего регистра, это значение уже считано и не инкрементируется, можно подпрограмму прерывания сделать следующим образом:

intx:

in XL, TCNT1L;

считываем нижний регистр

in XH, TCNT1H;

считываем верхний регистр

sbiw XH, 0x05;

корректируем показания, 2 (0x03) или 4 (0x05) цикла на вход в прерывание, при этом значение счётчика тоже увеличится на 2 или 4 и один цикл на считывание регистра TCNT1L одновременно с которым считывается регистр TCNT1H

...........

reti;

 

 

Ну а считать регистры ICR1L и ICR1H мы можем в любое время до наступления следующего события, так как при возникновении прерывания по входу ICP1, в эти регистры автоматически копируется значение из счётных регистров и больше не меняется до наступления следующего прерывания по входу ICP1. 

Изменено пользователем Alex Ferrum
Очепятка
Ссылка на комментарий
Поделиться на другие сайты

Да, ну и понятно, при входе в подпрограмму прерывания желательно сохранить регистр операций:

intx:

in temp3, SREG;

А при выходе из подпрограммы прерывания вернуть значение обратно:

out SREG, temp3;

reti;

Ссылка на комментарий
Поделиться на другие сайты

если уж использовать внешние прерывания, то от захвата можно отказаться вообще.

два внешних прерывания настроить на фронт и на спад.

запаздывание от события до обработчика в 7-8 циклов будет одинаковым для обоих обработчиков, и результат расчета будет корректным.

то есть, фиг с ним, что состояние счетчика будет на некоторое количество циклов больше, чем во время наступления фронта или спада. главное, что это количество циклов одинаковое для обоих обработчиков.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

@Starichok я полагаю лучше комбинировать вход внешних прерываний и вход захвата ICP1, дело в том что если промежуток времени, который нужно измерить будет небольшой (несколько циклов), тогда во время исполнения подпрограммы прерывания по входу INTX, возникнет прерывание по входу захвата ICP1, то выполнение подпрограммы этого прерывания будет отложено, НО состояние таймера-счётчика 1 будет скопировано в регистры ICR1L и ICR1H, откуда оно благополучно будет извлечено, когда начнёт выполняться подпрограмма прерывания по входу захвата.

Если же мы используем только прерывания по входам INT0 и INT1, то во время выполнения подпрограммы прерывания по одному входу, если случится прерывание по другому входу, то выполнение другой подпрограммы прерывания будет отложено, пока не завершится выполнение данной подпрограммы прерывания, значение счётных регистров (TCNT1L, TCNT1H) в это время будет менятся. И когда наступит время выполнения второй подпрограммы прерывания как мы определим на какую величину нужно корректировать показания, которые с каждым циклом меняются. С входом захвата проще, подпрограмма прерывания также будет отложена, но текущее состояние таймера-счётчика 1 будет скопировано в регистры захвата и нам уже не важно насколько тактов задержится выполнение подпрограммы прерывания по входу захвата - на один такт, на 2, на 5, на 10, на 15.

Кстати, по поводу контроллеров. Если брать контроллеры с максимальным количеством входов захвата, то это например: ATMEGA1280 и ATMEGA2560, там 4 входа захвата ICP. 

Если брать контроллеры с максимальным количеством индивидуальных, настраиваемых входов внешних прерываний, то это AT90USB162, там 8 входов INT0-INT7 и 8 соответствующих им прерываний. 

Также в контроллерах бывают входы PCINT, в некоторых моделях до 32 штук! Но для этих целей они не удобны, так как их нельзя настроить на конкретное изменение: фронт или спад (передний фронт, задний фронт) и прерывание там как правило одно на 8 входов. 

Ссылка на комментарий
Поделиться на другие сайты

чтобы точно не было никаких потерь, выше было предложено применение МК, имеющего 2 захвата.

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

использование одного внешнего прерывания практически не дает преимущества по сравнению с тем, чтобы в прерывании по захвату изменять срабатывание по фронту на срабатывание по спаду и обратно.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

@Starichok совершенно с вами согласен, лучше всего использовать контроллер с двумя входами захвата, хотя бы ATTINY2313 (хотя там один вход захвата относится к 8-ми разрядному таймеру-счётчику, другой к 16-ти разрядному), но автор темы хочет реализовать на ATMEGA8, поэтому приходится давать рекомендации для этого контроллера.

Если период измеряемого нами сигнала большой, то можно просто перенастраивать входы. Если у нас импульс несколько тактов и нам его длительность нужно измерить, тогда настраиваем вход внешнего прерывания на фронт, а вход захвата на спад. Если нам нужно измерить паузу между импульсами и она длится несколько тактов, тогда настраиваем вход внешнего прерывания на спад, а вход захвата на фронт. Причём эти перенастройки можно задать в программе, чтобы они менялись автоматически в зависимости от измеряемого сигнала. Тогда и ошибок никаких не будет. А можно задать чтобы все измерения проводились двумя разными методами и сравнивать результаты, а ошибка может быть только в сторону больших показаний, соответственно меньшее показания - верное, большее - неверное. 

Ссылка на комментарий
Поделиться на другие сайты

В 27.06.2022 в 13:11, korsaj сказал:

идеи, как на краях принять решение что скважность ШИМ 100%(0%).

Может вообще другим путём пойти? Интегрирующая RC-цепочка, полученное напряжение подать на АЦП, а скважность уже рассчитывать по формуле.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Сила с вами прЕбудет, только в том случае, если корпуса м/сх совпадают. А вообще такие вопросы решают иногда заглядывая в datasheet на микросхемы.
    • 350 стоит по умолчанию, вшито . Я так понял. Я включил . У меня сразу лым пошёл и само жало чуть по чернело но ещё рабочее ... Я научился пользоваться термопарой , измеряю, смотрю по таблице - разница очень большая . Кручу ратио - показания меняются, это гуд. Я думал что 100% - это предел. Но они пошли и дальше ..... Отсюда вопрос может кто знает как меняется температура в какую сторону при прокрутке туда или обратно? Хотя бы примерно?
    • Была у меня книжка (что-то типа помощь сельскому радиолюбителю) и в разделе самодельные источники питания был "рецепт" батарейки: две пластины меди и цинк(алюминий, не могу точно утверждать) между ними помещалась промокашка, предварительно замоченная в солевом растворе и присыпанная с одной стороны толченым углем. Элемент позиционировался как походный и потому промокашку сушили и вкладывали между пластин, а при необходимости ее мочили и элемент начинал работать. Точно не помню технологию и могу где-то ошибаться. Так вот вопрос к сторожилам, может кто  помнит данный "рецепт" или книгу в которой он был описан?
    • Попробуйте магнитолу отремонтировать. Говорят помогает. Иногда спасает поиск профильных специалистов по месту.
    • Офигенный заход... Отлично, не смеем отговаривать, хоть это будет дорого или очень дорого и больно. ШТА? При чем тут 220В? что в вашем понимании "нормальная"? Ну так а в чем проблема? Удивительно, учитывая что это основная задача частотного преобразователя. Куда подходит? Зачем он вообще идет? Параметры это агрегата за вас искать надо? Или удосужитесь дать побольше информации? З.Ы. А нафига реактивному дигателю вообще частотник? https://ru.wikipedia.org/wiki/РД-9
    • А что там анализировать? 1) Монтируется успешно. 2) Запрашивается в функции чтения данные с сектором 0, и перед каждым не успешно найденным файлом. 3) если выкинуть отладку, то один файл находит, но чтение буфера 0 и сам буфер пустой. Где-то косяк с конфигами... Кто работал пожалуйста подскажите, чтобы меньше потратить времени... Можно конечно. Какая разница как название указывать? Через массив символов либо явно указав массив символов в виде строки.
×
×
  • Создать...