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

Вольтметр с автоматическим переключением диапазонов

Добавлено: Ср мар 02, 2011 01:04:48
BooM
Здравствуйте. Разрабатываю вольтметр с автоматическим переключением диапазонов измеряемого напряжения. МК - ATMega8. Возникла проблема.

Кусок схемы, которого непосредственно касается вопрос:
cxem.jpg
Кусок схемы
(15.32 КБ) 917 скачиваний


Использую следующий принцип переключения пределов: Если вывод PC1 МК запрограммирован как вход, то делитель входного напряжения будет состоять из двух резисторов (470к и 100к), т.е. Uвх не должно превышать 5В * 5.7 = 28,5 В (чтоб не превысить напряжение на ноге PC0 МК). Если вывод PC1 запрограммирован как выход с логич. "0", то резистор 4.7 к как бы "соединиться" внутри МК с землей и следовательно подключится паралельно к резистору 100к и изменяет делитель. Теперь делитель будет состоять из двух сопротивлений: 470к и 4.5к (параллельное соединение 100к и 4.7к) и следовательно Uвх может достигать 5В * 105.4 = 522В.

Кусок программы следующий (Программирую CVAVR):

#define LIMIT_PREDEL 10 // Граница переключения предела
#define KOEF1 2.02 // Множитель в первом диапазоне
#define KOEF2 0.112 // Множитель во втором диапазоне

float result = 0;

...

PORTC = 0;
DDRC = 0x02;

...
while(1)
{
unsigned char adc_int = read_adc(0);
if (adc_in > LIMIT_PREDEL)
{
result = adc_int * KOEF1;
} else
{
DDRC.1 = 0;
adc_int = read_adc(0);
DDRC.1 = 1;
PORTC.1 = 0;
}
result adc_int * KOEF2;
}

...

}


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

Пробовал делеть задержки после изменения DDRC, чтоб он успел нормально изменить состояние - не помогло.

Может быть я не учел какую нибудь тонкость, принцип то внешне простой...

Дополнительная информация: Работаю с реальной схемой, а не с моделью. На Uвх поступает постоянное напряжение. Ссылка с описанием принципа изменения пределов http://32bit.me/?p=49

Помогите пожалуйста.

Re: Вольтметр с автоматическим переключением диапазонов

Добавлено: Ср мар 02, 2011 09:14:21
md5sum
PC0 защитить "защитным" диодом типа 6V1. (или стабилитроном на 5,6В)
Измерения проводить сначала при PC1=0, по результатам измерений принимаем решение "можно-ли уменьшить коэфф деления", если да, то PC1=Z и проводим повторное измерение.
Сразу!! после повторного измерения PC1=0.
Потом цикл расчетов и индикации и все по новой...

Re: Вольтметр с автоматическим переключением диапазонов

Добавлено: Ср мар 02, 2011 23:30:08
BooM
Такой собственно такой алгоритм и используется (видно по приложенному коду).

Проблема то и заключается в следующем: сначала PC=0, решение принято изменить диапазон и PC стает в состояние Z, НО он не возращается обратно в PC=0 после повторного измерения (ни СРАЗУ, ни после задержки в 10ms(один из эксперементов)) хотя возврат в коде есть!

...

PORTC = 0;
DDRC = 0x02;

...
while(1)
{
unsigned char adc_int = read_adc(0);
if (adc_in > LIMIT_PREDEL)
{
result = adc_int * KOEF1;
} else
{
DDRC.1 = 0;
adc_int = read_adc(0);
DDRC.1 = 1;
PORTC.1 = 0;
}
result adc_int * KOEF2;
}
...

Re: Вольтметр с автоматическим переключением диапазонов

Добавлено: Ср мар 02, 2011 23:38:22
md5sum
Тогда вопрос: что за переменная adc_in вот тут:

Код: Выделить всё

if (adc_in > LIMIT_PREDEL)
и где она описана, когда ей значения присваиваются?

Подозреваю, что буковки недостает :)))

Re: Вольтметр с автоматическим переключением диапазонов

Добавлено: Чт мар 03, 2011 20:41:44
BooM
md5sum, да, действительно здесь буква должна стоять :)

У меня в тексте программы есть еще одна переменная которая как раз и называется adc_in? поэтому компилятор не выдавал ошибок...
Проявил немнимательность!

md5sum, спасибо большое.