evgenij-byvshev: Программирование микроконтроллеров. Часть 3-1 [3732865]


И снова здравствуйте! Иногда возникает необходимость измерить аналоговый сигнал, например, температуру или напряжение на аккумуляторе, обработать его и вывести на индикатор в удобной для нас форме. Для этого применяется АЦП - Аналого-цифровой преобразователь. АЦП – это устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал).

Подробнее про АЦП, на какие типы делятся АЦП и прочие характеристики можно прочитать в википедии: https://ru.wikipedia.org/wiki/Аналого-цифровой_преобразователь

Сегодня я покажу Вам как можно включить встроенный в микроконтроллер АЦП. И в зависимости от угла поворота переменного резистора зажигать или гасить линейку светодиодов.

В микроконтроллере atmega328p имеется 10 разрядный 6-канальный АЦП в корпусе PDIP, который висит на порту С. Выходное напряжение конвертируется в 10 разрядное двоичное значение. Минимальное значение соответствует 0, а максимальное опорному напряжению. В данном микроконтроллере имеется 4 вида опорных напряжений, которые переключаются определённым битом при настройке АЦП. Полученный результат преобразования записывается в 2 регистра ADCH и ADCL.

Для этого нам понадобиться собрать следующую схему:

В этом уроке я буду использовать напряжение источника питания в качестве опорного напряжения. Выводы AREF и AVCC соединены с плюсом питания схемы. Переменный резистор на 10к крайними выводами подключен к источнику питания и к общему проводу схемы, а средним выводом подключен к входу АЦП микроконтроллера. Также к микроконтроллеру подключены 8 светодиодов которые будут отображать результат преобразования напряжения питания в виде светодиодной шкалы.

Код выглядит следующим образом:

#define F_CPU 8000000UL //Рабочая частота МК (8МГц)
#include <avr/io.h>
#include <util/delay.h> //для _delay_ms()

//Инициализируем порты
void port_ini(void)
{
    DDRD=0xff;
    PORTD=0x00;
}

//Инициализируем АЦП
void ADC_Init(){
    ADCSRA |= (1<<ADEN) // Разрешение использования АЦП
    |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//Делитель 128
    ADMUX  //Подключен внешний опорный ион, внутренний ион выключен
    ADMUX  << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
}

//Получаем данные с АЦП
unsigned int ADC_convert (void)
{
    ADCSRA  //Начинаем преобразование
    while((ADCSRA & (1<<ADSC))); //проверим закончилось ли аналого-цифровое преобразование
    return (unsigned int) ADC;
}

//Главная функция
int main(void)
{
   port_ini(); //Инициализируем порты
   ADC_Init(); //Инициализируем АЦП
   unsigned int u;
    while (1) 
    {

        u  //Вызывем преобразование

        //Проверяем считанное значение и отображаем на шкале светодиодов
        if (u > 128)
        PORTD = 0b00000001;
        else
        PORTD = 0b00000000;
        if (u > 256) 
        PORTD = 0b00000011;
        if (u > 384)
        PORTD = 0b00000111;
        if (u > 512)
        PORTD = 0b00001111;
        if (u > 640)
        PORTD = 0b00011111;
        if (u > 768) 
        PORTD = 0b00111111;
        if (u > 896) 
        PORTD = 0b01111111;
        if (u > 1020)
        PORTD = 0b11111111;
        _delay_ms(30);
    }
}

В коде есть комментарии поясняющие, что происходит в программе. В следующем уроке я более детально объясню, как инициализировать АЦП и в какие регистры микроконтроллера записываются значения преобразования.

Результат моделирования схемы в Proteus:

Если есть вопросы и предложения по этому уроку, пишите комментарии буду рад ответить на ваши вопросы.

Часть 1
Часть 2-1 Часть 2-2

Мой блог в ЖЖ: http://evgenij-byvshev.livejournal.com


Оригинал поста создан 22-02-2017 06:32:42 UTC


3731390 Кратко о себе.
3731425 Заполните профиль, точку A и B
3731441 Заполните профиль, точку A и B
3731446 Заполните профиль, точку A и B
3731486 Заполните профиль, точку A и B
3731489 Beauty Salon
3731851 В Греции есть мы [9]: павлины, хирурги и архетип велосипеда
3731874 Адаптация в Канаде: полная заправка (но я все равно облился)
3732004 КОГДА Я БОЮСЬ ЧЕГО-ТО, Я БРОСАЮ ЭТОМУ ВЫЗОВ! ЖИТЬ В СТРАХЕ ПРОСТО ГЛУПО! Энтони Хопкинс.
3732196 Заполните профиль, точку A и B
3732278 Заполните точку А и Б
3732345 Нагорнюк Руслан
3732853 В Греции есть мы [10]: ваши пальцы пахнут ладаном
3732865 Программирование микроконтроллеров. Часть 3-1
3733066 В Греции есть мы [11]: калимера и ностальгия

Прежде чем писать комментарий прочитайте О ПРОЕКТЕ
Поддержите проект донатом!


Comments 0