Страница 1 из 2

ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Вт ноя 06, 2012 00:43:06
Snake93
Уважаемые форумчане, требуется помощь в курсовом проекте.
Суть курсача - собрать Систему мониторинга больных.
То есть берётся 3 параметра: 1)Температура тела 2)Пульс 3)Наличие дыхания.
Вся эта информация берётся с трёх датчиков и , соответственно, подаётся на вход МК1,
там происходит оцифровка аналоговых сигналов и последующая передача по радиоканалу. (Судя по всему буду использовать модули RT10-433 и RR14-433)

С приёмника, сигнал будет поступать на вход МК2. А с него уже будет вывод на 3 семисегментных индикатора ( 3 разрядных)

В качестве МК(1-2) будет использоваться Atmega8. Пишу на С в CodeVisionAVR, в протеусе пытаю.
Возникают следующие вопросы:
1) Как организовать параллельную работу АЦП
2) По какому протоколу передавать информацию. Всё таки 3 цифровых сигнала, которые спутывать и смешивать не стоит.
3) Каким образом организовать вывод информации на индикаторы.

Для начала, я решил сделать проще.
Попробовал оцифровать один аналоговый сигнал

Вот код программы, который я проработал и вроде бы понял:)
Спойлер#define F_CPU 8000000UL
#include <mega8.h>
#include <delay.h>


void main(void)
{
DDRD = 0xFF;
PORTD = 0x00;

ADMUX = 0b00000000;
ADCSRA = 0b10001111;

while(1)
{
unsigned int u;
ADCSRA |= (1 << ADSC);
while((ADCSRA&(1 << ADIF))== 0);
u=(ADCL|ADCH << 8);

if (u>150)
PORTD.0 = 1;

if (u>400)
PORTD.1 = 1;

delay_ms(100);

}
}
Значения напряжения от 0 до 5 вольт на входе АЦП.

Искренне надеюсь на ваши советы

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Вт ноя 06, 2012 21:06:06
Snake93
Сделал следующее:
1)подключил 1 канал АЦП
2)вывел значение в вольтах на семисегментные индикаторы
Спойлер#define F_CPU 8000000UL
#include <mega8.h>
#include <delay.h>
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};


void main(void)
{
PORTB = 0xff;
DDRB = 0xff;
PORTD=0xff;
DDRD=0xff;


ADMUX = 0b00000000;
ADCSRA = 0b10001111;

while(1)
{
int y,x,r,t;
float z;
unsigned int u;
ADCSRA |= (1 << ADSC);
while((ADCSRA&(1 << ADIF))== 0);
u=(ADCL|ADCH << 8);

z=u*0.48875;


y=z/100;
x=(y%10);
y-=x;

r=z/10;
t=(r%10);
r-=t;

{
PORTD.0 = 1;
PORTB = number[x];
delay_ms(5);
PORTD.0 = 0;
delay_ms(5);

PORTD.1 = 1;
PORTB = number[t];
delay_ms(5);
PORTD.1 = 0;
delay_ms(5);
}

}
}
Изображение

Всё вроде бы нормально, но есть проблема с динамической индикацией-она отвратительна! Поочерёдное включение индикаторов загнал в цикл while(1) , и не могу выставить быструю смену, без возникновения ошибок в работе МК.

И ещё. Слышал есть __delay_cycles(8000000); которым это можно осуществить, но нужна библиотека #include <intrinsics.h> , коей нету в codevisionAVR и где её достать я просто хз...

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Вт ноя 06, 2012 22:25:33
VanyaSV
А зачем вам параллельная работа АЦП? Снимать какие-либо показания АЦП одновременно НЕВОЗМОЖНО! Лишь только по шагово... (ADC0...ADC7)
Данные лучше передавать по USART, ибо он аппаратный и простой, как гвоздь)
А как будет проверятся наличие дыхания у пациента?
Как будет считываться пульс больного?
Что за датчики температуры используете?

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Вт ноя 06, 2012 22:27:09
VanyaSV
Да и что за индикаторы вы используете?

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 00:34:58
Snake93
Как будет считываться пульс больного?
На просторах интернета нашёл такой вариант http://chipenable.ru/index.php/projects ... pulsa.html
Думаю не будет большой проблемой реализовать его.
Что за датчики температуры используете?
Ещё точно не думал над этим вопросом. Возможно можно собрать схему, используя терморезистор или что-то подобное.
А как будет проверятся наличие дыхания у пациента?
Во тут придётся поломать голову, это либо какой-то эспандер вокруг грудной клетки, либо клапан в носу :)))

В идеале всё свести к изменению напряжения в диапазоне от 0 до 5 В. Чтобы дальше уже работал АЦП.
Да и что за индикаторы вы используете?
На данном этапе работы всё только в среде моделирования.
Так что пока использую одноразрядный семисегментный индикатор с общим катодом.
А зачем вам параллельная работа АЦП? Снимать какие-либо показания АЦП одновременно НЕВОЗМОЖНО! Лишь только по шагово... (ADC0...ADC7)
Данные лучше передавать по USART, ибо он аппаратный и простой, как гвоздь)
Значит, надо разобраться с USART-ом и передачей по радиоканалу. И научиться последовательно включать АЦП.

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 01:26:51
VanyaSV
Схема данного датчика импульса мне очень поравилась кстати) сам датчик только дорог. В чип и дипе 350 рублей(

Измерение температуры - это тоже очень хороший вопрос. Можно попробывать датчики температуры ds18b20. Может быть что-нибудь и получится с его пгрешностью 0,5%)

USART очень простой интерфейс и в даташите про него много чего расписано)

А менять каналы АЦП вам поможет регистр ADMUX, а точнее 1 ниббл (MUX0...MUX3).

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 01:33:40
VanyaSV
Мне очень интересно, а зачем проверять наличие дыхания? Если у пациента есть пульс, следовательно он живой, а значит - дышит. Ну так и зачем делать данную проверку... Всё же и так придельно ясно)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 01:38:45
VanyaSV
А вот скажем снимать ЭКГ и отправлять его по USARTу было бы очень интересно)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 10:28:16
Snake93
Как правило) в течении нескольких минут человек может уже не дышать, а пульс может ещё быть. Но когда и пульса не будет (сердце перестанет биться). То начнутся необратимые процессы в организме: отмирание клеток мозга и прочее.
Тут счёт идёт на секунды:)

Конечно, это не предел возможностей, но на данном этапе сделать хотя бы это)
Учитывая, что срок - до середины декабря)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 16:13:15
VanyaSV
Ну тогда желаю успехов) Если будут какие-то вопросы - стучитесь)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Ср ноя 07, 2012 23:02:50
Snake93
Хорошо, спасибо)

А мне вот интересно, получается все действия: опрос АЦП, передача по USART-у, будет находится, как бы в общем цикле?

while(1)
{
Опрос АЦП 1;
Опрос АЦП 2;
Опрос АЦП 3;

Отправка данных по USART-у;
}

и это всё повторяется, с определённой частотой.

Так?)
Просто возникается проблема синхронизации работы двух МК

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 01:10:10
VanyaSV
Примерно так. Только не забывайте про то, что частоты обоих микроконтроллеров должны быть одинаковыми)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 12:06:37
shads
Snake93 писал(а):получается все действия: опрос АЦП, передача по USART-у, будет находится, как бы в общем цикле?

while(1)
{
Опрос АЦП 1;
Опрос АЦП 2;
Опрос АЦП 3;

Отправка данных по USART-у;
}

и это всё повторяется, с определённой частотой.

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

Благодаря такому решению, можно к одному центральному контроллеру, подключить много клиентских узлов, Он их будет опрашивать по очереди. Тогда будет например один пост наблюдения, к которому подключены много пациентов. ПЕРСПЕКТИВЫ.....

Я нечто подобное делал тут, только здесь адресные модули опрашивают состояние 1-го датчика, но ничто не мешает опрашивать 3 датчика.....

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 13:50:26
VanyaSV
+1) Идея нравится)




-1. Нарушение п. 2.7 правил.
ploop

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 14:11:09
Санек86
дыхание можно проверять по тому же принципу как в этом приборе

http://images.yandex.ru/yandsearch?text ... image&lr=4

надеваете маску для дыхания на человека, а в нее встроен такой прибор...

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 14:16:31
Санек86
Snake93 писал(а): Всё вроде бы нормально, но есть проблема с динамической индикацией-она отвратительна! Поочерёдное включение индикаторов загнал в цикл while(1) , и не могу выставить быструю смену, без возникновения ошибок в работе МК.
работа с АЦП и динамическая индикация есть здесь http://radioparty.ru/index.php/prog-avr ... -voltmeter
Все работает отлично...сам проверял.

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 08, 2012 19:00:29
Snake93
Санек86 писал(а):
Snake93 писал(а): Всё вроде бы нормально, но есть проблема с динамической индикацией-она отвратительна! Поочерёдное включение индикаторов загнал в цикл while(1) , и не могу выставить быструю смену, без возникновения ошибок в работе МК.
работа с АЦП и динамическая индикация есть здесь http://radioparty.ru/index.php/prog-avr ... -voltmeter
Все работает отлично...сам проверял.
Да , спасибо. Я это уже просмотрел давно)
Надо разобраться с прерываниями.
Лучше в фоне опрашивать датчики и сохранять данные в буфер. А по запросу основного контроллера отправлять инфу из буфера. Заодно благодаря буферу, можно будет усреднять (в разумных пределах конечно) данные перед отправкой, это избавит от ложных срабатываний. Ну и благодаря такому решению, необходимость в синхронизации отпадает.
Опять же на это понадобиться гораздо больше времени, которого сейчас пока нет. Так что этот вариант стоит рассмотреть в будущем, чтобы доработать на тот момент, работающее устройство )

Всем спасибо)
Буду продолжать, достижения и вопросы, естественно, выложу)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Пн ноя 12, 2012 15:43:55
Snake93
Начал работу с USART-ом, но вот беда, там нету библиотеки прерываний:
#include <avr/interrupt.h>
В CodevisionAVR нету такой библиотеки, где можно скачать?

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 15, 2012 14:49:50
VanyaSV
Попробуй скачай WinAVR) там должна быть)

Re: ATmega8: проблема с АЦП и организацией передачи данных

Добавлено: Чт ноя 15, 2012 19:49:14
Ser60
А как будет проверятся наличие дыхания у пациента?
Посмотрите обсуждение здесь:
http://radiokot.ru/forum/viewtopic.php?f=3&t=74820