Всем привет! Начну с картинки мужики. В двух словах подаю на АКБ автомобильный напряжение 19В частотой 1кГц с заполнение 40%. Красный график это данные АЦП, зеленый это применен фильтр для АЦП - бегущее среднее. Мне же нужно отфильтроваться по нижней границе красного графика, применил еще фильтр - медиана 3 порядка, почти тож самое вышло что и красный, не отфильтровывает выбросы ШИМ сигнала. Как быть, подскажет мож у кого есть другой код фильтрации? И еще момент, если спустить заполнение ШИМ до 10%, бегущее среднее работает по нижней границе красного графика. т.е. на малую скважность не обращает внимание.
Вложения:
Комментарий к файлу: красный - ацп зеленый - фильтр бегущее среднее 3.jpg [252.61 KiB]
Скачиваний: 399
не катит, т.к. мы видим же наглядно не каждый импульс на графике, эти данные АЦП по UART передаются, на основе их строится график... только на малых частотах, в несколько герц еще может быть... тут же нужен алгоритм!
Эмм... наверное не очень решение, но что в лоб пришло в голову - после среднего или медианного фильтра отсечь сэмплы выше оного и фильтрануть аналогично только оставшиеся?
тогда еще вопрос - какая частота ШИМ и какая частота опроса АЦП? и что может мешать запускать АЦП с частотой ШИМ, но в паузе ШИМ сигнала?
Тогда начну с того что новичок, и может быть в моих суждениях есть ошибка, т.к. сначала изучу какой либо блок(АЦП UART и т.д.) в теории, потом пытаюсь писать код. Как выше уже писал, частота ШИМ 1kHz, скважность 40% в данном случае. АЦП тоже выше описал 125kHz, данные беру прям с 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 то меряем напругу без филтрации
ничего не понял. прерывание по сравнению канала А, а ШИМ оказался на канале В ... и как это может работать? как я понял, 125 кГц - это частота тактирования АЦП, а не частота опроса входа АЦП. а я спрашивал, с какой частотой идет опрос входа АЦП. то есть, как часто вызывается твоя функция read_adc(0).
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
то тут трудно посчитать с какой частотой вызывается функция, и вряд ли ТС на этот вопрос даст ответ.
Больше такой вопрос интересует:
neid писал(а):
В двух словах подаю на АКБ автомобильный напряжение 19В частотой 1кГц с заполнение 40%.
Не понятно? Полагаю что ТС на АКБ подаете фиксированное напряжение 19В через какой-то "ключ" на который завели ШИМ 1кГц. -? Просто тема может вылиться еще в 5 страниц, а в результате на выходе у ТС стоит обыкновенный "линейный регулятор", а шим управляет этим регулятором через цепочку rc-rc.
ничего не понял. прерывание по сравнению канала А, а ШИМ оказался на канале В ... и как это может работать?
на этот вопрос я ответил настройками из codevisiona avr, но видимо не особо понимаете что там написано и как реализован шим, как еще на словах отвечу: "нам ещё нужен ШИМ сигнал на выходе, ещё есть режимы PWM - выберем "fastPWM top OCR1A" и запишем наше число в OCR1A, теперь таймер работает с частотой 1 кГц и дает выход.... нет, выход он пока не даёт, его ещё подключить надо... компаратор "А" уже занят, подключим к "В": OutB - Inverted PWM можно выбрать и неинвертируемый, но он не умеет полностью закрываться - маленькие иголочки при сбросе таймера будут просачиваться... поэтому берём инвертируемый, но в коде это учтём."
как я понял, 125 кГц - это частота тактирования АЦП, а не частота опроса входа АЦП. а я спрашивал, с какой частотой идет опрос входа АЦП. то есть, как часто вызывается твоя функция read_adc(0).
как часто? так часто что опрос стоит while(1)... и я конечно только учусь... но что тут не понятного может быть))) научите меня я пока не знаю как ответить на ваш вопрос с какой частотой опрашивается АЦП(((
Dimon456 писал(а):
Dimon456
не хочу отвечать даже! вообще не о том речь! там просто Р-канальный мосфет и все.... на 5 страниц она выльется если подобные вопросы не в тему задавать)))
Starichok51 писал(а):
вообще-то, АКБ автомобильная. батарея же она, а не он. и какие, на хрен, 19 Вольт, если на батарею нельзя подавать более 14,4 Вольта???
вообще то вы тоже не знаете многих схем как заряжать лучше акб... и подобный метод не только лучше заряжает са/са акб, но и десульфатацию производит попутно... вернемся к вопросу об ацп лучше, может тут истину проясним)) а эти учения как заряжать акб и русский язык оставим....
не хочу отвечать даже! вообще не о том речь! там просто Р-канальный мосфет и все.... на 5 страниц она выльется если подобные вопросы не в тему задавать)))
вопрос в тему был. Что весит на Compare A Match Interrupt: On ? Что мешает выключать ШИМ на время измерения?
Что весит на Compare A Match Interrupt: On ? Что мешает выключать ШИМ на время измерения?
выше расписано по шим... измерения нужны при работающем ШИМ, т.е. идет заряд на акб в это время и надо следить по нижней границе, что будет адекватному напряжению акб бегущее среднее дает завышеный результат... вы наверное забыли что общаетесь с дилетантом, но лично я вас понимаю, что вы хотите делать опрос АЦП в нулевом периоде ШИМ сигнала... тогда другой вопрос зачем его вообще выключать? Уверенно движемся к 5 странице)))
на этот вопрос я ответил настройками из codevisiona avr,
это не настройки ты привел, а комментарии. а из комментариев не понятно, какой режим задан таймеру. что записывается в TCCR1A, что в TCCR1B, что в OCR1A и что в OCR1B.
ты все время твердишь про нижнюю границу на графике. а нижняя граница получается, когда импульса ШИМ нет. это ты движешься к 5 странице своим непониманием того, что тебе говорят. чтобы всегда была твоя "нижняя граница" тебе и предлагают либо на время измерения отключать ШИМ либо делать измерения, когда в ШИМ проходит пауза. зачем измерять во время действия импульса, если при этом ты получаешь неправильный (ненужный) результат?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
что вы хотите делать опрос АЦП в нулевом периоде ШИМ сигнала
Вам же писали
Demiurg писал(а):
Запускать АЦП между импульсами ШИМ
neid писал(а):
тогда другой вопрос зачем его вообще выключать?
так делается во многих промышленных зарядниках, что дает более оптимальное измерение напряжения на акб. А вообще, судя по вашему графику, минимум измерения можно было давно взять еще с самого первого сообщения этой темы.
это не настройки ты привел, а комментарии. а из комментариев не понятно, какой режим задан таймеру. что записывается в 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 то меряем напругу
вопрос к вашему совету, зачем в это время выключать шим? и каким образом? таким?
как ты можешь сравнивать OCR1B, если у тебя там записан НОЛЬ, и это значение нигде не изменяется? и что такое PWR, тоже не понятно. OCR1A тоже нигде не изменяется и OCR1A задает частоту ШИМ. изменяется только сам счетчик таймера TCNT1. а вот где задается длительность импульса, чтобы получить 40% периода, я что-то нигде не увидел.
поскольку у тебя инверсный выход ШИМ, то сначала идет НОЛЬ (импульса нет). поэтому мне видится, что нужно еще добавить прерывание по переполнению. и в этом прерывании, пока импульса нет, запустить замер АЦП.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
видимо одна из них переменная будет, а расчет с плавающей запятой и в прерывании - это жестко.
А на счет иголок в ШИМ, там 5 режимов ШИМ, не ужели на всех иголки идут? Может у вас мосфет не успевает закрываться? Некоторые экстрималы умудряются dc-dc преобразователи строить на этих мегах.
пардон, я прозевал этот момент, где изменяется OCR1B. то есть, OCR1B задает длительность импульса. и опять не дана информация, где объявляется IGLA и чему она равна.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения