Терморегулятор вентилятора с програмной стабилизацией напряжения на attiny5
- Войдите на сайт для отправки комментариев
Сделал еще одно устройство на самых маленьких МК от атмела, в этот раз это attiny5 - 512 байт програмной памяти, 32 байта оперативной памяти, 0 байт EEPROM и АЦП на 8 бит.
Задача которая решалась - управление вентилятором охлаждения в зависимости от температуры для 3D принтера и ЧПУ станка. Кроме собственно управления вентилятором (таких схем хватает) здесь еще сделана стабилизация напряжения и появляется возможность совместить преобразование step-down с собственно управлением. При входном напряжении от 14 до 30 вольт, на выходе получаем напряжение со стабилизацией (не зависит от входного) от 5.5В до 12в - в зависимости от температуры. Напряжение на вентиляторе получается постоянным, это не ШИМ. Сделано во первых чтобы гарантировать стабильную работу вентилятора (в самом вентиляторе тоже есть электроника), а во вторых чтобы иметь гарантированное снижение напряжение (ШИМ дает снижение среднего значения напряжения, а не пиков).
Схема отлажена с применением осцилографа так, чтобы транзисторы работыли в режимах приближенных к ключевым - с максимальными фронтами открытия и закрытия. Это позволило применить маленькие транзисторы в корпусах SOT23 и управлять вентиляторами с током до 0.5А без нагрева транзисторов.
Схема:
Плата сделана ЛУТ без сверления:
так получилось до пайки и после:
Тут подробное описание http://radiokot.ru/circuit/digital/automat/76/
Пока установил только на принтер, тут описание http://www.thingiverse.com/thing:204997
Скетч сделан под atmel studio 6
/* * p000_invertor_fun_cooler.c * * Created: 06.07.2013 15:47:25 * Author: axillent */ #define INSOURCE // VCC = 5V // PB0 - PWM output // PB1 - voltage analog input // PB2 - temperature analog input #define TEMPERATURE_ADC 2 #define VOLTAGE_ADC 1 #define MAX_VOLTAGE_ADC 204 // maximum 12v on fan (using AREF=5V and voltage devider 1/3) #define MIN_VOLTAGE_ADC 98 // minimum voltage on fan #define MIN_TEMPERATURE 34 #define MAX_TEMPERATURE 46 #define OFF_TEMPERATURE 32 #define PWM_TOP 127 #include <avr/io.h> #include <avr/interrupt.h> #include <avr/wdt.h> #include <util/delay.h> volatile uint8_t voltage; volatile uint8_t target_voltage; ISR(ADC_vect) { switch(ADMUX) { case TEMPERATURE_ADC: { // formula - (adcl * 50 /4 * 10 + 32) / 64 - 273 uint16_t temperature = ADCL; temperature *= 50; temperature /= 4; temperature *= 10; temperature += 32; temperature /= 64; if(temperature > 273) temperature -= 273; else temperature = 0; // getting 32 range if(temperature <= OFF_TEMPERATURE) { target_voltage = 0; } else { temperature = (temperature < MIN_TEMPERATURE)?0:(temperature > MAX_TEMPERATURE)?(MAX_TEMPERATURE - MIN_TEMPERATURE):temperature-MIN_TEMPERATURE; temperature *= (MAX_VOLTAGE_ADC - MIN_VOLTAGE_ADC); temperature /= (MAX_TEMPERATURE - MIN_TEMPERATURE); target_voltage = MIN_VOLTAGE_ADC + temperature; } ADMUX = VOLTAGE_ADC; break; } case VOLTAGE_ADC: voltage = ADCL; ADMUX = TEMPERATURE_ADC; break; } ADCSRA |= (1 << ADSC); } int main(void) { // configure core, run at 8mhz CCP = 0xD8; CLKPSR = 0; // ports DDRB |= (1 << PB0); //configure PWM ICR0 = PWM_TOP; TCCR0A = (1 << WGM01) | (0 << WGM00) | (1 << COM0A1) | (0 << COM0A0); TCCR0B = (1 << CS00) | (1 << WGM03) | (1 << WGM02); // configure ADC // start from temperature ADMUX = TEMPERATURE_ADC; // enable, /32 prescaler, enable interrupts, trigger source ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // free running mode ADCSRB = 0; // enable interrupts sei(); // start first conversion ADCSRA |= (1 << ADSC); wdt_enable(WDTO_1S); while(1) { if(target_voltage) { int8_t diff = target_voltage - voltage; TCCR0A |= ((1 << COM0A1) | (0 << COM0A0)); if(diff > 0) { if(OCR0A < PWM_TOP) OCR0A++; } else if(diff < 0) { if(OCR0A) OCR0A--; } } else { TCCR0A &= ~((1 << COM0A1) | (0 << COM0A0)); PORTB &= ~(1 << PINB0); } wdt_reset(); _delay_ms(50); } }
чем надписи наносил на плату?
Вы, как всегда, радуете.
чем надписи наносил на плату?
самым простым способом )) ЛУТом
Вы, как всегда, радуете.
спасибо на добром слове )
из моего опыта самый-самый-самый простой способ делать платы дома это обзавестись:
- стеклотекстоитом толщиной 0.5мм
- мелкая наждачка (по нашему нулевка, по китайскому 800 и больше)
- журналами с тонкой мелованной бумагой (у меня используется воскресное приложение к ведомостям)
- лазерный принтер
- ламинатор (у меня переделанный, но и обычный подойдет)
- аммоний суперфосфат. Он в отличие от хлорного железа не пачкается, но можно и хлорное
- растфоритель для обезжиривания типа изопропилового спирта или бензина Калоша, первый почти не пахнет
- ацетон для снятия тоннера
Пилить ничего не нужно, такой стеклотекстолит режется канцелярскими ножницами
Сверлить не нужно - с определенными ограничениями можно делать без сверления (пример сверху). Используем smd по больше, под выводные компоненты делаем площадки так, чтобы паять выводы чуть их подогнув.
С готовыми шаблонами плата делается неторопливо за полчаса. Если хотим маркировку, то после лужения сплавом Розе прокатываем бумажку с обозначениями в ламинаторе так же как прокатывали рисунок платы перед травлением
При всем при том, что это не ардуина ни разу, проект, тем не менее, очень и очень интересный. Реализация конкретного устройства заслуживает всяческих похвал, но еще большая ценность, на мой взгляд, заключена в самой идее. Миниатюрный (я бы даже сказал очень) источник напряжения с собственными мозгами, весьма полезное и востребованное устройство.
Насчет печатных плат домашнего изготовления, я бы все-таки посоветовал лимонку с перекисью для травления, как имеющие преимущества по доставабельности и удобству и безопасности хранения. Ну и в качестве способа нанесения рисунка на плату, мне лично больше импонирует ЛУТ по фольге. По точности, разрешающей способности и трудозатратам он выигрывает у бумаги. Правда есть и минус -- нужен состав для удаления фольги. Если применение хлорного железа для травления приемлемо, то этот вопрос автоматически снимается.