Типиктивное запуск прерывания с использованием внутренних подтягиваний

Rogerclark
Сб 17 декабря 2016 г., 22:18
Я только что построил небольшой проект, в котором используется Maple Mini с монохромным ЖК -дисплеем Nokia 5110, а также вращающийся кодер и вход внешнего переключателя (переключатель тростника для обнаружения магнита), а также высокий ток PUT 1A с использованием FET FET водитель.

Я использую внутреннюю подтягивание 22K на входе от вращающегося энкодера, а также от входа переключателя тростника, но я заметил, что, кажется, получаю ложные триггеры на входе переключателя тростника, а в последнее время на входе вращения вращаются.

Я использовал внутренний подтягивание 22K, E.глин.

pinmode (push_button, input_pullup);

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

Я полагаю, я мог бы припаять на внешних подтягиваниях E.глин. 4.7K или, возможно, даже 1K, чтобы предотвратить ложные триггеры, но кажется странным, что STM будет иметь 22K в качестве внутреннего подтягивания, если его значение будет слишком высоким, чтобы можно было использовать использование.

Также может случиться так, что многие мисс-триггеры вызваны шумом поставки.

Примечание. Я выключаю вращающийся коммутатор, используя 100 -НФ -крышку по всему переключате Я хотел бы ?

КСТАТИ. Я питаю Maple Mini на VIN через внешнюю подачу 9V, потому что выключенный выход высокого тока, который управляет соленоидом, предназначен для работы с 12 В, но 9V, кажется, достаточно (но 5V недостаточно)

Любые мысли о том, что я делаю не так.

Ахулл
Сб 17 декабря 2016 г., 22:44
Что показывает «Область?

Mrburnette
Сб 17 декабря 2016 г., 22:57
Похоже, у вас на руках есть радиоприемник. Я предполагаю, что 50 Гц шум.

Луча

Ахулл
Сб 17 декабря 2016 г., 22:58
Mrburnette написал:Похоже, у вас на руках есть радиоприемник. Я предполагаю, что 50 Гц шум.

Луча

Rogerclark
Солнце 18 декабря 2016 г. 2:32 утра
Я не смотрел на прицел, так как я построил 2 из них, а подразделения и тот, который демонстрирует вину, - это тот, который я строю для своего отца.

Я согласен, что это звучит так, будто входные провода слишком длинные, но я изменил код, чтобы отключить детектор внешнего переключателя тростника (который находится на 10 -футовой паре проводов), и он все еще идет не так, поэтому я думаю, что его промаль вращающийся энкодер и вращающийся энкодер составляет всего около 2 дюймов, внутри коробки.

Честно говоря, я разрезал некоторые углы, чтобы сохранить необходимость припаять нагрузки на внешние компоненты, я использую международные подтягивания 22K на всех входах, которые представляют собой 2 поворотных сигналах энкодера, а также на наглаженную кнопку, которая находится на моем роторном энкодере, и и Также используйте подтягивания 22K на датчике переключателя тростника.

Для дебайта у меня просто есть 100 -нф -конденсаторы для GND на всех этих входах.

Но изначально у меня была проблема, где, если я нажал кнопку нажатия на вращающемся энкодере, я получу спусковой кноп.
И, чтобы остановить это, мне пришлось изменить свою проводку, чтобы у него не было общего провода заземления от системы GND на кнопку GND и заземление вращающегося энкодера.

Я предположил, что проблема заключалась в том, что когда кнопка была нажата, она шла о 100NF до GND (через кнопку).

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

По сути, я делаю то же самое, что и Ник Гэммон здесь

http: // www.Гаммон.компонент.Au/Forum/?ID = 11130

Изображение

Но кнопка на роторном энкодере дезантируется таким же образом и разделяет общий провод GND

Rogerclark
Солнце 18 декабря 2016 г. 3:00 утра
ХОРОШО.

Я узнал что -то новое.

По какой -то причине я думал, что внутренние подтягивания были 22к. Но они не !

На стр. 62 таблицы данных

http: // www.ул.com/content/ccc/resource/ ... 161566.PDF

Это говорит

RPU

Слабое подтягивание эквивалентное резистор MIN 30K, типичный 40K, максимум 50K

Мои, кажется, около 42 тыс.

Так что на самом деле мне нужен гораздо более низкий внешний резистор, так как эти «слабые» подтягивания далеки от больших, чтобы можно было использовать в моем приложении (по крайней мере, для линий прерывания)

Пито
Солнце 18 декабря 2016 г. 10:05
Также используйте R = 1K-2K2 последовательно с контактами переключателей, см. Схема в предыдущей теме ROT ENC.
Вы можете попытаться пройти 3 поворота (все провода, включая GND), тоже через ферритовый шарик с более длинными кабелями.. Жизнь рядом с радиостанцией :)

Rogerclark
Солнце 18 декабря 2016 г. 11:17 утра
Пито написал:Также используйте R = 1K-2K2 последовательно с контактами переключателей, см. Схема в предыдущей теме ROT ENC.
Вы можете попытаться пройти 3 поворота (все провода, включая GND), тоже через ферритовый шарик с более длинными кабелями.. Жизнь рядом с радиостанцией :)

Пито
Солнце 18 декабря 2016 г. 11:34
Без моделирования конденсатор 100NF @3V закороченный через 0.Сопротивление коммутатора 010 дюймов может вызвать усилители токов :)

Ахулл
Солнце 18 декабря 2016 г. 14:21
Пито написал:Без моделирования конденсатор 100NF @3V закороченный через 0.Сопротивление коммутатора 010 дюймов может вызвать усилители токов :)

Racemaniac
Солнце 18 декабря 2016 г. 15:15
Кстати, просто интересно, насколько необходимо использовать прерывание на кодере.
Я начал так же на дешевом китайском роторном энкодере, который у меня был, но когда я заметил, что 1 шаг запустил прерывание более 50 раз, я посмотрел на сигнал моего энкодера с логическим анализатором, и между одним промежуткой было около 2 мс. смену линии состояние, а затем другое. Так что теперь я закончил тем, что просто сделал программу, которая выбирает штифты каждую миллисекунду (и она некоторого разъединяется, требуя, чтобы PIN -коэффициент имел новое состояние на 2 последовательных чтения), и он очень надежно работает, и вряд ли облагает налогом процессор вообще , поэтому, если ваш энкодер не сможет сделать много шагов в секунду или не имеет гораздо лучшего качества, чем то, что у меня есть, использует прерывания и все эти усилия в оборудовании, выступая действительно необходимым?
(И, в конце концов, он работает на таймере, который также генерирует прерывания, признаюсь: P)

Пито
Солнце 18 декабря 2016 г. 16:57
Долгое время назад я использовал для использования PIC16 (DDS VFO) с аналогичным образом - прерывание ~ 4 кГц, при прерывании подпрограммы энкодера, чтение значений ENC, включительное ускорение, увеличение/уменьшение глобального VAR и флаг ENC был активным).

Кстати, 100nf @3.3 В, закороченные через 0.1om (ESR+Cont Res) создает импульс длиной 30 нс 30А тока.. (Часы MCU - 14NS).
Переключение тока 100nf.jpg
Переключить ток 100NF.JPG (53.74 киб) просмотрено 553 раза

Пито
Солнце 18 декабря 2016 г. 18:50
Учитывая пролетные провода длиной в 2 раза (2x 100 нх), ситуация будет (при условии 1NS края вождения импульса):
Переключение тока 100NF 200NH 0_1OHM.JPG
Переключить ток 100NF 200NH 0_1OM.JPG (81.29 киб) просмотрено 549 раз

Rogerclark
Sun 18 декабря 2016 г., 8:31 вечера
Линии до роторного энкодера на самом деле довольно короткие и относительно толстый провод.
Картина 21.jpg
Изображение 21.JPG (110.52 киб) просмотрено 541 раза

Mrburnette
Пн 19 декабря 2016 г. 1:26 утра
Я думаю, что внутренние подтягивания слишком слабы в этой среде высокого шума. Правило правила для подтягивания/выпадения составляет 10 тыс. Я сомневаюсь, что это устранит вашу проблему.
- Плохой входной источник постоянного тока на длинную длину,
- Пластиковый корпус
- FET + соленоидная индуктивная нагрузка

Я бы минимизировал стабильность напряжения с помощью 1A DC-DC
Кэпки должны быть низкими кепками ESR, Tantalum предпочтительным
Используйте ферритовые фильтры между кленом и FET

Вы, вероятно, можете жить с пластиковой коробкой, но используйте заземление между общими землей и DC-DC Ссылка.

Луча

Ахулл
Пн 19 декабря 2016 г. 1:43
Сколько тока протекает соленоид? Какой пит вы используете? С высоким или низким боковым переключением? Какой диод вы использовали? Диодный жареный?

Rogerclark
Пн 19 декабря 2016 г. 2:34
Привет, Энди,

Соленоид этот

http: // www.eBay.компонент.AU/ITM/WS-2X-5-6LBS ... 2245433151

Предполагается, что он будет 12 В, но обычно запускает его от 6V, поскольку он производит достаточное количество магнетизма при 6 В, однако иногда мне нужно использовать 9V.

FET 2N7000, который оценивается в 200 мА непрерывно и 500 мА, когда импульс. И я включаю FET только на 5 мс, а затем на 350 мс.

Соленоид имеет сопротивление постоянного тока 50 Ом, поэтому при 9 В максимальный ток, нарисованный, должен быть внутри спецификации для FET

Diode Flyback - это 1N4148 - меня можно взорвать, но у меня нет подразделения, показывающего проблему (длинная история)

У меня есть частично построенный резервный блок (тот, который я сфотографировал), поэтому мне нужно будет добавить соленоид и FET и т. Д., А прикрепите свою область и посмотрю, что происходит !

Но поскольку проблема запуска мисс, по -видимому, вызвана исключительно путем нажатия кнопки на вращающемся энкодере, а не только FET и соленоидом, я думаю, что основная причина заключается в том, что внутренние подтягивания «слабые», как описано в STM. на документах.

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

Стивестронг
Пн 19 декабря 2016 г., 9:37 утра
Rogerclark написал:Но я согласен, что у меня должен быть резистор в серии и с кодером, а не со 100NF, который закрыт энкодером.

Роффи
Пт 23 декабря 2016 г., 11:07
Я не знаю, будет ли это полезно или нет, но у меня были проблемы с использованием нескольких INT при работе с 6 кнопками плюс пара переключателей BCD. Я никогда не был поклонником Edge, запускаемых INT в, возможно, шумных средах. Может быть боль.
Я закончил тем, что запустил все «общины» через основание NPN и использовал только одну линию в качестве Int. Базовые и коллекционные линии были отделены, и мне пришлось иметь дело только с этим входом из одного края.
Хорошо, это означало сканирование во время Int, чтобы увидеть, что активно, но это, безусловно, позволило мне адаптировать схему к моим нуждам.

Rogerclark
Пт 23 декабря 2016 г., 19:23
Я думаю, что важный урок для меня заключается в том, что внутренний подтяжка очень слабая.
Возможно, достигая 50 тысяч, и, вероятно, полезен только для входов между устройствами на одной печатной плате.

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

Fredbox
Сб 24 декабря 2016 г., 4:23
Rogerclark написал:
По сути, я делаю то же самое, что и Ник Гэммон здесь

http: // www.Гаммон.компонент.Au/Forum/?ID = 11130

Изображение

Роффи
Сб 24 декабря 2016 г. 8:40
Это выглядит интересно, и полезная ссылка.... Single Int с использованием изменения .... должно быть гораздо более надежным.... Спасибо, что поместили это.
Однако я отмечаю, что вы используете 0.1UF электролитики в вашей цепи. Я бы хотел поменять их на приличную керамику и заземлить любые металлические участки на кодере, если они изолированы. Просто мое предпочтение хотя :)

Mrburnette
Сб 24 декабря 2016 г., 17:06
Роффи написал:Это выглядит интересно, и полезная ссылка.... Single Int с использованием изменения .... должно быть гораздо более надежным.... Спасибо, что поместили это.
Однако я отмечаю, что вы используете 0.1UF электролитики в вашей цепи. Я бы хотел поменять их на приличную керамику и заземлить любые металлические участки на кодере, если они изолированы. Просто мое предпочтение хотя :)

Октавио
Солнце 17 сентября 2017 г. 8:25 вечера
Приведенный ниже код подсчитывается при нажатию кнопки, кнопка подключена к контакту с конденсатором 10 UF, параллельно с фильтрацией позитивного шума, используется только внутренний подтягивание, и он работает ОК, если я нажимаю кнопку между вызовами на «последовательный.println (f1); "Но если я уменьшу задержку до 100 мс, то он имеет около 20 раз для каждой кнопки нажатия.В качестве работы я собираюсь напрямую прочитать статус порта и добавить цифровой фильтр, но это, кажется, важная ошибка в библиотеках Arduino или в STM MCU.Тест был проведен с USB -серийным адаптером.


void setup() { RCC_BASE->APB2ENR |= 0x10; // enable GPIOC clock GPIOB->regs->CRL = (GPIOB->regs->CRL & 0xFFFFFFF0) | 0x00000003; //set PB0/Pin3 as output (max speed 50MHz) } void loop() { //Set Pin3 (HIGH) GPIOB->regs->BSRR = 0b0000000000000001; //lower 16 bits //Clear Pin3 (LOW) GPIOB->regs->BRR = 0b0000000000000001; //lower 16 bits }

Rogerclark
Солнце 17 сентября 2017 г. 22:33
Внутренние подтягивания практически бесполезны для кнопок и т. Д.

Спецификация говорит, что их значения могут варьироваться от 30 тыс. До 50 тысяч

Используйте подходящую ценность внешней подтягивания

Октавио
Солнце 17 сентября 2017 г. 11:33
Значения подтягиваний аналогичны тем, которые встречаются в других микроконтроллерах (Atmega, XMega), и они без проблем работают в этих микроконтроллерах, с фильтрами или без него, если провода не слишком большие.И 50K кажется подходящим значением, иногда я использовал 1 млн. Внешних резисторов для снижения потребления тока и до сих пор работает.

Rogerclark
Пн 18 сентября 2017 г. 12:10
[Октавио - Солнце 17 сентября 2017 г. 11:33] - Значения подтягиваний аналогичны тем, которые встречаются в других микроконтроллерах (Atmega, XMega), и они без проблем работают в этих микроконтроллерах, с фильтрами или без него, если провода не слишком большие.И 50K кажется подходящим значением, иногда я использовал 1 млн. Внешних резисторов для снижения потребления тока и до сих пор работает.
Это не имеет значения. Они не процессор STM.

Октавио
Пн 18 сентября 2017 г., 18:22
Я отключил международный подтягивание и разработал внешний подтягивание 4K, проблема продолжается.

Стивестронг
Пн 18 сентября 2017 г. 18:36
Во -первых, вы должны определить все переменные, используемые в ISRS как «летучие».
Во -вторых, это не является для меня ошибкой, это скорее MCU, который работает пару раз быстрее, чем процессоры AVR.
В -третьих, вы должны поместить резистор (100 Ом) последовательно с конденсатором кнопки, чтобы уменьшить токи, произведенные путем закрытия конденсатора при нажатии кнопки. В противном случае он может генерировать шумовые шипы, которые могут ошибочно вызвать прерывания.

Пито
Пн 18 сентября 2017 г. 18:38
Ваш F1 должен быть нестабильным.. void loop() { while(1) { //Set Pin0 (HIGH) GPIOB->regs->BSRR = 0b0000000000000001; //lower 16 bits //Clear Pin0 (LOW) GPIOB->regs->BRR = 0b0000000000000001; //lower 16 bits } }

victor_pv
Пн 18 сентября 2017 г., 19:20
[Пито - Пн 18 сентября 2017 г. 18:38] - Кстати, я бегу здесь (BPILL) 3 Прикрепленные прерывания при 3 контактах, первые пожары 1300x в секунду, второй около 550x, третий около 4-10x в секунду (все в случайное время). Я не теряю ни одного (пока). Параллельно сериал.print (), math, hardwire i2c, bitbanged spi в xilinx.
Делать в ISR именно то, что вы делаете - увеличение нестабильного uint32_t.
Можете ли вы опубликовать, какую схему и настройки вы используете для отладки, если таковые имеются? (Внутренняя подтяжка, международная пульса
Это очень поможет в качестве отправной точки для других людей, так как вы получаете хорошие результаты.

Пито
Пн 18 сентября 2017 г. 20:05
Виктор, 3 выхода логики CMOS (3.3v) подаются в прерывания входов - т.е. PA2, PB3, PA0 (работает с любыми булавками с индексом <= 5, не тот же индекс на нескольких портах).. Если вы понимаете, о чем я :)

В моем случае в серии резисторов 360 Ом в моем. Я положил их туда, чтобы свести к минимуму звонки (это может уловить больше прерываний, когда он звонит). Почему это может звонить? Поскольку выходы CMOS быстрые, а провода длинные, паразитный LC, управляемый быстрыми кольцами края. То же самое может произойти с кодерами, переключателями и т. Д.

Значение резистора может быть выше, так как частота прерывания довольно низкая (максимум мало килохерца) - таким образом, RC не будет слишком много портить.
void loop() { //Set Pin3 (HIGH) GPIOB->regs->BSRR = 0b0000000000000001; //lower 16 bits //Clear Pin3 (LOW) GPIOB->regs->BRR = 0b0000000000000001; //lower 16 bits }

Октавио
Пн 18 сентября 2017 г. 20:48
Я получаю прерывания Aditionals без значения, изменяющего штифт, когда кнопка выпускается, а напряжение PIN идет медленно (около 200 мс) от 0 до 3.3В.Поскольку прерывание происходит без изменения состояния штифта, это должна быть ошибка, а не электрический шум.
О нестабильном: значение не записано из ISR и читается с одной инструкцией, поэтому оно не должно быть проблемой.

Пито
Пн 18 сентября 2017 г. 20:51
Я получаю прерывания Aditionals без значения, изменяющего штифт, когда кнопка выпускается, а напряжение PIN идет медленно (около 200 мс) от 0 до 3.3В.Поскольку прерывание происходит без изменения состояния штифта, это должна быть ошибка, а не электрический шум. Не могли бы вы объяснить мне более подробно - что это значит, что вы получаете прерывания «без изменения вывода», когда вы также добавляете вход «медленно» от нуля до 3.3В. Можете ли вы прояснить это более точно, пожалуйста?

Если ваш сигнал идет медленно от 0 до 3.3 В за 200 мс, вы можете получить 50 дополнительных прерываний. Это потому, что ваш сигнал медленный.
Уровень принятия решений для 1 или 0 в 3.3V CMOS на 1.65 В приблизительно.
Уровень принятия решения может измениться, так как окружающая среда шумная. Итак, вам нужно провести минимальное время в этом регионе. Логика в 1.65V будет вызывать каждый раз, когда уровень меняется на несколько милливолт (изменения поступают от VCC и GND - он прыгает +/- 30 мВ).
Поэтому используются триггеры Шмитта - триггер Шмитта вводит гистерезис - таким образом, небольшое изменение на 1.Уровень принятия решений 65 В не будет ретриг. А У Bluepill нет триггеров Schmitt, я думаю (или это)? У него есть входы триггеров Schmitt.
https: // en.Википедия.org/wiki/schmitt_trigger

Когда кто -то хочет преследовать каждое преимущество:
1. Вы должны использовать быстрые края (чтобы минимизировать время, проведенное в 1.65 В)
2. Или вы должны использовать триггеры Schmitt для обработки медленных сигналов (где края медленные)

PS: гистерезис триггера Schmitt в BPILL составляет 200 мВ (таблица данных). Надеюсь, это сработает. Итак - когда ваш медленный растущий сигнал не меняется (в то время как около 1.65V) на 200 мВ, вы должны получить 1 прерывание. В любом случае, я бы порекомендовал быстро иметь края.

Пито
Пн 18 сентября 2017 г., 21:55
@octavio: Попробуйте использовать другой вывод для прерывания, а не PA4. Попробуйте PA0.
PA4 - это SPI1 NSS, вы делаете переизмещение SPI1, может быть, есть что -то странное.
Кстати, SPI1 не находится на PB3,4,5 по умолчанию, а на PA4,5,6,7.

Октавио
Пн 18 сентября 2017 г. 22:05
Я имею в виду, что код ISR считывает значение PIN с использованием «DigitalRead ()» и сравнивается со значением, хранящимся в предыдущем прерывании, а иногда и то же самое, поэтому прерывание не должно произойти, но это происходит.И эта проблема возникает при использовании серийного.print () ", иначе он работает нормально.

Пито
Пн 18 сентября 2017 г. 22:07
Так что, пожалуйста, будут так добры и опубликуйте весь свой код, иначе мы не можем вам помочь..

Rogerclark
Пн 18 сентября 2017 г. 22:09
В ответ на пару постов...


Стив прав.. Если вы не поместите резистор последовательно с переключателем, ток всплеска для зарядки конденсатора вызовет проблемы. Я испытал это при использовании роторного энкодера.


@pito.. +1
Распроводная рельса на Bluepill кажется довольно шумным, когда я смотрю на него с прицелом, и это потенциально вызовет несколько триггеров,

Эн.g Если я положил напряжение от крышки, которая медленно заряжается, его фактически на высокий проходной фильтр и будет довольно плавным подъемом.
где, поскольку входной порог GPIO все время изменяется, так как его axcc/2 и VCC немного изменяются.

Пито
Пн 18 сентября 2017 г. 22:12
Мы узнаем больше, когда Октавио покажет нам код, который он на самом деле использует, когда испытает проблемы.
Скорее всего, у него есть переключатель от булавки на GND, подтягивания и конденсатора 10 UF от PIN -кода к GND. Таким образом, он снимает конденсатор в GND, а затем медленно заряжает его через подтягивание. Таким образом, напряжение поднимается KRC. Он использует Falling Edge, поэтому он запускает прерывание, когда нажимает кнопку на землю.

Rogerclark
Пн 18 сентября 2017 г. 22:19
Истинный...

КСТАТИ. Хороший звонок о потенциальных проблемах с NSS.

Код был добавлен, чтобы сделать его пригодным для использования в качестве GPIO, даже при использовании SPI, и я не помню, чтобы у кого -то было проблемы с использованием его в качестве вывода.

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

Октавио
Пн 18 сентября 2017 г. 22:55
Проблема решена, это был электрический шум (вероятно, вызван серийной линией).Был тонкий провод 4 -см. Между конденсатором и штифтом, этот провод был достаточно хорошей антенной, чтобы составить чип (тоже меня) сумасшедшим. Я решил проблему, добавив резистор 3K последовательно с штифтом и как можно ближе к MCU, емкость PIN -кода и резюме производит низкополосный проходной фильтр, который отменяет высокий уровень фруктов.

Пито
Пн 18 сентября 2017 г. 11:01
Таким образом, это означает, что ваш конденсатор 10 UF не работал как конденсатор на более высоких частотах. Скорее всего, вы не использовали керамический Multilayer SMD с 10 UF :)

Октавио
Вторник 19 сентября 2017 г. 12:08 утра
Это был многослойный керамический конденсатор, но между конденсатором 4 см был 4 -сантиметровый провод с конденсатором, а также 4 -сантиметровый конденсатор и доска GND.Похоже, что этот провод имеет хорошую радиофилью с последовательной линией.