📜 ⬆️ ⬇️

Regulator for soldering iron on Atmega8

Amateur radio is my hobby, so there is no permanent workplace. Usually it is necessary to get every time all the prizes from the wardrobe, lay them out on the table or on the floor, then clean them up each time. At the same time, the socket in the work zone is usually one; it is always lazy to make an extension cord, but it also needs to be stored somewhere. And it strains with one socket after conducting a test of the device that is powered from the socket, then wait for about 5 minutes again until the soldering iron warms up. After reading the Internet I decided that I need a soldering station, but spend 5-10 tr. For the sake of passion, I was not ready yet. The solution is a homemade floating station.
Who cares what happened - I ask under the cat.


For starters, for 250 rubles I bought a soldering iron on Ali
image

The soldering iron is so-so, but it will go for the house, I really had to replace the sting right away, since now there are a choice of 100 rubles each.
Power supply bought ready for 60W 24 volts.
')
Schemes will not be again, but on the signet signed all face values.
image
Lay Lay

The goal was to assemble everything on one board and as compact as possible. Power stabilizer and field set installed prone. The device is powered by 5 volts and as it turned out, 7805 heats up to 70-80 degrees, put a small radiator, the field heater does not heat at all.

I made the pay with LUT, it turned out almost perfectly:
Before pickling:
image
And after assembly:
image

The finished regulator assembly looks pretty cute in my opinion.
image

If the connector for the programmer does not install, then the board without a single jumper.
As we can see, even the minimum details, even the minimum resistors, are only for the general findings of the indicator.
The indicator is red with large numbers, control of the encoder (valcoder).
First inclusion:
image

He refused the classic PID, made some of its similarity, the goal is the minimum heating time.
If you press the encoder shaft and hold it for 3 seconds, you can adjust the display mode, the tuning step and the temperature adjustment (the thermocouples are all different).
I took a video on the phone, the quality is not very good, but the principle of operation is clear


The body, the body ... and here a great thought was born
image

And when it's time to clean the closet:
image

Source code for those who want to repeat.
Download project for atmel studio
Project code
#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/392507/


All Articles