Göra ADC beräkningar med PIC 12F675
Re: Göra ADC beräkningar med PIC 12F675
Mitt stalltips blir som följer:
if (V < 0,350) {
// Lys!!!!
}
if (V < 0,350) {
// Lys!!!!
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Göra ADC beräkningar med PIC 12F675
Bäckman gav dig rätt värde, ca 72 (decimalt).
Det är det värde som du ska ha i dina if'ar.
Det finns igen som helst anledning att räkna om ADC värdet
i något som motsvarar "millivolt", processorn skiter helt i det.
Alltså:
Notera att jag har lagt till lite hysteres för att relät inte ska stå och
fladdra vid brytpunkten. Det kanske behövs lite mer för att göra det stabilt.
Det är det värde som du ska ha i dina if'ar.
Det finns igen som helst anledning att räkna om ADC värdet
i något som motsvarar "millivolt", processorn skiter helt i det.
Alltså:
Kod: Markera allt
if (adc_rd < 70) //if value < 350mV turn on Relay_out
RELAY_OUT=1;
else if (adc_rd > 74)
RELAY_OUT=0; //if value > 350mV turn off Relay_out
}
fladdra vid brytpunkten. Det kanske behövs lite mer för att göra det stabilt.
Re: Göra ADC beräkningar med PIC 12F675
Varför envisas du med att översätta värdet till hex? Det tillför väl ingen tydlighet?
Jag brukar använda makron i sådana här fall, för att göra koden mer läsbar.
exempel:
För att få mindre fladder och jämnare resultat kan man flitrera det inlästa värdet på olika sätt.
Man kan t.ex. göra 32 inläsningar i rad och addera dessa innan man gör jämförelsen. Detta gör att resultatet blir ett värde mellan 0 och 32767 istället för 0-1023. Om det finns brus på ingången som är större än 1 LSB ( dvs > 5 mV) kommer det inlästa resultatet att få flera bitars högre noggrannhet - detta kan vara bra i ditt fall.
För att ytterligare minska inverkan från störningar kan man applicera ett digitalt "lågpassfilter" på det inlästa värdet.
Jag brukar använda makron i sådana här fall, för att göra koden mer läsbar.
exempel:
Kod: Markera allt
// spänningar
#define V_REF 5.000 // referensspänning för ADC i volt
#define V_LIMIT 0.350 // gränsvärde i volt
#define HYST 0.005 // hysteres i volt
// beräkningar
#define ADC_LIMIT (V_LIMIT / V_REF * 1024 + 0.5) // ett heltal mellan 0 och 1023
#define ADC_HYST (HYST / V_REF * 1024 + 0.5) // ett heltal mellan 0 och 1023
while(1) {
int relay;
int value = ACD_input(); // inläst värde från ADC mellan 0 och 1023
if (value > ADC_LIMIT + ADC_HYST)
relay = 1;
if (valur < ADC_LIMIT - ADC_HYST)
relay = 0;
delay_ms(500); // förhindra fladder för ofta
}
Man kan t.ex. göra 32 inläsningar i rad och addera dessa innan man gör jämförelsen. Detta gör att resultatet blir ett värde mellan 0 och 32767 istället för 0-1023. Om det finns brus på ingången som är större än 1 LSB ( dvs > 5 mV) kommer det inlästa resultatet att få flera bitars högre noggrannhet - detta kan vara bra i ditt fall.
För att ytterligare minska inverkan från störningar kan man applicera ett digitalt "lågpassfilter" på det inlästa värdet.
Re: Göra ADC beräkningar med PIC 12F675
Trådskrivaren.
t.ex.
vad är problemet med att skriva t.ex.
t.ex.
Jag har omvandlat 350mV till 15E i Hex form...
if (adc_rd < 0x15e)
Jag orkar i alla fall inte sitta och räkna om alla resultat till hex för att se om det är rätt svar...Där x fås i decimal, och sedan omvandlas till hex.
x = (350*1024)/vref
Som blir 11800 i hex?
vad är problemet med att skriva t.ex.
if (adc_rd < 350)
Re: Göra ADC beräkningar med PIC 12F675
OK, då är jag med.
En fråga utan tydlig referens kan lika gärna syfta på
det närmast föregående inlägget...
Men annars håller jag helt med, många verkar tro att
hex är ett annat slags tal än bin eller dec...
En fråga utan tydlig referens kan lika gärna syfta på
det närmast föregående inlägget...

Men annars håller jag helt med, många verkar tro att
hex är ett annat slags tal än bin eller dec...

Re: Göra ADC beräkningar med PIC 12F675
Ja, processorn vet ju inget om varken hextal eller decimaltal. Alla tal i processorn är ju binära. Sedan är det en helt annan sak hur vi väljer att skriva talen i programkoden. Dessa tal får processorn aldrig se - kompilatorn översätter ju dessa till binära tal. Så att skriva 405, 0x195 eller 0b110010101 är ju precis samma sak.
Re: Göra ADC beräkningar med PIC 12F675
Jag envisas för att jag trodde man måste ange alla tal i hex form. Uppenbarligen hade jag fel. Jag har bara sett det på flera ställen i hex så jag antog
Re: Göra ADC beräkningar med PIC 12F675
Ja, det verkar vara en vanlig missuppfattning 
Det är ju lite som att 1Kg och 1000gr är exakt samma sak.
Eller 2 dussin eller 24 styck, vilket ju också är samma sak.
Sen så är det ju en annan sak om ett visst verktyg antar att
ett visst värde är angivet i en viss form.
Men kompilatorer brukar alltid godkänna valfritt format och man
väljer från fall till fall vilket som bli mest lättläst.

Det är ju lite som att 1Kg och 1000gr är exakt samma sak.
Eller 2 dussin eller 24 styck, vilket ju också är samma sak.
Sen så är det ju en annan sak om ett visst verktyg antar att
ett visst värde är angivet i en viss form.
Men kompilatorer brukar alltid godkänna valfritt format och man
väljer från fall till fall vilket som bli mest lättläst.
Re: Göra ADC beräkningar med PIC 12F675
Nu har jag rättat till lite grejer och försöker få en led tänd som är kopplad till gp4 via 1 kohm. Oavsett vilken spänning jag har på ad ingången lyser Led.
Har provat i koden att sätta relay_out = 0 oavsett vad och lysdioden lyser ändå. Har även kollat spänningen på gp4 och den ligger hela tiden 2.45V
Jag kan inte se var felet ligger.. För tllfället har jag inte brytt mig om hysteres mm vill bara att den reagerar på adc'n
Börja nästa undra om ansel och trisio är rätt satta?
Har provat i koden att sätta relay_out = 0 oavsett vad och lysdioden lyser ändå. Har även kollat spänningen på gp4 och den ligger hela tiden 2.45V
Jag kan inte se var felet ligger.. För tllfället har jag inte brytt mig om hysteres mm vill bara att den reagerar på adc'n
Börja nästa undra om ansel och trisio är rätt satta?
Kod: Markera allt
#define RELAY_OUT GPIO.F4
unsigned int adc_rd;
void main() {
TRISIO = 0x4; // Set GP2/AN2 as input, rest as outputs (except GP3/MCLR)
ANSEL = 0x4; // Set AN2 as analog, rest as digital (don't forget CMCON)
CMCON = 0x07; // comparator off
while (1) {
adc_rd = ADC_Read(2); // get ADC value from 2nd channel
if (adc_rd < 0x48) //if value < 350mV turn on Relay_out
RELAY_OUT=1;
else
RELAY_OUT=0; //if value > 350mV turn off Relay_out
}
}
Re: Göra ADC beräkningar med PIC 12F675
> Har även kollat spänningen på gp4 och den ligger hela tiden 2.45V
Om GP4 är en digital utgång så ska den *aldrig* ligga på annat än
GND eller Vdd (eller några tiondels V ifrån kanske).
Kontrollera att det verkligen är 1 kohm du använder.
Om GP4 är en digital utgång så ska den *aldrig* ligga på annat än
GND eller Vdd (eller några tiondels V ifrån kanske).
Kontrollera att det verkligen är 1 kohm du använder.
Re: Göra ADC beräkningar med PIC 12F675
Hexadecimalt är väldigt lätt att i huvudet göra om till binärt (till skillnad från decimalt). Programmerare använder därför ofta hexadecimalt för att sätta register. Tydligare är att skriva i binärt direkt (om kompilatorn tillåter), men det undviker ofta programmerare eftersom att binärt inte är tillåtet i Ansi C, och därmed gör koden krånglig att porta till en kompilator som inte tillåter binärt.newbadboy skrev:Jag har bara sett det på flera ställen i hex så jag antog
Att använda hexadecimalt på ställen där själva linjära värdet är intressant ser jag (som andra i tråden) bara nackdelar med.
Re: Göra ADC beräkningar med PIC 12F675
sodjan skrev:> Har även kollat spänningen på gp4 och den ligger hela tiden 2.45V
Om GP4 är en digital utgång så ska den *aldrig* ligga på annat än
GND eller Vdd (eller några tiondels V ifrån kanske).
Kontrollera att det verkligen är 1 kohm du använder.
Helt säkert... har t.o.m kopplat bort all last på den pinnen och ändå ligger den på 2,45V därför börjar jag undra om all register är rätt satta. men jag kan inte se vad som skulle skita till det
Re: Göra ADC beräkningar med PIC 12F675
OK.
Då är det något annat fel.
Ett litet demoprogram som uppvisar problmet skulle hjälpa.
Skala ner programmet till det nödvändigaste för att felet ska vara kvar.
Då är det något annat fel.

Ett litet demoprogram som uppvisar problmet skulle hjälpa.
Skala ner programmet till det nödvändigaste för att felet ska vara kvar.
Re: Göra ADC beräkningar med PIC 12F675
Om pinnen växlar läge varje varv i loopen kommer en multimeter visa ca 2,5V vid 5V inspänning.
Förresten, behöver man inte initiera ADC innan den används? finns det inte en färdig funktion för initiering, men tanke på att det finns en färdig funktion för läsning?
Förresten, behöver man inte initiera ADC innan den används? finns det inte en färdig funktion för initiering, men tanke på att det finns en färdig funktion för läsning?