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

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

COKPOWEHEU писал(а):В смысле "где"?
slav0n писал(а):а где же аппаратный ШИМ? где разгрузка ядра?..
ohmycode!
primuss3.com
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

COKPOWEHEU, конечно протеус далек от оригинала, и у меня нет двухлучевого осциллографа, что бы проверить на реальном чипе.
Но судя по протеусу, мега168, у вас дело обстоит так:
в прерывание он попадает либо при начале 1, либо при начале 0, далее запускается преобразование АЦП.
Следовательно ваш алгоритм ни чем не отличается от моего предложенного ранее.

slav0n, при режиме АЦП Free Running, насколько я понимаю, преобразование идет постоянно.
Теперь вопрос: у мк действительно 16 битный регистр ADCW есть? Или это два 8 битных регистра? и что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

не вникал, но такой макрос есть в хедере iom8.h

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

/* ADC */
#define ADCW	_SFR_IO16(0x04)
#ifndef __ASSEMBLER__
#define ADC	_SFR_IO16(0x04)
#endif
#define ADCL	_SFR_IO8(0x04)
#define ADCH	_SFR_IO8(0x05)
ohmycode!
primuss3.com
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 19097
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Dimon456 писал(а):Теперь вопрос: у мк действительно 16 битный регистр ADCW есть? Или это два 8 битных регистра? и что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
там 2 8-битных регистра (видно в даташите) - старший и младший.
сколько тратится на запись, хрен знает, но прерывание возникнет, когда будет готов результат.
чтение - 2 такта. младшего регистра и старшего.
конфликта не возникнет. результат обновится только после окончания преобразования (я так думаю).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4082926#p4082926"]в прерывание он попадает либо при начале 1, либо при начале 0[/uquote]
Не в начале, а в конце, константа ADC_TIME_TIMER как раз отвечает за то, на сколько тактов старт АЦП возникнет раньше импульса ШИМ.
slav0n, повторяю: аппаратный ШИМ на канале А. С первого раза непонятно было?
Следовательно ваш алгоритм ни чем не отличается от моего предложенного ранее.
Поправьте ссылку, а то сейчас она ведет на заготовку кода с cvavr'ным мусором.
что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
Очередное преобразование начинается после чтения ADCH. То есть если нам нужна вся 10-битная точность, читаем сначала ADCL, потом ADCH (в Си можно читать сразу 16-битный ADC, он сам разберется). Если достаточно 8-битной, читаем только ADCH.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

COKPOWEHEU писал(а):Не в начале, а в конце, константа ADC_TIME_TIMER как раз отвечает за то, на сколько тактов старт АЦП возникнет раньше импульса ШИМ.
Это на каком мк?
За что отвечает следующая команда?

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

#define ADCSRA_START (1<<ADEN | 1<<ADSC | 1<<ADFR | 0b110 << ADPS0) //F_CPU/64
ADCSRA = ADCSRA_START;
И ссылка правильно ведет, единственный генератор начального кода, только код малость неправильный.
COKPOWEHEU писал(а):Очередное преобразование начинается после чтения ADCH
Это на каком мк?
Последний раз редактировалось Dimon456 Вс авг 29, 2021 21:01:25, всего редактировалось 1 раз.
Реклама
Самсусамыч

Сообщение Самсусамыч »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4083148#p4083148"]Очередное преобразование начинается после чтения ADCH. То есть если нам нужна вся 10-битная точность, читаем сначала ADCL, потом ADCH (в Си можно читать сразу 16-битный ADC, он сам разберется). Если достаточно 8-битной, читаем только ADCH.[/uquote]
Вы ошибаетесь. Запуск преобразования не связан с чтением/не чтением значений регистров данных АЦП. Если АЦП настроен в режиме непрерывного преобразования, то новое цикл преобразования начинается сразу же после записи результата в регистры данных АЦП. Точнее новый запуск произойдёт не ранее чем через один такт после окончания текущего преобразования. Что касается чтения регистров данных АЦП, тут Вы правы. Действительно регистры данных АЦП необходимо читать в определённой последовательности – вначале младший (ADCL), затем старший (ADCН). Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор, пока не будет прочитан регистр ADCH. Благодаря этому можно быть уверенным, что при чтении регистров в них будут находиться составляющие одного и того же результата. Соответственно, если очередное преобразование завершится до обращения к регистру ADCH, результат преобразования будет потерян. Таким образом запуск очередного преобразования не связано с чтением регистров данных АЦП.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4083198#p4083198"]Это на каком мк?
За что отвечает следующая команда?[/uquote]
На каком МК работает вычитание? Да на любом.
Следующая команда (запись в ADCSRA бита ADCS и прочих) отвечает за запуск очередного преобразования.
И ссылка правильно ведет, единственный генератор начального кода, только код малость неправильный.
Но вы-то писали про алгоритм измерения, а не про нечитаемые продукты cvavr'а.
Вы ошибаетесь. Запуск преобразования не связан с чтением/не чтением значений регистров данных АЦП.
Да. Сейчас перечитал:
When ADCL is read, the ADC Data Register is not updated until ADCH is read
То есть при чтении ADCL регистровая пара блокируется до момента чтения ADCH.
Кстати, у некоторых контроллеров можно настроить запуск АЦП по сравнению таймера аппаратно (ADTS=0b101). Так что если решать исходную задачу (только напряжение по паузам) можно сделать без прерываний таймеров.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ааааа, будете изобретать, вот код
Спойлер

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

// ADC Clock frequency: 125,000 kHz 
//ADC Auto Trigger Source: Free Running
ISR(ADC_vect) 
{
static uint8_t count = 1;
	
    if(count==3){
		adc_data[0] = ADCW;
		ADMUX = (0<<REFS1)|(1<<REFS0)| (0<<MUX0);//set ch 0 
        PWM_pin_clr();//сброс выхода
		}
    if(count==9) {
		adc_data[1] = ADCW;
		ADMUX = (0<<REFS1)|(1<<REFS0)| (1<<MUX0);//set ch 1 
        PWM_pin_set();//установка выхода
      }
	
	if(count++>9) count=1;

}
Примерно 1 кГц 40%
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

с последовательностью чтения регистров результата там все должно быть ОК.
внимательно смотрим сишные макросы:
#define ADCW _SFR_IO16(0x04)
#define ADCH _SFR_IO8(0x05)
да и код мой уже замусолили и так и эдак...
но для реального использования в нем все-таки кой чего не хватает... чего?
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

slav0n писал(а):но для реального использования в нем все-таки кой чего не хватает... чего?
Теста в реальном устройстве.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

но прежде:

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

u32 V_sum, A_sum;
u16 period, pulsewidth;
u8 A_round, V_round;

ISR(TIMER1_OVF_vect)
{
    if(ADMUX & (1<<MUX0)){
        A_sum += ADCW;//get ch 1
        ADMUX = (1<<REFS1)|(1<<REFS0)| (0<<MUX0);//set ch 0 
        PWMpin_clr();//сброс выхода
        ICR1 = period - pulsewidth;
        A_round++;
    }else{
        V_sum += ADCW;//get ch 0
        ADMUX = (1<<REFS1)|(1<<REFS0)| (1<<MUX0);//set ch 1
        PWMpin_set();//установка выхода
        ICR1 = pulsewidth;
        V_round++;
    }
}
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

slav0n писал(а):но прежде:
ну чего ты докопался до этого таймера?
Выше, двумя тремя сообщениями, я тебе дал код,
ISR(ADC_vect) срабатывает когда преобразование завершено, именно там где тебе надо, до следующей записи в ADCW регистр у тебе примерно 100 +- мкс. Идеальная синхронизация. Лучше не сделаешь.
Лучше бы код помог оптимизировать.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

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

Сообщение Dimon456 »

slav0n писал(а):я показал не синхронизацию
За чем? Если есть возможность синхронизировать, за чем отказываться.
slav0n писал(а):а способ фильтрации помех средним арифметическим.

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

A_sum += ADCW;
A_round++;
а где дальше? Может не полностью код написал?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

Dimon456 писал(а):а где дальше?
ну же, прояви фантазию, ты же можешь.
тут даже твоя любимая СС легко внедряется
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Мне не когда сейчас проявлять фантазию, я на уборке, примерно займет месяца 2.
Так что сам проявляй фантазию.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

а у меня наоборот времени хоть отбавляй, перелом голени
ohmycode!
primuss3.com
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1405
Зарегистрирован: Чт фев 19, 2015 12:41:04

Сообщение astrahard »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3989861#p3989861"]Запускать АЦП между импульсами ШИМ?[/uquote]
Цифровая фильтрация область малоизученная и, стандартный фильтр зачастую малопригоден. Например, если известно заранее когда будет помеха, логичнее всего не пускать ее в фильтр даже очень высокого порядка а, элементарно бланкировать. Такой способ наиболее выигрышный и, самоочевиден. Избавиться от такой сильной помехи медианой 3 порядка ха-ха-ха.
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="slav0n",url="/forum/viewtopic.php?p=4082548#p4082548"]да... а на самом деле вона как:
http://primuss3.com/forum/index.php?top ... 0#msg15490[/uquote]
Ну где вы вдели такое что приложили, у вас там по всей видимости конденсатор работает на разряд в вашей осциллограмме, поэтому и спад идет. Вот осциллограмма снятая с куска провода ЗУ заряд идет частотой 1кГц, заполнение 40% , режим самописец в ослике. Все правильно сказал kote52, именно так и происходить.
Изображение
Ответить

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