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
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

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

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

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

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); } } }  
×
×
  • Create New...