Вольтметр с автоматическим переключением диапазонов
Добавлено: Ср мар 02, 2011 01:04:48
Здравствуйте. Разрабатываю вольтметр с автоматическим переключением диапазонов измеряемого напряжения. МК - ATMega8. Возникла проблема.
Кусок схемы, которого непосредственно касается вопрос:
Использую следующий принцип переключения пределов: Если вывод 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
Помогите пожалуйста.
Кусок схемы, которого непосредственно касается вопрос:
Использую следующий принцип переключения пределов: Если вывод 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
Помогите пожалуйста.