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

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


korsaj

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

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

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

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

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

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

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

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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