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

74HC4094 в качестве расширителя порта

Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница?

Вроде бы как еще падение на светодиоде имеется 1,2-1,6В плюс точность(%) резисторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда Вы это берете? на резисторах R25...R32 не по 5В же падает, а намного меньше.

Согласен. В общем, тему считаю исчерпанной. Спасибо за участие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения, но есть еще одна проблема с индикацией. В статике все работает замечательно. Делаю так:

display(1);

digit(1);

delay_ms(2000);

 

display(2);

digit(2);

delay_ms(2000);

 

display(1);

digit(1);

delay_ms(2000);

и на индикаторе поочередно зажигаются 1,2,3 слева-на-право.

А вот в динамике есть накладка. Вот кусок кода:

 

 

__flash unsigned char code7[]=

{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

 

 

#pragma vector=TIMER0_COMPA_vect

__interrupt void TC0_COMPA_ISR(void)

{

switch(znak)

{

case 0:

hundred=1;

ten=2;

one=3;

 

display(hundred);

digit(++znak);

break;

 

case 1:

display(ten);

digit(++znak);

break;

 

case 2:

display(one);

digit(++znak);

znak=0;

break;

}

...................

}

 

////////////////////////////////////////

/********************************************************

// Вывод значения на индикатор с преобразованием в 7-сегментный код

void display(unsigned char num)

{

unsigned char temp;

 

num=*(code7+num);

 

temp = num;

PORTB=(temp&0x3f);

 

temp = PORTD;

temp &= 0x3f;

num &= 0xc0;

PORTD = (temp|num);

}

 

 

//*****************************************************************

//Включение знакоместа формированием "1" на выходе (74HC4094)

void digit(unsigned char number)

{

unsigned char table[]={0,1,2,4,8,16,32};

 

for (unsigned char i = 0; i < 8; i++)

{

if ((*(table+number) & 128)) PORTC |= (1<<SI);

else PORTC &= ~(1<<SI);

PORTC |= (1<<CLK);

PORTC &= ~(1<<CLK);

*(table+number) <<= 1;

}

PORTD |= (1<<STR);

PORTD &= ~(1<<STR);

}

 

При этом происходит наложение H+M, M+L, L+H. H,M,L-разряды индикатора.

Проганял в симуляторе. Все пучком. В чем же дело?

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот в динамике есть накладка.

При этом происходит наложение H+M, M+L, L+H. H,M,L-разряды индикатора.

Проганял в симуляторе. Все пучком. В чем же дело?

Как часто вызывается __interrupt void TC0_COMPA_ISR(void) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда весь листинг программы приведите (приложите файл)

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

furnace.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Во первых, проинициализируйте переменную znak=0 в Initialise(void).

 

Затем попробуйте следующее:

 

1) добавьте элемент "нет свечения":

__flash unsigned char code7[]= //hgfedcba

{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x78, 0x5c, 0x39, 0x77, 0x38, 0x00};

//0(0), 1(1), 2(2), 3(3), 4(4), 5(5), 6(6), 7(7), 8(8), 9(9), 10(t),11(o),12©,13(A),14(L),15( )

 

2) в обработчике __interrupt void TC0_COMPA_ISR(void)

вместо каждой пары строк

display(hundred/ten/one);

digit(++znak);

 

напишите:

display(15);

digit(++znak);

display(hundred/ten/one);

 

Если не поможет, попробуйте для эксперимента отключить все обработчики прерываний, кроме __interrupt void TC0_COMPA_ISR(void).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Трансформатор на выходе под нагрузкой дает 10,5В. На входной емкости 4700мкФ еще на пару вольт накидывается. По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В?

number соответствует номеру знакоместа. Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница?

Допустимая рассеиваемая без радиатора мощность рассчитывается довольно просто. Достаточно пары страниц из datasheet L7805CV. Тепловое сопротивление корпуса TO-220 составляет 55 С/Вт. Максимальная рабочая температура кристалла L7805CV - 150 C. Следовательно при температуре окружающей среды 25С максимально допустимая рассеиваемая температура (150С-25С)/55С/Вт=2,27Вт.

Считаем далее.

Собственный ток потребления L7805 при 25С - 6мА (+0,5мА при изменении нагрузки до 1А.) При входном напряжении 12В и токе нагрузки 35 мА на м/с будет рассеиваться примерно (12В-5В)*(0,006А+0,035А)=0,29Вт. Что даст перегрев 0,29Вт*55С/Вт=15,95С. При температуре окружающей среды 25С температура м/с составит примерно 25C+15.95C=41С, еще не горячо, но уже ощутимо :)

Если 35мА ток потребления устройства при погашенном индикаторе, то при всех засвеченных сегментах всех знакомест ток потребления будет около (5В-1,3В)/220Ом*7+0,035А=118мА. Тогда температура самого стабилизатора L7805 при температуре окр. воздуха 25С будет около (12В-5В)*(0,006А+0,118А)*55С/Вт+25С= 73С - уже можно обжечься! ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых, проинициализируйте переменную znak=0 в Initialise(void).

А зачем? Она же глобальная.

 

Если не поможет, попробуйте для эксперимента отключить все обработчики прерываний, кроме __interrupt void TC0_COMPA_ISR(void).

А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика?

 

 

 

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

Спасибо за детальный расчет. Очень кстати. Значит для уменьшения тепловыделения:

1) поставить трансформатор с выходным напряжением 6...7В,

2) поставить на 7805 радиатор,

3) или вообще применить импульсный источник питания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) поставить трансформатор с выходным напряжением 6...7В,

Ага, но только на 9В. При очень грубом подсчете выпрямителя на небольшие напряжение можно считать, что в самых плохих условиях (пониженное входное сетевое напряжение, маленькая емкость фильтрующего конденсатора выпрямителя и т.п.) на входе стабилизатора будет то же по величине напряжение (естественно что уже постоянное), что и на выходе трансформатора. Maximum Dropout Voltage (падение напряжение на стабилизаторе) для L7805CV составляет 2,5В. При использовании 6-7В трансформатора вашему стабилизаторе просто не хватит величины выпрямленного напряжения, чтобы на выходе обеспечить стабильное напряжение 5В.

2) поставить на 7805 радиатор,

Для трансформаторного линейного БП, я бы даже сказал, что это обязательное условие.

3) или вообще применить импульсный источник питания.

Одно из самых корректных решений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем? Она же глобальная.

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

 

А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика?

затрудняюсь ответить

Изменено пользователем AVL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика?

Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был No_prescaling. Но все равно не ясно, каким образом период прерывания влияет на наложение разрядов? И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется TL431 и схема измерения ratiometric.

#pragma vector=ADC_vect

__interrupt void ADC_ISR(void)

{

digit(0); //выключить индикатор

 

accum = ADC;

 

digit(znak); //восстановить индикатор

} // End of ADC_ISR

Но включение, выключение в процедуре АЦП влияет на индикацию. Младший разряд нижнего индикатора еле светится значением. Вопрос:

1)так ли необходимо выключать индикацию в момент измерения?

2)опорное напряжение (+2.5В) на TL431 по качеству отличается от внутреннего, который в микроконтроллере, например в Меге8 ? Я использовал внешний, потому-что у Меги48 внутренний +1.1В.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был No_prescaling. Но все равно не ясно, каким образом период прерывания влияет на наложение разрядов?

Предделитель какого обработчика был No_prescaling?

И вопрос. Вы сделали, что я рекомендовал (см.ниже)?

1) добавьте элемент "нет свечения":

__flash unsigned char code7[]= //hgfedcba

{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x78, 0x5c, 0x39, 0x77, 0x38, 0x00};

//0(0), 1(1), 2(2), 3(3), 4(4), 5(5), 6(6), 7(7), 8(8), 9(9), 10(t),11(o),12©,13(A),14(L),15( )

 

2) в обработчике __interrupt void TC0_COMPA_ISR(void)

вместо каждой пары строк

display(hundred/ten/one);

digit(++znak);

 

напишите:

display(15);

digit(++znak);

display(hundred/ten/one);

Изменено пользователем AVL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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