logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA8] Sterowanie przekaźnkiem w zasilaczu

Faber33 09 Maj 2010 11:56 1689 8
  • #1 8053964
    Faber33
    Poziom 16  
    Witam. Mam takie pytanie...jak zrobić na Atmedze8 sterownik przekaźnika który by odłączał zasilanie podawane do obciążenia w zasilaczu regulowanym...po osiągnięciu zbyt dużej temperatury na tranzystorach mocy, uszkodzonym czujniku temperatur lub niedziałającym wentylatorze który je chodzi...dodam że mam już wykonany miernik: pomiar napięcia, prądu, temperatury (LM35)...Doradził by mi ktoś dodam że jestem początkujący :) i jakoś nie moge znaleźć schematu takiego zabezpieczenia :)
  • #2 8054281
    klops_mops
    Poziom 17  
    Witam,

    kolego poradziłeś sobie z miernikami napięcia i prądu, a nie możesz z prostymi warunkami?

    - kontrola temperatury: warunek: temperatura > temperatura_bezpieczna wtedy załączasz przekaźnik który normalnie w stanie wyłączonym przewodzi
    - kontrola pracy wentylatora: np. mierzenie jego poboru prądu - jeśli prawidłowy to jest wszystko ok, jeśli nie to załączenie przekaźnika

    Itp.

    Pozdrawiam
  • #3 8054445
    Faber33
    Poziom 16  
    dzięki za info...tylko że ja tego programu do atmegi nie pisałem więc nie jest to dla mnie takie jasne :/ Wiem gdzie to ewentualnie podłączyć ale nie wiem jak rozwiązać to programowo :(
  • #4 8056132
    arktik1
    Poziom 27  
    Czyli krótko mówiąc potrzebny ci czujnik obrotów z termostatem.
    W jakim języku chcesz to pisać??
  • #5 8056367
    Faber33
    Poziom 16  
    hmm...te pliki które już mam to otwieram w AVR Studio...tam są pliki .c i .h ale nie wiem jaki to język :/ w układzie jest już czujnik temperatury załączający wentylator przy określonej temp. ale chciałbym jeszcze dopisać do programu komendy które wykorzystując wolne wyprowadzenia np. portu D w ATmedze sterowałyby przekaźnikiem odłączającym zasilanie po przekroczeniu określonej temperatury radiatora powiedzmy 85 stopni
  • #6 8062793
    Faber33
    Poziom 16  
    Oczywiście autora projektu tego miernika nie sposób się doprosić aby łaskawie odpisał :/ chodź widzę żę bywa na forum... bo w tych plikach niema znowu kalibracji miernika :/ a w pliku hex jest...ale tam sprawa dla mnie wygląda dużo gorzej :| może by ktoś pomógł to dopisać :)???
  • #7 8063686
    arktik1
    Poziom 27  
    Jeśli masz pliki C i H to chyba Język:C.
    Pokaż kod.
  • #8 8063750
    Faber33
    Poziom 16  
    To jest kod z pliku main.c jeszcze jest tam kilka innych ale w tym jest najwięcej danych ;)


    
    #define Uref 		2.64			// Napiecie referencyjne
    #define Rpom 		0.3			    // Rezystor pomiarowy
    #define R1			100000			// Dzielnik napieciowy - R1 100k ohm
    #define R2			7500			// Dzielnik napieciowy - R2 7k5  ohm
    #define Temp_wl		70				// Temp wlaczenia wiatraka
    #define Temp_wy		60				// Temp wylaczenia wiatraka
    
    #include <avr/io.h>
    //#include <math.h> 
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "naglowkowy.h"
     
    void lcd_U_I(void);
    void lcd_P_R(void);
    void lcd_T_FAN(void);
    void lcd_TON_TOFF(void); 
    
    char data0[8] = {0x0E, 0x11, 0x11, 0x11, 0x0A, 0x0A, 0x1B, 0x00}; //ohm		numer 0
    char data1[8] = {0x02, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}; //stopien numer 1
    char data2[8] = {0x00, 0x04, 0x15, 0x0E, 0x15, 0x04, 0x00, 0x00}; // gwiazdka
    char x;
    
    	int i, ADC_H, ADC_L;
    	float prad, napiecie, temperatura;
    	long ADC_temp, ADC_temp_sr;
    	float Uin;
    	int napiecie_int , napiecie_float;
    	int prad_int , prad_float;
    	char menu = 0;
    	char setup;
    
    int main(void)
    {
    
    	Ust_Portow();
    	LCD_init();
    	ADC_init();
    
    	lcd_def_char(data0,0);
    	lcd_def_char(data1,1);
    	lcd_def_char(data2,2);
    
    	pierwsza();
    	write_char(0b00000010);
    	write_text(" Zasila");
    		
    	druga();
    	write_text("cz 30V ");
    	write_char(0b00000010);	
    
    	Waitms(100);		
    	
    	PORTB|= _BV(PB1);
    	Waitms(500);	
    	
    	PORTB &= ~_BV(PB1);
    
    	czysc();
    	
    	while(1)
    	{
    
    		prad = 0;
    		napiecie = 0;
    		temperatura = 0;				
    		ADC_temp = 0;
    		ADC_temp_sr = 0;
    		Uin = 0;
    
       		// pomiar wartosci ADC0 - napiecie
       		for(i = 0 ; i < 20 ; i++)
    		{
    			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
       			while(bit_is_set(ADCSRA,ADSC)){};   
       			ADC_L = ADCL;
       			ADC_H = ADCH;
    			ADC_temp  = ADC_H*256+ADC_L;
    			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
    			if(i==19)			
    			{
    				ADC_temp = ADC_temp_sr/20;
    				Uin = (Uref/1024)*ADC_temp;
    				napiecie = ((R1+R2)/R2)*Uin;
    				
    				napiecie_int = napiecie;
    				napiecie_float = (napiecie*100)-(napiecie_int*100);
    					
    			}
      		}
    
    		temperatura = 0;				
    		ADC_temp = 0;
    		ADC_temp_sr = 0;
    		Uin = 0;
    		//prad = 0;
    
       		// pomiar wartosci ADC1
       		ADMUX |= _BV(PC0); 			
       		for(i = 0 ; i < 20 ; i++)
    		{
    			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
       			while(bit_is_set(ADCSRA,ADSC)){};   
       			ADC_L = ADCL;
       			ADC_H = ADCH;
    			ADC_temp  = ADC_H*256+ADC_L;
    			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
    			if(i==19)			
    			{
    				ADC_temp = ADC_temp_sr/20;
    				Uin = (Uref/1024)*ADC_temp;
    				prad = Uin/Rpom;
    				
    				prad_int = prad;
    				prad_float = (prad*1000)-(prad_int*1000);
    			}
      		}
    
    
    		temperatura = 0;				
    		ADC_temp = 0;
    		ADC_temp_sr = 0;
    		Uin = 0;
    
      		ADMUX &= ~_BV(PC0);
    
       		// pomiar wartosci ADC2
       		ADMUX |= _BV(PC1); 			
       		for(i = 0 ; i < 20 ; i++)
    		{
    			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
       			while(bit_is_set(ADCSRA,ADSC)){};   
       			ADC_L = ADCL;
       			ADC_H = ADCH;
    			ADC_temp  = ADC_H*256+ADC_L;
    			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
    			if(i==19)			
    			{
    				ADC_temp = ADC_temp_sr/20;
    				Uin = (Uref/1024)*ADC_temp;
    				temperatura = Uin*90;
    			}
      		}
    		ADMUX &= ~_BV(PC1);
    
    		
    		if(temperatura >= Temp_wl)
    		{
    			PORTB|= _BV(PB1);
    		}
    
    		if(temperatura <= Temp_wy)
    		{
    			PORTB &= ~_BV(PB1);
    		}
    
    		
    		if(bit_is_clear(PINB,PB2))
    		{
    			
    //		while(bit_is_clear(PINB,PB2)){}
    
    				Waitms(100);
    				menu=menu+1;
    				if(menu > 3)
    					{
    					menu=0;
    					}
    		}
    
    	
    		
    		if(menu==0) // prad napiecie
    			{
    			lcd_U_I();					
    			}
    
    		if(menu==1) /// moc rezystancja
    			{
    			lcd_P_R();		
    			}
    
    		if(menu==2) // temp fan
    			{
    			lcd_T_FAN();
    			}
    					
    		if(menu==3) // temp on off
    			{
    			lcd_TON_TOFF();
    			}
    		
    				
    	//	if(bit_is_set(PINB,PB1))
    	//	{
    	//	czysc();
    	//	write_text("Fan ON  ");
    	//	}
    
    	}
    	return 0;
    
    }
    
    void lcd_U_I(void)
    {
    				pierwsza(); 
    				write_text(" ");
    				write_data(napiecie_int);
    				write_text(".");
    				if(napiecie_float<10)
    				{
    				write_text("0");
    				}
    				write_data(napiecie_float);				
    				write_text("V  ");					
    
    				druga();
    
    				write_text(" ");
    				write_data(prad_int);
    				write_text(".");
    				if(prad_float<10)
    				{
    				write_text("0");
    				}
    				
    				if(prad_float<100)
    				{
    				write_text("0");
    				}		
    						
    				
    				
    				write_data(prad_float);				
    				write_text("A  ");
    }
    void lcd_P_R(void)
    {
    				pierwsza();
    				write_text(" ");
    				
    				if((napiecie*prad)<1)
    				{
    				write_data(napiecie*prad*1000);
    				write_text("mW     ");
    				}
    				else
    				{
    				write_data(napiecie*prad);
    				write_text("W     ");				
    				}
    				
    				
    				druga();
    				if(((napiecie/prad)>=1000000)||(napiecie==0)||(prad==0))
    					{
    					write_text("R > 1M");
    					write_char(0b00000000);
    					write_text("   ");
    					}
    				else
    					{
    				
    					write_text("  ");
    					write_data(napiecie/prad);
    					write_char(0b00000000);
    					write_text("      ");	
    					
    					}
    }
    void lcd_T_FAN(void)
    {
    				
    				
    				pierwsza();
    				write_text(" ");
    				write_data(temperatura);
    				
    				write_char(0b00000001);
    				write_text("C   ");			
    				
    				druga();
    				if(bit_is_set(PINB,PB1))
    				write_text("Fan ON  ");
    				if(bit_is_clear(PINB,PB1))	
    				write_text("Fan OFF  ");
    }
    void lcd_TON_TOFF(void)
    {
    		druga();
    		write_text(" ON ");					
    		write_data(Temp_wl);
    		write_char(0b00000001);		
    		write_text("C    ");		
    
    		pierwsza();	
    		write_text("OFF ");		
    		write_data(Temp_wy);
    		write_char(0b00000001);		
    		write_text("C    ");
    }
    
  • #9 8064018
    arktik1
    Poziom 27  
    To na pewno C.
    Musi się wypowiedzieć znawca C.
REKLAMA