Regulador para soldador en Atmega8

La radioafición es mi pasatiempo, por lo que no hay un trabajo permanente. Por lo general, debe sacar todos los muelles del armario cada vez, colocarlos en una mesa o en el piso y luego limpiarlos cada vez. Al mismo tiempo, la salida en la zona de trabajo suele ser la misma, lo que hace que el cable de extensión sea flojo todo el tiempo, y también debe almacenarse en algún lugar. Y con un tomacorriente molesta al probar el dispositivo alimentado por el tomacorriente, luego espere nuevamente unos 5 minutos hasta que el soldador se caliente. Después de leer Internet, decidí que necesitaba una estación de soldadura, pero gastar 5-10 TR en aras de la afición, todavía no estaba listo. La solución es una estación de tiro improvisada.
A quién le importa lo que pasó: le pido un gato.


Para empezar, compré un soldador de este tipo por 250 rublos. El soldador
imagen

es regular, pero para la casa funcionará, realmente tuve que reemplazar el aguijón de inmediato, ya que ahora hay 100 rublos para elegir.
La fuente de alimentación se compró lista para 60W 24 voltios.

Esquema de nuevo no será, pero en el sello firmado todas las denominaciones. Tablero
imagen
en formato plano

El objetivo era poner todo junto en un tablero y lo más compacto posible. El estabilizador de potencia y el hombre de campo instalaron la mentira. El dispositivo funciona con 5 voltios y, como resultó, el 7805 se calienta hasta 70-80 grados, coloca un pequeño radiador, el poste de campo no se calienta en absoluto.

Hice el tablero LUT, resultó casi perfecto:
antes del grabado:
imagen
y después del ensamblaje: el ensamblaje
imagen

del regulador listo se ve incluso bonito en mi opinión
imagen

Si el conector para el programador no está instalado, entonces la placa sin un solo puente.
Como puede ver los detalles mínimos, incluso las resistencias mínimas, solo en las conclusiones generales del indicador.
Indicador rojo con grandes números, control del codificador (valcoder).
La primera inclusión:
imagen

rechacé el PID clásico, lo asemejé, el objetivo es el tiempo mínimo de calentamiento.
Si presiona el eje del codificador y lo mantiene presionado durante 3 segundos, puede ajustar el modo de visualización, el paso de configuración y la corrección de temperatura (los termopares son todos diferentes).
Grabé un video en el teléfono, la calidad no es muy buena, pero el principio de funcionamiento es claro


Caso, caso ... y luego nació un gran pensamiento
imagen

Y cuando es hora de ponerlo en el armario:
imagen

Codifique las fuentes para aquellos que quieran repetirlo.
Descargar proyecto para atmel studio
Código del proyecto
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

unsigned char display_on, registr, butt1,butt2,butt3, butt3s, zamer,rezhim,mode,param,params, edit, redit, blink, wait2, wait3, wait5, wait6, wait7, rdisp, encoder_r, encoder_l, right, left, prewmode;
unsigned char ind[4],tempvar, tempmem;
float measureint, voltage_ADC,tmp;
unsigned int stop_h, stop_m, pwm_d, measure, pmeasure;
int pwm,tempch;
//unsigned int voltage_ADC;
unsigned char param1[10]; 
unsigned char param1eeprom[10] EEMEM;
uint16_t tempset,measure; uint16_t tem EEMEM;
unsigned char pwm_m[455] EEMEM;

ISR (TIMER0_OVF_vect)
{
		 if(display_on==1)  
			 {
				 PORTB |= (1 << PB6); PORTD |= (1 << PD7); PORTD |= (1 << PD3); PORTC |= (1 << PC2);
				
				 PORTB &=~ (1 << PB0); //1
				 PORTC &=~ (1 << PC1); //2
				 PORTD &=~ (1 << PD4); //3
				 PORTD &=~ (1 << PD2); //4
				 PORTD &=~ (1 << PD5); //5
				 PORTB &=~ (1 << PB7); //6
				 PORTD &=~ (1 << PD6); //7
			 }
			 
		 if(display_on==37)
			 {
				
				if(ind[registr]==0 || ind[registr]==6 || ind[registr]==9) {display_on=display_on+20;} //6 
					if(ind[registr]==2 || ind[registr]==3 || ind[registr]==5 || ind[registr]=='P') {display_on=display_on+25;} //5 
					 if(ind[registr]==4 || ind[registr]=='g') {display_on=display_on+35;} //4 	
						if(ind[registr]==7) {display_on=display_on+40;} // 3 
						 if(ind[registr]==1) {display_on=display_on+45;} //2 
							 if(ind[registr]=='-') {display_on=display_on+50;} //2 
				 				 
				 if(registr==0) { PORTB &=~ (1 << PB6);}
				 if(registr==1) { PORTD &=~ (1 << PD3);}
				 if(registr==2) { PORTC &=~ (1 << PC2);}
				 if(registr==3) { PORTD &=~ (1 << PD7);}
								
					 if (ind[registr]==0) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7);}//0
					 if (ind[registr]==1) {PORTD |= (1 << PD2);PORTD |= (1 << PD5);}//1
					 if (ind[registr]==2) {PORTB |= (1 << PB0);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//2
					 if (ind[registr]==3) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//3
					 if (ind[registr]==4) {PORTC |= (1 << PC1);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTD |= (1 << PD6);}//4
					 if (ind[registr]==5) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//5
					 if (ind[registr]==6) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//6
					 if (ind[registr]==7) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);}//7
					 if (ind[registr]==8) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//8
					 if (ind[registr]==9) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//9
					 if (ind[registr]=='P') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD6);}//P
					 if (ind[registr]=='g') {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2); PORTD |= (1 << PD6);}//g	
					 if (ind[registr]=='-') {PORTD |= (1 << PD6);}//- 
					  if (ind[registr]=='F') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4); PORTD |= (1 << PD6);}//F
					  if (ind[registr]=='n') {PORTB |= (1 << PB0);PORTD |= (1 << PD5); PORTD |= (1 << PD6);}//n	 
						 
				 registr++;
				 if (registr>3){registr=0;}
			 }
			 
			 display_on++;
			 if (display_on>100){display_on=1;blink++; if(blink>250){blink=0;} ADCSR |= (1<<ADSC);}
				 if(blink==250){wait2++; if(wait2>250){wait2=0;}}
				  if(wait2==250){wait3++; if(wait3>250){wait3=251;}; butt3s++; if(butt3s>250){butt3s=251;}; wait5++;wait6++;}	 
				   if(wait3==3 && mode==1){mode=0;}
					   if(wait5==20){wait5=0;}
						   if(wait5==51){wait5=0;}
							   if(wait5==50){wait6++; if(wait6==250){wait6=0;};if(wait6==param1[3]){rezhim=0;}}
				   
}

void init_pwm (void)
{
	TCCR1A|=(1<<COM1A0);
	TCCR1A|=(1<<COM1A1);
	TCCR1B|=(1<<CS10);
	//TCCR1A|=(1<<WGM10);
	TCCR1A|=(1<<WGM11); 
	//TCCR1B|=(1<<WGM12);
	TCCR1B|=(1<<WGM13);
		
	//   
	OCR1A=27000;
	//OCR1B=10000; // 0  200/170  250/215
	ICR1=27000;
}

ISR (ADC_vect)//    
{
	voltage_ADC = voltage_ADC+ADCW;//   
	if (zamer==100) 
	 {
	   measureint=voltage_ADC/zamer;
	   measure=measureint*param1[2]/100;
	   
	   if(rezhim==1)
	    {   
	     if(mode==0)
		  {
			if(param1[0]>0) {ind[0]=measure/100;ind[1]=measure%100/10;ind[2]=measure%10;ind[3]='g';}
			if(param1[0]==0) 
			    {
				  if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;}
					 if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;}
						 ind[2]=tempset%10;ind[3]='g';
				}
	      }
		 if(mode==1)
		    {  
			  if(blink<170)
			   {if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;}
			    if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;}
			    ind[2]=tempset%10;ind[3]='g';
			   }
				  if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;}
			}
	    }
	 
	  	  
	  if(tempmem==0)
	    {
	         if(wait5==10)//5=10 
	         {
		          if(tempch==0 && tempset==measure && eeprom_read_byte(&pwm_m[tempset])!=pwm)
		          {eeprom_write_byte(&pwm_m[tempset],pwm); tempmem=1; ind[0]='g';ind[1]='g';ind[2]='g';}
									  					  
				 if(tempset!=measure) 
		         {
			         pwm_d=tempset-measure;
			         pwm=pwm+pwm_d;
		         }
		         wait5=0;tempch=0;
		     }
		
		    if(pmeasure<measure && tempset<measure) //     
			  {
				pwm_d=measure-tempset; tempch++;
				pwm=pwm-pwm_d;
				pmeasure=measure;
			  }
			  
			  if(pmeasure>measure && tempset>measure) //     
			  {
				pwm_d=tempset-measure; tempch++;
				pwm=pwm+pwm_d*measure/100; 
				pmeasure=measure;
			  }	
			  	  
		  }
		
		 
		 if(wait5==10 && tempmem==1)//5=10 
		   {  
					
			 if(tempset<measure){pwm=pwm-1;}
			 if(tempset>measure){pwm=pwm+1;}
			 if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);}
			 if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);}	 
			 wait5=0;
			 if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer<50){tmp=tmp-10;}
			 if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer>50){tmp=tmp+10;}
							 
		   }	
			 
		if(pwm>250){pwm=250;} if(pwm<0){pwm=0;}
		if(tempset-10>measure && tempmem==1){OCR1A=0;wait5=0;wait6=0;} else {OCR1A=27000+tmp-pwm*108;}   
	  voltage_ADC=0;zamer=0;		
	}
	zamer++; 
		
	if (rezhim!=1) {OCR1A=27000;} 
		if (measure>480) {OCR1A=27000;rezhim=0;OCR1A=27000;}
	
	
	//ADCSR |= (1<<ADSC);//  
}


// 
int main(void)
{

TIMSK |= (1 << TOIE0); //     2
TCCR0|=(0<<CS02)|(1<<CS00);
init_pwm(); //  


//ads
ADMUX|= (1<<REFS0); // 
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
sei(); //   

PORTB=0b00000000; PORTC=0b00101000; PORTD=0b00000001;//  
DDRB=0b11111111; DDRC=0b11010110; DDRD=0b11111110;
			 
butt1=0;butt2=0;butt3=0;rezhim=0;mode=0;params=0;edit=0;redit=0;blink=0;tempmem=0;tempch=0;
encoder_l=40; encoder_r=0; right=0; left=0;butt3s=0;wait3=0;wait2=0;mode=0;prewmode=0;pwm_d=0;

tempset = eeprom_read_word(&tem); if(tempset>500){tempset=100;}	
param1[0] = eeprom_read_byte(¶m1eeprom[0]); if(param1[0]>1){param1[1]=1;}
param1[1] = eeprom_read_byte(¶m1eeprom[1]); if(param1[1]>10){param1[1]=5;}	
param1[2] = eeprom_read_byte(¶m1eeprom[2]); if(param1[2]>250){param1[2]=75;}
param1[3] = eeprom_read_byte(¶m1eeprom[3]); if(param1[3]>250){param1[3]=10;}
	
pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;}

while (1) // 
{
if(tempset<100){tempset=100;}	if(tempset>450){tempset=450;}
	
// 
if ((PINC&(1<<PC5))==0x00){butt1++; if(butt1>200){butt1=201;}} else {butt1=0;}
 if(butt1==200 && rezhim==0){butt3s=0; rezhim=1; butt1=201;}
 if(butt1==200 && rezhim==1){butt3s=0; rezhim=0; butt1=201;}
 if(butt1==200) {butt3s=0;}
	
	if (butt1==201 && butt3s==2 && rezhim!=2){rezhim=2;butt3s=10;}
	if (butt1==201 && butt3s==2 && rezhim==2){rezhim=0;butt3s=10;}	
    
// 	
if ((PIND&(1<<PD0))==0x00){butt2++; if(butt2>encoder_l){butt2=encoder_l+1;}} else {butt2=0;}
if ((PINC&(1<<PC3))==0x00){butt3++; if(butt3>encoder_l){butt3=encoder_l+1;}} else {butt3=0;}

if(right==1 || left==1){right=0; left=0;}
if(encoder_r==0) 
  {
	  if(butt2==encoder_l+1 && butt3==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;right=1;}
	  if(butt3==encoder_l+1 && butt2==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;left=1;}
  }
if(encoder_r==0){encoder_r=1;} encoder_r--;

if(mode!=prewmode){prewmode=mode; eeprom_write_word(&tem, tempset);} 

if(rezhim==0)
{
	if(blink<170){ind[0]=-1; ind[1]=-1; ind[2]=-1; ind[3]=-1;}
	if(blink>170){ind[0]='-'; ind[1]='-'; ind[2]='-'; ind[3]='-';}
}

if(rezhim==1)
  {
	 if(right==1) {tempset=tempset+param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} } 
	 if(left==1){tempset=tempset-param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} }
  }
  

if(rezhim==2)
 {
	if(butt1==200){if(edit==0){edit=1;tempvar=-1;} else {edit=0; eeprom_write_byte(¶m1eeprom[params], param1[params]);} }
	
	if(edit==0)
	 {
		  ind[0]='P'; ind[1]=params; ind[2]=-1; ind[3]=-1;
		  if(right==1){params++;}; if(left==1){params--;}
			  if(params<0){params=0;}; if(params>3){params=3;}
	 }
	
	if(edit==1)
	{
	 if(blink==1 || tempvar!=param1[params])
		 {
			
		 if(param1[params]<100){ind[0]=-1;} else {ind[0]=param1[params]/100;}
		 if(param1[params]<10) {ind[1]=-1;} else {ind[1]=param1[params]%100/10;}
		 ind[2]=param1[params]%10;
	     }
	     if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;}
		tempvar=param1[params];
		if(right==1){param1[params]++;};if(left==1){param1[params]--;}
			if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=1;}
		if(params==0) {if(param1[params]<0){param1[params]=0;} if(param1[params]>1){param1[params]=1;}}	
			if(params==1) {if(param1[params]<1){param1[params]=1;} if(param1[params]>50){param1[params]=50;}}	
				if(params==2) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}}	
					if(params==3) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}}	
    }
	 
 }
 

 } //loop
} //main


<spoiler />

Source: https://habr.com/ru/post/es392507/


All Articles