Страница 1 из 2

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 20:29
BBKing
Привет всем!
Решил собрать свой первый проект - велоспидометр на беговел сыну. Будет состоять из про мини, 2-разрядного 7-сегментного индикатора и датчика Холла. В ФЛПрог собрал скетч. Всё работает отлично, вот только тускловат индикатор. На улице видно не будет. Решил померить на одном из его элементов напряжение, но вольтметр показал какую-то белиберду, что-то около 0.4 В. Тогда поставил паралельно элементу конденсатор на 10 мкф и увидел более реальные показания 1.68-1.7 В. Правда это с защитным резистором на 220 Ом. И это при питании от 5.4 В. Ну в общем поставил со стороны анода и катода по транзистору и подал напряжение 7.5 в. Яркость не изменилась. Меряю напряжение на элементе индикатора, а там значения не изменились. Тогда решил убрать защитный резистор и получил приемлемую яркость и напряжение на элементе 1.88-1.9 В. При питании от 5 В, тоже самое. Конечно не 2.1 В но уже более-менее... Вроде бы проблема решена, но во-первых, как-то стрёмно без защитных резисторов, а во-вторых есть мысли добавить ещё кое-какие функции, что может повлиять на яркость индикатора. Как я понимаю суть проблемы? Вероятно программа подаёт сигнал на индикатор на какое-то время, затем выключает. И так много раз в цикле. Получилось что-то наподобие шим-сигнала. Кто-то сталкивался с такой проблемой и как её решили?

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 20:42
eugeneb
Нет тут проблем, всё пройдено. Покажите схему и программу.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 20:51
BBKing
Вот программа
[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 пине прерывания и датчик холла.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 20:56
eugeneb
Программу, которая в FLProg, в картинках :)

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 20:58
BBKing
В ФЛПрог использовал два пользовательских блока, тахометр и время, дата, числа. Первый измеряет интервал между импульсами, второй для округления.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:03
eugeneb
А индикацию Вы как организовали? Пристегните файл flp сюда. Внизу есть кнопка "Добавить файлы".

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:08
BBKing
Изображение

Отправлено спустя 2 минуты 21 секунду:
Файл программы

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:12
eugeneb
Всё правильно. Но не есть хорошо навешивать индикаторы на контроллер.
Общий ток по всем выходам не должен превышать 40 мА.
Примените буфер - либо два регистра типа 595, либо одну микросхему MAX7219.
Второе проще - резисторы не нужны.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:17
BBKing
Я ставил транзисторы на аноды и катоды. Потребление от платы микроамперы...

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:26
eugeneb
Непонятно. Схема нужна.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 21:34
BBKing
приблизительно так, только ещё со стороны катодов транзисторы обратной полярности
Изображение

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 22:27
Александр_Светлый
Нехорошо то не хорошо, но порты вполне справляются с прямым подключением 7-ми сегментных индикаторов, проверено лично, держат даже в TQFP корпусах (хоть и не спорю, это полное извращение и издевательство над МК). Резисторы 125-220 Ом и ток будет лежать в пределах 30-40 мА при этом яркость практически или максимальная. Схема простейшая, общий катод индикатора на землю (GND) без всяких ухищрений и на a b c d e f g через резисторы выходы МК. Буферные микросхемы и драйвера с транзисторами хорошо, но в данном случае думаю излишне. Советую индикатор заклять тонировочной плёнкой, тогда лучше видно на солнце индикаторы просвечивающие через тонировку.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 22:56
BBKing
Транзисторов не жалко. Я использовал кт315 и кт361, их у меня много. Проблема в слишком коротких импульсах с контроллера на индикатор. Даже увеличение напряжения на 2 вольта никак не повлияло на яркость. Импульсы на столько коротки, что светодиод не успевает разгореться. Наверное таки придётся ставить сдвиговые регистры. Они должны понизить частоту и расширить импульс. Ну так я думаю, хотя я в этом почти ничего не понимаю.

Напряжение на 7-сегментном индикаторе

Добавлено: 02 мар 2019, 23:53
Sancho
Александр_Светлый писал(а): 02 мар 2019, 22:27Советую индикатор заклять тонировочной плёнкой, тогда лучше видно на солнце индикаторы просвечивающие через тонировку.
Отличный совет!!! Проверенный.
Для его теста просто накройте индикатор белой бумагой.
Ключевое слово - контраст.

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 11:17
pan
eugeneb писал(а): 02 мар 2019, 21:12Общий ток по всем выходам не должен превышать 40 мА.
поправлю, 40ма на один пин, но не более 200ма по всем

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 11:23
Brand2
[ref]BBKing[/ref], я бы поставил OLED Display 1,3 '',можно вывести большие цифры,и подключение проще.

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 11:51
eugeneb
pan писал(а): 03 мар 2019, 11:17поправлю, 40ма на один пин, но не более 200ма по всем
Да, Вы правы.
Но это стрессовые цифры, не рекомендуемые.
BBKing писал(а): 02 мар 2019, 21:34приблизительно так, только ещё со стороны катодов транзисторы обратной полярности
Не нравится мне эта схема...
Нарисуйте Вы уже свою схему, карандашом на бумаге и сфотайте.

А насчёт коротких импульсов, это предположение или Вы осциллографом проверили?
Сейчас соберу, где-то у меня завалялся индикатор.

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 12:58
eugeneb
Собрал без всяких буферов по Вашей словесной схеме.
Яркость субъективно нормальная. Но это не на улице.
[spoiler]
p1.jpg
[/spoiler]

Скважность так себе:

при двух разрядах - 23%
[spoiler]
p2.jpg
[/spoiler]



при трёх разрядах - 15%
[spoiler]
p3.jpg
[/spoiler]

Это сигналы разрядов r1 и r2 (у меня общий катод)
Видно, что нижняя полка доходит только до 2.4 вольта (а должна до нуля).
Это от того что нет резисторов - выходы контроллера между собой борются через сегменты.

И обратите внимание как меняется частота при двух разрядах и при трёх, то есть при программной нагрузке. У Вас ведь ещё прерывания есть.
Я бы советовал всё таки регистры.
Либо статическая индикация, либо на MAX7219 - там яркость можно менять на ходу.

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 13:40
BBKing
Подрисовал схему, правда второй транзистор только для одного элемента индикатора, но думаю будет понятно.
[spoiler]
7_seg (1).jpg
[/spoiler]
Вот моя осцилограма снятая прямо с элемента индикатора
[spoiler]
1.jpg
[/spoiler]
1,8 в, но если замкнуть защитный резистор подымается до 2,4в. Но скважность :(

Отправлено спустя 4 минуты 12 секунд:
Вчера подумал про малую длину импульса потому, что при повышении питания на 2 вольта яркость оставалась прежней. И я так понял, что програмно скважность не поправить?

Напряжение на 7-сегментном индикаторе

Добавлено: 03 мар 2019, 13:54
eugeneb
Если предположить напряжение насыщения транзисторов по 0.5В, падение на сегменте - 2.5В, то чтобы получить пиковый ток в сегменте 20 мА, балластное сопротивление должно быть (5В - 0.5В - 0.5В - 2.5В) / 0.02мА = 75Ом.
А при скважности 25% можно и до 40мА догнать (с конденсаторами), то есть R=39Ом.