ADC-převodník

Ahoj,
mam asi začátečnický dotaz, ale k věci. Vyvíjím si PWM regulátor topení a potřebuji načítat dva potenciometry skrze AD převodník u PIC 18F46K22, jenže mam problém. Bez problému načtu pouze jeden potenciometr a druhý nikoli, oba dva se mi “třískají” a ovlivňují navzájem. Netuším kde bych mohl mít chybu, nastavení MCU jsem prošel 3x tam i zpátky a chybu tam vysloveně nevidím, vstupy mam nastavené na vstupy skrze TRIS registr, analogy mam nastavené také správně skrze ANSELx registr. KÓd jsem použil z nějakého tutoriálu na webu.Aplikaci budu přepínat skrze push button; dva režimy - auto/manual, přičemž v manuálu budu číst ty dva analogové vstupy. Na nepájivém poli mi to sice sepne LED signalizující změnu režimu, ale při vyplé LED a nastavení potenciometrů se mi LED rozbliká a nebo zhasne.Je možné, že to způsobuje to nepájivé pole? MCU mam odrušené skrze keramiky na napájení i v tom nepájivém poli.

Tady je kód pro ADC:

    ADCON1 = 0x0C;
    ADCON2 = 0x92;
    
    ADCON0 = (channel << 2);
    ADCON0 |= 0x03;
        
    while (ADCON0bits.GO_nDONE);
    
    return ((ADRESH << 8)| ADRESL);

V ADC jsem zadal reálné číslo kanálu - pinu, kde mam připojený potenciometr

  ADC_hodnota[0] = ADC(11);

a nastavení MCU:

    PMD1 = 0xFF;                //setting peripheral module
    RCON  = 0x1F;               //setting reset control register
    STATUS = 0xC;               //setting status bits
    ANSELA = 0x00;              //digital port
    ANSELB = 0xF0;              //RB <0-3> digital, other as analog ports
    ANSELC = 0x00;              //digital ports
    ANSELD = 0x00;              //digital ports   
    ANSELE = 0x00;              //digital ports
    VREFCON0 = 0x00;            //nastaveni napetove reference
    TRISEbits.RE0 = 0;          //vystup pro LED1
    TRISDbits.RD3 = 1;          //vstup pro SW_1
    TRISEbits.RE2 = 0;          // PWM_1 - topeni_1
    TRISDbits.RD1 = 0;          // PWM_2 - topeni_2
    TRISBbits.RB4 = 1;          // vstup PTC_1
    TRISBbits.RB5 = 1;         CCPTMRS1 = 0x4; // vstup PTC_2
CCPTMRS1 = 0x4;

Co se týče frekvence MCU tak ho taktuji na 4 MHz.

Budu rád za pomoct, protože jestli tam mam chybu, tak já jí teda nevidím :frowning:

cau,tohle ma delat co ?

ADC_hodnota[0] = ADC(11); 

hodnota se cte z adresH/L

unsigned int16 ADC_hodnota_1; ADC_hodnota_1=((ADRESH << 8)| ADRESL);
zapnes ad prevodnik, nastavis vstupy,nastavis referenci,nastavis kanal,pockas,spustis mereni,pockas nes se dokonci prevod,prectes hodnotu, zmenis kanal,pockas,spustis mereni…

[forum.mcontrollers.com/t/pic16f88-ad-prevodnik-zmena-napeti-zpusobi-preblikavani-led/1162/83)

Sakra, když jsem to kopíroval, tak mi vypadla část fce. Tadu je celý kód té funkce:

unsigned int ADC (unsigned int channel) {    
            
    ADCON1 = 0x0C;
    ADCON2 = 0x92;
    ADRESH = 0x00;
    ADRESL = 0x00;
    
          
    
    ADCON0 = (channel << 2);
    ADCON0 |= 0x03;
        
    
    while (ADCON0bits.GO_nDONE);
    
    //ADC_value = ((ADRESH*256)| (ADRESL));    
   
    return ((ADRESH << 8)| ADRESL);    
    
}

No, jde mi o to, že když zadám parametru funkce číslo kanálu (portu) na kterém mam připojený potenciometr, tak aby vrátila hodnotu z AD převodníku. A tu hodnotu předávám do pole se kterým dále pracuji. Měním střídu PWM signálu, jenže v tom nepájivém poli se to chová prapodivně - potenciometry se navzájem ovlivňují.

oblibena fraze :predchozi prispevky se necituji…

kolik bitu ma unsigned int v tvim prekladaci ? pouzivas 8/10 bit adc ?

rozchod pouze jeden kanal bez nakyho morfovani, precist a nejak zobrazit hodnotu

Ok, citovat předchozí nebudu.
No, přiznám se že netuším kolik bitů má unsigned int v XC8.
Na ADC používám 10 bitů - vycházel jsem z nějakého tutoriálu na webu.

v xc8 nedelam…
microchipdeveloper.com/tls2101:type-qualifiers

microchipdeveloper.com/projects … -project-3
microchipdeveloper.com/projects … -project-5

a jak sem uz psal je potreba zacit postupne…

Jo, pustím se do toho o víkendu pěkně po jednom kanálu ADC.