Терморегулятор вентилятора с програмной стабилизацией напряжения на attiny5

axill
Offline
Зарегистрирован: 05.09.2011

Сделал еще одно устройство на самых маленьких МК от атмела, в этот раз это 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);
    }
}

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

чем надписи наносил на плату?

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Вы, как всегда, радуете.

axill
Offline
Зарегистрирован: 05.09.2011

Michal пишет:

чем надписи наносил на плату?

самым простым способом )) ЛУТом

Araris пишет:

Вы, как всегда, радуете.

спасибо на добром слове )

axill
Offline
Зарегистрирован: 05.09.2011

из моего опыта самый-самый-самый простой способ делать платы дома это обзавестись:

- стеклотекстоитом толщиной 0.5мм

- мелкая наждачка (по нашему нулевка, по китайскому 800 и больше)

- журналами с тонкой мелованной бумагой (у меня используется воскресное приложение к ведомостям)

- лазерный принтер

- ламинатор (у меня переделанный, но и обычный подойдет)

- аммоний суперфосфат. Он в отличие от хлорного железа не пачкается, но можно и хлорное

- растфоритель для обезжиривания типа изопропилового спирта или бензина Калоша, первый почти не пахнет

- ацетон для снятия тоннера

Пилить ничего не нужно, такой стеклотекстолит режется канцелярскими ножницами

Сверлить не нужно - с определенными ограничениями можно делать без сверления (пример сверху). Используем smd по больше, под выводные компоненты делаем площадки так, чтобы паять выводы чуть их подогнув.

С готовыми шаблонами плата делается неторопливо за полчаса. Если хотим маркировку, то после лужения сплавом Розе прокатываем бумажку с обозначениями в ламинаторе так же как прокатывали рисунок платы перед травлением

a5021
Offline
Зарегистрирован: 07.07.2013

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

Насчет печатных плат домашнего изготовления, я бы все-таки посоветовал лимонку с перекисью для травления, как имеющие преимущества по доставабельности и удобству и безопасности хранения. Ну и в качестве способа нанесения рисунка на плату, мне лично больше импонирует ЛУТ по фольге. По точности, разрешающей способности и трудозатратам он выигрывает у бумаги. Правда есть и минус -- нужен состав для удаления фольги. Если применение хлорного железа для травления приемлемо, то этот вопрос автоматически снимается.