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

adnega

Свой
  • Постов

    3 603
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные adnega


  1. тут такое дело: нет, период не важен. Он всегда будет одинаковый. Но ширина пульса разная может быть. Например пока ширина входного пульса меньше 1.5мс я не хочу чтобы срабатывало прерывание, но если вдруг ширина превысит скажем 1.5мс, мне нужно чтобы сработало прерывание.

     

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

     

     

    понятно, тогда покопаюсь дальше, напишу. а так если есть еще какие идеи будет интерестно узнать.

    Для тактовой 168МГц 1.5мс это аж 252000 тактов.

    Если процедура обработки займет 100 тактов, то проц будет нагружен на 0.04%.

    Можно не заморачиваться и сделать обработку в прерывании.

    Хотя есть одна уязвимость. Если на вход подать меандр с частотой мегагерц 10, то скорее всего все умрет.

    Я бы сделал так:

    1. У Вас уже есть механизим получения длительности и периода импульса аппаратно на таймере (правда, прерывания по первому и второму каналу нужно отключить).

    2. Добавляете еще один (третий) канал сравнения на 1.5мс (и включаете ему прерывания).

    3. При возникновении события по третьему каналу входим в прерывание и анализируем флаги в статусном регистре. Если флаг второго канала установлен, то спад от импульса пришел ранее 1.5мс и это короткий имульс - отбрасываем. Если флаг второго канала НЕ установлен, то спада импульса еще не было, и получается импульс шире 1.5мс - интересующий нас случай.

    4. Можно показать, что сигналы короче 1.5мс (частота выше 666Гц) не будут вызывать прерывания. В самом хужшем случае прерывания будут каждые 1.5мс с указанной выше нагрузкой (порядка 0.04%).

     

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

     

    Но теперь мне нужно чтобы прерывание срабатывало только тогда когда скажем ширина пульса имеет определенное значение (или выше/ниже определенного значения).

     

    Период импульса не важен?

    Если нужна аппаратная реализация с генерацией прерывания при поступлении импулься широной от T1 до T2 без участия CPU, то самое простое что мне видится:

    - нстроить таймер на запуск по фронту с входа;

    - настроить первый канал на время T1 с генерацией DMA-запроса;

    - настроить второй канал на время T2 с генерацией DMA-запроса;

    - DMA-запрос от первого канала настроить на запись управляющего слова в регистр РАЗРЕШЕНИЯ прерывания от внешнего входа по спаду импульса;

    - DMA-запрос от второго канала настроить на запись управляющего слова в регистр ЗАПРЕЩЕНИЯ прерывания от внешнего входа по спаду импульса;

    - иметь ввиду, что DMA имеет "приличное" время отклика на событие (порядка 12 тактов), поэтому очень короткие импульсы (с точность 100нс) отловить не получится.

     

    Читать TIMER, DMA, EXTI.

    Надеюсь, ясно описал)

     

    PS. Кстати, может и не получится(

    Чисто аппаратная реализация (без участия CPU) не всегда возможна.

    Почему нельзя использовать прерывания?

  3. При температуре ниже примерно +10 градусов перестают работать часы. Причем при считывании счетчика RTC возвращает 0.

    В свое время морозили STM32F103RET6 до минус 65C. До минус 50C все работало, при минус 60C начинало отказывать (скорее всего логика и ключи, т.к. проц по интерфейсу работал исправно), при прогреве до минус 55C работоспособность восстанавливалась. Часовой кварц такой: KX-327ST.

  4. Есть кусочек кода

     

    tI2C->I2CLK = (u32divider & ~0xFF)? 0xFF:((u32divider & ~0x03)? u32divider: 4);

     

    взят из библиотеки под МК. Собственно вопрос что означает этот код, а конкретно что делает оператор"?" и ":"?

     

    Упрощенная запись оператора if

    if(cond) x=val1;
    else x=val2;
    
    может быть записано так
    
    x = (cond)? val1 : val2;

  5. Из плюсов "дёшево и просто" следует исключить, ибо моточные изделия никогда дешёвыми не были. Это в одном экземпляре Вы можете намотать колечко самостоятельно.

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

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

    Есть готовые трансформаторы 1:1 по 9 руб./шт. Поэтому все же "дешево".

    По поводу наводок. Самая распространенная 50Гц и гармоники. Поскольку на входе индуктивность (причем маленькая, около 100мкГн), то для такого низкочастотного сигнала трансформатор превращается в "гвоздь". Моделирование показывает, что практически прямое (через 10 Ом) попадание 220В 50Гц на вторичку трансформатора не оказывает ни какого влияния на работу схемы (правда, моделька с линейной индуктивностью и не учитывает насыщение). К тому же ток под 30А легко расплавит предохранитель на выходе устройства.

    И наоборот, высокочастотный 5МГц сигнал (так же 220В через 10 Ом) с учетом индуктивности проводов и входной емкости 560пФ практически полностью шунтируется емкостью. На первичной стороне конечно наблюдается модуляция, но около 10%.

    Все становится плохо только в районе 200кГц. Схема в указанных выше условиях не то что не работает, а может и "пыхнуть первичкой" (на коллекторе транзистора порядка 80В).

  6. Сделал примерно по такой схеме (см. вложение). Только трансформатор сделал сам: ферритовое кольцо (М2500) К10х6х4.5, 16 витков первичка, 16 витков вторичка (обмотки не касаются друг друга, занимают сектора градусов под 120). Софт написал для LPC1111FHN33/101 - обрабатывает 8 входов, ток потребления всех схемы порядка 13мА.

     

    Периодически транзистор открывается коротким (420нс) импульсом, затем через время T1 в течение времени T2 ждем появления лог. 0 на входе. Если ноль не появился - значит КЗ, если появился - ОБРЫВ. T1 - должно быть больше 600 "попугаев" из приложенного рисунка. T2 - любое, чтобы туда попадали импульсы от ОБРЫВа (скорее влияет на время опроса). Частота колебаний порядка 200кГц (зависит от номиналов в схеме и длины проводов).

     

    Из плюсов: дешево, просто, гальваноизоляция от основной схемы и между каналами, защищено от НЧ и ВЧ наводок (?), нагрев феном до 100С не влияет на работоспособность.

     

    Из минусов: зависит от номиналов и длины проводов (впрочем, как любая аналоговая схема), чувствительна к емкости и сопротивлению на линии. Например, два конца могли бы служить датчиками протечки воды на полу))

     

    Из вопросов:

    1. Как с наводками? 50Гц, конечно не проходят, но как быть с другими частотами и энергиями?

    2. Как с излучением? Судя по потребляемой мощности энергии не так уж и много, но как оценить?

    3. Можно рекомендовать к применению данную схему?

    post-27702-1346505657_thumb.png

    post-27702-1346505666_thumb.png

  7. Всем привет)Не могу понять, почему в даташите нигде не написано на какой ноге висит 16-17 канал АЦП, даже в MicroExplore их нет(не подскажите?

    "Смотрите раздел Electrical characteristics, где приведены реальные значения для V25 и Avg_Slope" где находится этот раздел ? какой даташит?

     

    По документации. Есть три основных документа:

    - Datasheet (DS). В нем описаны всякие разные чипозависимые вещи. Напряжения, времянки, распиновка корпуса и т.п. Короче, справочник с цифрами.

    - Reference Manual (RM). В нем описано как программировать семейство микроконтроллеров. Регистры, схемы, порядок инициализации и т.п. Короче, справочник по регистрам.

    - Errata Sheet (ES). В нем описано какие проблемы могут быть у микроконтроллера. Каждай раздел состоит из описания проблемы и способа ее решения. Короче, справочник по ошибкам.

     

    У Вас все эти документы есть? Последних версий?

     

    Кроме основных документов могут быть полезными AN (примеры применений), справочник по программированию Flash, справочник по ядру Cortex и т.п.

     

    При желании все документы без труда ноходятся на www.st.com

     

    Так вот, где сидит "16-17 канал АЦП" можно узнать из RM; какая частота у АЦП и ЦАП, коэффициенты для температурного сенсора - из DS.

  8. пробовал эти переменные вообще глобально объявлять, изменять их в обработчике, а потом в основной функции из них читать в другие переменные, тоже самое, получаю нереальные испорченные значения. что еще может быть не так?

    можно на ваш ir_get посмотреть?

    хочу увидеть как вы сохраняете данные и где именно объявляете переменные?

    переменные объявлены так:

    volatile int        ir_pulse;
    volatile int        ir_period;

     

    В ir_get нет ничего специфичного.

    Переменные у Вас равны 0xFFFFFFFF.

    Правильно ли Вы смотрите их отладчиком?

    Дошагиваете отладчиком до места присваивания из регистров?

    В каждом ли прерывании переменные равны 0xFFFFFFFF (в первом, в последующих)?

  9. не могу понять почему так? пробовал объявлять эти переменные в других местах кода итд, тоже самое почти что.

    почему в обработчике прерывания не могу считать верные значения, как я это делал в беспрерывном цикле без прерываний?

    Может, "volatile" добавить?

  10. подключил к ножке PA1 пульс (1.5мс ширина, период 15мс), поставил брейкпоинт внутри функции прерывания, и оно не происходит.

    что там еще может быть?

    и еще вопрос, как именно понимать это максимальное разрешение? т.е. это количество клоков которое учавствует в сэмплингер входного сигнала? на Рис. 133, стр. 373 Мануала, устанавливая PSC=720 мы контролируем CK_INT который на входе мультиплексора? или как?

    Не вижу настройки NVIC.

    "Максимальное разрешение" - множитель задающий масштаб в регистрах захвата.

    В примере при тактовой 72МГц, получается масштаб "единица на 10мкс".

  11. с TIM2_CCR1, но почемуто читается только 0.

    Дык таймер-то никто не запустил.

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

    Суть такова:

    - по фронту импульса таймер сбрасывается и генерится прерывание, но предварительно сохраняется текущее значение таймера в первый (не путать с CCR1) регистр захвата;

    - по спаду импульса копируется текущее значение таймера во второй регистр захвата;

    - в прерывании имеем период и длительность импульса;

    - можно настроить прерывание по переполнению и иметь информацию об отсутствии импульсов.

     

    Например, так:

    //-------------------------------------------------------------
    // init_TIMER2(void)
    //-------------------------------------------------------------
    // Инициализация таймера 2 захват параметров ШИМ-сигнала на
    // линии 2
    //-------------------------------------------------------------
    void __inline init_TIMER2(void)
    {
        TIM2->CR1=0;                // счетчик выключен
        TIM2->PSC=720;            // максимальное разрешение
    
        TIM2->CCMR1=
            (2<<TIM_CCMR1_CC1S)
            |(1<<TIM_CCMR1_CC2S);
    
        TIM2->CCER=
            (1<<TIM_CCER_CC1E)
            |(1<<TIM_CCER_CC1P)
            |(1<<TIM_CCER_CC2E)
            |(0<<TIM_CCER_CC2P);
    
        TIM2->SMCR=
            (4<<TIM_SMCR_SMS)
            |(6<<TIM_SMCR_TS);
    
        TIM2->DIER=6;
    
        TIM2->CR1=1;
    
    }
    //-------------------------------------------------------------
    // void TIM2_IRQHandler(void)
    //-------------------------------------------------------------
    // Прерывание от T2
    //-------------------------------------------------------------
    void TIM2_IRQHandler()
    {
        if(TIM2->SR&2)
        {
            ir_pulse=TIM2->CCR1;
    
        }
        if(TIM2->SR&4)
        {
            ir_period=TIM2->CCR2;
            ir_get(ir_pulse,ir_period);
        }
        TIM2->SR=0;
    }

  12. мне кажется что клок таймера ТИМ3 = клок периферии * 2

    только лишь в даташите на стр. 29 в табличке видно что максимальная частота счетчика в два раза больше макс. частоты периферии таймера.

    А в Reference Manuale на рисунке Clock Tree можно найти прямоугольник типа:

    if(APBx pres = 1 x1)
    else x2

    Т.е. если для APB Вы установили отличный от 1 делитель (а в случае 168МГц это так), то частота таймеров увеличивается в два раза.

    PS. На STM32F1xx тоже так было...

  13. Из википедии:

    Многие устройства D-Link работают под управлением специализированных ОС с ядром Linux, что даёт права и возможности изменения прошивок (firmware) и создания альтернативных прошивок. Существуют отдельные энтузиасты, а также команды разработчиков альтернативного встраиваемого программного обеспечения[1][2] для ряда моделей многих производителей телекоммуникационного оборудования. У части потребителей эти прошивки пользуются популярностью, так как добавляют функциональность устройствам, а также исправляют ошибки более оперативно, чем официальные службы поддержки...

     

    По моему, самый простой и дешевый вариант для управления светодиодом по WiFi с питанием от розетки.

  14. Смастерил для одной поделки линейный источник питания.

    Ток потребления - порядка 1А.

    Изначально использовал диодный мост RS204. Для него допустимы ток 2А.

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

    просто неприятно.

    Поменял на мост с предельным током 6A (KBU6G). Нагрев поменьше, но тоже выше того, что ожидал.

    Отсюда пару вопросов:

    - С каким запасом по току нужно брать диодный мост?

    - Допустимый ток указывается при условии использования радиатора?

    Еще неплохо обращать внимание на падение напряжения открытого перехода. Где-то читал про подделки диодных мостов. Недавно товарищ FR307 купил, так они в БП калились и... сильно отличались по внешнему виду от "холодных" FR307.

  15. Возможно. Но если я вижу активность на TXEN, значит из MAC все уходит. Получается, что на физике запрещена трансляция броадкастов? Такое может быть?

    Физика KSZ8041TL.

    У меня (KSZ8041NLI) работает нормально. Правда, все самописное.

    post-27702-1345041552_thumb.png

  16. Ого, тк это еще и очень важный регистр)

    Странно, почему при включении в регистре AFR, любого, второго ШИМ-а, МК начинает себя вести фантастическим образом. Все зависает!!! кроме того ШИМ-а, которому последним установили AFR.

     

        //-----------------
        GPIOA->MODER    |= 0x2;                        // Alternate function mode
        GPIOA->AFR[0]    |= 1;                        //
        TIM2->CCMR1        |= TIM_CCMR1_OC1M;            // инвертированный шим
        TIM2->CCER         |= TIM_CCER_CC1E;            // разрешаем таймеру использование ШИМ
        TIM2->CCR1        = 22;
        TIM2->CR1         |= TIM_CR1_CEN;                // запуск таймера

    Может Вы запустили ШИМ на ноге PA0, которая в STM32F4DISCOVERY соединена с питанием через резистор (330 Ом) и конденсатор (100 нФ)?

  17. Посмотрел. TXEN есть. На TXD0 смотрел - тоже чего то есть. Wireshark все еще ничего не видит.

    Странно.

    У меня на F4 пакеты стабильно принимались, но отправка работала очень не стабильно (иногда без потерь, иногда 100% потерь). TXEN и TXD проявляли активность. Проблема была в том, что для этих ног GPIO были сконфигурированы со SPEED 2МГц. Поставил 100МГц - уже третий день ни одного ping-пакета не потеряно.

    Проверьте на всякий случай свои настройки.

    Кста, тоже пользуюсь wireshark (под Win XP) - проблем с потерей пакетов не замечал.

  18. Воу, работает! По видимому, это глупый вопрос, но все же! Если чесн то я не оч понимаю что этот регистр вообще делает(

    что означают все эти значения?

    Это не глупый, а правильный вопрос (которого от Вас ждут второй день).

     

    Набор регистров AFR выбирает для пина необходимую альтернативную функцию.

    Например, на выбранном Вами пине PA2 "сидит" еще:

    - TIM2_CH3;

    - TIM5_CH3;

    - TIM9_CH14

    - USART2_TX;

    - ETH_MDIO.

     

    Каким образом камень узнает, что вы хотите видеть на пине PA2? Никаким!

     

    Для этого Вы настраиваете PA2 для работы, скажем, с TIM2_CH3 (а это AF1) в регистре альтернативных функций AFR. Поглядеть на каком пине что сидит и номер альтернативной функции можно в datasheet в таблице "Alternate function mapping".

     

    Справедливости ради замечу, что раньше выбор той или иной альтернативной функции определялся тактированием того или иного периферийного узла и не было возможности частично задействовать некоторые пины в группе выводов для SPI, а некоторые для TIMER. От этого errata у STM32F1xx разрасталась. И слава Инженерам STM, что в F4 нет такого гемора.

     

  19. ну что вы :laughing: я, конечно, совсем новичок, но тактирование порта я включать умею)

    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOAEN;

    ну а по поводу регистра MODER я, таким образом, хотел наложить маску, дабы определить ногу PA2 как выход- хотя тут да!!!! протупил xDDD

    нужно было наложить 0х10 )Спасибо большое за замечание)

    Кстати по поводу регистра MODER, я в даташите не нашел указаний по поводу конфигурации ног порта, т.е ШИМ должен работать при любой конфигурации регистра MODER.

    Вы же аппаратный ШИМ от таймера решили задействовать?

    Тогда Вам нужно "Alternate function mode", а это маска (2 << (2 * 2)) == 0x20.

    И не забудьте GPIOA->AFRL = (1 << (2 * 4)) == 0x100.

    Рекомендую прочитать/посмотреть datasheet (DS) в районе 58 страницы.

    И Reference manual (RM) в районе 139 страницы (и ниже).

     

    PS. Советую неспеша разобраться с предметной областью самостоятельно, а не заводить "лишние" темы на форуме.

    Вопросы лучше задавать конкретные: хочу сделать то-то, делаю так-то, не получаетя.

    Проверьте досконально свой код на предмет опечаток, описок, соответствия DS и RM.

     

    До ШИМа каких-нить успехов достигли? Ну, там, светодиоды позажигать получилось ли...

×
×
  • Создать...