АЦП со странным выходом для PIC16F15325

#c #microcontroller #pic #adc

Вопрос:

Я пытался считывать аналоговое напряжение на выводе RC3 на PIC16F15325. У меня 3,23 В на потенциометре, а его выход составляет почти 1,65 В, что идет на вывод RC3 микроконтроллера PIC. Для настройки и библиотек я использовал Кофигуратор кода MPLAB. Код выглядит следующим образом:

 #include "mcc_generated_files/mcc.h"


void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    EUSART1_Initialize();
    ADC_Initialize();
    
    adc_result_t val1 = 0;
    

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    //INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
        // Add your application code
        val1 = ADC_GetConversion(19); // selected channel RC3
        printf("Value - %hu n",val1);
        DELAY_milliseconds(1000);
    }
}
 

Для напряжения, о котором я упоминал выше, я ожидал значение около «511». Все, что выходит за рамки 1023 [т. Е. (2^10) — 1], странно, так как PIC имеет 10-разрядный АЦП.Однако uotput, который я получаю, это:

Вывод с PIC16F15325 на терминале TeraTerm.

Пожалуйста, помогите мне решить эту проблему.

Комментарии:

1. Если вам нужна помощь, вы должны показать свою полную программу, а не только основную. Вы действительно думаете, что RC3-это 19-й канал?

2. Пожалуйста, не публикуйте скриншоты текста, вставьте его как текст. И да, вы можете копировать и вставлять с TeraTerm.

Ответ №1:

На самом деле вывод был правильным, но выглядел странно только из-за формата. Только что я заглянул в таблицу данных, в которой говорилось о 2 способах форматирования результатов АЦП.

PIC16(L)F15325/45 Страница данных-228

и внутри ADC_Initialize(); ADCON1 = 0x10, что означает, что ADFM смещен влево. Я просто сделал val1 = val1 >> 6; это после ADC_GetConversion(19); , и это сработало, как и ожидалось.