|
|
  |
mega168 - скачет напряжение с АЦП |
|
|
|
Nov 14 2007, 13:11
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Nov 15 2007, 06:45
|
Участник

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

|
ну да ладно всем спасибо зато вопрос знаю теперь чуть лучше, любой опыт не лишний
Удачи, Дмитрий.
|
|
|
|
|
Nov 27 2007, 07:06
|
Участник

Группа: Новичок
Сообщений: 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++; ...
Удачи, Дмитрий.
|
|
|
|
|
Nov 27 2007, 12:16
|
Участник

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

|
Цитата(oran-be @ Nov 27 2007, 16:01)  Почему бы вам не сделать цикличский буффер?  потому что знал, что так можно, но как - не знал ... до этого момента
|
|
|
|
|
Nov 27 2007, 14:35
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 27 2007, 14:54
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
А еще можно не заносить значение в буфер, а только считать сумму. А на 16 раз среднее, обнулять сумму. А еще можно не проверять счетчик, а делать так Счетчик &=0xf; PS. Всегда найдется дело для умелых рук.
|
|
|
|
|
Nov 28 2007, 08:07
|
Участник

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

|
ну, спасибо, всем!
|
|
|
|
|
Nov 28 2007, 09:20
|

Частый гость
 
Группа: Участник
Сообщений: 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 результатов и получил почти идеально гладкий график. С наводками мне очень сложно бороться, какой бы фильтр не ставил, как бы подальше от силовых проводов не отводил, всеравно прыгает результат довольно значительно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|