На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
    > Какието непонятки с ШИМ + энкодер , ATTiny2313
      Цитата medved_68 @
      Технологически внутри смонтирована плавкая вставка - типа этого

      Интересная штука )))
      Нужно будет попробовать.
        KillerXX7, у тебя изначально переменная PWMValue двухбайтная, а контроллер восьмиразрядный, все операции с этой переменной делаются из нескольких инструкций, младший байт -- старший байт. используешь ты ее в прерываниях. Если прерывание происходит в момент когда обрабатывается эта переменная, то в ней оказывается не верное значение и в прерывании ты его считываешь. От этого и была у тебя проблема ошибочных значений шима. Я бы сделал эту переменную размером в байт, а в прерывании сдвигом получал бы нужную разрядность. Или на время работы с этой переменной включал глобальный запрет прерываний.

        Добавлено
        в IAR-овских библиотеках есть специальный модификатор функций для работы в подобных ситуациях, то есть ты с этой переменной работаешь только внутри специально объявленных функций. Таким образом компилятор гарантирует атомарность работы с многобайтными переменными. Tсли память не изменяет, модификатор называется MONITOR.

        С другой стороны, gcc достаточно мудреный компилятор и мне сдается, что он должен был выдавать тебе варнинг на эту переменную, могу ошибаться.
          Цитата KillerXX7 @
          Вот именно на это самое программное подавление я и потратил целый день, прочитав похоже доводы против.
          Что только не пробовал, оно всёравно глючило.

          Это весьма не сложно.
          На конденсаторах ты делаешь интегратор.
          Сделаем его программно:
          1. Запустим таймерную процедуру-интеррапт.
          Например, 1[мС].
          В качестве цифрового интегратора будем использовать
          реверсивный двоичный счетчик.
          При таком периоде считать можно до 4-8.
          Дребезг контактов дольше, как правило, не бывает.

          2. В этой процедуре смастерим двоичный реверсивный
          счетчик (с двумя ограничениями, сверху и снизу).
          Это и есть аналог интегратора.

          3. По прерыванию считываем значение бита.
          1 - и нет насыщения сверху - увеличиваем значение счетчика
          0 - и нет насыщения снизу - уменьшаем значение счетчика
          (Чему именно соответствует 0 и 1 зависит от схемы)

          4. Достигнутая граница сверху - кнопка нажата, выставим флаг
          Достигнутая граница снизу - кнопку отпустили, сбросим флаг.

          Вот так, силой мысли можно сэкономить кучу конденсаторов. :D
          Не знаю - нужно ли приводить исходные тексты ?
          Это не так уж и сложно.

          -Added
          Цитата KillerXX7 @
          4. Что ещё можно добавить убрать в этой схеме Энкодер-Контроллер-Нагрузка

          S силовых триодов подключить к земле, а
          нагрузку подключить между +12V и D силовых триодов.

          Если ты все-таки решил оставить емкостины для подавления
          дребезга, включи последовательно с контактом небольшой
          резистор 50-100 [ом].

          Какой пиковый ток пойдет через контакт ? ;)
          5V/(сопротивление контакта и провода).
          Так обгорают контакты.

          -Added
          Цитата KillerXX7 @
          Цитата ЫукпШ @
          а между шинами питания запаять резистор

          Для чего он нужен?
          Мне кажется он будет просто "греться", хотя могу ошибаться.
          К тому же на "боевой" схеме на выходе в стабилизаторе стоит делитель напряжения на 2 резисторах, тоесть по сути уже есть поротивление между плюм и землёй.

          Рассмотрим цепи R1,VD2,C7.
          VD2 без резистора между +5V и землей "R5vgnd"
          совершенно бесполезен.
          Он нужен для того, чтобы емкость C7
          быстрее разряжалась при выключении питания
          по цепи VD2->"R5vgnd".
          Не факт, что емкостина разрядится через
          источник питания.
          Чтобы иметь возможность выключить питание
          и быстро включить ставят VD2 и "R5vgnd".
          Если это точно не требуется на них можно сэкономить.
          Сообщение отредактировано: ЫукпШ -
            Цитата MeG @
            PWMValue двухбайтная, а контроллер восьмиразрядный, все операции с этой переменной делаются из нескольких инструкций, младший байт -- старший байт. используешь ты ее в прерываниях. Если прерывание происходит в момент когда обрабатывается эта переменная, то в ней оказывается не верное значение и в прерывании ты его считываешь. От этого и была у тебя проблема ошибочных значений шима. Я бы сделал эту переменную размером в байт, а в прерывании сдвигом получал бы нужную разрядность. Или на время работы с этой переменной включал глобальный запрет прерываний.

            С другой стороны именяю её значение я также только в прерываниях, а до выхода из прерывания все остальные прерывания запрещены.
            Компилятор никаких варнингов не выдаёт, код компилится вообще молча (что даже странно для сишной проги :D).
            Возможно компилятор сам разрулиает с именением переменной и прерываниями, но не факт.

            Цитата ЫукпШ @
            Вот так, силой мысли можно сэкономить кучу конденсаторов.

            Алгоритм ясен =)
            Именно такую реализацию не пробовал.
            Но всётаки осталвлю конденсаторы, очень нраится как с ними работает =)))
            Резисторы действительно впаяю. Слабо верится что через энкодер может протекать ток около 5 ампер, но цифра в любом случае страшная.


            Цитата ЫукпШ @
            Чтобы иметь возможность выключить питание
            и быстро включить ставят VD2 и "R5vgnd".
            Если это точно не требуется на них можно сэкономить.

            Необходимости в "передергивании" питания нет.
            Получается что диод в таком случае можно снять, верно?
              Цитата KillerXX7 @
              Получается что диод в таком случае можно снять, верно?

              Да.

              -Added
              Цитата KillerXX7 @
              С другой стороны именяю её значение я также только в прерываниях, а до выхода из прерывания все остальные прерывания запрещены.

              Тогда и проблем нет.
              А если бы было необходимо править эту
              переменную в фоновой программе, можно было бы
              на время операции с ней запрещать прерывания.
                [офтоп]

                KillerXX7, а можно вопрос?
                зачем понадобилось использовать энкодеры (кста, этож вроде как колесо от мыши, нет?), почему было не взять ATTiny26 (он с АЦП. ШИМ-каналов правда только 2, а не 4, но тут больше и не используется) и два обычных потенциометра?

                [/офтоп]
                  [офтоп]

                  Колесо от мышки одна из реализация энкодера =)
                  Те что у меня больше похожи на регуляторы громкости на музыкальных центрах / магнитолах, ну или на выбор времени на микроволновках :D
                  Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами + современней и стильней смотрися и ощущается, да и вообще они ближе к цифре чем к аналогу.

                  [/офтоп]
                  Сообщение отредактировано: KillerXX7 -
                    Цитата KillerXX7 @
                    [офтоп]
                    Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами
                    [/офтоп]


                    А я делал так - с кнопками UP и DOWN:
                    ссылка
                      [офтоп]
                      Цитата KillerXX7 @
                      Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами + современней и стильней смотрися и ощущается, да и вообще они ближе к цифре чем к аналогу.

                      ясн...

                      хотя ИМХО единственный плюс (с точки зрения разработчика) и он же минус (с точки зрения пользователя) энкодера — возможность использовать его для задания нескольких параметров (как в нынешних автомагнитолах делают)... Незнаю, может и есть кто, кому нравится, что для реглировки басов надо четыре раза нажать кнопку, глянуь на магнитолу, убедиться, что она показывает "bass", и только после этого крутить ручку... но мне кажется в миллион раз удобнее на ощупь найти ручку нужного потенциометра и крутнуть её...

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

                      [/офтоп]
                        Заинтересовался кодом для энкодера с этой темы-
                        ExpandedWrap disabled
                           if((((PIND) & (1<<PD2)) == 0)   ^ (((PIND) & (1<<PD3)) == 0)){
                                  PWMValue+=50;
                                  setPin(PB0, 1); // - Отладка
                              }else{
                                  PWMValue-=50;
                                  setPin(PB0, 0); // - Отладка

                        Я пишу на CVAVR,так же по схеме хочу соединить к меге16, вот это- PIND - не могу понять как написать, не могли бы обьяснить,что это обозначает PIND,какая это нога или ранее запомненное состояние
                        Сообщение отредактировано: dws -
                          PIND, это висьмибитный входной регистр порта D, восемь ножек этого порта соответствуют восьми битам этого регистра. Логический уровень напряжения на ножке порта соответствует значению бита в регистре, если данная ножка сконфигурирована на вход.
                            Вообще-то PIND не регистр. PIND адресуется непосредственно к выводам МК, независимо от того, как они сконфигурированы.
                              Извиняюсь,я знал,что PIND это ножка порта,я думал если написать,например if(PIND==0), то выдаст ошибку,оказывается можно, тогда попробуем на деле этот код.Получается,это обращение к любому выводу порта D
                              Сообщение отредактировано: dws -
                                Цитата Prince @
                                Вообще-то PIND не регистр. PIND адресуется непосредственно к выводам МК, независимо от того, как они сконфигурированы

                                вообще-то PIND это регистр синхронизированный с клоком если верить даташиту Атмела на ATtiny2313

                                http://www.atmel.com/dyn/resources/prod_documents/DOC2543.PDF

                                на странице 54 (рисунок 25) нарисована эквивалентная схема одного пина порта. Через ключ ножка подключается к триггеру шмидта, с него на триггер защелку и далее на синхронный D-триггер (именно он и назван PINxn), то есть, сигнал с ножки доступен для считывания с задержкой в один такт. Ключ перед триггером шмидта управляется сигналом DIGITAL INPUT-ENABLE, то есть, триггер подключен к ножке в случае если порт настроен как цифровой вход. В тоже время, считывать сигнал с D-триггера пина порта (PINxn) можно независимо от того как настроен порт, на вход, на выход или как аналоговый. Если порт не настроен на вход, то, в силу подтяжки к земле перед триггером шмидта, с PINxn будет считываться ноль. С триггера шмидта выходит сигнал DIxn, он используется как входной цифровой сигнал в случае использования порта для альтернативной функции (таблица 23).
                                  Прости, был неправ. Вспомнил даташит на at90s2313, в нём никаких защелок по входу вроде бы не было. Предположил, что и тут аналогичная схема.
                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) 1 [2] 3  все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0398 ]   [ 14 queries used ]   [ Generated: 18.07.25, 01:22 GMT ]