Jump to content
dron-r

Детектор изменения длительности ШИМ

Recommended Posts

Добрый день.
На ногу МК извне подается ШИМ. По условию задачи этот ШИМ может иметь только две длительности высокого уровня - Т1 и Т2 мс (соответственно если измерить эти длительности, то это будет N1 и N2 отсчетов). Далее, если детектируется длительность T1, то нужно выполнять функцию func1, а если длительность T2 - то func2.

Пример: пусть в начальный момент у нас МК детектирует T1. Далее пользователь что-то сделал (на переключатель нажал), длительность импульса стала T2. В этот момент надо, чтобы произошло прерывание. Снова пользователь нажал (вернул переключатель в начальное положение). Длительность стала снова T1. В этот момент надо, чтобы произошло прерывание.

Если измерять ШИМ с помощью таймеров, то будет генерироваться прерывание. Таким образом основная программа будет выполняться прерывно, пока ШИМ вовсе не исчезнет. Можно ли как-нибудь детектировать длительность ШИМ где-нибудь в фоновом режиме, чтобы основная программа работала непрерывно? А если длительность вдруг изменится, то вот тут уже пусть сработает какое-нибудь прерывание.

Share this post


Link to post
Share on other sites

зачем это нужно? скорости СТМ не хватает два раза за 20мс обработать прерывания?

Share this post


Link to post
Share on other sites

Разве это правильно подобные измерения делать не в фоновом режиме? Т.е. смысл беспокоить МК на каждом импульсе ШИМ, если нужны только моменты изменения ШИМ.

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

а что в этом не правильно,

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

Share this post


Link to post
Share on other sites

@dron-r , если выполнение основной программы так важно, какое максимальное время цикла ее работы?
Запретите выполнение прерываний, определяющих длительность импульсов ШИМ, а в необходимый момент проверяйте флаги прерываний и передавайте управление по своему усмотрению.

Вариантов решения - масса. В том числе и предложенный выше с помощью внешних схем.

Edited by mvkarp

Share this post


Link to post
Share on other sites
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

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

А внешнее управление платой производится с помощью ШИМ.

Share this post


Link to post
Share on other sites
11 час назад, dron-r сказал:

 

Если измерять ШИМ с помощью таймеров, то будет генерироваться прерывание. Таким образом основная программа будет выполняться прерывно, пока ШИМ вовсе не исчезнет. Можно ли как-нибудь детектировать длительность ШИМ где-нибудь в фоновом режиме, чтобы основная программа работала непрерывно? А если длительность вдруг изменится, то вот тут уже пусть сработает какое-нибудь прерывание.

PWM генерируется аппаратно, юзер код никакого влияния на генерацию не окажет.

Кстати -озвучьте частоту PWM.

Может вам подойдет вариант PWM Caprture ? В прерывании вы будете иметь и длительность импульса и период.

Share this post


Link to post
Share on other sites

Частота ~70Гц.

PWM Caprture знаю, так сейчас и делается. Так я подумал, что иметь целое прерывание на измерение параметров ШИМ много. Мне абсолютные значения частоты и duty cycle не нужны. Интересуют только моменты изменения длительности высокого уровня.

Так-то получается прерывание будет вызываться ~70 раз в секунду, а если откликаться только на изменения, то, положим, ~1 раз в 10 минут.

Share this post


Link to post
Share on other sites

Никто не заставляет пользоваться прерыванием - можете отлавливать флаг и обрабатывать его вручную. Ну и 70 раз в секунду едва ли сильно помешает контроллеру.

Share this post


Link to post
Share on other sites

Попробуйте оценить загрузку контроллера прерываниями с частотой 70 Гц и Вы не сумеете такую загрузку обозначить сколь нибудь знАчимой величиной. Однако, вы можете использовать DMA для Input Capture и длиной его буфера редуцировать частоту расчетов. Но реальную интегральную загрузку МК это может и не изменить. Просто будет отложенный расчет и прыгающее окно усреднения вместо скользящего.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Timu4en Jin
      Значит в чем суть, по всем параметрам сгорела микросхема, и она без маркировки, может кто то уже чинил подобный блок, и знает что там и чем заменить, буду благодарен. Я бы загрузил больше фото но больше 10 мб нельзя. Стрелками указал что заменил. Высоковольтный диод c3d100, 10ом резистор, конденсатор на 100пф 630в, рядом с этой микросхемой была перемычка, нулевой резистор и она имела Сопротивление в 102ом,после всего этого что заменил никаких результатов. Помогите кто знает


    • By Павел Лопатин
      Добрый день!
      Подскажите, пожалуйста, можно ли вынести переменный резистор 16K1-B10K, L20KC, 10 кОм с ШИМ регулятора на отдельную плату? 
      Какие провода лучше использовать? На какое расстояние можно вынести (длина провода) и изменятся ли от этого характеристики? (все-таки, как я понимаю, появится дополнительное сопротивление от провода)
      ШИМ покупной в RDC2-0024 - фото и схема в аттаче
      DOC002726141.pdf
    • By Kirillius Labutin
      Добрый день!
      Имеется готовый лазерный модуль с драйвером (стабилизатор тока и, наверное, напряжения). 
      Хочу регулировать яркость лазера с помощью ШИМ с МК, гугл сказал что лучший вариант - шунтирование лазера. Но драйвер устроен таким образом, что в нём с питанием напрямую не связан ни "+" ни земля лазера. Набросал такую схемку, чтобы реализовать это через оптопару.

      Внимание, вопрос)
      1. Заработает ли такая схема?
      2. Какой посоветуете транзистор Q1 и оптопару? Макс. напряжение в цепи - 5В, ток - 0.5А Я думаю что-нибудь вроде IRLL014TRPBF
      3. Какой выбрать номинал резистора R1 для разряда Q1? Частота ШИМ планируется в районе 1кгц.
    • By SigmA
      Доброго времени суток всем. Для своей новой жены захотелось мне сделать сердечко на atmega8, с кучей эффектов и т.д. Так вот, разные мигалки-переключалки св-диодов я написал, использовал delay. Но мне этого стало мало и я решил подключить шим программный. Отдельно от всей программы шим работает как нужно, так же и переключалки работают отдельно от шим, но вот когда я соединяю это всё воедино то работает только шим и не переходит дальше по коду.Я так понимаю, что таймеры и delay вместе работать не могут? Но если могут, то как?
      #include <mega8.h> #include <delay.h> #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 unsigned char i, s,; unsigned char green=255; unsigned char green_b; //переменные, для буферизации значений скважности ШИМ unsigned char count; //переменная- счетчик вызовов обработчика прерываний unsigned char temp=1; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { count++; if (count == 0){ //если счетчик переполнился и принял значение 0 green_b = green; GREEN = 1; } if (green_b == count) { GREEN = 0;} } void main(void) { PORTC=0x0F; //конфигурируем порт DDRC=0x0F; TCCR0=0x01; //настраиваем таймер TCNT0=0x00; TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0 #asm("sei") //глобально разрешаем прерывания while (1) { for (i=0;i<3;i++) { if (temp==1) {if (green < 255) green += 1; else temp = 2;} if (temp==2) {if (green > 0) green -= 1; else temp = 1;} delay_ms(1000); }; s=7; for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.0=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.3=1; delay_ms(200); PORTC.3=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.3=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.0=1; delay_ms(200); PORTC.0=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.2=1; delay_ms(200); ; PORTC.1=1; delay_ms(200); PORTC.0=1; delay_ms(200); PORTC.3=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.0=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.1=1; delay_ms(200); ; PORTC.2=1; delay_ms(200); PORTC.3=1; delay_ms(200); PORTC.0=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.3=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC=0x01; delay_ms(200); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x09; delay_ms(200); PORTC=0x0A; delay_ms(200); PORTC=0x0C; delay_ms(200); PORTC=0x0D; delay_ms(200); PORTC=0x0E; delay_ms(200); PORTC=0x0F; delay_ms(200); PORTC=0x07; delay_ms(150); PORTC=0x0B; delay_ms(200); PORTC=0x03; delay_ms(250); PORTC=0x05; delay_ms(300); PORTC=0x09; delay_ms(350); PORTC=0x01; delay_ms(400); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x00; delay_ms(200); } for (i=0;i<=5;i++) { PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(1000); } } }  
  • Сообщения

    • Я просто уже ахреневаю с вашего дебилизма. Схема сделана и проверена Если кто-то сделает схему в таком виде, как ниже, то может сразу застрелиться, это не СВЧ монтаж.
    • На выходе от 2.3 В до 4.3 В при регулировке R3.
    • @Alkarn  Почему подано на вход схемы 1 Вольт ? Начать с 1 мВ хотя бы, но вообще, схема работает с уровнями ниже.  R3 переменный резистор. Где он ? Это моделировано на МС ? Это твои проблемы.  Сначала это все моделировалось в мультисиме и потом уже собиралось практически  
    • именно так. Пульсации в источниках никто не отменял. Или у вас все источники только аккумуляторы и без внутреннего сопротивления? я вам ребят скажу, что хоть сила и собрана по этой схеме, но она далеко не торт на самом деле. Если смотреть с позиции цифрового управления, то линейность на начальном участке у нее отвратная. Стабильность тоже так себе, потому как управление и ОС идет по разным входам ОУ и очень зависит от параметров каждого (!) конкретного ОУ. И это только основные проблемы. Есть еще куча нюансов. Но чтобы все их затронуть и описать, надо книжку написать по электронным нагрузкам и их схемотехнике Чисто ради разминки ума - кто нибудь сможет мне доходчиво рассказать как в моей схеме работает режим CR на умножителе AD633? Ну к примеру. И обьяснить хоть в общих чертах почему я не смог достигнуть сопротивления ниже 1 Ом? А вроде узелок такой простенький достаточно... Полноценная тема для главы той книги
    • РадиоНастройщик, кто вам сказал, что вы что-то понимаете в схемах, и можете поучать других? Не поленился, и промоделировал начальную схему и вашу. Результат еще раз подтвердил то, что и так было очевидно - начальная схема великолепно работает  и индицирует СВЧ сигнал с уровнем менее 100 мВ. Ваша даже при уровне входного сигнала 1 В на выходе выдает ослабленный сигнал входной частоты. Начните с Борисова и Айсберга. Иначе остаются 2 предположения:  1-вы злостный тр олль, 2 - надо обратиться к психоаналитику для коррекции самооценки.  
    • ошибка с тиристором - но интересует больше разводка земли у МС и влияние перемычек 
    • скину свою защиту сюда - может кому пригодится - так как чую - не скоро доберусь до задуманного усилка) схема комплексной зашиты на ОУ ЛМ324 , схема зашиты проверена - в кулере применил полевик - нет смысла регулировать - ес радиаторы горят) - зашита по току на оптопаре - честно - не проверял -но- по идее при перегрузе той или иной полярности должна сработать - желательно ес слишком мощный умзч - добавить резистор в цепь шунта - для ограничения тока - не спалить оптопару , печатку не делал - так как планировал делать все полностью одной платой - весь УМЗЧ и добавить еще пару задуманных схем - но это позже.
×
×
  • Create New...