Не знаю много ли тут людей кто программирует на PIC. Мне нужно замерять АЦП на ноге, и плюс замерять замерять FVR. (чтоб узнать напряжение питания МК)
По отдельности получается замерять и то и то.
А вот вместе не получается. Ну естественно я пытаюсь по очереди замерять, конфигурируя.
Микроконтроллер PIC16F1847
Я уже как только не пробовал, но где то косячу. При попытке замера по очереди, один сигнал влияет на другой причем очень сильно.
Напряжение питания МК 5.0в (для теста)
По отдельности например вот так:
FVR 2.048в = ADC 415
мультиметром на ноге RA4 3.950в = ADC 800.
Если ничего не меняю физически но включаю замер по очереди то:
FVR 2.048в = ADC 685
мультиметром на ноге RA4 3.950в = ADC 640.
Код (без лишнего) на данный момент выглядит так:
Ну и вот блок схема ADC моего мк:
По отдельности получается замерять и то и то.
А вот вместе не получается. Ну естественно я пытаюсь по очереди замерять, конфигурируя.
Микроконтроллер PIC16F1847
Я уже как только не пробовал, но где то косячу. При попытке замера по очереди, один сигнал влияет на другой причем очень сильно.
Напряжение питания МК 5.0в (для теста)
По отдельности например вот так:
FVR 2.048в = ADC 415
мультиметром на ноге RA4 3.950в = ADC 800.
Если ничего не меняю физически но включаю замер по очереди то:
FVR 2.048в = ADC 685
мультиметром на ноге RA4 3.950в = ADC 640.
Код (без лишнего) на данный момент выглядит так:
C:
unsigned int read_adc (){//функция чтения ацп
int tmp;
CHS4_bit=0; //этими битами выбираю канал. page 143
CHS3_bit=0;
CHS2_bit=1;
CHS1_bit=0;
CHS0_bit=0;
/*
00000 = AN0
00001 = AN1
00010 = AN2
00011 = AN3
00100 = AN4
00101 = AN5
00110 = AN6
00111 = AN7
01000 = AN8
01001 = AN9
01010 = AN10
01011 = AN11
01100 = Reserved. No channel connected.
11100 = Reserved. No channel connected.
11101 = Temperature Indicator
11110 = DAC output(1)
11111 = FVR (Fixed Voltage Reference) Buffer 1 Output(2)
*/
ADON_bit=1; //включаю ацп
ADGO_bit=1; //этим битом запускаю замер ацп на выбранном канале
while (GO_bit){}; // если ацп работает и снимает показания то ниче не делаем висим тут.
tmp = (unsigned int)ADRESH << 8; //верхний регистр приводим к инту и сдвигаем влево на 8 бит так как это верхний регистр
tmp |= ADRESL;//нижний регистр склеиваю
ADON_bit=0; //вырубаю ацп
CHS4_bit=1; //этими битами выбираю канал. page 143
CHS3_bit=1;
CHS2_bit=1;
CHS1_bit=0;
CHS0_bit=0;
return tmp;
}
unsigned int read_fvr (){//функция чтения fvr
int tmp_fvr;
ADFVR1_bit=1;
ADFVR0_bit=0;
FVREN_bit=1;
CHS4_bit=1; //этими битами выбираю канал. page 143
CHS3_bit=1;
CHS2_bit=1;
CHS1_bit=1;
CHS0_bit=1;
ADON_bit=1; //запускаю работу ацп
ADGO_bit=1; //этим битом запускаю замер ацп на выбранном канале
while (GO_bit){}; // если ацп работает и снимает показания то ниче не делаем висим тут.
tmp_fvr = (unsigned int)ADRESH << 8; //верхний регистр
tmp_fvr |= ADRESL;//нижний регистр склеиваю
ADON_bit=0; //вырубаю ацп
TRISA4_bit=1;//RA4 на вход
ANSA4_bit=1;//аналоговый пин
FVREN_bit=0; //пробую выррубать FVR
ADFVR1_bit=0; //пробую вырубать буфер FVR
ADFVR0_bit=0;
return tmp_fvr;
}
void main() {
while (1) {//основной цикл
adc=read_adc();
fvr=read_fvr();
}
}