Вопрос из разряда песочницы, но видимо забыл все (или не знал)). Хочу сделать зарядное уст. из промышленного обратноходового БП, где напряжение стабилизируется штатной ОС БП, а стабилизацию тока (точнее ограничение) хочу реализовать с помощью ШИМ+АЦП МК Attiny85.
volatile int adc_l; volatile int adc_HL; volatile float adc_val;
//границы переменных int grany (int peremen, int a1, int b1) { if (peremen<=a1) {peremen=a1;} if (peremen>=b1) {peremen=b1;} return peremen; }
int OCR1A_plus () { if (OCR1A>=253) {OCR1A=254;} else {OCR1A++;} return 0; }
int OCR1A_minus () { if (OCR1A<=2) {OCR1A=0;} else {OCR1A--;} return 0; }
int main (void) {
DDRB|=1<<PB1|0<<PB4; //~~~~~~~~~~~~~~~~~~~~~~~~ШИМ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // |состояние выхода OC1A| вкл.PWM| 4 бита предделителя частоты| TCCR1=0<<COM1A1|1<<COM1A0|1<<PWM1A|1<<CS10|1<<CS11|1<<CS12|0<<CS13; OCR1A=200;//установка скважности //~~~~~~~~~~~~~~~~~~~~~~~~АЦП~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // ист. опорного напр. 2.56V| выбор канала АЦП ADC1 (PB4) | ADMUX|= 0<<REFS0|1<<REFS1|1<<REFS2|0<<MUX0|1<<MUX1;//|0<<MUX2|0<<MUX3; // вкл.АЦП|авт. режим|старт |предделитель частоты АЦП на 128 | ADCSRA|=1<<ADEN|1<<ADATE|1<<ADSC|0<<ADPS0|1<<ADPS1|1<<ADPS2; while(1){
adc_l=ADCL; //значение входного напряжения в нижнем регистре adc_HL=(ADCH<<8)|adc_l;//чтение верхнего регистра вместе с нижним adc_val = int(grany(adc_HL,0,1023)); if (adc_val>400) {OCR1A_minus();} else {OCR1A_plus ();} } }
По сути вроде так: запускаем ШИМ, уст. начальную скважность, получаем значение АЦП в диапазоне 0-1024. Если значение АЦП выше 400 - то уменьшаем скважность до момента пока знач. АЦП станет ниже 400 и так циклично.
Starichok51, Владимир, коль это зарядное устройство - то ШИМ-ом будет регулироваться ток зарядки свинцово-кислотного АКБ.
Цитата:
как я понял, ты решил создать НЕобычный DC-DC с применением МК?
Именно так. Есть несколько ОХ ИБП и я хочу сделать из них ЗУ c параметрами стабилизации СС\СV: 0.7-5А и 12.5-15.6V и различными алгоритмами заряда на МК. Корпуса маленькие и вкорячить туда полноценный DC-DC на честные 5А - не получится, да и излишне. Посему решил ток ограничивать ШИМ с МК, а напряжение стабилизируется штатной ОС ИБП. Ранее делал подобные ЗУ на ATmega328 c OLED экраном. Но уже 5 лет прошло и все с башки вылетело)) Вопрос тут банальный и скорее всего математический))
Добавлено after 11 minutes 42 seconds: >TEHb<, LM там работает как усилитель шунта с коэффициентом 30. Зачем ему отр. пит.? А происходит то, что ток ограничивается в процентах но не работает как полноценная ОС.
30? Скорее ближе к семи, судя по резистором. Отрицательное питание затем, что этот ОУ не очень хорошо работает с напряжениями на входах, близких к минусовому питанию. Ещё на выходе стоит конденсатор убрать, а затворный резистор подбавить.
Ну хз, значения с ADC приходят более или менее адекватные. А конденсатор С3 как раз и нужен для адекватных значений АЦП ибо там ШИМ и без него на входе АЦП "каша". К железу у меня в принципе вопросов нет. Все показания (ОCR1A и ADC) я выводил на OLED и они правильно считываются. Здесь вопрос больше программный.
Последний раз редактировалось dds7sdd Вс ноя 19, 2023 20:02:17, всего редактировалось 1 раз.
Во-первых: Фильтр на R3C1 работать не будет, т.к. С1 моментально разрядится через шунт при запирании полевика, R3 нужно подключить к шунту, а после кондёр С1 на операционник; Во-вторых: Кондёр на 200 мкФ на выходе операционника... без резистора... кровь из глаз... Он там нах не нужен, но если хочешь снизить пульсации, то 100н за глаза, через резистор, конечно; В-третьих: Если после условия идёт одно действие, то скобки не нужны; В-четвёртых: Не вижу смысла использовать все 10 бит АЦП, если ШИМ у тебя 8 бит + можно усреднить значение (старое значение + новое значение)>>1, причём усреднение можно делать прямо в прерывании по АЦП, а вообще, для более корректного измерения тока R3C1 нах и нужно искать среднеквадратичное значение, сигнал-то ШИМ, ну и на вывод AREF божественную керамику не забывай вешать о чём прямо в даташите сказано; В-пятых: Ты не указал частоту ядра, но обрати внимание, если у тебя частота ядра, например, 1 МГц, то частота ШИМ получается 1МГц/8192/256 ~ 0,48 Гц и время, когда транзистор открыт/закрыт ~ 1 секунда; В-шестых: Очевидно, что будут пульсации по току, я бы воткнул ещё электролит минимум микрофарад на 1000 LESR + керамика на 1 мкФ. А вообще, для регулировки тока LM358 и полевика с резюком в истоке достаточно https://vpayaem.ru/inf_curr1.html Но полевик при таком включении будет работать в линейном режиме и греться, придётся продумать охлаждение, поскольку за Maximum Safe Operating Area можно легко улететь и словить тепловой пробой кристалла P.S. Операционник с указанными номиналами резисторов в цепи ООС работает с коэффициентом усиления ~ 8, но никак не 30
_________________ Окстись! Открой DataSheet и просветись!
"то ШИМ-ом будет регулироваться ток зарядки свинцово-кислотного АКБ."
Из ШИМа надо сделать DAC, далее компаратор, далее оптопара выходом впаралель существующей. И МК будет задавать режим, а не управлять преобразователем... Вмешательство в схему будет минимальным, преобразователь будет работать на штатной частоте и скважности. Я так думаю...
Я вот тоже не могу понять, зачем на очень медленную систему АЦП МК + сам МК с его программой возлагать задачу слежения за током, когда даже самый дешманский ОУ это сделает многократно лучше.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения