Пишем программный код для работы АЦП на микроконтроллере PIC 16F873A в среде программирования MPLAB X IDE.

В данном уроке мы настроим АЦП на микроконтроллере PIC 16F873A. В зависимости от  входного напряжения у нас будут зажигаться и тухнуть светодиоды.

Схема подключения:

 

Регистры с которыми будем работать:

Управляющий регистр ADCON0.

ADCS1 и ADCS0 : Выбор источника тактового сигнала.

Третий бит ADCS2 выбора источника тактового сигнала  находится в регистре ADCON1

Таблица выбора тактовой частоты от настроек данных битов:

CHS2, CHS1, CHS0 — Выбор аналогового канала

000 = Канал 0 (AN0)

001 = Канал 1 (AN1)

010 = Канал 2 (AN2)

011 = Канал 3 (AN3)

100 = Канал 4 (AN4)

101 = Канал 5 (AN5)

110 = Канал 6 (AN6)

111 = Канал 7 (AN7)

GO/DONE -Статус модуля АЦП

1 – модуль АЦП выполняет преобразование (установка бита вызывает начало преобразования)

0 – состояние ожидания (сбрасывается аппаратно по окончанию преобразования).

ADON — Бит включения модуля АЦП

1 – модуль АЦП включен

0 – модуль АЦП выключен.

Управляющий регистр – ADCON1

ADFM  — Формат сохранения 10-битного результата

1 – правое выравнивание (два старших бита находятся в двух младших битах регистра ADRESH, остальные нули, а 8 младших битов – в регистре ADRESL)

0 – левое выравнивание (два младших бита находятся в двух старших битах регистра ADRESL, остальные нули, а 8 старших битов – в регистре ADRESH).

ADCS2 — Старший бит выбора источника тактового сигнала

PCFG3 — PCFG0 — Управляющие биты настройки каналов АЦП. Данные биты настраивают тип входов (цифровой /аналоговый), а также влияют на выбор источника опорного напряжения. 

Таблица выбора данных: 

Программный код: 

#define _XTAL_FREQ 8000000
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#include <pic16f873A.h>
#include <xc.h>


void main(void) {
int adc_data_raw = 0;
float adc_data = .0f;

TRISB = 0x00;
PORTB = 0x00;
////////////////////////////
PORTA = 0x00;
ADFM = 1; //right justified
//AN7:AN1 digital, AN0 analog, Vref+ = Vdd, Vref- = Vss
PCFG3 = 0;
PCFG2 = 1;
PCFG1 = 0;
PCFG0 = 0;
ADCS0 = 1;//Fosc/8
ADON = 1;//ADC On


while(1){
__delay_us(10);
GO=1;
while(GO==1){;}
adc_data_raw = (unsigned int)ADRESH << 8;
adc_data_raw |= ADRESL;
adc_data = (float)adc_data_raw * 5.12 / 1024;

if(adc_data<=1) {PORTB = 0b00001000;}
if((adc_data>1)&(adc_data<=2)){PORTB = 0b00010000;}
if((adc_data>2)&(adc_data<=3)){PORTB = 0b00100000;}
if((adc_data>3)&(adc_data<=4)){PORTB = 0b01000000;}
if((adc_data>4)&(adc_data<=5)){PORTB = 0b10000000;}
__delay_ms(5);
}
}