В данном уроке мы настроим АЦП на микроконтроллере PIC 16F873A. В зависимости от входного напряжения у нас будут зажигаться и тухнуть светодиоды.
Схема подключения:
Регистры с которыми будем работать:
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);
}
}