Напряжение на 7-сегментном индикаторе
Напряжение на 7-сегментном индикаторе
Привет всем!
Решил собрать свой первый проект - велоспидометр на беговел сыну. Будет состоять из про мини, 2-разрядного 7-сегментного индикатора и датчика Холла. В ФЛПрог собрал скетч. Всё работает отлично, вот только тускловат индикатор. На улице видно не будет. Решил померить на одном из его элементов напряжение, но вольтметр показал какую-то белиберду, что-то около 0.4 В. Тогда поставил паралельно элементу конденсатор на 10 мкф и увидел более реальные показания 1.68-1.7 В. Правда это с защитным резистором на 220 Ом. И это при питании от 5.4 В. Ну в общем поставил со стороны анода и катода по транзистору и подал напряжение 7.5 в. Яркость не изменилась. Меряю напряжение на элементе индикатора, а там значения не изменились. Тогда решил убрать защитный резистор и получил приемлемую яркость и напряжение на элементе 1.88-1.9 В. При питании от 5 В, тоже самое. Конечно не 2.1 В но уже более-менее... Вроде бы проблема решена, но во-первых, как-то стрёмно без защитных резисторов, а во-вторых есть мысли добавить ещё кое-какие функции, что может повлиять на яркость индикатора. Как я понимаю суть проблемы? Вероятно программа подаёт сигнал на индикатор на какое-то время, затем выключает. И так много раз в цикле. Получилось что-то наподобие шим-сигнала. Кто-то сталкивался с такой проблемой и как её решили?
Решил собрать свой первый проект - велоспидометр на беговел сыну. Будет состоять из про мини, 2-разрядного 7-сегментного индикатора и датчика Холла. В ФЛПрог собрал скетч. Всё работает отлично, вот только тускловат индикатор. На улице видно не будет. Решил померить на одном из его элементов напряжение, но вольтметр показал какую-то белиберду, что-то около 0.4 В. Тогда поставил паралельно элементу конденсатор на 10 мкф и увидел более реальные показания 1.68-1.7 В. Правда это с защитным резистором на 220 Ом. И это при питании от 5.4 В. Ну в общем поставил со стороны анода и катода по транзистору и подал напряжение 7.5 в. Яркость не изменилась. Меряю напряжение на элементе индикатора, а там значения не изменились. Тогда решил убрать защитный резистор и получил приемлемую яркость и напряжение на элементе 1.88-1.9 В. При питании от 5 В, тоже самое. Конечно не 2.1 В но уже более-менее... Вроде бы проблема решена, но во-первых, как-то стрёмно без защитных резисторов, а во-вторых есть мысли добавить ещё кое-какие функции, что может повлиять на яркость индикатора. Как я понимаю суть проблемы? Вероятно программа подаёт сигнал на индикатор на какое-то время, затем выключает. И так много раз в цикле. Получилось что-то наподобие шим-сигнала. Кто-то сталкивался с такой проблемой и как её решили?
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Нет тут проблем, всё пройдено. Покажите схему и программу.
С уважением,
Евгений Бобков
Евгений Бобков
Напряжение на 7-сегментном индикаторе
Вот программа
[spoiler]unsigned long rpm_149117821_1;
volatile unsigned long temp_149117821_1;
volatile unsigned long time_149117821_1=61000000;
float in_19267442_1;
int out_19267442_1;
float _gtv1 = 0.00108;
int _sido1TB = 0;
String _sido1TSN;
bool _sido1a1 = 0;
bool _sido1b1 = 0;
bool _sido1c1 = 0;
bool _sido1d1 = 0;
bool _sido1e1 = 0;
bool _sido1f1 = 0;
bool _sido1g1 = 0;
bool _sido1dp = 0;
bool _sido1r1 = 0;
bool _sido1r2 = 0;
int _sido1Raz = 1;
unsigned long _sido1STi = 0UL;
bool _sido1Mod = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(2, INPUT);
attachInterrupt(0, tacho_149117821_1, RISING );
}
void loop()
{
//Плата:1
const unsigned long max_time_2=60000000UL / 16;
if ( (temp_149117821_1+max_time_2) < micros() ) {rpm_149117821_1=0;}
else{rpm_149117821_1 = 60000000UL / time_149117821_1;}
in_19267442_1 = ((rpm_149117821_1)*(_gtv1))*(60);
out_19267442_1 = round ( in_19267442_1 );
if(_isTimer(_sido1STi, 1 )) {
_sido1STi = millis();
if (_sido1Raz > 2) {_sido1Raz = 1;}
if(_sido1Mod){
_sido1a1 =1;
_sido1b1 =1;
_sido1c1 =1;
_sido1d1 =1;
_sido1e1 =1;
_sido1f1 =1;
_sido1g1 =1;
_sido1r2 =0;
_sido1r1 =0;
_sido1Mod=0;} else {
_sido1TSN = String (out_19267442_1);
_sido1TB = _IntToSevenSegment(_charFromStringForIndex(_sido1TSN,_sido1Raz));
_sido1a1 =! bitRead(_sido1TB, 0);
_sido1b1 =! bitRead(_sido1TB, 1);
_sido1c1 =! bitRead(_sido1TB, 2);
_sido1d1 =! bitRead(_sido1TB, 3);
_sido1e1 =! bitRead(_sido1TB, 4);
_sido1f1 =! bitRead(_sido1TB, 5);
_sido1g1 =! bitRead(_sido1TB, 6);
_sido1r2 = (_sido1Raz==1);
_sido1r1 = (_sido1Raz==2);
if(_sido1Raz == 2) {_sido1dp = ! (0);}
if(_sido1Raz == 1) {_sido1dp = ! (0);}
_sido1Raz = _sido1Raz +1; _sido1Mod=1;} }
digitalWrite(13, _sido1r2);
digitalWrite(12, _sido1r1);
digitalWrite(11, _sido1g1);
digitalWrite(10, _sido1f1);
digitalWrite(9, _sido1e1);
digitalWrite(8, _sido1d1);
digitalWrite(7, _sido1c1);
digitalWrite(6, _sido1b1);
digitalWrite(5, _sido1a1);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
byte _IntToSevenSegment(int value)
{
if (value==48) {return 63;}
if (value==49) {return 6;}
if (value==50) {return 91;}
if (value==51) {return 79;}
if (value==52) {return 102;}
if (value==53) {return 109;}
if (value==54) {return 125;}
if (value==55) {return 7;}
if (value==56) {return 127;}
if (value==57) {return 111;}
if (value==45) {return 64;}
if (value==65) {return 119;}
if (value==67) {return 57;}
if (value==99) {return 88;}
if (value==100) {return 94;}
if (value==69) {return 121;}
if (value==70) {return 113;}
if (value==72) {return 118;}
if (value==104) {return 116;}
if (value==76) {return 56;}
if (value==79) {return 63;}
if (value==111) {return 92;}
if (value==80) {return 115;}
if (value==114) {return 80;}
if (value==83) {return 109;}
if (value==116) {return 120;}
if (value==85) {return 62;}
if (value==117) {return 28;}
if (value==110) {return 84;}
return 0;
}
int _charFromStringForIndex(String val, int idx)
{int lengt=val.length();
if(lengt < idx) return 0;
return val.charAt(lengt-idx);
}
void tacho_149117821_1()
{
time_149117821_1 = micros() - temp_149117821_1;
temp_149117821_1 = micros();
}[/spoiler]
Отправлено спустя 5 минут 11 секунд:
Схему долго рисовать, но в общих чертах...
Двухзначный 7-сегментный индикатор с общим анодом. Аноды на 12,13 пины, катоды с 5 по 11. На 2 пине прерывания и датчик холла.
[spoiler]unsigned long rpm_149117821_1;
volatile unsigned long temp_149117821_1;
volatile unsigned long time_149117821_1=61000000;
float in_19267442_1;
int out_19267442_1;
float _gtv1 = 0.00108;
int _sido1TB = 0;
String _sido1TSN;
bool _sido1a1 = 0;
bool _sido1b1 = 0;
bool _sido1c1 = 0;
bool _sido1d1 = 0;
bool _sido1e1 = 0;
bool _sido1f1 = 0;
bool _sido1g1 = 0;
bool _sido1dp = 0;
bool _sido1r1 = 0;
bool _sido1r2 = 0;
int _sido1Raz = 1;
unsigned long _sido1STi = 0UL;
bool _sido1Mod = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(2, INPUT);
attachInterrupt(0, tacho_149117821_1, RISING );
}
void loop()
{
//Плата:1
const unsigned long max_time_2=60000000UL / 16;
if ( (temp_149117821_1+max_time_2) < micros() ) {rpm_149117821_1=0;}
else{rpm_149117821_1 = 60000000UL / time_149117821_1;}
in_19267442_1 = ((rpm_149117821_1)*(_gtv1))*(60);
out_19267442_1 = round ( in_19267442_1 );
if(_isTimer(_sido1STi, 1 )) {
_sido1STi = millis();
if (_sido1Raz > 2) {_sido1Raz = 1;}
if(_sido1Mod){
_sido1a1 =1;
_sido1b1 =1;
_sido1c1 =1;
_sido1d1 =1;
_sido1e1 =1;
_sido1f1 =1;
_sido1g1 =1;
_sido1r2 =0;
_sido1r1 =0;
_sido1Mod=0;} else {
_sido1TSN = String (out_19267442_1);
_sido1TB = _IntToSevenSegment(_charFromStringForIndex(_sido1TSN,_sido1Raz));
_sido1a1 =! bitRead(_sido1TB, 0);
_sido1b1 =! bitRead(_sido1TB, 1);
_sido1c1 =! bitRead(_sido1TB, 2);
_sido1d1 =! bitRead(_sido1TB, 3);
_sido1e1 =! bitRead(_sido1TB, 4);
_sido1f1 =! bitRead(_sido1TB, 5);
_sido1g1 =! bitRead(_sido1TB, 6);
_sido1r2 = (_sido1Raz==1);
_sido1r1 = (_sido1Raz==2);
if(_sido1Raz == 2) {_sido1dp = ! (0);}
if(_sido1Raz == 1) {_sido1dp = ! (0);}
_sido1Raz = _sido1Raz +1; _sido1Mod=1;} }
digitalWrite(13, _sido1r2);
digitalWrite(12, _sido1r1);
digitalWrite(11, _sido1g1);
digitalWrite(10, _sido1f1);
digitalWrite(9, _sido1e1);
digitalWrite(8, _sido1d1);
digitalWrite(7, _sido1c1);
digitalWrite(6, _sido1b1);
digitalWrite(5, _sido1a1);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
byte _IntToSevenSegment(int value)
{
if (value==48) {return 63;}
if (value==49) {return 6;}
if (value==50) {return 91;}
if (value==51) {return 79;}
if (value==52) {return 102;}
if (value==53) {return 109;}
if (value==54) {return 125;}
if (value==55) {return 7;}
if (value==56) {return 127;}
if (value==57) {return 111;}
if (value==45) {return 64;}
if (value==65) {return 119;}
if (value==67) {return 57;}
if (value==99) {return 88;}
if (value==100) {return 94;}
if (value==69) {return 121;}
if (value==70) {return 113;}
if (value==72) {return 118;}
if (value==104) {return 116;}
if (value==76) {return 56;}
if (value==79) {return 63;}
if (value==111) {return 92;}
if (value==80) {return 115;}
if (value==114) {return 80;}
if (value==83) {return 109;}
if (value==116) {return 120;}
if (value==85) {return 62;}
if (value==117) {return 28;}
if (value==110) {return 84;}
return 0;
}
int _charFromStringForIndex(String val, int idx)
{int lengt=val.length();
if(lengt < idx) return 0;
return val.charAt(lengt-idx);
}
void tacho_149117821_1()
{
time_149117821_1 = micros() - temp_149117821_1;
temp_149117821_1 = micros();
}[/spoiler]
Отправлено спустя 5 минут 11 секунд:
Схему долго рисовать, но в общих чертах...
Двухзначный 7-сегментный индикатор с общим анодом. Аноды на 12,13 пины, катоды с 5 по 11. На 2 пине прерывания и датчик холла.
Последний раз редактировалось BBKing 02 мар 2019, 21:44, всего редактировалось 1 раз.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Программу, которая в FLProg, в картинках 

С уважением,
Евгений Бобков
Евгений Бобков
Напряжение на 7-сегментном индикаторе
В ФЛПрог использовал два пользовательских блока, тахометр и время, дата, числа. Первый измеряет интервал между импульсами, второй для округления.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
А индикацию Вы как организовали? Пристегните файл flp сюда. Внизу есть кнопка "Добавить файлы".
С уважением,
Евгений Бобков
Евгений Бобков
Напряжение на 7-сегментном индикаторе
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Всё правильно. Но не есть хорошо навешивать индикаторы на контроллер.
Общий ток по всем выходам не должен превышать 40 мА.
Примените буфер - либо два регистра типа 595, либо одну микросхему MAX7219.
Второе проще - резисторы не нужны.
Общий ток по всем выходам не должен превышать 40 мА.
Примените буфер - либо два регистра типа 595, либо одну микросхему MAX7219.
Второе проще - резисторы не нужны.
С уважением,
Евгений Бобков
Евгений Бобков
Напряжение на 7-сегментном индикаторе
Я ставил транзисторы на аноды и катоды. Потребление от платы микроамперы...
Напряжение на 7-сегментном индикаторе
приблизительно так, только ещё со стороны катодов транзисторы обратной полярности


-
- Лейтенант
- Сообщения: 355
- Зарегистрирован: 12 окт 2016, 19:03
- Откуда: Краснодар
Напряжение на 7-сегментном индикаторе
Нехорошо то не хорошо, но порты вполне справляются с прямым подключением 7-ми сегментных индикаторов, проверено лично, держат даже в TQFP корпусах (хоть и не спорю, это полное извращение и издевательство над МК). Резисторы 125-220 Ом и ток будет лежать в пределах 30-40 мА при этом яркость практически или максимальная. Схема простейшая, общий катод индикатора на землю (GND) без всяких ухищрений и на a b c d e f g через резисторы выходы МК. Буферные микросхемы и драйвера с транзисторами хорошо, но в данном случае думаю излишне. Советую индикатор заклять тонировочной плёнкой, тогда лучше видно на солнце индикаторы просвечивающие через тонировку.
Я не флудер , просто мне есть что сказать =)
Напряжение на 7-сегментном индикаторе
Транзисторов не жалко. Я использовал кт315 и кт361, их у меня много. Проблема в слишком коротких импульсах с контроллера на индикатор. Даже увеличение напряжения на 2 вольта никак не повлияло на яркость. Импульсы на столько коротки, что светодиод не успевает разгореться. Наверное таки придётся ставить сдвиговые регистры. Они должны понизить частоту и расширить импульс. Ну так я думаю, хотя я в этом почти ничего не понимаю.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Напряжение на 7-сегментном индикаторе
Отличный совет!!! Проверенный.Александр_Светлый писал(а): 02 мар 2019, 22:27Советую индикатор заклять тонировочной плёнкой, тогда лучше видно на солнце индикаторы просвечивающие через тонировку.
Для его теста просто накройте индикатор белой бумагой.
Ключевое слово - контраст.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 450
- Зарегистрирован: 26 фев 2018, 21:27
- Откуда: Haifa
- Имя: Alex
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Напряжение на 7-сегментном индикаторе
[ref]BBKing[/ref], я бы поставил OLED Display 1,3 '',можно вывести большие цифры,и подключение проще.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Да, Вы правы.
Но это стрессовые цифры, не рекомендуемые.
Не нравится мне эта схема...BBKing писал(а): 02 мар 2019, 21:34приблизительно так, только ещё со стороны катодов транзисторы обратной полярности
Нарисуйте Вы уже свою схему, карандашом на бумаге и сфотайте.
А насчёт коротких импульсов, это предположение или Вы осциллографом проверили?
Сейчас соберу, где-то у меня завалялся индикатор.
С уважением,
Евгений Бобков
Евгений Бобков
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Собрал без всяких буферов по Вашей словесной схеме.
Яркость субъективно нормальная. Но это не на улице.
[spoiler] [/spoiler]
Скважность так себе:
при двух разрядах - 23%
[spoiler] [/spoiler]
при трёх разрядах - 15%
[spoiler] [/spoiler]
Это сигналы разрядов r1 и r2 (у меня общий катод)
Видно, что нижняя полка доходит только до 2.4 вольта (а должна до нуля).
Это от того что нет резисторов - выходы контроллера между собой борются через сегменты.
И обратите внимание как меняется частота при двух разрядах и при трёх, то есть при программной нагрузке. У Вас ведь ещё прерывания есть.
Я бы советовал всё таки регистры.
Либо статическая индикация, либо на MAX7219 - там яркость можно менять на ходу.
Яркость субъективно нормальная. Но это не на улице.
[spoiler] [/spoiler]
Скважность так себе:
при двух разрядах - 23%
[spoiler] [/spoiler]
при трёх разрядах - 15%
[spoiler] [/spoiler]
Это сигналы разрядов r1 и r2 (у меня общий катод)
Видно, что нижняя полка доходит только до 2.4 вольта (а должна до нуля).
Это от того что нет резисторов - выходы контроллера между собой борются через сегменты.
И обратите внимание как меняется частота при двух разрядах и при трёх, то есть при программной нагрузке. У Вас ведь ещё прерывания есть.
Я бы советовал всё таки регистры.
Либо статическая индикация, либо на MAX7219 - там яркость можно менять на ходу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
С уважением,
Евгений Бобков
Евгений Бобков
Напряжение на 7-сегментном индикаторе
Подрисовал схему, правда второй транзистор только для одного элемента индикатора, но думаю будет понятно.
[spoiler] [/spoiler]
Вот моя осцилограма снятая прямо с элемента индикатора
[spoiler] [/spoiler]
1,8 в, но если замкнуть защитный резистор подымается до 2,4в. Но скважность
Отправлено спустя 4 минуты 12 секунд:
Вчера подумал про малую длину импульса потому, что при повышении питания на 2 вольта яркость оставалась прежней. И я так понял, что програмно скважность не поправить?
[spoiler] [/spoiler]
Вот моя осцилограма снятая прямо с элемента индикатора
[spoiler] [/spoiler]
1,8 в, но если замкнуть защитный резистор подымается до 2,4в. Но скважность

Отправлено спустя 4 минуты 12 секунд:
Вчера подумал про малую длину импульса потому, что при повышении питания на 2 вольта яркость оставалась прежней. И я так понял, что програмно скважность не поправить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Напряжение на 7-сегментном индикаторе
Если предположить напряжение насыщения транзисторов по 0.5В, падение на сегменте - 2.5В, то чтобы получить пиковый ток в сегменте 20 мА, балластное сопротивление должно быть (5В - 0.5В - 0.5В - 2.5В) / 0.02мА = 75Ом.
А при скважности 25% можно и до 40мА догнать (с конденсаторами), то есть R=39Ом.
А при скважности 25% можно и до 40мА догнать (с конденсаторами), то есть R=39Ом.
С уважением,
Евгений Бобков
Евгений Бобков
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость