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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

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

Сообщение Demiurg »

Запускать АЦП между импульсами ШИМ?
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3989861#p3989861"]Запускать АЦП между импульсами ШИМ?[/uquote]
не катит, т.к. мы видим же наглядно не каждый импульс на графике, эти данные АЦП по UART передаются, на основе их строится график... только на малых частотах, в несколько герц еще может быть... тут же нужен алгоритм!
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

а бегущее среднее у тебя компьютер строит по данным UART? или МК это бегущее вычисляет?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3989899#p3989899"]а бегущее среднее у тебя компьютер строит по данным UART? или МК это бегущее вычисляет?[/uquote]
мк вычисляет по ацп, до алгоритма бегущее среднее ни каких обработок, ацп 10бит 125kHz , комп просто строит по данным из UART скорость 9600
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Эмм... наверное не очень решение, но что в лоб пришло в голову - после среднего или медианного фильтра отсечь сэмплы выше оного и фильтрануть аналогично только оставшиеся?
Реклама
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

neid писал(а):мк вычисляет по ацп
тогда еще вопрос - какая частота ШИМ и какая частота опроса АЦП?
и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3990100#p3990100"]тогда еще вопрос - какая частота ШИМ и какая частота опроса АЦП?
и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?[/uquote]
Тогда начну с того что новичок, и может быть в моих суждениях есть ошибка, т.к. сначала изучу какой либо блок(АЦП 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));
[uquote="Starichok51",url="/forum/viewtopic.php?p=3990100#p3990100"]и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?[/uquote]
писал подобное что то не пошло((( шим настроен 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 то меряем напругу без филтрации
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

Сообщение Dimon456 »

Starichok51 писал(а): то есть, как часто вызывается твоя функция read_adc(0).
Учитывая что

Код: Выделить всё

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

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

Сообщение Starichok51 »

вообще-то, АКБ автомобильная. батарея же она, а не он.
и какие, на хрен, 19 Вольт, если на батарею нельзя подавать более 14,4 Вольта???
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3990275#p3990275"]ничего не понял.
прерывание по сравнению канала А, а ШИМ оказался на канале В ... и как это может работать?[/uquote]
на этот вопрос я ответил настройками из codevisiona avr, но видимо не особо понимаете что там написано и как реализован шим, как еще на словах отвечу:
"нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход....
нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM
можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём."
[uquote="Starichok51",url="/forum/viewtopic.php?p=3990275#p3990275"]как я понял, 125 кГц - это частота тактирования АЦП, а не частота опроса входа АЦП.
а я спрашивал, с какой частотой идет опрос входа АЦП. то есть, как часто вызывается твоя функция read_adc(0).[/uquote]
как часто? так часто что опрос стоит while(1)... и я конечно только учусь... но что тут не понятного может быть))) научите меня я пока не знаю как ответить на ваш вопрос с какой частотой опрашивается АЦП(((
Dimon456 писал(а):Dimon456
не хочу отвечать даже! вообще не о том речь! там просто Р-канальный мосфет и все.... на 5 страниц она выльется если подобные вопросы не в тему задавать)))
Starichok51 писал(а):вообще-то, АКБ автомобильная. батарея же она, а не он.
и какие, на хрен, 19 Вольт, если на батарею нельзя подавать более 14,4 Вольта???
вообще то вы тоже не знаете многих схем как заряжать лучше акб... и подобный метод не только лучше заряжает са/са акб, но и десульфатацию производит попутно... вернемся к вопросу об ацп лучше, может тут истину проясним)) а эти учения как заряжать акб и русский язык оставим....
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3990355#p3990355"]Что весит на Compare A Match Interrupt: On ?
Что мешает выключать ШИМ на время измерения?[/uquote]
выше расписано по шим... измерения нужны при работающем ШИМ, т.е. идет заряд на акб в это время и надо следить по нижней границе, что будет адекватному напряжению акб бегущее среднее дает завышеный результат...
вы наверное забыли что общаетесь с дилетантом, но лично я вас понимаю, что вы хотите делать опрос АЦП в нулевом периоде ШИМ сигнала... тогда другой вопрос зачем его вообще выключать?
Уверенно движемся к 5 странице)))
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

ты все время твердишь про нижнюю границу на графике.
а нижняя граница получается, когда импульса ШИМ нет.
это ты движешься к 5 странице своим непониманием того, что тебе говорят.
чтобы всегда была твоя "нижняя граница" тебе и предлагают либо на время измерения отключать ШИМ либо делать измерения, когда в ШИМ проходит пауза.
зачем измерять во время действия импульса, если при этом ты получаешь неправильный (ненужный) результат?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение neid »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3990380#p3990380"]это не настройки ты привел, а комментарии.
а из комментариев не понятно, какой режим задан таймеру.
что записывается в TCCR1A, что в TCCR1B, что в OCR1A и что в OCR1B.[/uquote]

Код: Выделить всё

//*******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;
[uquote="Starichok51",url="/forum/viewtopic.php?p=3990380#p3990380"]чтобы всегда была твоя "нижняя граница" тебе и предлагают либо на время измерения отключать ШИМ либо делать измерения, когда в ШИМ проходит пауза.
зачем измерять во время действия импульса, если при этом ты получаешь неправильный (ненужный) результат?[/uquote]
вот я и писал выше, т.е. "когда в ШИМ проходит пауза" это мое видение вашего совета, мож и не правильно, пока так!

Код: Выделить всё

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

Код: Выделить всё

TCCR1A &=~(1 << COM1B0);              
 TCCR1A &=~(1 << COM1B1);
Добавлено after 43 minutes 28 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3990382#p3990382"]судя по вашему графику, минимум измерения можно было давно взять еще с самого первого сообщения этой темы.[/uquote]
Наглядно можете показать в виде кода?
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

поскольку у тебя инверсный выход ШИМ, то сначала идет НОЛЬ (импульса нет).
поэтому мне видится, что нужно еще добавить прерывание по переполнению. и в этом прерывании, пока импульса нет, запустить замер АЦП.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Я бы код переписал, особенно вот этот участок

Код: Выделить всё

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

А на счет иголок в ШИМ, там 5 режимов ШИМ, не ужели на всех иголки идут? Может у вас мосфет не успевает закрываться?
Некоторые экстрималы умудряются dc-dc преобразователи строить на этих мегах.
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

пардон, я прозевал этот момент, где изменяется OCR1B.
то есть, OCR1B задает длительность импульса.
и опять не дана информация, где объявляется IGLA и чему она равна.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «AVR»