|
Индикация уровня напряжения
Программные примеры для микроконтроллеров PIC - MPLab IDE
(Индикация уровня напряжения на аналоговом входе)
На аналоговый вход AN0 микроконтроллера подается напряжение в диапазоне
0-4 В. Требуется организовать индикацию текущего уровня напряжения с помощью
восьми светодиодов, подключенных к выводам порта D: если напряжение
<0,5 В, то включен светодиод на выводе 0; диапазону 0,5-1 В соответствуют светодиоды
на выводах 0 и 1; диапазону 1-1,5 В — на выводах 0-2 и т.д.
Будем использовать 10-тиразрядное аналого-цифровое преобразование с коэффициентом
деления частоты системной синхронизации для тактирования АЦП,
равным 32.
Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "18F458.h".
#device ADC=10 //Устанавливаем разрешение 10 разрядов
#use delay(clock=10000000)
#fuses HS, NOWDT
#byte ADCON0 = 0x1F //Определяем регистр управления АЦП
int n;
#int_AD //Обработка прерывания от АЦП
AD_isr()
{
n = read_adc() / 102; /*Определяем количество включаемых
светодиодов. Если n=0,то горит светодиод на выводе 0.
Если n=1,то горят светодиоды на выводах 0 и 1 и т.д.*/
output_D(~(2 << n - 1));/*Выражению 2 << псоответствует
умножение 2 на 2 праз (сдвиг влево на n разрядов).Тогда,
если n=0 (U < 0,5В),то 2 << n-1=2-1=1;(00000001)
если n=1 (U = 0,5-1В),то 2 << n-1=4-1=3;(00000011)
В порт D выдается инвертированный результат (т.е.11111110,
11111100 и т.д.) для включения соответствующих светодиодов*/
ADCON0 |= 4; //Возобновляем аналого-цифровое преобразование
//установкой в регистре управления разряда GO
}
void main()
{
setup_adc_ports(ALL_ANALOG); //Используем внутренний источник
//опорного напряжения. Все выводы порта А - аналоговые входы
setup_adc(ADC_CLOCK_DIV_32); //Тактирование АЦП с Fosc/32
enable_interrupts(INT_AD); //Разрешаем прерывание от АЦП
enable_interrupts(global); //Общее разрешение прерываний
set_adc_channel(0); //Выбираем для АЦП канал 0 //Начинаем аналого-цифровое преобразование
//установкой в регистре управления разряда GO
ADCON0 |= 4; //Начинаем аналого-цифровое преобразование
//установкой в регистре управления разряда GO
while(1); //Бесконечный цикл в ожидании прерывания от АЦП
}
|
Файлы проекта можно скачать здесь:
|
|
|