Лабораторный блок питания своими руками на микроконтроллере ЧАСТЬ 1.

Начал с индикации. Пока что на макетной плате

Вольт амперметр на двух 4х разрядных семисегментных индикаторах. Атмега 8 в качестве контроллера, питание от 3х до 5 вольт. Для амперметра будет использован операционный усилитель, чтобы умножить падение напряжения на шунте.


Самое интересное, что все цифры что вы видите на фото, показываются по очереди, но скорость переключения разрядов настолько высока, что вы не увидите даже мерцания. Тем самым я сэкономил кучу портов МК


1 цифра = 8 портов. У меня же вместо этого на каждую цифру используюется все те же 8 портов, только включается она npn Транзистором, в нужное время, за чем следит Atmega 8, в итоге мне нужно всего 8 портов для любого количества цифр, и + 1 порт на каждую цифру, для включения npn транзистора, который будет давать минус к катоду светодиодов.


Это касается семисегментных индикаторов с общим катодом. С общим анодом история в точности наоборот ).


Код на чистом си, чтобы точно понимать, что и как работает, и настроить прибор идеально )

Лабораторный блок питания своими руками на микроконтроллере ЧАСТЬ 1. Avr, Вольт-амперметр, Лбп

Сообщество Ремонтёров

7.3K постов42.1K подписчиков

Добавить пост

Правила сообщества

ЕСЛИ НЕ ХОТИТЕ, ЧТОБЫ ВАС ЗАМИНУСИЛИ НЕ ПУБЛИКУЙТЕ В ЭТОМ СООБЩЕСТВЕ ПРОСЬБЫ О ПОМОЩИ В РЕМОНТЕ, ДЛЯ ЭТОГО ЕСТЬ ВТОРОЕ СООБЩЕСТВО:


Посты с просьбами о помощи в ремонте создаются в дочернем сообществе: https://pikabu.ru/community/HelpRemont

К публикации допускаются только тематические статьи с тегом "Ремонт техники".

В сообществе строго запрещено и карается баном всего две вещи:

1. Оскорбления.

2. Реклама.

В остальном действуют базовые правила Пикабу.

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

а смысл? https://www.aliexpress.com/af/0.html?SearchText=%D0%B8%D0%BD...

если хотели по минимуму использовать ноги, то http://arduino.ru/Tutorial/registr_74HC595

да и был пост о простом бп

http://pikabu.ru/story/prosteyshiy_samodelnyiy_blok_pitaniya...

учитываю стоимость деталей у нас в рознице, дешевле собрать подобный из модулей, чем делать с полного нуля

если цель просто сделать, тогда ладно

Иллюстрация к комментарию
раскрыть ветку (7)
2
Автор поста оценил этот комментарий

Все детали закаызваю с али экспресс. Atmega и два таки индикатора стоят порядка 100 руб за все. Сдвиговый регистр тут не нужен абсолютно, так как ног за глаза хватает, и другого кроме индикации она делать не будет. Максимум при повышенном потреблении будет управлять кулером, но для этого ноги еще есть. Тот дисплей, что предлагаете вы, имеет очень большое время отклика (повернул ручку и доли секунды нужно ждать пока сработает, сложно настроить точность показаний в данный момент у меня именно он стоит), корявость измерения (не всегда, зависит от типа нагрузки). В моем же случае, исчезнуть все эти проблемы. Плюс количество снятия показаний в секунду я смогу регулировать, для повышения точности, на этом дисплее оно фиксированное и маленькое.

И да, заказываю я детали не по одной, по этому цена дешевле.

Иллюстрация к комментарию
раскрыть ветку (6)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

Автор поста оценил этот комментарий

я тоже заказываю не по одной )))

сдвиговый регистр, упростит итоговую разводку

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

Иллюстрация к комментарию
раскрыть ветку (3)
Автор поста оценил этот комментарий

Транзисторы тут нужны только для того, чтобы подать минус на катод.  Сдвиговых регистров тоже не один понадобиться. В общем спорный вопрос, если бы я делал какую-нибудь бегущую строку, то да, а так транзисторы самое то.

раскрыть ветку (2)
Автор поста оценил этот комментарий

Скрипто, как значения на разряды бьёшь? Я тут таймер универсальный собираю на семисегменте, всё руки не доходят погуглить как рациональнее разбить...

Так пойдёт?

var1 = incoming / 100;

var2 = incoming % 100 / 10;

var3 = incoming % 10;

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Так как мне нужно выводить точку я сделал так.

1. Разделяю на дробное и не дробное банальным переводом в int из float

2. Так как напряжение не превышает 99.999 вольт точно, то сначала проверяю больше ли оно 9, если да, то точку ставлю после второго разряда, если нет, то точку ставлю после первого разряда. Если меньше 1 вольта, то в первый разряд ставлю 0 и после него точку. Причем точку ставлю побайтовым сдвигом

Сначала порту даю значение цифры

PORTD = digits[3]; // Допустим это будет 3

потом добавляю 1 в конец байта

PORTD |= (1<<7);

Это дает точку в нужном разряде.

Вот немного кода если интересно


Это я рабиваю на разряды

void PutRazryadVolt( double volt){

int y = volt;


double z = volt-y;



if(y>9){


RV1 = y/10;


RV2 = y%10;


int RD = z*100;


Vdot=2;


RV3 = RD/10;


RV4 = RD%10;


}


else if(y<10 && y>=1){


RV1 = y;


Vdot = 1;


int RD = z*1000;


RV2 = RD/100;


RD = RD-(100*RV2);


RV3 = RD/10;


RV4 = RD%10;


}


else{


RV1 = 0;


Vdot = 1;


int RD = z*1000;


RV2 = RD/100;


RD = RD-(100*RV2);


RV3 = RD/10;


RV4 = RD%10;


}


}

А это вывожу на семисегментые индикаторы


void PrintLedVolt(){

if (Vdot == 2){


//display 1


PORTC =(1<<2);


PORTD = digits[RV1];


_delay_ms(perehod);


PORTC = (1<<3);


PORTD = digits[RV2];


PORTD |= (1<<7); //Добавляем точку к разряду


_delay_ms(perehod);


PORTC = (1<<4);


PORTD = digits[RV3];


_delay_ms(perehod);


PORTC = (1<<5);


PORTD = digits[RV4];


_delay_ms(perehod);


}


else{


//display 1


PORTC =(1<<2);


PORTD = digits[RV1];


PORTD |= (1<<7); //Добавляем точку к разряду


_delay_ms(perehod);


PORTC = (1<<3);


PORTD = digits[RV2];


_delay_ms(perehod);


PORTC = (1<<4);


PORTD = digits[RV3];


_delay_ms(perehod);


PORTC = (1<<5);


PORTD = digits[RV4];


_delay_ms(perehod);


}


}


Чуть позже сделаю пост, полностью как это работает

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку