Вы вошли на сайт, как Гость
Регистрация

Индикация уровня напряжения

Программные примеры для микроконтроллеров 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);                    //Бесконечный цикл в ожидании прерывания от АЦП
}

Файлы проекта можно скачать здесь: