АЦП На контроллерах ATmega

Аналого-цифровой преобразователь  ( ADC ) — устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал). Обратное преобразование осуществляется при помощи ЦАП (цифро-аналогового преобразователя, DAC).

818519252

В контроллерах Atmega есть встроенный преобразователь при том зачастую он способен обрабатывать сигналы с 8 разных каналов, но последовательно.

Как и во всех модулях можно обрабатывать по прерыванию, можно напрямую, можно со внешнего рперывания, в общем как хотите. Рассмотрим пример в лоб.

unsigned short ADCGet(unsigned char adc_input)
{
 ADMUX=adc_input | (ADMUX & 0xF0);
 _delay_us(10);
 ADCSRA |= (1<<ADSC);
 while((ADCSRA & 0x10)==0); 
 ADCSRA|=0x10;
 return ADCW;
}
void ADCInit(){
 ADMUX = (1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(0<<MUX0);
 ADCSRA = (1<<ADEN)|(1<<ADIE);
}

Первая функция вызывает преобразование:

  1. задаем канал с которого будем считывать
  2. ждем пока пройдет переходный процесс на ногах
  3. начинаем преобразование
  4. ждем окончания
  5. ставим, навсякий, флаг об окончании
  6. возвращаем считанное значение.

Далее Функция инициализации:

  1. REFS0..1 – это выбор опорного напряжения ( напряжение соответствующее максимальному значению ацп, у нас 10 разрядный ацп -> MAX=1023 следовательно при опорном напряжении, например напряжение питания, если напряжение между землей и считываемой ногой достигнет значения половины питания то ацп выдаст нам 512)
    1. 00 – напр на ноге AREF
    2. 01 – напр питания
    3. 10 – нет
    4. 11 – внутренний источник опорного напряжения
  2. MUX3..0 – номер канала

 

Флэшка своими руками

Привет всем. Для создания своей флэшки с блэк джеком и шлюхами я взял модуль памяти M25P32 (документация), контроллер ATMega168 (документация) и конвертер USB<->UART (SerialPort) (документация).

И так. Зачем все это нужно?

Предположим, что мы хотим сделать устройство в котором можно хранить информацию, и при этом считывать ее и записывать могли бы только мы. Или сделать устройство которое автономно бы делало какие либо измерения, а потом забрав его можно было бы узнать чего он там наизмерял. В общем применение этой схемы довольно обширна.

Схема

Без имени-2

Это документация на используемые схемы. Там же и есть способы их подключения.

FT232RL_V202 m25p32 atmega168

 

 

 

 

 

 

По сути же схема выглядит так

 

Протоколы

Здесь мы используем 2 основных протокола. Это UART и SPI оба они реализованы в контроллере, остается только привести их в удобный для себя вид.

Терминал

 

Основные ошибки с UARTом:

  • Забыть линию TXD настроить выходом ( например DDRD |= (1<<PD1) )
  • Скорость передачи лучше брать из стандартного ряда а значения для UBBR из мануала

Для проверки я использовал вот эту прогу (Terminal)

Не забывать при SPI:

  • Задать все порты (входы выходы)
  • Давать задержку между передачей и принятием данных

Программа

Для своего удобства разделил программу на несколько блоков

Вообще-то этот проект сделан чтобы автоматически прибавлять числа и записывать в память, но от изначальной задачи он отличается совсем немного.

Все изменения будут заключены в одном единственном блоке.

Пусть у нас будет 3 комманды:

  1. Запись данных
  2. Считывание данных
  3. Стирание

Изменения будут только в блоке прерывания:

ISR(USART_RX_vect){
 if(command==0xFF){
  command = UDR0;
 }else{
  switch(command){
   case 0x01://Запись данных

   break;
   case 0x02://Чтение данных

   break;
   case 0x03://Стирание данных

   break;
  }
 }
}

Проект

SoftWare

Наверное отдельно рассмотрю как делать ПО для такого типа приложений в другой статье. Но в общем и целом эта программа должна подключаться к одному из COM портов и передавать определенные пакеты данных.

HardWare

Это плата на которой это все тестилось.

2013-02-13 11.40.52

 

Питание так же от USB.

Заключение

Самое лучшее применение этой идеи, я думаю в дистанционных приборах, которые остаются где-либо и записывают что-то. Потом, с помощью специальной программы данные считываются и обрабатываются.