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

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

Вс авг 29, 2021 09:49:16

COKPOWEHEU писал(а):В смысле "где"?
slav0n писал(а):а где же аппаратный ШИМ? где разгрузка ядра?..

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

Вс авг 29, 2021 09:57:48

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

slav0n, при режиме АЦП Free Running, насколько я понимаю, преобразование идет постоянно.
Теперь вопрос: у мк действительно 16 битный регистр ADCW есть? Или это два 8 битных регистра? и что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?

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

Вс авг 29, 2021 10:10:20

не вникал, но такой макрос есть в хедере 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)

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

Вс авг 29, 2021 12:29:13

Dimon456 писал(а):Теперь вопрос: у мк действительно 16 битный регистр ADCW есть? Или это два 8 битных регистра? и что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
там 2 8-битных регистра (видно в даташите) - старший и младший.
сколько тратится на запись, хрен знает, но прерывание возникнет, когда будет готов результат.
чтение - 2 такта. младшего регистра и старшего.
конфликта не возникнет. результат обновится только после окончания преобразования (я так думаю).

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

Вс авг 29, 2021 16:43:44

в прерывание он попадает либо при начале 1, либо при начале 0

Не в начале, а в конце, константа ADC_TIME_TIMER как раз отвечает за то, на сколько тактов старт АЦП возникнет раньше импульса ШИМ.
slav0n, повторяю: аппаратный ШИМ на канале А. С первого раза непонятно было?
Следовательно ваш алгоритм ни чем не отличается от моего предложенного ранее.
Поправьте ссылку, а то сейчас она ведет на заготовку кода с cvavr'ным мусором.
что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
Очередное преобразование начинается после чтения ADCH. То есть если нам нужна вся 10-битная точность, читаем сначала ADCL, потом ADCH (в Си можно читать сразу 16-битный ADC, он сам разберется). Если достаточно 8-битной, читаем только ADCH.

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

Вс авг 29, 2021 18:24:02

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 раз.

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

Вс авг 29, 2021 19:41:28

Очередное преобразование начинается после чтения ADCH. То есть если нам нужна вся 10-битная точность, читаем сначала ADCL, потом ADCH (в Си можно читать сразу 16-битный ADC, он сам разберется). Если достаточно 8-битной, читаем только ADCH.

Вы ошибаетесь. Запуск преобразования не связан с чтением/не чтением значений регистров данных АЦП. Если АЦП настроен в режиме непрерывного преобразования, то новое цикл преобразования начинается сразу же после записи результата в регистры данных АЦП. Точнее новый запуск произойдёт не ранее чем через один такт после окончания текущего преобразования. Что касается чтения регистров данных АЦП, тут Вы правы. Действительно регистры данных АЦП необходимо читать в определённой последовательности – вначале младший (ADCL), затем старший (ADCН). Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор, пока не будет прочитан регистр ADCH. Благодаря этому можно быть уверенным, что при чтении регистров в них будут находиться составляющие одного и того же результата. Соответственно, если очередное преобразование завершится до обращения к регистру ADCH, результат преобразования будет потерян. Таким образом запуск очередного преобразования не связано с чтением регистров данных АЦП.

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

Вс авг 29, 2021 19:54:02

Это на каком мк?
За что отвечает следующая команда?

На каком МК работает вычитание? Да на любом.
Следующая команда (запись в ADCSRA бита ADCS и прочих) отвечает за запуск очередного преобразования.
И ссылка правильно ведет, единственный генератор начального кода, только код малость неправильный.
Но вы-то писали про алгоритм измерения, а не про нечитаемые продукты cvavr'а.
Вы ошибаетесь. Запуск преобразования не связан с чтением/не чтением значений регистров данных АЦП.
Да. Сейчас перечитал:
When ADCL is read, the ADC Data Register is not updated until ADCH is read
То есть при чтении ADCL регистровая пара блокируется до момента чтения ADCH.
Кстати, у некоторых контроллеров можно настроить запуск АЦП по сравнению таймера аппаратно (ADTS=0b101). Так что если решать исходную задачу (только напряжение по паузам) можно сделать без прерываний таймеров.

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

Вс авг 29, 2021 22:22:34

Ааааа, будете изобретать, вот код
Спойлер
Код:
// 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%

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

Пн авг 30, 2021 06:48:40

с последовательностью чтения регистров результата там все должно быть ОК.
внимательно смотрим сишные макросы:
#define ADCW _SFR_IO16(0x04)
#define ADCH _SFR_IO8(0x05)

да и код мой уже замусолили и так и эдак...
но для реального использования в нем все-таки кой чего не хватает... чего?

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

Пн авг 30, 2021 20:25:38

slav0n писал(а):но для реального использования в нем все-таки кой чего не хватает... чего?
Теста в реальном устройстве.

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

Вт авг 31, 2021 08:20:10

но прежде:
Код:
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++;
    }
}

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

Вт авг 31, 2021 09:38:36

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

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

Вт авг 31, 2021 09:47:03

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

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

Вт авг 31, 2021 09:56:49

slav0n писал(а):я показал не синхронизацию
За чем? Если есть возможность синхронизировать, за чем отказываться.
slav0n писал(а):а способ фильтрации помех средним арифметическим.
Код:
A_sum += ADCW;
A_round++;
а где дальше? Может не полностью код написал?

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

Вт авг 31, 2021 10:02:37

Dimon456 писал(а):а где дальше?
ну же, прояви фантазию, ты же можешь.
тут даже твоя любимая СС легко внедряется

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

Вт авг 31, 2021 10:10:38

Мне не когда сейчас проявлять фантазию, я на уборке, примерно займет месяца 2.
Так что сам проявляй фантазию.

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

Вт авг 31, 2021 10:12:17

а у меня наоборот времени хоть отбавляй, перелом голени

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

Вт сен 07, 2021 19:31:45

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

Цифровая фильтрация область малоизученная и, стандартный фильтр зачастую малопригоден. Например, если известно заранее когда будет помеха, логичнее всего не пускать ее в фильтр даже очень высокого порядка а, элементарно бланкировать. Такой способ наиболее выигрышный и, самоочевиден. Избавиться от такой сильной помехи медианой 3 порядка ха-ха-ха.

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

Чт ноя 11, 2021 13:38:38

да... а на самом деле вона как:
http://primuss3.com/forum/index.php?top ... 0#msg15490

Ну где вы вдели такое что приложили, у вас там по всей видимости конденсатор работает на разряд в вашей осциллограмме, поэтому и спад идет. Вот осциллограмма снятая с куска провода ЗУ заряд идет частотой 1кГц, заполнение 40% , режим самописец в ослике. Все правильно сказал kote52, именно так и происходить.
Изображение
Ответить