Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega168 - скачет напряжение с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
kd_Rash
Что может быть, подскажите
на вход АЦП (через делитель) подаю напряжение, которое потом вывожу на индикаторы. использую ИОН - 1.1 V
но при выводе на индикаторы напряжение скачет (перескакивает) 11,9-12,3-11,9-12,1...
использую авто аккумулятор, т.ч сами понимаете такого быть не должно

что посоветуете
С Уважением, Дмитрий.
yura-w
Цитата(kd_Rash @ Nov 6 2007, 13:58) *
..использую ИОН - 1.1 V, но при выводе на индикаторы напряжение скачет (перескакивает) 11,9-12,3-11,9-12,1...

не понятно, какое напряжение измеряете. может просто точности не хватает или в крайних диапазонах измеряете
kd_Rash
мерим напряжение авто борт. сети через делитель 1:20 (для мах измеряемого напряжения - 20 В) на ADC0.
AREF через кондер на землю
GDI
Может развели плату плохо, помехи ловите. Режим NoiseReduction пробовали? Если мерите постоянку, то может поставить на входе ФНЧ какой нибудь, хотя бы RC цепочку с большой постоянной времени.
CDT
Цитата(kd_Rash @ Nov 6 2007, 13:58) *
Что может быть, подскажите
на вход АЦП (через делитель) подаю напряжение, которое потом вывожу на индикаторы. использую ИОН - 1.1 V
но при выводе на индикаторы напряжение скачет (перескакивает) 11,9-12,3-11,9-12,1...
использую авто аккумулятор, т.ч сами понимаете такого быть не должно

что посоветуете
С Уважением, Дмитрий.

Почитать внимательно DS, обратив внимание на:
время коммутации АЦП, время выборки и преобразования;
отодвиньте момент выборки сигнала от фронтов переключения портов (особенно сильноточных) на чистое место;
позаботьтесь о чистоте опорного напряжения и напряжения питания АЦП;
посмотрите ошибки в обработке результатов (правильность вычислений, особенно округлений);
сделайте так, что бы младшие 1-2 разряда можно было обрезать (округлить).
Да и входной сигнал можно почистить, коль это напряжение бортовой сети.
Опорное взять побольше (5В), что бы увеличить U на дискрет.
AndV
Можно попробовать усреднять результаты измерений. При измерении напряжения бортовой сети время измерения не так критично, как я понимаю.
kd_Rash
спасибо
но я и опорное делал 5 В, и частототой ацп играл
и RC фильтр на входе стоит
и усреднение стоит по последним 4-ем результатам.
но стОит усреднение уменьшить до 3-х, сразу начинается "перескакивание"(11,9-12,1)
конечно можно и так оставить, но пока мне надо, чтоб было все правильно.
наверно переключение сильноточных портов как то влияет все-таки?
_Pasha
Цитата(kd_Rash @ Nov 6 2007, 17:14) *
спасибо
но я и опорное делал 5 В, и частототой ацп играл
и RC фильтр на входе стоит
и усреднение стоит по последним 4-ем результатам.
но стОит усреднение уменьшить до 3-х, сразу начинается "перескакивание"(11,9-12,1)
конечно можно и так оставить, но пока мне надо, чтоб было все правильно.
наверно переключение сильноточных портов как то влияет все-таки?


Если Вы не забыли поставить кондюк параллельно нижнему резюку делителя и неправильно запитали АЦП, то переключение портов влияет. А можно ли моменты переключения собрать в кучу и не принимать во внимание отсчеты АЦП, приходящиеся на на такие моменты? Я устанавливаю флаг, еогда надо что-то с портом делать, а в ISR от АЦП его проверяю и сбрасываю. Если установлен, то нафиг, else работаем. smile.gif
GDI
Цитата
наверно переключение сильноточных портов как то влияет все-таки?

НойзРедакшен может помочь - в этом режиме МК останавливает всю перифирию на время измерения АЦП.
muravei
Цитата(kd_Rash @ Nov 6 2007, 13:58) *
ИОН - 1.1 V

Могу ошибаться, но не маловатоли будет, у "знакомых АВР " опрорное 2в минимум.
oran-be
АЦПшник в Мегах 48-88-168 желательно калибровать - это Атмелы пишут, иначе невидать вам 10 бит, как своих ушей. И есть еще одна фишка, о кторой они не пишут - это влияние сопротивления источника сигнала. Стоит посмотреть, нет ли переключения входного коммутатора. И, если есть, то тогда необходимо проверить, чтобы была задержка между переключением коммутатора и началом измерения.
При сопротивлении источника сигнала 1кОм необходима задержка >500 тактов, при сопротивлении 30к - выходное сопротивление внутренней опоры - не менее 10000 тактов при частоте 8МГц.

Цитата(muravei @ Nov 6 2007, 18:50) *
Могу ошибаться, но не маловатоли будет, у "знакомых АВР " опрорное 2в минимум.

Расширяйте круг знакомств - меньше ошибок будет smile.gif

Цитата(GDI @ Nov 6 2007, 18:50) *
НойзРедакшен может помочь - в этом режиме МК останавливает всю перифирию на время измерения АЦП.

А Это шумоподавление глубоко до фени - потратил денек, проверил. При правильнй разводке не влияет ядро на показания АЦП ни разу. Ну может +-1 дискрет.
singlskv
Цитата(oran-be @ Nov 6 2007, 18:27) *
АЦПшник в Мегах 48-88-168 желательно калибровать - это Атмелы пишут, иначе невидать вам 10 бит, как своих ушей.
Это никак не объясняет скачущие показания.
Цитата
И есть еще одна фишка, о кторой они не пишут - это влияние сопротивления источника сигнала.
Пишут но вскользь...
Цитата
Стоит посмотреть, нет ли переключения входного коммутатора.
А вот если есть переключение каналов....
Скорее всего ошибки здесь, если есть переключения.
Цитата
И, если есть, то тогда необходимо проверить, чтобы была задержка между переключением коммутатора и началом измерения.
При сопротивлении источника сигнала 1кОм необходима задержка >500 тактов, при сопротивлении 30к - выходное сопротивление внутренней опоры - не менее 10000 тактов при частоте 8МГц.
Откуда дровишки ? Из лесу вестимо.... smile.gif
Откуда Вы взяли все эти 500, 10000, ... тактов ?
Можно рассчет показать ?

Автор,
без схемы входа, значений резисторов в плечах делителя ADC и частоты ADC(какой делитель на какой частоте проца), типа канала (обычный/диф.), Ваш вопрос чисто абстрактный...
ArtemKAD
Если есть переключение каналов АЦП, то надо одно холостое преобразование после переключения (можно просто перевключив АЦП) и ли не использовать в программе Sleep-режим...
oran-be
Цитата(singlskv @ Nov 6 2007, 22:54) *
.......
Откуда Вы взяли все эти 500, 10000, ... тактов ?
Можно рассчет показать ?
.............

О каком рассчете может идти речь, если у Атмела в узких местах в документации дырени конкретные. Для интереса посмотрите, к примеру как Микрочипсы описывают свои АЦП - внутренняя схема, номиналы, формулы, примеры рассчетов. А с Атмелами узкие места приходится закрывть собственным временем. Данные - потратил честных пару дней и протестировал АЦПшник на предмет работы его УВХ и проч. Так что данные - экспириментальные, кстати, подтвержденные в серии.
mse
Цитата(oran-be @ Nov 7 2007, 09:36) *
О каком рассчете может идти речь, если у Атмела в узких местах в документации дырени конкретные.
...

Нет никаких дыр конкретных. Указана полоса пропускания УВХ - типовая, 38кГц. Указано время сэмплирования АЦП - 1,5такта АЦП. Параметры нормированы на соответствующих тактовых. Всё. В этих рамках надо плясать.
У Микрочипа подробно описано только потому, что программист должен управлять временем сэмплирования УВХ. А здесь всё фиксировано, и нечего считать.
kd_Rash
Нажмите для просмотра прикрепленного файла
Цитата(singlskv @ Nov 6 2007, 22:54) *
Автор,
без схемы входа, значений резисторов в плечах делителя ADC и частоты ADC(какой делитель на какой частоте проца), типа канала (обычный/диф.), Ваш вопрос чисто абстрактный...


вкратце, конечно
oran-be
Интересный креатиффчик...
Непонятно тока зачем делать четыре измерения, заполняя буфер, а потом на пятый раз сдвигать все значения. При этом идет усреднение каждый раз. Может, стоит просто зациклить заполнение фильтра и каждый раз усреднять - получится обычный нерекурсивный фильтр.
А засада, может кроется в объявлениях переменных - есть у меня подозрение, что компилятор при входе в прерывание затрет переменные в 0. Надо сгенерировать ассемблерный код и посмотреть.
alexander55
Цитата(kd_Rash @ Nov 6 2007, 13:58) *

Судя по схеме у Вас есть много резервов для улучшения качества оцифровки.
1. Входной делитель с конденсатором приблизить к входу (смысл не масштабировать помеху).
2. Неиспользуемые входы АЦП шные посадить лучше на землю.
3. Резистор в делителе 7,5 кОм уменьшить, а опорное поднять.
4. На AVCC поставить конденсатор.
5. +5 В на коллекторы транзисторов отвести отдельно с 7805.

Это, что сразу бросилось в глаза. smile.gif
singlskv
Цитата(oran-be @ Nov 7 2007, 13:28) *
А засада, может кроется в объявлениях переменных - есть у меня подозрение, что компилятор при входе в прерывание затрет переменные в 0. Надо сгенерировать ассемблерный код и посмотреть.
Там вобще-то static стоит, компилятор который в такой ситуации будет
обнулять переменные нужно просто выкинуть...

Автору:
- кондер на AVcc обязательно
- непонятно зачем между +5 и Avcc резистор 100 Ом, атмел рекомендует:
2. The AVCC pin on the device should be connected to the digital VCC supply
voltage via an LC network as shown in Figure 109.
L=10uH C=100nF

- неясно какая частота MCU, но например для 8MHz и выбраном Вами делителе 16
получаем fADC=8000000/16=500000 - многовато будет для 10bit точности.
- в тексте прерывания строка
if (t==0) {x1=ADCrez;}
не будет работать никогда, тк перед ней стоит t++;
и вобще не очень понятно что Вы хотели сделать...
если скользящее среднее, то там его нету...

- непонятно как объявлены ADCrez и k.

P.S. текст проги пишите в текстовом виде
alexander55
Цитата(singlskv @ Nov 7 2007, 14:01) *
L=10uH C=100nF[/i]

Поддерживаю, желательно так сделать.
_Pasha
Цитата(kd_Rash @ Nov 7 2007, 10:46) *
вкратце, конечно


1. Да поставьте же ж Вы на АВЦЦ кондюка 2,2мкф! И, BTW, можно и без L=10uH. Сам ставлю 100 Ом ( из жадности biggrin.gif ) и ниче...
2. Почему на AREF так мало (100н)? Никогда так не делал - все больше 10мкФ.
3. Так у Вас, оказывается, можно дрыгать ногами в одном месте программы!
ArtemKAD
Цитата
вкратце, конечно

Цитата
1. Да поставьте же ж Вы на АВЦЦ кондюка 2,2мкф!

Именно. Ну хоть какой-то на 18 ноге поставь!!!
Цитата
3. Резистор в делителе 7,5 кОм уменьшить, а опорное поднять.

Лучше ТАК не делай wink.gif . Особенно в части понижения резистора...

Цитата
5. +5 В на коллекторы транзисторов отвести отдельно с 7805.

То-же лучше не так. Переподключи коллекторы на +12 (туда где делитель) и замени 7805 на 78L05 (пусть лучше греется 4-е транзистора чем 1 стабилизатор). Можешь поставить по резистору в цепь коллектора. Повесь резисторы на землю на базах транзисторов.

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

Перенеси электролит с выхода стабилизатора на вход. Поставь на входе стабилизатора керамику.
Резистор и электролит по цепи Reset выбрось.
alexander55
Цитата(ArtemKAD @ Nov 7 2007, 16:16) *
Лучше ТАК не делай wink.gif . Особенно в части понижения резистора...

Объясните поподробнее почему.
Туда не ходи, сюда ходи. Снег башка попадет - совсем мертвый будешь. (Джентальмены удачи.)smile.gif
kd_Rash
спасибо всем!

на ADC0 и на AREF поставил по кондеру по 2 мкф - не помогло
ADCrez и k - глобальные
t++ перенес, ошибся

короче разводка не очень удачная - надо как-то программным путем.
а мое усреднение не очень устраивает, т.к. изменения напряжения показываются с задежкой

да, забыл сказать, до этого у меня стояла мега8 - было все ок
и на схеме только показал работу АЦП, остальную переферию убрал для простоты.
т. ч. все ноги у меги заняты

повторюсь - стояла мега8 и без всякого усреднения напряжение не перескакивало.
выпаял ее и поставил 168-ю, изменив делитель под опорное 1,1В- 7,5 и 0.5 кОм (у 8меги - 2,56 было и в делители стояли 7,5 и 1 кОм)+ 2мкф.
alexander55
Цитата(kd_Rash @ Nov 8 2007, 10:48) *
короче разводка не очень удачная - надо как-то программным путем.
а мое усреднение не очень устраивает, т.к. изменения напряжения показываются с задежкой

А какая задержка и на что она влияет ?
Если только на вывод на дисплей, то не надо так расстраиваться.
Когда от изменений на дисплее рябит в глазах - это очень плохо. smile.gif
kd_Rash
Цитата(alexander55 @ Nov 8 2007, 11:57) *
А какая задержка и на что она влияет ?
Если только на вывод на дисплей, то не надо так расстраиваться.
Когда от изменений на дисплее рябит в глазах - это очень плохо. smile.gif

да, но почему с мегой8-ой такого не было crying.gif
хотелось бы понять(найти) причину
GDI
А вы посчитайте какая постоянная времени получилась(да и было) у вашей входной цепи на ADC0 и прикиньте сколько усреднений вы успеете сделать пока установится новое напряжение на входе АЦП. Я думаю, что именно из-за этого у вас получаются задержки покизаний, а не из-за того что вы делаете программное усреднение. Кстати у атмела есть апноут про оверсемплинг - там рассказано как при усреднении можно получить дополнительные разряды преобразования АЦП, если мне не изменяет память если на 16 измерений получать 1 результат, то можно вытянуть один лишний разряд, т.е. получить 11бит преобразование
alexander55
Цитата(GDI @ Nov 8 2007, 11:18) *
если мне не изменяет память если на 16 измерений получать 1 результат, то можно вытянуть один лишний разряд, т.е. получить 11бит преобразование

Здесь зависимость корень квадратный из количества показаний. Т.е. Сделав 100 усреднений, повысим точность в 10 раз.
PS. Вот ссылка на обсуждение цифровой фильтрации http://electronix.ru/forum/index.php?showt...4068&st=15#
GDI
Цитата
Сделав 100 усреднений, повысим точность в 10 раз

Нет, не так, опять же по памяти, при 256 измерениях получается 12 бит, а это всего в 4 раза против исходных 10бит, это цыфры из апнота атмеловского, там же есть и пример.
alexander55
Цитата(GDI @ Nov 8 2007, 12:32) *
Нет, не так, опять же по памяти, при 256 измерениях получается 12 бит, а это всего в 4 раза против исходных 10бит, это цыфры из апнота атмеловского, там же есть и пример.

А если считать исходно 8 бит (а 2 бита от лукавого), то и получается в 16 раз (а 2 бита от лукавого). biggrin.gif
kd_Rash
сделал так - уже лучше (да... креатифчик был smile.gif)
#pragma vector = ADC_vect
__interrupt void MY_ADC (void)
{
static char t=0;
static unsigned short x1=0,x2=0,x3=0;

ADCrez = ADCL; ADCrez = ADCrez + (ADCH << 8);

if (t <= 2)
{
x1=x2;
x2=x3;
x3=ADCrez;
t++;
}
else
{
t=0;
}
ADCrez = (x1+x2+x3)/3;
k=1;
}


ADMUX = Bit(REFS0) | Bit(REFS1);
ADCSRA = Bit(ADEN) | Bit(ADIE) | Bit(ADPS2) | Bit(ADPS1) | Bit(ADPS0);
ADCSRA |= Bit(ADSC);DIDR0 |= Bit(ADC0D);

case 1:
ADCSRA |= Bit(ADSC);
while (k==0) {;}
Uadc = (0.1947 * (float)ADCrez) + 9.5684;
SetDataDisp (1,(unsigned short)Uadc);
k=0;
break;
alexander55
Цитата(kd_Rash @ Nov 8 2007, 13:24) *

Совет. Берите выборку кратную 1, 2, 4, 8 и т.д (2 в степени 0, 1,2,3...). Не будете терять точность при вычислении среднего (обойдетесь простым сдвигом на соответствующее количество разрядов).
Извините, чужие листинги читать лень (свои тоже временами). biggrin.gif
GDI
Цитата
ADCrez = ADCL; ADCrez = ADCrez + (ADCH << 8);

лучше записать:
ADCrez = ADCL | (ADCH << 8);
или
ADCrez = ADCL; ADCrez |= (ADCH << 8);
Maik-vs
Цитата(kd_Rash @ Nov 8 2007, 14:24) *
сделал так - уже лучше (да... креатифчик был smile.gif)

. . .


Да уж, впердолить в прерывание три лишних пересылки в статическом массиве и до кучи деление на три - это сильный креатифчик. sad.gif
kipmaster
Цитата(kd_Rash @ Nov 6 2007, 12:58) *
Что может быть, подскажите
на вход АЦП (через делитель) подаю напряжение, которое потом вывожу на индикаторы. использую ИОН - 1.1 V
но при выводе на индикаторы напряжение скачет (перескакивает) 11,9-12,3-11,9-12,1...
использую авто аккумулятор, т.ч сами понимаете такого быть не должно

что посоветуете
С Уважением, Дмитрий.



1. Хорошим и быстрым вольтметром проверьте питание в процессе измерения. Из-за проводов питания/разводки напряжение может меняться от количества горящих сегментов индикатора. Вообще мерять питание через делитель можно, если питание ооочень стабильное.
2. Как управляются индикаторы? Портами Меги? Тогда - совсем плохо, по 5-10 мА в каждый сегмент, количество сегментов скачет, Мега дает ошибку. Если надо точно мерять - порты должны работать только на высокоомную нагрузку. Я использую для светодиодной индикации очередь сдвиговых регистров.
kd_Rash
сделал все таки - и не скачет, и почти мгновенно
...
#pragma vector = ADC_vect __interrupt void MY_ADC (void)
{
ADCrez = ADCL; ADCrez = ADCrez + (ADCH << 8);
}
...
ADMUX = Bit(REFS0) | Bit(REFS1);
ADCSRA = Bit(ADEN) | Bit(ADIE) | Bit(ADPS2) | Bit(ADPS1) | Bit(ADPS0);
ADCSRA |= Bit(ADSC);
DIDR0 |= Bit(ADC0D);
...
(main)
...
for (;;)
{
if (ADCSRA & Bit(ADIF) != 0)
{
x1=x2;
x2=x3;
x3=x4;
x4=x5;
x5=x6;
x6=x7;
x7=x8;
x8=x9;
x9=x10;
x10=ADCrez;
ADCrez = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)/10;
Uadc = (0.1947 * (float)ADCrez) + 9.5684;
ADCSRA |= Bit(ADSC);
j++;
}
...

case 1: // вывод напряжения
ADCSRA |= Bit(ADSC);
j=0;
SetDataDisp (1,(unsigned short)Uadc);
break;
...

правда, чтобы не загружать сильно процессор надо правильней наверно так:

...
if (j<10)
{
if (ADCSRA & Bit(ADIF) != 0)
{
x1=x2;
x2=x3;
x3=x4;
x4=x5;
x5=x6;
x6=x7;
x7=x8;
x8=x9;
x9=x10;
x10=ADCrez;
ADCrez = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)/10;
Uadc = (0.1947 * (float)ADCrez) + 9.5684;
ADCSRA |= Bit(ADSC);
j++;
}
}
...

но тогда показания меняются совсем медленно, и не могу понять почему sad.gif
alexander55
Цитата(kd_Rash @ Nov 12 2007, 17:54) *


Несколько соображений.
1. Сделайте 16 выборок и сосчитайте среднее и только потом вывод на дисплей.
2. Считать Uadc незачем каждый раз (арифметика с плавающей точкой выполняется очень медленно). Только перед выводом на дисплей.
3. Альтернативный вариант. Можно сделать циклический буфер. Причем при подсчете среднего вычитать самое последнее (заменяемое) и прибавлять последнее (которое заменяет).
4. При 16 выборках и считайте так.
ADCres=Sum>>4;

Это видно невооруженным глазом. biggrin.gif
kipmaster
И все-таки лечить аппаратные проблемы программными средствами не всегда гуд. По характеру скачков и по схеме очевидно, что напряжение меняется от количества включенных светодиодных сегментов. Посему, если хотите усреднять - усредняйте сколко угодно, только цикл усреднения должен захватывать несколько циклов индикации. А лучше запитать индикаторы через один защитный диод и 7805, а контроллер через отдельный стабилизатор с делителем через отдельный диод. И землю с питанием разделить на аналоговую и цифровую.
kd_Rash
Цитата(kipmaster @ Nov 13 2007, 13:07) *
И все-таки лечить аппаратные проблемы программными средствами не всегда гуд. По характеру скачков и по схеме очевидно, что напряжение меняется от количества включенных светодиодных сегментов. Посему, если хотите усреднять - усредняйте сколко угодно, только цикл усреднения должен захватывать несколько циклов индикации. А лучше запитать индикаторы через один защитный диод и 7805, а контроллер через отдельный стабилизатор с делителем через отдельный диод. И землю с питанием разделить на аналоговую и цифровую.


естественно так и надо
но переделывать лень для первого варианта, а подумать и программно исправить - интерес

Цитата(alexander55 @ Nov 13 2007, 09:45) *
Несколько соображений.
1. Сделайте 16 выборок и сосчитайте среднее и только потом вывод на дисплей.
2. Считать Uadc незачем каждый раз (арифметика с плавающей точкой выполняется очень медленно). Только перед выводом на дисплей.
3. Альтернативный вариант. Можно сделать циклический буфер. Причем при подсчете среднего вычитать самое последнее (заменяемое) и прибавлять последнее (которое заменяет).
4. При 16 выборках и считайте так.
ADCres=Sum>>4;

Это видно невооруженным глазом. biggrin.gif



спасибо
исправлюсь smile.gif
ArtemKAD
Цитата
А лучше запитать индикаторы через один защитный диод и 7805, а контроллер через отдельный стабилизатор с делителем через отдельный диод. И землю с питанием разделить на аналоговую и цифровую.

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

Хотя... Вот сейчас пришла мысля - ток индикатора протекает всегда в одну сторону создавая паразитное напряжение которое не зависимо от величины ОТНИМАЕТСЯ от истинного измеряемого значения. Можно попробовать измерить несколько раз и ВЫБРАТЬ наибольшее из группы...

Или еще вариант - измерять при выключенных всех разрядах (при индикации сделать паузу на несколько измерений)...
singlskv
Цитата(ArtemKAD @ Nov 13 2007, 21:46) *
Бесполезно - у него полный ток индикатора течет через землю МК (все аноды индикатора коммутируются портом).
Возможно поможет только повышение опорного напряжения т.к. станет больше ступенька АЦП....
Наврятли это реальная причина...
то есть влиять может конечно, в сумме....
просто похоже что у Автора пока еще "каша в голове" по поводу того что он хочет сделать, и как
это нужно делать...

Автор, похвально конечно Ваше желание разобраться самому, но зачем Вы тогда задаете
вопросы здесь ?
Сформулируйте точно что Вы хотите получить, ну и приложите код Вашего решения,
ну а мы если что отредактируем...
alexander55
Цитата(singlskv @ Nov 13 2007, 22:11) *

Уже предложена куча полезных советов, автору нужно только их осознать и все будет ХОРОШО. biggrin.gif
kd_Rash
Цитата(singlskv @ Nov 13 2007, 23:11) *
Наврятли это реальная причина...
то есть влиять может конечно, в сумме....
просто похоже что у Автора пока еще "каша в голове" по поводу того что он хочет сделать, и как
это нужно делать...

Автор, похвально конечно Ваше желание разобраться самому, но зачем Вы тогда задаете
вопросы здесь ?
Сформулируйте точно что Вы хотите получить, ну и приложите код Вашего решения,
ну а мы если что отредактируем...


мне кажется, что сформулировал более, чем достаточно

если бы все здесь были такие как вы, то естественно, что я даже не стал регистрироваться на этом форуме

а вопрос был в самом начале - стояла мега8. напряжение показывалось великолепно. выпаял и поставил мегу168 (кстати поменял их 2 греша на брак) - и начались перескакивания в напряжении
укажите плз хотя бы одну причину

Цитата(alexander55 @ Nov 13 2007, 09:45) *
Несколько соображений.
1. Сделайте 16 выборок и сосчитайте среднее и только потом вывод на дисплей.
2. Считать Uadc незачем каждый раз (арифметика с плавающей точкой выполняется очень медленно). Только перед выводом на дисплей.
3. Альтернативный вариант. Можно сделать циклический буфер. Причем при подсчете среднего вычитать самое последнее (заменяемое) и прибавлять последнее (которое заменяет).
4. При 16 выборках и считайте так.
ADCres=Sum>>4;

Это видно невооруженным глазом. biggrin.gif


Uadc у меня стояло сначала только перед выводом на дисплей. но когда я это поставил там где стоит - перескакивания исчезли полностью в купе с подсчетом среднего из 10-ти.

пробовал брать 16, как Вы посоветовали - чуть стало похуже.
беря последовательно среднее из от 2 до 20, лучшими стали из 10 и 11

спасибо
kipmaster
Цитата(ArtemKAD @ Nov 13 2007, 20:46) *
Бесполезно - у него полный ток индикатора течет через землю МК (все аноды индикатора коммутируются портом).
Возможно поможет только повышение опорного напряжения т.к. станет больше ступенька АЦП....

Хотя... Вот сейчас пришла мысля - ток индикатора протекает всегда в одну сторону создавая паразитное напряжение которое не зависимо от величины ОТНИМАЕТСЯ от истинного измеряемого значения. Можно попробовать измерить несколько раз и ВЫБРАТЬ наибольшее из группы...

Или еще вариант - измерять при выключенных всех разрядах (при индикации сделать паузу на несколько измерений)...


Вот еще бредово-гениальная идея. Криатифф 2000%! Надо измерить влияние одного включенного сегмента на ошибку, и потом в каждом цикле индикации считать количество сегментов и делать поправку к отсчету АЦП.
alexander55
Цитата(kd_Rash @ Nov 14 2007, 10:24) *
пробовал брать 16, как Вы посоветовали - чуть стало похуже.
беря последовательно среднее из от 2 до 20, лучшими стали из 10 и 11

Попробуйте 32. Сдвиг удобный >>5.
kd_Rash
Цитата(alexander55 @ Nov 14 2007, 14:16) *
Попробуйте 32. Сдвиг удобный >>5.

попробовал
результат стал стоять мертво, но если опять же Uadc ставить перед выводом на дисплей - опять перескакивает 12,9-13,2 ...

спасибо

результат стал стоять мертво (поторопился, извините - не лучше чем 11)
вот
Maik-vs
Выключайте индикатор на время оцифровки, чтобы не текли токи индикатора по аналоговой земле. А то происходит как бы самовозбуждение от индикатора на АЦП. Ну или опорное напряжение АЦП должно прыгать в такт с измеряемым. В общем говно вопрос - надо аналоговую землю отделять от цифровой.
kd_Rash
ну да ладно
всем спасибо
зато вопрос знаю теперь чуть лучше, любой опыт не лишний

Удачи, Дмитрий.
alexander55
Цитата(kd_Rash @ Nov 15 2007, 09:45) *

Рекомедую, просмотреть этот топик сначала и проанализировать все с позиций знаний, полученных в процессе. Это поможет в дальнейшем, чтобы не было сказки про белого бычка. biggrin.gif
kd_Rash
Всё таки добил - работает теперь луше чем было раньше!


for (;;)
{
//----------------
if (timer_count_a > 11)
{
if (ADCSRA & Bit(ADIF) != 0)
{
x1=x2;
x2=x3;
x3=x4;
x4=x5;
x5=x6;
x6=x7;
x7=x8;
x8=x9;
x9=x10;
x10=x11;
x11=x12;
x12=x13;
x13=x14;
x14=x15;
x15=x16;
x16=ADCrez;
ADCSRA |= Bit(ADSC);
}
timer_count_a=0;
}
...
...
...

if (timer_count > 180) // 0.5 сек.
{

switch (g_Uset)
{
case 1: ADCSRA |= Bit(ADSC); // вывод напряжения
ADCcp = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14+x15+x16) >> 4;
Uadc = (0.1929 * (float)ADCcp) + 13;
SetDataDisp (1,(unsigned short)Uadc);
break;


...
...
...


}
timer_count=0;
}
timer_count++; timer_count_a++;
...


Удачи, Дмитрий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.