понедельник, 29 сентября 2014 г.

USB АЦП на Arduino и ATmega8


Подкинули работёнку на выходные, сразу же сделал по своему а не как задумывалось изначально, организовал вывод информации на компьютер при помощи переходника USB UART.
Плата основана на микроконтроллере ATmega8, к стати отличный микроконтроллер, один из моих любимых на сей час.
Слегка доработал питание, добавил LC фильтр для фильтрации от ВЧ помех и более стабильного питания микроконтроллера. Ну и ещё по мелочи добавил в обвязку микроконтроллера конденсаторы на 0.1 mF(100 nF).
Снизу будет небольшая фотосессия платы.

Ладно не буду томить, вот код:


#include <avr/wdt.h> // здесь организована работа с ватчдогом

#define Noise_level 1 // фильтрация +/- 1 LSB
 
unsigned int sensor[3]; // буфер для записи предыдущего результата
unsigned int filter_sensor[3]; // отфильтрованное значения
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  
  //////////////////////////////////////////////////////

  wdt_enable(WDTO_1S); // защита от зависаний МК, если не сбросить ватчдог через 1 сек МК уйдёт в ресет

  //////////////////////////////////////////////////////

  // make a string for assembling the data to log:
  String dataString = "";
  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    sensor[analogPin] = analogReadOversampled(analogPin);
 
    if(filter_sensor[analogPin] > sensor[analogPin] + Noise_level || // если предыдущее значение +/- 1 LSB
    filter_sensor[analogPin] < sensor[analogPin] - Noise_level){
      filter_sensor[analogPin] = sensor[analogPin];  // то выводим только предыдущее значение
    }
    
    //filter_sensor[analogPin] = sensor[analogPin]; 
    dataString += String(filter_sensor[analogPin] / 2); // превращаем 11 бит в 10
    if (analogPin < 2) {
      dataString += ",";
    }
    else{
      dataString += ",";  
      dataString += (millis() / 1000);
    }
  }
  
  wdt_reset(); // сбросим вачдог чтобы не сработала защита от зависаний
  Serial.println(dataString);
}
 
//////////////////////////////////////////////////////
 
unsigned int analogReadOversampled(byte analogChannel)  { // оверсемплинг, возвращает 11 битное значение 0...2046
  unsigned long aSum = 0;   // the sum of all analog readings
  for(unsigned int i = 1024; i > 0; i--){
    aSum = aSum + analogRead(analogChannel);
  }
  return aSum >> 9;   // эквивалент делению на 512
}
 
//////////////////////////////////////////////////////

//Размер скетча в двоичном коде: 4 200 байт (из 7 680 байт максимум)


Как видите ничего сверх сложного тут нету, тем более закомментировал почти каждую строчку.

Вот тут можно почитать как превратить ATmega8 а почти что полноценную ардуино.

Частота микроконтроллера 16 MHz фьюзы из калькулятора фьюзов выглядят вот так:



Небольшая фотосессия:





Вот ссылка на АЦП Калькулятор / ADC Calculator скрин из которого показывался на видео:




Купить ATmega8 из Китая можно тут:
http://ali.pub/fydxw


Вот собственно hex-file и Arduino Sketch (Download project files):

https://vk.com/doc256435878_334636262

Трёхканальный UART АЦП на ATtiny13

http://razniepodelki.blogspot.com/2014/09/uart-attiny13.html

Вот кстати ссылка на паблик ВКонтакте посвящённый любителям ATmega8A:

https://vk.com/atmega8a

Ссылка на софт:

http://www.x-io.co.uk/serial-oscilloscope/

Напишу для буржуев:

USB ADC on the Arduino on ATmega8 DIY

Комментариев нет:

Отправить комментарий