m.ix писал(а):dimonn писал(а):Датчика температуры нет
по ТБ он обязан быть даже у китайцев стоит.

Это аварийный термо-размыкатель а не датчик температуры.
Собственно я не модернизирую фен а чиню. Тоесть поддержание температуры мне не нужно.
Для выпаивания деталей у меня паяльная станция.
Сдел сегодня часть работы , вот код программы. Atiny 13A
Мощность регулируется.
Осталось добавить вход управления режим 1-2 и схему оформить.
/*
* P_REG1.c
*Симисторный регулятор мощности фена
* Created: 11.10.2015 10:14:15
* Author: Dmitry
*/
//#define F_CPU 4000000
#include <avr/io.h>
#include "math.h"
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#define REG 2 // вход регулятора мощности PB2
#define SYM 3 // выход на оптосимистор PB3
#define Z_CR 4 // сигнал пересеч через 0 PB4
#define DZ_CR 9 // компенсация опережения детектора при спаде
#define REG_MUX 0b00100001 // внешнее Aref +5V ADLAR =1 , старший байт результата в верхнем регистре, MUX на вход ADC1 PB2
//#define TP_MUX 0b01100010 // Режим измер термопары внутр Aref +1.1 старший байт результата в верхнем регистре, MUX на вход ADC2 PB4
#define KF 64// параметр фильтра 120 - 50ms
const unsigned char POW_P []PROGMEM = { 156, 112, 103, 97, 92, 88, 84, 80, 77, 74, 71, 68, 66, 63, 60, 58, 55, 53, 50, 48, 46, 43, 40, 38, 35, 32, 29, 26, 22, 18, 13, 4 };
volatile unsigned char DZ=0;
void main_init()
{
PORTB=0;
DDRB = (1<<SYM);
DIDR0 = (1<<ADC1D) ; // выключение цифр выводов ADC1- регулятор мощности
TCCR0A=0; // , нормальный режим работы таймера
TCCR0B=(1<<CS02); // предделитель 256
TIMSK0=((1<<OCIE0A)|(1<<OCIE0B)); // разрешение прерываний от таймера
ADCSRA=((1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)); // прескалер 64 тактовая АЦП 62.5 kHz, Ckdiv=0
PCMSK= (1<<Z_CR); // прерывания от изм сост на выв Z_CR
GIMSK=(1<<PCIE); // Разреш прерываний от изм сост выводов
}
int main(void)
{
unsigned char REG_V=0; // Регулятор мощности
unsigned char REG_OUT=0; // фильтрованное значение для REG
unsigned int REG_ACC=0; // Акумулятор фильтра
unsigned char T; // Задержка вкл тиристора от пересеч 0
main_init();
sei();
while (1)
{
ADMUX=REG_MUX; // тут измерения ADC
ADCSRA|=(1<<ADSC);
while (ADCSRA&(1<<ADSC));
REG_V=ADCH;
REG_V=REG_V>>3; // деление на 8 - 32 значения мощности
REG_ACC=REG_ACC+REG_V-REG_OUT; // фильтрация
REG_OUT=REG_ACC/KF;
if (REG_OUT>31) REG_OUT=31;
T=(pgm_read_byte(&POW_P[REG_OUT]));
T=T+DZ; // применеие компенсации опережения детектора при спаде
OCR0A=T;
OCR0B=T+1;
if (TCNT0>64) GIMSK=(1<<PCIE); // разрешение прерывания PCINT0
}
}
ISR (PCINT0_vect)
{
SCH1=TCNT0;
if (PINB&(1<<Z_CR)) DZ=0;
else DZ=DZ_CR;
GIMSK=0; // выкл прерываний от PCINT0
TCNT0=0;
}
ISR (TIM0_COMPA_vect)
{
PORTB |= (1<<SYM);
}
ISR(TIM0_COMPB_vect)
{
PORTB&= ~(1<<SYM);
SCH1=TCNT0;