Atmega8上的烙铁调节器

业余无线电是我的爱好,因此没有固定工作。通常,您每次都必须从壁橱中取出所有墩子,将它们放在桌子或地板上,然后每次都要对其进行清理。同时,工作区中的插座通常是相同的,这使得延长线一直很懒惰,并且还需要存放在某个地方。对于一个插座,它会测试由插座供电的设备,从而烦人,然后再次等待约5分钟,直到烙铁变热。阅读互联网后,我决定需要一个焊台,但要花费5-10 TR为了爱好,他还没有准备好。解决方案是临时发射台。
谁在乎发生了什么-我要一只猫。


首先,我在这里为阿里买了一个电烙铁,价格为250卢布,这样的电烙马马虎虎
图片

,但是对于能正常使用的房子,我真的必须立即更换它,因为现在他们可以选择100卢布。
购买的电源可用于60W 24伏特。

计划将不会再次出现,但会在签名板上签署所有面额。
图片
外行形式的

木板目的是将所有东西都放在一块木板上,并尽可能紧凑。动力稳定器和现场检查员安装了卧具。该设备由5伏特供电,事实证明,7805加热到70-80度,放了一个小的散热器,磁场极根本不加热。

我制作了电路板LUT,结果几乎是完美的:
蚀刻之前:
图片
组装之后:
图片

现成的调节器组装在我看来看起来非常漂亮
图片

如果未安装编程器的连接器,则说明该板上没有单个跳线。
如您所见,仅在指示器的一般结论上,就可以看到最小的细节,甚至最小的电阻。
红色指示灯,带有大量数字,控制编码器(valcoder)。
第一项包括:我
图片

拒绝了经典的PID,对其进行了外观化,其目标是最短加热时间。
如果按住编码器轴并保持3秒钟,则可以调整显示模式,设置步骤和温度校正(热电偶都不同)。
我在手机上拍了视频,质量不是很好,但是操作原理很清楚


案例,案例……然后一个伟大的想法诞生了
图片

,什么时候该把它放到壁橱里了:
图片

那些想重复它的人的代码源。
下载Atmel Studio项目
项目代码
#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


<剧透/>

Source: https://habr.com/ru/post/zh-CN392507/


All Articles