Модуль АЦП PIC32 все возможные навороты которыми могут обладать модули микроконтроллера. Но мы рассмотрим только один простой вариант для работы с одним входом. Мы для работы выберем модуль 1.
Работа АСП модуля проста.
Перед началом настройки мы должны убедиться, что модуль отключен:
1 |
AD1CON1bits.ON=0; // выключить АЦП1 |
Мы должны выбрать вход который будет использоваться как аналоговый:
1 2 3 |
/*настройка аналоговых входов для АЦП1*/ TRISBbits.TRISB0=1; // регистр направления данных порта AD1PCFG=0xFFFE; // PORTB = Digital; RB0 = analog, 0-аналоговый вход 1 - цифровой |
Следующий этап, это подключение выводов для опорного напряжения (уровень, разность напряжений между этими входами определяют, какой диапазон напряжений оцифровывает модуль):
1 |
AD1CHS=0; // отрицательный выход к Vr-, CH0SA - AN0; |
Режим работы АЦП, тут мы настраиваем, кто будет запускать АЦП для выполнения измерения, как будет АЦП предоставлять данные нам и как долго мы будем подключены к источнику сигнала для зарядки (или перезарядки) измерительной емкости на входе АЦП. Тут все зависит от того, что и как измеряется. В нашем варианте АЦП работает непрерывно.
1 2 3 |
AD1CON1bits.SSRC = 0b010; // 010 = Timer 3 period match ends sampling and starts conversion AD1CON1bits.FORM = 0b011; // 011 = Signed Fractional 16-bit (DOUT = 0000 0000 0000 0000 sddd dddd dd00 0000) AD1CON1bits.ASAM = 1; // 1 = выборка начинается сразу после преобразования. |
АЦП имеет 16 буферов, при необходимости мы можем их использовать для эффективности работы. Но в нашем примере мы будем использовать только один буфер (так как в будущем планируем использовать DMA для передачи данных между АЦП и памятью):
1 2 3 |
AD1CON2 = 0; // BUFM = 0 буфер = 16 слов AD1CON2bits.SMPI=0x0; // количество буферов участвующих в цикле измерения, по окончанию заполнения формируется прерывание 16 буферов /*один буфер грузим*/ |
И последние настройки это сколько мы тратим времени на выборку и длительность периода TAD (общее время обработки данных в АЦП):
1 2 |
AD1CON3bits.SAMC = 2; // TAD (0-31) время выборки AD1CON3bits.ADCS = 2; // TPB · (ADCS<7:0> + 1)*2 = 64 · TPB = TAD |
И остается включить:
1 |
AD1CON1bits.ON=1; //включить АЦП1 |
Но конвертирование не наступит, пока ты не включить источник запуска АЦП. А источником мы назначили таймер Т3.
1 2 3 4 |
TMR3 = 0x0000; // выключить T3CONbits.TCKPS = 0b111; // 111 = 1:256 prescale value PR3=FCY/NZCHAST/256/FFT_N; // вычисляем значение для частоты NZCHAST T3CONbits.ON = 1; // включить таймер |
Вот после этого АЦП начнет выполнять измерение с частотой заданной таймером.
Общий вид функции инициализации АЦП может быть такой
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// настройка АЦП void initADC (void)/*настройка АЦП */ { /*настройка АЦП для режима автоматических измерений*/ AD1CON1bits.ON=0; // выключить АЦП1 /*настройка аналоговых входов для АЦП1*/ TRISBbits.TRISB0=1; // регистр направления данных порта AD1PCFG=0xFFFE; // PORTB = Digital; RB0 = analog, 0-аналоговый вход 1 - цифровой AD1CHS=0; // отрицательный выход к Vr-, CH0SA - AN0; AD1CON1bits.SSRC = 0b010; // 010 = Timer 3 period match ends sampling and starts conversion AD1CON1bits.FORM = 0b011; // 011 = Signed Fractional 16-bit (DOUT = 0000 0000 0000 0000 sddd dddd dd00 0000) AD1CON1bits.ASAM = 1; // 1 = выборка начинается сразу после преобразования. AD1CON2 = 0; // BUFM = 0 буфер = 16 слов AD1CON2bits.SMPI=0x0; // количество буферов участвующих в цикле измерения, по окончанию заполнения формируется прерывание 16 буферов /*один буфер грузим*/ AD1CON3bits.SAMC = 2; // TAD (0-31) время выборки AD1CON3bits.ADCS = 2; // TPB · (ADCS<7:0> + 1)*2 = 64 · TPB = TAD AD1CON1bits.ON=1; //включить АЦП1 } |