реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> mega168 - скачет напряжение с АЦП
kd_Rash
сообщение Nov 14 2007, 13:11
Сообщение #46


Участник
*

Группа: Новичок
Сообщений: 58
Регистрация: 11-01-07
Пользователь №: 24 311



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

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

спасибо

результат стал стоять мертво (поторопился, извините - не лучше чем 11)
вот

Сообщение отредактировал kd_Rash - Nov 14 2007, 13:19
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Nov 14 2007, 15:28
Сообщение #47


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



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

Сообщение отредактировал Maik-vs - Nov 14 2007, 15:30
Go to the top of the page
 
+Quote Post
kd_Rash
сообщение Nov 15 2007, 06:45
Сообщение #48


Участник
*

Группа: Новичок
Сообщений: 58
Регистрация: 11-01-07
Пользователь №: 24 311



ну да ладно
всем спасибо
зато вопрос знаю теперь чуть лучше, любой опыт не лишний

Удачи, Дмитрий.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 15 2007, 07:13
Сообщение #49


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(kd_Rash @ Nov 15 2007, 09:45) *

Рекомедую, просмотреть этот топик сначала и проанализировать все с позиций знаний, полученных в процессе. Это поможет в дальнейшем, чтобы не было сказки про белого бычка. biggrin.gif
Go to the top of the page
 
+Quote Post
kd_Rash
сообщение Nov 27 2007, 07:06
Сообщение #50


Участник
*

Группа: Новичок
Сообщений: 58
Регистрация: 11-01-07
Пользователь №: 24 311



Всё таки добил - работает теперь луше чем было раньше!


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++;
...


Удачи, Дмитрий.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 27 2007, 12:01
Сообщение #51


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Почему бы вам не сделать цикличский буффер?

WORD awAdcBuff[16];
WORD wAdcResult;

WORD* pAdcBuff = awAdcBuff;

И в прерывании:

*pAdcBuff = ADC;
pAdcBuff++;
if(pAdcBuff == (awAdcBuff+16)) pAdcBuff = awAdcBuff;

wAdcResult = 0;
for(BYTE i=0; i<16; i++){
wAdcResult += awAdcBuff[i];
}
wAdcResult = wAdcResult/16; //

Как то поприятнее выглядит.
Go to the top of the page
 
+Quote Post
kd_Rash
сообщение Nov 27 2007, 12:16
Сообщение #52


Участник
*

Группа: Новичок
Сообщений: 58
Регистрация: 11-01-07
Пользователь №: 24 311



Цитата(oran-be @ Nov 27 2007, 16:01) *
Почему бы вам не сделать цикличский буффер?


smile.gif
потому что знал, что так можно,
но как - не знал ... до этого момента
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2007, 14:35
Сообщение #53


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kd_Rash @ Nov 27 2007, 14:16) *
потому что знал, что так можно,
но как - не знал ... до этого момента
Тогда вот вам еще в копилку - чтобы не высчитывать каждый раз сумму по всему буферу, ее можно считать при занесении значения в буфер:
Код
WORD wAdcSum;
    wAdcSum -= *pAdcBuff
    wAdcSum += (*pAdcBuff = ADC);
    pAdcBuff++;
    if(pAdcBuff == (awAdcBuff + 16))
        pAdcBuff = awAdcBuff;

// там, где нужен результат:
wAdcResult = wAdcSum / 16;
А еще можно заменить константу 16 на (sizeof(awAdcBuff) / sizeof(awAdcBuff[0])) - это позволит задавать размер буфера только в одном месте - при объявлении. А еще - можно этот sizeof() обернуть в удобный макрос:
Код
#define  ELEMENTS(Array)   (sizeof(Array) / sizeof(Array[0]))
WORD awAdcBuff[16];
WORD wAdcResult;
WORD wAdcSum;
WORD* pAdcBuff = awAdcBuff;

    wAdcSum -= *pAdcBuff
    wAdcSum += (*pAdcBuff = ADC);
    pAdcBuff++;
    if(pAdcBuff == (awAdcBuff + ELEMENTS(awAdcBuff) ))
        pAdcBuff = awAdcBuff;

// там, где нужен результат:
wAdcResult = wAdcSum / ELEMENTS(awAdcBuff);
так будет совсем красиво.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 27 2007, 14:54
Сообщение #54


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



А еще можно не заносить значение в буфер, а только считать сумму.
А на 16 раз среднее,
обнулять сумму.
А еще можно не проверять счетчик, а делать так
Счетчик &=0xf;
PS. Всегда найдется дело для умелых рук. smile.gif
Go to the top of the page
 
+Quote Post
kd_Rash
сообщение Nov 28 2007, 08:07
Сообщение #55


Участник
*

Группа: Новичок
Сообщений: 58
Регистрация: 11-01-07
Пользователь №: 24 311



ну, спасибо, всем!
Go to the top of the page
 
+Quote Post
Gogan
сообщение Nov 28 2007, 09:20
Сообщение #56


Частый гость
**

Группа: Участник
Сообщений: 83
Регистрация: 25-10-07
Из: Киев
Пользователь №: 31 728



Цитата(kd_Rash @ Nov 28 2007, 10:07) *
ну, спасибо, всем!

Интересная тема. Расскажу про свой опыт измерений. Я работал только с мега8 и мега16. При измерении сигнала от тензодатчика (0-18мВ) стоял инструментальный усилитель AD620 (дорогой собака - 10$) с коеф.ус.275 и с него на АЦП. В итоге на выходе (рисовал график на компе) получил все наводки - и помехи от силовой аппаратуры (модуляция 8кгц) и синфазные (50гц) на уровне до 10% от максимума (может, конечно, можно было увеличить RC фильтр, но я не стал). Частота контроллера 8мгц, предделитель ацп 128 (максимальный), ацп считает за 13 тактов (по даташиту), в итоге получается около 4800 результатов в секунду (мне необходимо было не меньше 2). В итоге я усреднял каждые 2500 результатов и получил почти идеально гладкий график.

С наводками мне очень сложно бороться, какой бы фильтр не ставил, как бы подальше от силовых проводов не отводил, всеравно прыгает результат довольно значительно.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 28 2007, 10:01
Сообщение #57


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Gogan @ Nov 28 2007, 12:20) *
В итоге я усреднял каждые 2500 результатов и получил почти идеально гладкий график.

sqrt(2500)=50
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01584 секунд с 7
ELECTRONIX ©2004-2016