Обсуждаем контроллеры компании Atmel.
Ответить

Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 16:48:03

Всем привет! Начну с картинки мужики. В двух словах подаю на АКБ автомобильный напряжение 19В частотой 1кГц с заполнение 40%. Красный график это данные АЦП, зеленый это применен фильтр для АЦП - бегущее среднее. Мне же нужно отфильтроваться по нижней границе красного графика, применил еще фильтр - медиана 3 порядка, почти тож самое вышло что и красный, не отфильтровывает выбросы ШИМ сигнала. Как быть, подскажет мож у кого есть другой код фильтрации?
И еще момент, если спустить заполнение ШИМ до 10%, бегущее среднее работает по нижней границе красного графика. т.е. на малую скважность не обращает внимание.
Вложения
3.jpg
красный - ацп
зеленый - фильтр бегущее среднее
(252.61 KiB) Скачиваний: 378

Re: Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 20:02:02

Запускать АЦП между импульсами ШИМ?

Re: Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 20:19:13

Запускать АЦП между импульсами ШИМ?

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

Re: Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 20:46:57

а бегущее среднее у тебя компьютер строит по данным UART? или МК это бегущее вычисляет?

Re: Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 22:02:56

а бегущее среднее у тебя компьютер строит по данным UART? или МК это бегущее вычисляет?

мк вычисляет по ацп, до алгоритма бегущее среднее ни каких обработок, ацп 10бит 125kHz , комп просто строит по данным из UART скорость 9600

Re: Фильтр АЦП atmega 8 по нижней границе

Пн мар 01, 2021 23:16:19

Эмм... наверное не очень решение, но что в лоб пришло в голову - после среднего или медианного фильтра отсечь сэмплы выше оного и фильтрануть аналогично только оставшиеся?

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 08:28:35

neid писал(а):мк вычисляет по ацп
тогда еще вопрос - какая частота ШИМ и какая частота опроса АЦП?
и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 10:33:44

тогда еще вопрос - какая частота ШИМ и какая частота опроса АЦП?
и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?

Тогда начну с того что новичок, и может быть в моих суждениях есть ошибка, т.к. сначала изучу какой либо блок(АЦП UART и т.д.) в теории, потом пытаюсь писать код. Как выше уже писал, частота ШИМ 1kHz, скважность 40% в данном случае. АЦП тоже выше описал 125kHz, данные беру прям с read-adc(0) и все и ставлю в функцию среднего бегущего
Код:
#define K 0.1 //K - коэффициент фильтрации, 0.0-1.0
//*******ФУНКЦИЯ БЕГУЩЕЕ СРЕДНЕЕ АРИФМИТИЧЕСКОЕ**********************************
float expRunningAverage(float newVal) {
  static float filVal = 0;
  filVal += (newVal - filVal) * K; //K - коэффициент фильтрации, 0.0-1.0
  return filVal;
}

//*******************************************************************************
----прочий код-------
adc=expRunningAverage(read_adc(0));

и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?

писал подобное что то не пошло((( шим настроен 1kHz
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Disconnected
// OC1B output: Inverted PWM
// Timer Period: 0,99925 ms
// Output Pulse(s):
// OC1B Period: 0,99925 ms Width: 0,99925 ms
// Compare A Match Interrupt: On

Код:
if(OCR1B>0 && OCR1B<PWR) {adc_max_pwr=expRunningAverage(read_adc(0));} //т.е. когда период ШИМ Toff то меряем напругу

или
Код:
if(OCR1B>0 && OCR1B<PWR) {adc_max_pwr=read_adc(0);} //т.е. когда период ШИМ Toff то меряем напругу без филтрации

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 14:45:48

ничего не понял.
прерывание по сравнению канала А, а ШИМ оказался на канале В ... и как это может работать?
как я понял, 125 кГц - это частота тактирования АЦП, а не частота опроса входа АЦП.
а я спрашивал, с какой частотой идет опрос входа АЦП. то есть, как часто вызывается твоя функция read_adc(0).

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 15:22:53

Starichok51 писал(а): то есть, как часто вызывается твоя функция read_adc(0).
Учитывая что
Код:
----прочий код-------
adc=expRunningAverage(read_adc(0));
то тут трудно посчитать с какой частотой вызывается функция, и вряд ли ТС на этот вопрос даст ответ.

Больше такой вопрос интересует:
neid писал(а):В двух словах подаю на АКБ автомобильный напряжение 19В частотой 1кГц с заполнение 40%.
Не понятно? Полагаю что ТС на АКБ подаете фиксированное напряжение 19В через какой-то "ключ" на который завели ШИМ 1кГц. -?
Просто тема может вылиться еще в 5 страниц, а в результате на выходе у ТС стоит обыкновенный "линейный регулятор", а шим управляет этим регулятором через цепочку rc-rc.

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 15:46:11

вообще-то, АКБ автомобильная. батарея же она, а не он.
и какие, на хрен, 19 Вольт, если на батарею нельзя подавать более 14,4 Вольта???

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 16:49:37

ничего не понял.
прерывание по сравнению канала А, а ШИМ оказался на канале В ... и как это может работать?

на этот вопрос я ответил настройками из codevisiona avr, но видимо не особо понимаете что там написано и как реализован шим, как еще на словах отвечу:
"нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход....
нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM
можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём."
как я понял, 125 кГц - это частота тактирования АЦП, а не частота опроса входа АЦП.
а я спрашивал, с какой частотой идет опрос входа АЦП. то есть, как часто вызывается твоя функция read_adc(0).

как часто? так часто что опрос стоит while(1)... и я конечно только учусь... но что тут не понятного может быть))) научите меня я пока не знаю как ответить на ваш вопрос с какой частотой опрашивается АЦП(((

Dimon456 писал(а):Dimon456
не хочу отвечать даже! вообще не о том речь! там просто Р-канальный мосфет и все.... на 5 страниц она выльется если подобные вопросы не в тему задавать)))

Starichok51 писал(а):вообще-то, АКБ автомобильная. батарея же она, а не он.
и какие, на хрен, 19 Вольт, если на батарею нельзя подавать более 14,4 Вольта???

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

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 17:16:29

neid писал(а):не хочу отвечать даже! вообще не о том речь! там просто Р-канальный мосфет и все.... на 5 страниц она выльется если подобные вопросы не в тему задавать)))
вопрос в тему был.
Что весит на Compare A Match Interrupt: On ?
Что мешает выключать ШИМ на время измерения?

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 17:32:26

Что весит на Compare A Match Interrupt: On ?
Что мешает выключать ШИМ на время измерения?

выше расписано по шим... измерения нужны при работающем ШИМ, т.е. идет заряд на акб в это время и надо следить по нижней границе, что будет адекватному напряжению акб бегущее среднее дает завышеный результат...
вы наверное забыли что общаетесь с дилетантом, но лично я вас понимаю, что вы хотите делать опрос АЦП в нулевом периоде ШИМ сигнала... тогда другой вопрос зачем его вообще выключать?
Уверенно движемся к 5 странице)))

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 17:56:24

neid писал(а):на этот вопрос я ответил настройками из codevisiona avr,
это не настройки ты привел, а комментарии.
а из комментариев не понятно, какой режим задан таймеру.
что записывается в TCCR1A, что в TCCR1B, что в OCR1A и что в OCR1B.

ты все время твердишь про нижнюю границу на графике.
а нижняя граница получается, когда импульса ШИМ нет.
это ты движешься к 5 странице своим непониманием того, что тебе говорят.
чтобы всегда была твоя "нижняя граница" тебе и предлагают либо на время измерения отключать ШИМ либо делать измерения, когда в ШИМ проходит пауза.
зачем измерять во время действия импульса, если при этом ты получаешь неправильный (ненужный) результат?

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 17:58:26

neid писал(а):что вы хотите делать опрос АЦП в нулевом периоде ШИМ сигнала
Вам же писали
Demiurg писал(а):Запускать АЦП между импульсами ШИМ
neid писал(а):тогда другой вопрос зачем его вообще выключать?
так делается во многих промышленных зарядниках, что дает более оптимальное измерение напряжения на акб.
А вообще, судя по вашему графику, минимум измерения можно было давно взять еще с самого первого сообщения этой темы.

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 18:53:14

это не настройки ты привел, а комментарии.
а из комментариев не понятно, какой режим задан таймеру.
что записывается в TCCR1A, что в TCCR1B, что в OCR1A и что в OCR1B.


Код:
//*******Timer1 output compare A interrupt service routine***********************
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
timer++;                                                        //таймер шим 1кГц
OCR1B= (PERIOD_kHz*(1000-IGLA))*0.001;    //т.к С ИНВЕРСИЕЙ - считаем так
} // end Timer1
//**********************************************************************

// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Disconnected
// OC1B output: Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,99925 ms
// Output Pulse(s):
// OC1B Period: 0,99925 ms Width: 0,99925 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1F; // 1F3F(7999) - 1кГц - 1.0000 ms
OCR1AL=0x3F;
OCR1BH=0x00;
OCR1BL=0x00;


чтобы всегда была твоя "нижняя граница" тебе и предлагают либо на время измерения отключать ШИМ либо делать измерения, когда в ШИМ проходит пауза.
зачем измерять во время действия импульса, если при этом ты получаешь неправильный (ненужный) результат?

вот я и писал выше, т.е. "когда в ШИМ проходит пауза" это мое видение вашего совета, мож и не правильно, пока так!
Код:
if(OCR1B>0 && OCR1B<PWR) {adc_max_pwr=expRunningAverage(read_adc(0));} //т.е. когда период ШИМ Toff то меряем напругу


вопрос к вашему совету, зачем в это время выключать шим? и каким образом? таким?
Код:
TCCR1A &=~(1 << COM1B0);             
 TCCR1A &=~(1 << COM1B1);


Добавлено after 43 minutes 28 seconds:
судя по вашему графику, минимум измерения можно было давно взять еще с самого первого сообщения этой темы.

Наглядно можете показать в виде кода?

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 18:58:09

neid писал(а):if(OCR1B>0 && OCR1B<PWR)
как ты можешь сравнивать OCR1B, если у тебя там записан НОЛЬ, и это значение нигде не изменяется?
и что такое PWR, тоже не понятно.
OCR1A тоже нигде не изменяется и OCR1A задает частоту ШИМ.
изменяется только сам счетчик таймера TCNT1.
а вот где задается длительность импульса, чтобы получить 40% периода, я что-то нигде не увидел.

поскольку у тебя инверсный выход ШИМ, то сначала идет НОЛЬ (импульса нет).
поэтому мне видится, что нужно еще добавить прерывание по переполнению. и в этом прерывании, пока импульса нет, запустить замер АЦП.

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 19:01:18

Я бы код переписал, особенно вот этот участок
Код:
OCR1B= (PERIOD_kHz*(1000-IGLA))*0.001;
видимо одна из них переменная будет, а расчет с плавающей запятой и в прерывании - это жестко.

А на счет иголок в ШИМ, там 5 режимов ШИМ, не ужели на всех иголки идут? Может у вас мосфет не успевает закрываться?
Некоторые экстрималы умудряются dc-dc преобразователи строить на этих мегах.

Re: Фильтр АЦП atmega 8 по нижней границе

Вт мар 02, 2021 19:14:48

пардон, я прозевал этот момент, где изменяется OCR1B.
то есть, OCR1B задает длительность импульса.
и опять не дана информация, где объявляется IGLA и чему она равна.
Ответить