Терморегулятор вентилятора с програмной стабилизацией напряжения на 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 по больше, под выводные компоненты делаем площадки так, чтобы паять выводы чуть их подогнув.
С готовыми шаблонами плата делается неторопливо за полчаса. Если хотим маркировку, то после лужения сплавом Розе прокатываем бумажку с обозначениями в ламинаторе так же как прокатывали рисунок платы перед травлением
При всем при том, что это не ардуина ни разу, проект, тем не менее, очень и очень интересный. Реализация конкретного устройства заслуживает всяческих похвал, но еще большая ценность, на мой взгляд, заключена в самой идее. Миниатюрный (я бы даже сказал очень) источник напряжения с собственными мозгами, весьма полезное и востребованное устройство.
Насчет печатных плат домашнего изготовления, я бы все-таки посоветовал лимонку с перекисью для травления, как имеющие преимущества по доставабельности и удобству и безопасности хранения. Ну и в качестве способа нанесения рисунка на плату, мне лично больше импонирует ЛУТ по фольге. По точности, разрешающей способности и трудозатратам он выигрывает у бумаги. Правда есть и минус -- нужен состав для удаления фольги. Если применение хлорного железа для травления приемлемо, то этот вопрос автоматически снимается.