Göra ADC beräkningar med PIC 12F675

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av labmaster »

Mitt stalltips blir som följer:
adc.gif
if (V < 0,350) {
// Lys!!!!
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

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å:

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
       
  }
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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

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:

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
}
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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

> Varför envisas du med att...

Vem är "du" ??
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

Trådskrivaren.

t.ex.
Jag har omvandlat 350mV till 15E i Hex form...

if (adc_rd < 0x15e)
Där x fås i decimal, och sedan omvandlas till hex.
x = (350*1024)/vref
Som blir 11800 i hex?
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...

vad är problemet med att skriva t.ex.
if (adc_rd < 350)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

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... :-)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

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.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

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.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

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?

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
        
  }

}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

> 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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av bearing »

newbadboy skrev:Jag har bara sett det på flera ställen i hex så jag antog
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.

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.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

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.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av bearing »

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?
Skriv svar