Простой электронный самописец


Сначала была идея

На работе (работаю в медицине) пыхтят и мучаются два электромеханических самописца ну и я вместе с ними: тушь, механика – знаете ли неприятно. Как то раз в мою голову забрела идея: а почему бы не заменить два задыхающихся от старости самописца простой системой сбора данных состоящей из контроллера АЦП и ПК (пусть даже слабенького и старенького) с соответствующим программным обеспечением с возможностью вывода на принтер? И тут понеслось в голове и закружилось…

Лирика

Так как кроме идеи у меня ничего не имелось: ни опыта, ни особых познаний в схемотехнике и электронике, пришлось перелопатить изрядное количество литературы и пошарить по просторам сети. Также проект предполагался бюджетным, и поэтому пришлось освоить метод ЛУТ, научиться травить платы, сверлить и паять – о чем нисколько не жалею. Таким образом я прошел некоторый, пусть небольшой, путь — путь проб и ошибок, привожу некоторые наблюдения, сделанные мной в процессе, может, кто-то сравнит их со своими и согласится, а может и не согласится:
  • быстрого старта, как такого, не получится, не стоит строить иллюзии — придется попотеть;
  • эмуляторы типа Proteus на первых порах лучше не использовать, гораздо полезнее экспериментировать на реальном железе, потрогать рукам, попробовать на вкус и на зуб. Для простейшей отладки достаточно UART;
  • монтажные платы – брр, предпочитаю ЛУТ + хлорное железо+сверловка, получается чуть дольше, но дает четкое понимание того, что ты делаешь;
  • советую не увлекаться монтажом smd-корпусов и «минитюаризацией» монтажных плат — это достаточно сложно для новичка, иногда бывает проще заново развести плату в «увеличенном масшабе» с простым навесным монтажом (опять же полезнее для понимания).


О теории АЦП и первой попытке

После некоторых изысканий выяснилось, что реализовать задуманную идею можно в нескольких вариантах. Простейшие решения приведены в книжке Патрика Гелля(см.подвал), там же разъясняются азы аналого-цифрового преобразования сигнала. Привожу типичную схему, взятую оттуда:
В основе схемы – микросхема АЦП. Взаимодействие с ПК реализуется на программном уровне путем формирования управляющих последовательностей импульсов на модемных линиях интерфейса RS-232 ПК. Данное обстоятельство ограничивает скорость передачи данных и увеличивает вероятность ошибки передачи. Точность измерения определяется разрядностью АЦП (в данном случае 8 разрядов), точностью подводимого к АЦП опорного напряжения (здесь используется ИОН LT 1009 CZ). Скорость оцифрования сигнала зависит от времени преобразования АЦП и опять же от точности организации интерфейса разработчиком. Собственно, данная реализация была моим первым боевым опытом (см. фото ниже), но вскоре меня разочаровала, так как чувствовал потребность в более изящном решении. Управляющая программа(драйвер) была написана под DOS на паскале.
Подобные схемы, не смотря на свою жизнеспособность, ввиду указанных недостатков практически не применяются, микросхемы АЦП обычно используются вместе с микроконтроллером, который уже организует передачу данных на аппаратном уровне, попутно выполняя какие-либо операции управления, либо примитивной обработки данных. Хорошим примером такого решения может служить вот такая схемка на основе микроконтроллера AVR:

В основе схемы лежит микроконтроллер Atmega8, микросхема сопряжения с USB FT232BM, микросхема АЦП AD7876, ИОН — REF195GP. На входе — дифференциатор на базе операционного усилителя приводит сигнал на входе к диапазону 0-5В (опорное напряжение АЦП). Аналого-цифровое преобразование сигнала осуществляет микросхема АЦП AD7876 и передает данные по интерфейсу SPI в микроконтроллер, который, в свою очередь, «выкидывает» результат в usb-порт посредством UART и микросхемы сопряжения FT232BM.
В рамках моей задачи мне нужно задействовать 4 канала АЦП. Привлекательной возможностью выглядит использование встроенного АЦП микроконтроллера с коммутируемым входом, что позволит отказаться от использования внешней микросхемы АЦП и обеспечить нужное количество каналов — дешевое и простое решение. Включать дифференциатор в схему нет необходимости, так как амплитуда сигнала на каждом из входов не превышает 2-2,5 В.

Схема моего девайса

Контроллер АЦП строится на микроконтроллере AVR Atmega8. МК обладает достаточным количеством ножек для того чтобы подключить 4 канала АЦП, сигнальные светодиоды, плату сопряжения с ПК. В схеме используется внешний ИОН L1009CZ. Плата сопряжения с ПК через интерфейс RS-232 основана на микросхеме MAX232 и обособлена от основного модуля, при необходимости может быть заменена на плату с FT232 на борту для сопряжения через USB, либо с любым bluetooth-модулем (типа BTM-222, HC-04) для коммуникации через blootooth интерфейс. На рисунке ниже представлена принципиальная схема разрабатываемого устройства:

Схема питания стандартная – на базе линейного стабилизатора 78L05, присутствует сигнальный светодиод HL1. Принципиальная схема нарисована с помощью sPlan, разводка платы — в Sprint Layout. В конце технологической цепочки — ЛУТ+травление+сверловка+пайка получаем:

Вид снизу:


Программная часть

Для кодинга использовал AVRStudio+WinAVR(AVR-GCC) под Windows, альтернатива для Linux – Eclipse + AVR-GCC. Пробовал CodeVisionAVR — неплох для начала, имеет встроенный генератор кода, ограничение по объему кода 2 кБ.
Прошивка работает по следующему алгоритму:
  • инициализация: функции — UART_init, ADC_init, LED_init;
  • последовательный опрос каналов в бесконечном цикле по прерыванию и передача данных через UART на com-порт ПК.

В целях отладки по тексту рассованы тестовые сообщения. Переключение канала опроса подсвечивается соответствующим светодиодом. При инициализации все 4 светодиода мигают одновременно. Для того чтобы переключение светодиодов было заметно глазу намеренно поставил задержки.

/* WinAVR version...
   Chip: ATmega8
   Memory Model: SMALL
   Data Stack Size: 256 bytes
   Clock frequency: 4.0000 MHz

   PCO - PC3 - Channels */

// ATmega8 I/O register definitions
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>

#define ADC_VREF_TYPE 0x40
#define ADC_CH1_MUX 0x1
#define ADC_CH2_MUX 0x2
#define ADC_CH3_MUX 0x3

// Counter of channel's changes
uint8_t i = 0;
void LED_init(void){
	printf("Led initialization....\r\n");
    char j = 0;

    DDRD|= (1<<DDD7);
    DDRB|= ((1<<DDB0)|(1<<DDB1)|(1<<DDB2));

    for(j=0;j<5;j++)
    {
        PORTD|=(1<<PD7);
        PORTB|=(1<<PB0)|(1<<PB1)|(1<<PB2);
        _delay_ms(600);
        PORTB&= ~((1<<PB0)|(1<<PB1)|(1<<PB2));
        PORTD&= ~(1<<PD7);
        _delay_ms(600);
    }
}

//Sending of single char
static int my_putchar(char c, FILE *stream){

	while((UCSRA&(1<<UDRE)) == 0);
	UDR = c;
	return 0;
}

void myUART_init(void){
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19; 

    //Redirection of stdout
    static FILE mystdout = FDEV_SETUP_STREAM(my_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &mystdout;

    printf("UART initialization....\r\n");
}

void ADC_init(void){
    // ADC initialization
    // ADC Voltage Reference: AREF pin
    // ADC High Speed Mode: Off
    // ADC Auto Trigger Source: None
    // Select ADC input 0
    printf("ADC initialization....\r\n");
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x8E;
}
// ADC interrupt service routine
ISR(ADC_vect){
	// Here is sending data in RS-232
	printf("I'am in interrupt...\r\n");
 	uint16_t data = ADCL;
    data+= (ADCH<<8);
 	printf("Ch_%u=%u\r\n",i,data);

 	//Control of ADMUX's state
 	uint8_t pr = ADMUX;
 	printf("ADMUX = %u\r\n",pr);
 	data = 0;

    if (i == 3)
 	    {
 	    	i = 0;
 	    	ADMUX&= ~ADC_CH3_MUX;

 	    	PORTB&= ~(1<<PB2);
 	    	PORTD|=(1<<PD7);

 	    	//Change of channel
 	    	data = ADMUX;
 	    	printf("3to0,ADMUX = %u\r\n",data);
 	    	data=0;

 	    	_delay_ms(25);
 	    }
    else
    	{

    		if (i == 0)
    			{

    				ADMUX|= ADC_CH1_MUX;

    				PORTD&= ~(1<<PD7);
    				PORTB|= (1<<PB0);

    				//Change of channel
    				data = ADMUX;
    				printf("0to1,ADMUX = %u\r\n",data);
    				data=0;
    			}

    		if (i == 1)
    			{

    				ADMUX&= ~ADC_CH1_MUX;
    				ADMUX|= ADC_CH2_MUX;

    				PORTB&= ~(1<<PB0);
    				PORTB|= (1<<PB1);

    				//Change of channel
    				data = ADMUX;
    				printf("1to2,ADMUX = %u\r\n",data);
    				data=0;
    			}

    		if (i == 2)
    			{

    				ADMUX&= ~ADC_CH2_MUX;
    				ADMUX|= ADC_CH3_MUX;

    				PORTB&= ~(1<<PB1);
    				PORTB|= (1<<PB2);

    				//Change of channel
    				data = ADMUX;
    				printf("2to3,ADMUX = %u\r\n",data);
    				data=0;
    			}

    		i++;
    		_delay_ms(25);
    	}

    // Start a new AD conversion
    ADCSRA|=0x40;

};

int main(void)
{
   	myUART_init();
    ADC_init();
    LED_init();
    printf("I'am in main...\r\n");
    // Global enable interrupts
    sei();
    // Start the first AD conversion
    ADCSRA|=0x40;
    while (1);
}


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

Программатор

Для прошивки применялся простейший программатор STK200, причем разводку платы пришлось делать самому, чтобы облегчить пайку. Прошивал avrdude. Пробовал avreal – отличная альтернатива, трудностей также не возникло.



Наконец-то – работает!

После отладки кода, нескольких циклов стирания/записи МК девайс ожил и заморгал светодиодами к моей огромной радости.

На ПК использовал текстовый терминал для работы с COM-портом. В сети их навалом, при желании можно и самому написать, например, используя QT + QSerialDevice(замечательная библиотечка для работы с com-портами, написанная нашим соотечественником Денисом Шиенковым), или как тут.

В заключение

В планах осталось только написание ПО для ПК. Вообще-то уже пишу, используя в связке QT+QSerialDevice+QWT, и скоро, скоро, чувствую, поползут мои графики по дисплею. А еще подумываю о том, чтобы реализовать аппаратную часть на МК серии STM32F, взяв за основу упоминаемую уже на хабре STM32VLDISCOVERY — хочется освоить новое железо.

Полезная литература

Помогут переварить все вышенаписанное книги:
П. Хоровиц, У. Хилл. “Искусство схемотехники” — классическая вещь;
Патрик Гелль. Как превратить персональный компьютер в измерительный комплекс — упоминалась выше.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 60

    –32
    Мы такими вещами еще в институте, на младших курсах баловались. И преподаватели нас журили за то, что мы используем USART, а не usb.
      +43
      Какие вы все хитрые и умные!!! Молодцы!
      Я наверное полный дебил, но мне вот интересно почитать, что да как, потому-что у меня таких уроков не было.
      4granik: спасибо!
        +3
        Хорошая статья.
        alexander007 ничего такого страшного не сказал, что бы так люто бешено минусовать.Сложности которые сопровождают обучение быстро забываются.Со временем то что приводит в восторг начинающих, начинает казаться чем то само собой разумеющимся.
          +4
          Видимо люди против развития технического творчества среди студентов. Хотя нам нравилось. Все просто кайфовали когда их первая собранная схема начинала моргать светодиодами.
            +2
            А вы помните что поступая на 1 курс, на 5 информация с 1-го будет уже не актуальна или устаревшей?
              +5
              Матан и Физика устареть не могут.)Да и к слову — то, что преподавали нам и так уже устарело лет 20 назад(мне возможно не повезло с универом или факультетом).
                –2
                Физика — запросто.
                +5
                На 1ом курсе действительно были не устаревающие дисциплины. Матан, геометрия, физика и физическая культура не стареют. Законы Ньютона и Кирхгофа вряд ли кто будет пересматривать в ближайшие 10-20 лет.
                  +1
                  Это понятно, я про статью на хабре. Тут была хорошая статья. Сейчас найду
          +3
          Стесняюсь спросить… И что вы с тех пор сделали полезного в этой сфере?
            +2
            USB батенька до 5 метров, а в медицине расстояние может быт больше. И вообще рано хоронить RS232 — он не только дальше передается (а уж при преобразовании в RS485 или вообще в Ethernet до бесконечности), но и является промышленным стандартом.
              0
              485 по работе от 232 не будет отличаться, т.к. у Вас только принимаются данные. Мах232 заменить на мах485.
              Рационально или нет это второй вопрос. Главное, что не лень было это делать и сделал. Дошел до конца.

              Ну эту задачку я бы попробовал решить линейным входом звуковой карты.
            +4
            Кем Вы работаете?
              +15
              У меня другой вопрос, для чего это устройство?
                +4
                Видимо, мы должны догадаться сами.
                Такой себе «черный ящик» :)
                  +3
                  присоединяюсь к вопросу
                  один грибок и электроника выгорела, а механический бы продолжал работать…
                  обороноспособность не подорвали заменой?
                    0
                    В худшем случае сгорит МК. Вставлю новый с той же прошивкой(запасной) и все заработает снова)
                  0
                  я так думаю, что оно ЭКГ будет писать
                    0
                    Действующая система используется при радионуклидных исследованиях, состоит из сцинтилляционного датчика, дискриминатора, измерителя скорости счета, самописца. Всего 4 датчика. Таким образом, проще говоря, количество частиц регистрируемых датчиком в единицу времени прямо пропорционально высоте кривой на самописце. Устройство в сумме с ПК призвано заменить(дополнить) как раз самописец.
                      –1
                      рассмотрите возможность работы через переходник USB-COM (а то придут в учреждение новые компы без COM-портов....)
                        0
                        Спасибо, рассмотрел(есть в статье). Нужно только отсоединить конвертер UART-RS-232(беспаечно, см. фото) и подсоединить конвертер UART-USB, либо bluetooth-модуль.
                    +6
                    © Ничего не понимаю.

                    Че-то я не понял, чего это ваши самописцы пишут-то?
                    Пульс, давление, температуру тела?
                    С каких таких датчиков инфа поступает, не понятно.
                      +27
                      Иногда бывает читаю какой-то пост и все вроде написано красиво и тема интересна мне но… как-то без души, обыденно как-то. С этим постом совсем наоборот — и тема мне не очень интересна, и стиль поста не «шедевральный», но… прям прет от него задором и куражом — чуствуется, что человек сделал что-то интересное и сам просто кайфует от этого. Приятно. Автор, успехов!
                        +2
                        Блин, автор, молодец! Мало уже таких специалистов, кто хочет вникать в тонкости работы железа и софта, да и в электросхемах разбираться тоже надо уметь!
                        Молодец!!!
                          0
                          Вы просто не там искали этих специалистов, поэтому и кажется, что их мало ;)
                            0
                            Поддерживаю rushter.Много, мало не очень конкретные критерии.Вот я знаю много специалистов умеющих работать с железом, потому что я инженер-разработчик.
                          0
                          Да не ищу их я… просто раньше на старой работе был один, который мог расколупать железку и понять почему она сдохла. Но это было давно, сейчас круг общения не маленький, но таких людей не прибавилось… всем бы телефоны с тач-скринами подавай и все. За паяльник не каждый сейчас умеет браться… :(
                          • UFO just landed and posted this here
                              +5
                              Ох зря вы это сказали…
                              • UFO just landed and posted this here
                                  0
                                  Да можно было и вообще без ПК обойтись. Сейчас даже копеечные микроконтроллеры вполне способны обрабатывать сигнал АЦП в реальном времени, формировать архив на локальную флешку и посылать данные на печать по какому-нибудь UPnP. Можно запустить микроконтрллер под линуксом, и писать на C++, а можно и вовсе под .NET Micro Framework писать на C#. Или под Windows CE писать на Visual C++ или на C# под .NET Compact Framework. В общем вариантов просто масса. И полно девайсов встроенными АЦП, прямо в чип или в виде периферии. И проще и дешевле, и энергопотреблением ниже.

                                  Но безусловно для самообразования полезно. Я вот например собственный АЦП ни за что не спаяю, хотя написать программу под микроконтроллер без труда смогу :)
                                    0
                                    Предполагается возможность промежуточной обработки данных, так что без ПК не обойтись. МК с операционкой на борту в рамках данной задачи, по моему мнению, выглядит избыточным решением. Да, я как раз и использовал встроенный в МК АЦП.
                                    0
                                    Наверное, это как в древнем анекдоте

                                    Доктор: Пациент, вас мучают эротические сновидения?
                                    Пациент: Ну, почему сразу — мучают?..

                                    Ещё проще купить подходящий готовый девайс.
                                    А стремление впихнуть ардуину куда только можно как-то уже стало раздражать. Помните кто-то тут лампочку на ардуине делал… Приколько, когда лежит ящик ардуин, протянул руку, да и встроил в лампочку. Но, как-то, не спортивно, что ли. :) Да и паять приятно же.
                                    • UFO just landed and posted this here
                                      0
                                      Не быстрее. Большая часть времени была потрачена на образовательный процесс и осмысление — это время сложно было сократить). На изготовление устройства ушло 2-3 неполных дня — относительно немного, да и несложно совсем, зато себестоимость проекта вышла мизерной. Если бы я брал готовое решение, то предпочел бы ардуине, как упоминал в статье, STM32VLDISCOVERY.
                                      • UFO just landed and posted this here
                                          0
                                          Аналогично, через USART, там их 3.
                                          • UFO just landed and posted this here
                                              0
                                              Не вижу в этом проблемы. Зато можно организовать коммуникацию посредством 3 интерфейсов одновременно: RS-232, USB, Bluetooth. Все плюсы и минусы микропроцессоров на ядре ARM Cortex-M3 изложены вот в этом хабрапосте. Ничего не имею против ардуино, дело вкуса.
                                              • UFO just landed and posted this here
                                                  0
                                                  Аппаратно ардуино — МК+минимум обвязки+устройство коммуникации(которое в принципе я хотел видеть съемным с возможностью замены). Так или иначе к ардуино пришлось бы навешивать диоды, резисторы, ИОН — дополнительную обвязку, заточенную под мою задачу и процесса сборки все равно не удалось бы избежать. Так что в моем конкретном случае проще и дешевле развести плату целиком чем возиться с макетками и проводами. Так что, от цели я не удалился.
                                  –3
                                  Спасибо, интересно! Вот только я думаю велосипед можно было и не изобретать, а взять какой-нить Arduino-клон. Цена вопроса в Москве — от 700 до 2000р, можно заказать по почте за 500р. Да и программировать для него чуть проще — не надо помнить названия регистров и заморачиваться с логическими функциями для портов.
                                    0
                                    > можно заказать по почте за 500р.
                                    А где если не секрет? (можно в ЛС)
                                      +1
                                      низззяяя! Мне тоже интересно, и думаю я не один такой ;)
                                        0
                                        +1 меня тоже интересует этот вопрос и тоже можно в личку)
                                        0
                                        Макетная плата AVR-USB-MEGA16, с ATmega32 на борту, с интерфейсом miniUSB, и с USB-бутлоадером. Схему, которая сделана автором, можно легко собрать на ней, и упростить — FTDI уже не нужен, программатор тоже паять не надо.
                                          0
                                          Можно. Но я не люблю макетные платы) путаница проводов, неэстетично как-то. В AVR-USB-MEGA16 интерфейс USB реализован на программном уровне, впрочем, почему бы и нет.
                                      +6
                                      Меня больше интересует другой момент. Когда-то мы бегали по своему отделению с идеей собрать самопальный прикроватный монитор в реанимацию и нас осадили крепко старшие товарищи. Дело в том, что сей аппарат не будет сертифицирован и допущен к работе в медпрактике. Использовать его можно будет только скрытно от комиссии, причем полученныеим данные нельзя будет подшить в историю и размахивать ими, в случае чего.

                                      Полученная этим самописцем ЭКГ не сможет прикрыть филейные части врача в суде; юридически она == 0.
                                        0
                                        Да, согласен. Девайс будет использоваться в дополнение, для внутреннего пользования. К сожалению, самописцам придется еще поработать.
                                          0
                                          У меня точно такая же проблема. Только в сфере ГРОЕИ (единство измерений). Собрал все — измеряет прекрасно(с точностью до ±0,05мкм), но когда приходит комиссия — мы прячем все это дело. Потратил немало своих денег и времени, а приходится прятать, обидно.=)
                                          0
                                          Замечу еще, новая версия чудо-программы-на-все-случаи-жизни, Putty, умеет открывать COM-порты. Например, можно открыть порт, к которому присоединен по Bluetooth телефон, и поиграться с AT-командами :)
                                            0
                                            А какие самописцы раньше стояли? Не знаком к сожалению с медецинским оборудованием — но интересно.

                                            Жаль на производствах не всегда возможно так разом заменить советские КСМ и чудом сохранившиеся КСП (платиновая хорда сильно снижала их срок службы в 90-е )…
                                              0
                                              Никогда не рассматривал связку sPlan/SprintLayout в качестве инструмента разработки. Там можно по составленной схеме перенести все компоненты в SpringLayout для разводки или надо руками добавлять? И почему не Eagle?
                                                0
                                                Довольно красиво и аккуратно, только на «Вид снизу:» провода питания как-то ненадежно подпаяны, имхо.
                                                  0
                                                  можно было бы и красивее собрать. Внешний вид не тру.
                                                  –1
                                                  «продам самопысец. скорость пыса — 5 лытров в секунду»
                                                    0
                                                    А что вы не взяли такую атмегу, на которой уже есть последовательный порт?
                                                      0
                                                      Я использовал UART — универсальный асинхронный приемопередатчик, присутствует в каждой атмеге, организация приема/передачи данных лежит как раз на нем. Микросхема MAX 232 лишь согласовывает уровни, приводит TTL к стандарту RS-232, если вы про это.
                                                      0
                                                      Тоже таким балуюсь.
                                                      habrahabr.ru/post/237543/

                                                      Only users with full accounts can post comments. Log in, please.