Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F1786 probleme ADC.


Postări Recomandate

Vreau sa folosesc un PIC16F1786 pentru a masura voltajul unei baterii, din pacate Proteus nu are acest PIC si nu am putut sa simulez softul. 

 

Lucrand in MikroC citirea ADC se face din doua functii ( acest pic are ADC pe 12 biti) din "help" ul oferit de mikroC reiese ca indiferent de PIC el returneaza ori 10 biti or 12 biti. Bateria find una de 12V am facut un divider din doua rezistente ( 56k+10k) la intrare in ADC am filtru RC ( rezistenta 1.8k + cond.100nF) rezultatul find afistat pe un LCD 16x2. Am simulat soft-ul in proteus pe un PIC16F1963 ( compatibil ca pinout doar ca are ADC pe 10 biti) si functioneaza fara probleme ( in loc de 12V se afiseaza 4 dar este din cauza translatarii ADC in voltaj).  Asa ca am scris soft ul in PIC-ul meu si l-am bagat in montaj avand o surpirza pe cinste, se afisa "0.0,V" acea cratima find ascii 44 ( 44-48 = -4) rezultand ca din conversie comva se obtinea ca voltaj  -0.04V. Pana la urma am schimbat variabila din "int" in "unsigned int" si acuma se afiseaza "6.8V" in loc de "12V". 

 

 Am masurat pe intrarea ADC si am 1.8V calculand cu functia de translatare rezulta corect cei 12V deci functia in sine este corecta, problema cred ca apare la citirea ADC_Get_Sample(), returnand valori aiurea (  nu am incercat sa afisezi valoarea dar cred ca o sa urmeze). Pana acuma nu am lucrat cu ADC pe 12biti, oare mikroC nu configureaza cum trebuie ADC-ul ? sau nu este destul de mare "unsigned int" ca sa faca conversia, desi nu cred.

 

 

Asta este codul.

float sol_volts;float bat_volts;#define ADC_count 5void main() {C1ON_bit = 0;                       // Disable comparatorsC2ON_bit = 0;TRISA = 0x7;ANSELA = 0x7;InitLCD();ADC_Init();while(1) {  readInputData();  updateDisplay();  delay_ms(500);}}unsigned int readADC(char chanel) { unsigned int temp=0; int i;  ADC_Get_Sample(chanel);  for(i=0;i<ADC_count;i++)     temp+=ADC_Get_Sample(chanel);return (temp/ADC_count);}void readInputData() {   sol_volts = 0;   bat_volts = (float)readADC(2)*0.008185;}
Editat de bandi12
Link spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Acel 0.008185 este valoare de scalare de la ADC la volt, 33.5V este maximul suportat de rezistente (56K+10K) ca la iesire sa fie sub 5V ( am si un zener de 5v1 ca siguranta).

 

Am afisat ADC-ul si destul de interesant rezultatul :

 

La 0V am 64660 care urca pana la 65510 care reprezinta 2.1V de acolo sare la 0 si urca pana la 1230 insemnand 5V.  Rezultand ca ADC-ul scoate valori aiurite intre 0-2.1V si de acolo incepe se lucreze pana la valoarea de 1230.

 

65510-64660 = 850 valori + 1230 = 2080 de valori intre 0-5V.

Editat de bandi12
Link spre comentariu

In mod sigur ceva e citit aiurea de ADC. E ca si cum ai avea un offset.Daca vrei sa masori 12V pe 12 biti nu faci divizor pentru 33.5V. Astfel, reduci rezolutia la 10 biti si un pic. Schema si program complet se poate pune?

Editat de thunderer
Link spre comentariu
void testADC() {char txt[10];unsigned int adcRead = ADC_Get_Sample(2);WordToStrWithZeros(adcRead, txt);LCD_Out(1,2,txt);}void main() {delay_ms(150);TRISC = 0x00;PORTC = 0;C1ON_bit = 0;                       // Disable comparatorsC2ON_bit = 0;TRISA = 0x7;ANSELA = 0x7;InitLCD(); // este o functie cu mesaj de HelloADC_Init();while(1) { testADC(); delay_ms(500); }}

 

 

Posted Image

 

 

 

 

Posted Image

 

 

 

 

Mufa stanga jos + cel mic pleaca catre LCD si pe cel de sus-mijloc vine alimentarea de la baterie si cursorul de la potentiometru. 

Ceramicele de 100nF sunt lipiti direct pe pinii soclului ( sunt doua findca PIC-ul are doua VSS uri.)

 

 

Problema cred ca vine direct din ADC_Get_Sample(2)  sau din ADC_Init() al lui MikroC, o sa incerc sa ma documentez din datasheet si sa incerc o citire prin registrii fara sa utilizez functia din MikroC ( pana acuma am folosit numai cel din mikroC si nu am avut probleme dar se pare ca are ceva cu PIC-ul asta si nu vrea)

Editat de bandi12
Link spre comentariu

Folosesc AN2 pe langa AN0 si AN1, pe AN0 e un senzor de curent , pe AN1 si AN2 masor doua voltaje ( baterie respectiv panou solar).

 

Am gasit pana la urma problema, se pare ca mikroC nu face setarea / citirea corecta a ADC-ului a acestui PIC sau ADC pe 12 biti. Am studiat datasheet-ul si am translatat exemplul de ADC din asm in C  si acuma se afiseaza corect valorile intre 0-4095. Mai ramane sa vad cum pot seta dinamic canalul pe care vreau sa fac citirea care este setat prin ADCON0 la bitii 2-6 fara sa definesc pentru fiecare canal aferentul in hexadecimal , sigur e posibil cu shiftare dar ma cam bate

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări