Jump to content
ELFORUM - Forumul electronistilor

PIC16F1786 probleme ADC.


Recommended Posts

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;}
Edited by bandi12
Link to comment
  • Replies 6
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

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.

Edited by bandi12
Link to comment

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?

Edited by thunderer
Link to comment
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)

Edited by bandi12
Link to comment

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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines