Proteus: вопросы и ответы

Обсуждаем цифровые устройства...
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Proteus: вопросы и ответы

Сообщение shads »

Еще прикол...

После того как прицепил питание на AREF AVCC , преобразование пошло...

НО цветные квадратики возле выводов ADC так и не появились. Ну и ладно подумал я, хотя уже привычно смотреть по цвету квадратика, примерный уровень на ножке.....

НО, после того как я (совсем по другой причине) у резисторов подтяжки изменил режим работы на DIGITAL, квадратики появились.....
Так что постепенно вывели протеус на чистую воду :) .....
Последний раз редактировалось shads Вт апр 23, 2013 16:09:19, всего редактировалось 2 раза.
Аватара пользователя
passer_by
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Re: Proteus: вопросы и ответы

Сообщение passer_by »

:(
В датошите пишут:
In the TQFP and QFN/MLF package, ADC7..6 serve as analog inputs to the A/D converter.
These pins are powered from the analog supply and serve as 10-bit ADC
channels. - Типа только каналы АЦП
alex1126 писал(а):Это я знаю. А сколько туда пускать лучше?

Строго говоря это не совсем защита. Уровень VREF совместно с токовыми шунтами (у вас R3, R6 ) определяет ток отсечки в обмотках. Он (VREF) подбирается/регулируется в зависимости от применяемого двигателя. И судя по типу :wink: резисторов у вас там чуть не 10А собираетесь пропускать. Сдохнет бобик L298 однахо.
Последний раз редактировалось passer_by Вт апр 23, 2013 16:27:29, всего редактировалось 1 раз.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Proteus: вопросы и ответы

Сообщение shads »

passer_by писал(а)::(
В датошите пишут: - Типа только каналы АЦП

Дык в том что это не АЦП, вопрос не стоял.....

Просто у меня не осталось выводов для 2-х кнопок, и я их воткнул на эти ADC входы...
По сути чуть переделал ф-цию опроса кнопок, инициализирую так:

Код: Выделить всё

    ADMUX = (0<<REFS1)| (1<<REFS0)|                        //в кач-ве ИОН питание контроллера
            (0<<MUX3)| (1<<MUX2)| (1<<MUX1)| (0<<MUX0)| //канал АЦП6
            (1<<ADLAR);                                    //выровнять влево                                
    ADCSR = (1<<ADEN)|                                    //вкл АЦП
            (0<<ADPS2)| (0<<ADPS1)| (1<<ADPS0);            //предделитель ADC = 2 (точность не нужна, нужна скорость)
 

а вместо опроса бита порта (кнопка 1), сделал так:

Код: Выделить всё

    ADMUX &=~(1<<MUX0);                            //включаем канал ADC6 (MUX1 и MUX2 установлены ранее)
    ADCSR |= (1<<ADSC);                            //запустить преобразование 
    while (ADCSR & (1<<ADSC)){}                     //крутимся в цикле до конца замера
    if (ADCH < 0x80) 

кнопка 2:

Код: Выделить всё

    ADMUX |=(1<<MUX0);                            //включаем канал ADC7 (MUX1 и MUX2 установлены ранее)
    ADCSR |= (1<<ADSC);                            //запустить преобразование 
    while (ADCSR & (1<<ADSC)){}                     //крутимся в цикле до конца замера
    if (ADCH < 0x80)    

сравнение в конце и определяет нажата или нет. Время преобразования 2-х кнопок всего 10us

В общем не плохой вариант сэкономить на полноценных выводах....
Аватара пользователя
passer_by
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Re: Proteus: вопросы и ответы

Сообщение passer_by »

Ну, блин, ни когда б не додумался так использовать АЦП :)) Круто. Тогда конечно AREF подключать на питание нужно, если используете внешний ИОН. (Если использовали б внутренний ИОН тогда бы AREF - в воздухе болтался и Протеус этот режим то же видит) И раз ADC6, 7 работают в режиме АЦП, то и ни какие красные квадратики не будут появляться.
Непосредственно весь код не вижу, но у вас наверное сам опрос этих "кнопок" как бы длится не менее длительности измерения.
P.S. А когда вообще запускается режим измерения? Ведь он может попасть и сразу после отпускания кнопки или в процессе нажатия ( в реальной схеме) может вляпаться на дребезг контактов....
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Proteus: вопросы и ответы

Сообщение shads »

passer_by писал(а):Ну, блин, ни когда б не додумался так использовать АЦП :)) Круто.
Как припрет, и не до такого додуматься можно :))

passer_by писал(а):Тогда конечно AREF подключать на питание нужно, если используете внешний ИОН. (Если использовали б внутренний ИОН тогда бы AREF - в воздухе болтался и Протеус этот режим то же видит)
У меня сейчас подключено только AVCC к питанию, AREF не подключен, т.к. ИОН настроен на внутреннее питание контроллера. Как я понимаю в таком случае на AREF обычно только кондер вешают.....

passer_by писал(а):И раз ADC6, 7 работают в режиме АЦП, то и ни какие красные квадратики не будут появляться.
Как я выяснил..... (сам удивлен такому поведению протеуса) если резисторы подтяжки в режиме ANALOG то квадратиков нет..... А если резисторы подтяжки включены в режиме DIGITAL то квадратики есть..... :shock:

passer_by писал(а):Непосредственно весь код не вижу, но у вас наверное сам опрос этих "кнопок" как бы длится не менее длительности измерения.
Не, практически все время - преобразование занимает. Процедура опроса кнопок совсем не сложная.....

весь код обработки кнопок:
Спойлер

Код: Выделить всё

//#######################################################################################################################
//#
//# ОБРАБОТКА НАЖАТИЙ КЛАВИШ (с использованием выводов ADC6 и ADC7 у MEGA8 )
//# данный вариант можно использовать для подключения кнопок, если не хватает линий вв\выв у контроллера
//#
//#    короткое нажатие - устанавливает флаги BTN_SHRTx (биты 0,1) в глобальной переменной BtnFlags
//#    длинное нажатие - устанавливает флаги BTN_LONGx (биты 2,3) в глобальной переменной BtnFlags
//#
//#    BtnInit() - функция инициализации портов (вызвать перед использованием библиотеки)
//#    BtnGet() - функция чтения данных кнопок, возвращает маску нажатых кнопок (биты 0-1 - коротк нажат, биты 2-3 - длинн нажат)
//#    BtnInterrupt() - функцию циклического опроса порта кнопок, надо вызывать с частотой 100Гц (например в прерывании)
//# 
//#######################################################################################################################


//настройки параметров библиотеки
#define BTN_LOCK_TIME     20                        /*время обработки дребезга в милисекундах (10-100)*/
#define BTN_LONG_TIME    1000                    /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/


//глобальная переменная флагов кнопок и маски флагов кнопок
volatile char BtnFlags;                            //регистр флагов нажатых кнопок
    #define BTN_SHRT1    (1<<0)                    /*флаги короткого нажатия кнопок*/
    #define BTN_SHRT2    (1<<1)
    #define BTN_LONG1    (1<<2)                    /*флаги длинного нажатия кнопок*/
    #define BTN_LONG2    (1<<3)


//----------
//функция инициализации (вызвать перед использованием библиотеки)
INLINE void BtnInit (void)                                
{    
    
//настройка ADC
    
ADMUX = (0<<REFS1)| (1<<REFS0)|                        //в кач-ве ИОН питание контроллера
            
(0<<MUX3)| (1<<MUX2)| (1<<MUX1)| (0<<MUX0)| //канал АЦП6
            
(1<<ADLAR);                                    //выровнять влево                                
    
ADCSR = (1<<ADEN)|                                    //вкл АЦП
            
(0<<ADPS2)| (0<<ADPS1)| (1<<ADPS0);            //предделитель ADC = 2 (точность не нужна, нужна скорость)
}


//----------
//функция чтения маски нажатых кнопок 
//возвращает маску нажатых кнопок (биты 0-1 - коротк нажат, биты 2-3 - длинн нажат)
NOINLINE char BtnGet (void)                                
{    
    
cli ();
    
char temp BtnFlags;
    
BtnFlags 0;
    
sei ();
    return 
temp;
}
 

//----------
//функция циклического опроса кнопок (вызывать с частотой 100Гц, например в прерывании)
INLINE static void BtnProcess (void)                                
{    
    static 
uint8_t BtnLockBit;                    //ащелка (защита от дребезга)
    
static uint8_t BtnLockCoun;                    //счетчик защелки (защита от дребезга)
    
static uint8_t BtnLongCoun;                    //счетчик длинного нажатия
    
static uint8_t BtnMascLast;                    //запомнить маску нажатой кнопки для анализа после отжатия кнопки
    
char BtnTemp 0;

    
//опрос состояний линий ADC
    
ADMUX &=~(1<<MUX0);                            //включаем канал ADC6 (MUX1 и MUX2 установлены ранее)
    
ADCSR |= (1<<ADSC);                            //запустить преобразование 
    
while (ADCSR & (1<<ADSC)){}                     //крутимся в цикле до конца замера
    
if (ADCH 0x80)    
        
BtnTemp 0x01;                            //формирование маски нажатых кнопок

    
ADMUX |=(1<<MUX0);                            //включаем канал ADC7 (MUX1 и MUX2 установлены ранее)
    
ADCSR |= (1<<ADSC);                            //запустить преобразование 
    
while (ADCSR & (1<<ADSC)){}                     //крутимся в цикле до конца замера
    
if (ADCH 0x80)    
        
BtnTemp 0x02;                            //формирование маски нажатых кнопок

    //основной алгоритм обработки событий кнопки
    
if (BtnTemp){                                //клавиша нажата
        
BtnMascLast BtnTemp;                    //запоминаем для использования после отпускания кнопки

        
if (BtnLockCoun < (BTN_LOCK_TIME/10)){
            
BtnLockCoun++;                        //обработка дребезга
            
return;
        }

        
BtnLockBit=1;                            //нажатие зафиксировано        
        
if (BtnLongCoun >= (BTN_LONG_TIME/10))                                
            return;
        if (++
BtnLongCoun >= (BTN_LONG_TIME/10))
            
BtnFlags |= (BtnTemp << 2);            //установка бита длинного нажатия (старшие 4 бита флагов ButtonByte)
    
}
            
    else{                                        
//клавиша отжата            
        
if (BtnLockCoun){                        //обработка дребезга
            
BtnLockCoun --;
            return;
        }

        if (! (
BtnLockBit))                        //отжатие зафиксировано
            
return;

        
BtnLockBit =0;
        if (
BtnLongCoun < (BTN_LONG_TIME/10))
            
BtnFlags |= BtnMascLast;            //установка бита короткого нажатия (младшие 4 бита флагов ButtonByte)
        
BtnLongCoun 0;
    }
}


//#######################################################################################################################
//#
//#    THE END!
//#
//#######################################################################################################################
 
Аватара пользователя
passer_by
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Re: Proteus: вопросы и ответы

Сообщение passer_by »

Ну принцип понял. Хотя с самим кодом еще надо разбираться. Использование INLINE плохо понимаю. Кажется функция INLINE static void BtnProcess (void) длинновата для INLINE. И можно ли использовать функции INLINE в прерываниях? А NOINLINE ваще темное дело.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Proteus: вопросы и ответы

Сообщение shads »

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

Код: Выделить всё

#define INLINE   inline __attribute__((__always_inline__))
#define NOINLINE __attribute__((__noinline__))

INLINE static void BtnProcess (void) сделал INLINE т.к. она вызывается только из одного места, вот чтобы отдельной функцией не оформлялось, залепил INLINE.....
Seawolf
Родился
Сообщения: 3
Зарегистрирован: Сб мар 03, 2012 14:16:52

Re: Proteus: вопросы и ответы

Сообщение Seawolf »

Всем добрый вечер !

scheme.png
(20.35 КБ) 600 скачиваний


В даннам файле стандартная схема управления симистром на основе оптопары MOC3031M (взята из даташита).
Получение полупериодов на нагрузку(лампочку) не создает проблем.
В схеме необходимо на нагрузку получить не полупериод, а часть синусоиды между пиками (см graph.png).

graph.png
(16.74 КБ) 395 скачиваний


На мой взгляд, это можно сделать двумя способами:
1. На генераторе Ec установить Phase(Degrees)=90
2. На генераторе Eu установить Start(secs)=0.25

В обоих случаях возникает одна и та же ошибка:

Error.png
(15.19 КБ) 470 скачиваний


Файл проекта прилагаю. Буду благодарен за совет

Project.rar
(22.85 КБ) 207 скачиваний
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: Proteus: вопросы и ответы

Сообщение Murka »

passer_by писал(а):Ну, блин, ни когда б не додумался так использовать АЦП
10 резюков по 1 кОм последовательно и будет вам 10 кнопок через каждые 0.5V.
shads писал(а):Как я выяснил..... (сам удивлен такому поведению протеуса) если резисторы подтяжки в режиме ANALOG то квадратиков нет..... А если резисторы подтяжки включены в режиме DIGITAL то квадратики есть..... :shock:
Так и должно быть, квадратиками прот показывает цифровые уровни, а если вы желаете аналоговую обработку то цифровые уровни вам никчему. Причём тут-же включится расчет аналоговых цепей и загрузит вам проц под 100%.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: Proteus: вопросы и ответы

Сообщение alex1126 »

Murka писал(а):Причём тут-же включится расчет аналоговых цепей и загрузит вам проц под 100%.

а я еще конденсаторы вообще исключаю из моделирования. Помех все равно там нет, а расчет должен быть попроще. Разумеется если это не RC генератор :)
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: Proteus: вопросы и ответы

Сообщение Murka »

Seawolf писал(а):Всем добрый вечер !
В схеме необходимо на нагрузку получить не полупериод, а часть синусоиды между пиками
Сэр Zero-Cross_ом сие получить не возможно! Возьмите для начала не Zero-Cross а Random-phase оптопару что-то типа MOC 3021.
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
Orion33
Друг Кота
Сообщения: 4753
Зарегистрирован: Сб апр 21, 2012 19:21:43

Re: Proteus: вопросы и ответы

Сообщение Orion33 »

Seawolf писал(а):В обоих случаях возникает одна и та же ошибка:

Странно, что при современном уровне развития информатизации у Вас возникает проблема в понимании написанного Протеусом.
Он пишет, что для симуляции задан слишком маленький интервал времени, и его, очевидно, необходимо увеличить. Сделать это можно в Settings\Set Simulation Options\Trancient.
TAS90
Родился
Сообщения: 10
Зарегистрирован: Ср апр 24, 2013 10:23:52

Re: Proteus: вопросы и ответы

Сообщение TAS90 »

Не могли бы вы мне помочь, необходимо с микроконтроллера подать сигнал на ОУ 2хканальный, в Протеусе впервые поэтому озадачен тем , что LM358 выглядит иначе чем в даташите. Надо получить то, что представленно на картинке, но в протеусе никак не могу :/
Вложения
как надо.jpg
(18.02 КБ) 508 скачиваний
Seawolf
Родился
Сообщения: 3
Зарегистрирован: Сб мар 03, 2012 14:16:52

Re: Proteus: вопросы и ответы

Сообщение Seawolf »

Murka писал(а):Сэр Zero-Cross_ом сие получить не возможно! Возьмите для начала не Zero-Cross а Random-phase оптопару что-то типа MOC 3021.


Большое спасибо, попробую. Может лучше попытаться решить задачу с помощью транзисторов ?

Orion33 писал(а):Странно, что при современном уровне развития информатизации у Вас возникает проблема в понимании написанного Протеусом.
Он пишет, что для симуляции задан слишком маленький интервал времени, и его, очевидно, необходимо увеличить. Сделать это можно в Settings\Set Simulation Options\Trancient.


1. У меня не возникает проблем с пониманием.
2. Чем Вы объясните, что схема, которую я выложил, работает при текущих параметрах - но при изменении фазы на 90 градусов
начинает выдавать ошибку по времени итерации ?
Симулятор считает построенную схему (которую мы не меняем) по одному и тому же алгоритму, настройки те же - меняются только
исходные данные.
3. По Вашему совету, при каких параметрах [NUMSTEPS] / [TRTOL] / [TTOL] / [TMIN], проект заработал без ошибок ???

P.S. Уважаемые специалисты, все когда-то были новичками. Хотелось бы получать в ответ не пафосные излияния, а конкретный
ответ на конкретный вопрос.
Orion33
Друг Кота
Сообщения: 4753
Зарегистрирован: Сб апр 21, 2012 19:21:43

Re: Proteus: вопросы и ответы

Сообщение Orion33 »

TAS90 писал(а):в Протеусе впервые поэтому озадачен тем , что LM358 выглядит иначе чем в даташите. Надо получить то, что представленно на картинке, но в протеусе никак не могу :/

Если Вы сравните внимательно свою картинку и УГО в Протеусе, то наверняка заметите, что и там и там есть треугольнички с плюсиками и минусиками.
ЗЫ. Простите, Вы студент?
Orion33
Друг Кота
Сообщения: 4753
Зарегистрирован: Сб апр 21, 2012 19:21:43

Re: Proteus: вопросы и ответы

Сообщение Orion33 »

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

Да, такое вполне может быть. При наличии возбуждения Микрокап, например, сильно уменьшает шаг итераций.
Seawolf писал(а):3. По Вашему совету, при каких параметрах [NUMSTEPS] / [TRTOL] / [TTOL] / [TMIN], проект заработал без ошибок ???

Я же Вам только совет дал :) То есть путь, куда копать. А Вы уж параметры подберите :)
TAS90
Родился
Сообщения: 10
Зарегистрирован: Ср апр 24, 2013 10:23:52

Re: Proteus: вопросы и ответы

Сообщение TAS90 »

Orion33 писал(а):Если Вы сравните внимательно свою картинку и УГО в Протеусе, то наверняка заметите, что и там и там есть треугольнички с плюсиками и минусиками.
ЗЫ. Простите, Вы студент?


Да студент, просто в даташите как бы 2 входа в один и два в другой(inp1(2)inp1(3) и inp2(5)inp2(6)), а в протеусе они почемуто объединены :/ мне та нужны и те и те :( Прост только начал с ним работать и что-то никак...Прошил только микроконтроллер и вставил, у него тоже пару ножек скрыто (ГНД и Питание).
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Proteus: вопросы и ответы

Сообщение Engineer_Keen »

TAS90 писал(а):Да студент, просто в даташите как бы 2 входа в один и два в другой(inp1(2)inp1(3) и inp2(5)inp2(6)), а в протеусе они почемуто объединены :/

Не объединены они там. Там два усилителя в одном корпусе, в протеусе на поле вытаскивается по одному усилителю. Надо просто второй на поле вытащить, там во-первых по нумерации ног будет видно что это два устройства из одного корпуса, во-вторых по позиционному обозначению (U1:A, U1:B).
TAS90
Родился
Сообщения: 10
Зарегистрирован: Ср апр 24, 2013 10:23:52

Re: Proteus: вопросы и ответы

Сообщение TAS90 »

Engineer_Keen писал(а):Не объединены они там. Там два усилителя в одном корпусе, в протеусе на поле вытаскивается по одному усилителю. Надо просто второй на поле вытащить, там во-первых по нумерации ног будет видно что это два устройства из одного корпуса, во-вторых по позиционному обозначению (U1:A, U1:B).


О_о я та голову ломал! Спасибо большое, пойду доделывать и запускать агрегат свой ))))
Аватара пользователя
Murka
Мучитель микросхем
Сообщения: 441
Зарегистрирован: Ср июн 03, 2009 00:20:21
Откуда: Новороссия ЛНР Рубежное -> РФ Калуга
Контактная информация:

Re: Proteus: вопросы и ответы

Сообщение Murka »

Seawolf писал(а):Большое спасибо, попробую. Может лучше попытаться решить задачу с помощью транзисторов ?
Я бы не стал, сложно это, и повторяемость невысокая, ну в смысле настраивать каждое новое изделие, и термодрейф, и куча всяких других мелочей на седую голову. Луче лапой нос прикрою. :facepalm:
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Свободу можно завоевать, можно просрать, но высидеть свободу нельзя! ©
Всё, что меня не убивает - делает большую ошибку!
Не зли меня!!! :wink:
Ответить

Вернуться в «Цифровая техника»