Kod: Zaznacz cały
#define Uref 2.66 // Nap ref
#define Rpom 0.1 // Rez pom
#define R1 100000 // Dziel - R1 100k ohm
#define R2 7665 // Dziel - R2 7k5 ohm
#define Temp_wl 50 // Temp wl wiat
#define Temp_wy 30 // Temp wyl wiat
#define Temp_max 50 // Temp wyl przek
#define Temp_min 40 // Temp wl przek
#define Imax 3.15
#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, ogran, pradogr;
long ADC_temp, ADC_temp_sr;
float Uin;
int napiecie_int , napiecie_float;
int prad_int , prad_float;
int pradogr_int , pradogr_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(" Zas.30V");
druga();
write_text(" 3.15A");
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;
pradogr = 0;
ogran = 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);
ADC_temp = 0;
ADC_temp_sr = 0;
Uin = 0;
//prad = 0;
// pomiar wartosci ADC3
ADMUX |= _BV(PC2);
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;
pradogr = (Imax/1024)*ADC_temp;
ogran = pradogr;
pradogr_int = ogran;
pradogr_float = (ogran*1000)-(pradogr_int*1000);
}
}
ADMUX &= ~_BV(PC2);
if(temperatura >= Temp_wl)
{
PORTB|= _BV(PB1);
}
if(temperatura <= Temp_wy)
{
PORTB &= ~_BV(PB1);
}
if(temperatura >= Temp_max)
{
PORTD &= ~_BV(PD0);
}
if(temperatura <= Temp_min)
{
PORTD|= _BV(PD0);
}
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");
write_text(" ");
write_data(pradogr_int);
write_text(".");
if(pradogr_float<10)
{
write_text("0");
}
if(pradogr_float<100)
{
write_text("0");
}
write_data(pradogr_float);
write_text("A");
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");
write_text(" ");
if((napiecie*prad)<1)
{
write_data(napiecie*prad*1000);
write_text(" mW ");
}
else
{
write_data(napiecie*prad);
write_text(" W ");
}
}
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 ");
}
A co byś powiedział na zastosowanie TL431 jako zewnętrzenego źródła napięcia odniesienia???? Różne opinie czytałem jedni mówią że to coś daje a inni że nic