реклама на сайте
подробности

 
 
> Проблема при измерении периода синусоиды, ATmega8
straighter
сообщение Mar 4 2016, 23:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555



Уважаемые форумчане, помогите разобраться... ATmega8 работает с кварцем 8 Мгц. На вход встроенного компаратора подаю синусоиду 4 кГц от стабильного генератора. По положительному перепаду на выходе компаратора происходит захват значения в Timer/Counter1. Возникает прерывание, вычисляется разность между последним захваченным значением и предыдущим захваченным значением. По идее, эта разность должна быть равна 2000, т.к. 8МГц/4кГц=2000.
Но на самом деле получается 1000. Почему?

Это значение (1000) я могу наблюдать в виде последовательного кода на выходе PORTC.1 с помощью осциллографа.

Фрагмент программы, прерывание по захвату Таймера1:

i
Код
nterrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
b=ICR1;
if (b>a) {
e=b-a;
};
a=b;
for(i=0; i < 16; i++)
{      
if(0x0001 & (e>>(15-i)))
        PORTC.1=1;                      //если бит-единица, то и выставляем единицу
        else PORTC.1=0;       //иначе - выставляем ноль        
     }
PORTC.1=0;
}


Сообщение отредактировал IgorKossak - Mar 5 2016, 10:40
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zombi
сообщение Mar 5 2016, 12:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



А если в прерывании просто инвертировать PORTC.1 какая частота на нём будет?
Go to the top of the page
 
+Quote Post
straighter
сообщение Mar 5 2016, 13:12
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555



Цитата(zombi @ Mar 5 2016, 14:24) *
А если в прерывании просто инвертировать PORTC.1 какая частота на нём будет?


Это я тоже пробовал раньше. Тогда частота синусоиды была 25 кГц (период 40 мкс). А частота сигнала на выходе порта, который я инвертировал, была в два раза ниже, как и должно быть:

Прикрепленное изображение


А вот осциллограмма моего последнего эксперимента, о котором я писал в первом посте. Частота синусоиды 4 кГц. На осциллограмме показаны кодовая последовательность на выходе PORTC.1 и вспомогательные импульсы для облегчения разделения битов в кодовой последовательности. Если перевести кодовые пакеты в десятичную систему, то получается 1000 и 999:

Прикрепленное изображение


Вот в растянутом виде:

Прикрепленное изображение


Сообщение отредактировал straighter - Mar 5 2016, 13:19
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 5 2016, 14:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(straighter @ Mar 5 2016, 17:12) *
На осциллограмме показаны кодовая последовательность на выходе PORTC.1 и вспомогательные импульсы для облегчения разделения битов в кодовой последовательности.

А почему интервалы между "вспомогательные импульсы" разные?
Go to the top of the page
 
+Quote Post
straighter
сообщение Mar 5 2016, 18:14
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 29-06-12
Пользователь №: 72 555



Цитата(zombi @ Mar 5 2016, 16:52) *
А почему интервалы между "вспомогательные импульсы" разные?


Эти вспомогательные импульсы формируются тоже в цикле "for(i=0; i < 16; i++)", просто в моем первом посте я для упрощения кода их не показал. А интервалы между ними разные потому что эти интервалы зависят от количества сдвигаемых разрядов в данный момент цикла, т.е. от 15 до 0.

Цитата(controller_m30 @ Mar 5 2016, 16:52) *
Приведите ещё настройки всех регистров компаратора и Таймера_1.


Настройки регистров были произведены с помощью CodeVizardAVR:

CODE

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x20;

// Analog Comparator initialization
// Analog Comparator: On
// Analog Comparator Input Capture by Timer/Counter 1: On
ACSR=0x04;
SFIOR=0x00;


Цитата(controller_m30 @ Mar 5 2016, 16:52) *
А ещё, если так можно, пусть программа прерывания TC1, выводит каждый раз не вычисленную разность, а просто текущее значение ICR1, которое там зафиксировалось. Желательно, чтоб на скрине поместилось два подряд идущих числа - чтоб можно было самим оценивать и их разность, и при этом видеть абсолютное значение каждого числа. Может это что-то подскажет...


Можно будет так попробовать. Но только уже после выходных...

Сообщение отредактировал straighter - Mar 5 2016, 18:15
Go to the top of the page
 
+Quote Post
pilot1440
сообщение Mar 13 2017, 12:45
Сообщение #6





Группа: Новичок
Сообщений: 1
Регистрация: 29-04-15
Пользователь №: 86 450



ACSR=0x04;
а какое условие прерывания у компаратора? По любому изменению на входе?

Сообщение отредактировал IgorKossak - Mar 13 2017, 20:52
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- straighter   Проблема при измерении периода синусоиды   Mar 4 2016, 23:31
- - akl   Возможно, есть дребезг в моменты перехода полуволн...   Mar 5 2016, 02:59
- - zombi   Или clkcpu не 8MHz или на счетчик поступает не clk...   Mar 5 2016, 14:41
- - controller_m30   Приведите ещё настройки всех регистров компаратора...   Mar 5 2016, 14:52
- - zombi   Судя по осциллограммам на формирование одного бита...   Mar 5 2016, 19:37
- - straighter   Цитата(zombi @ Mar 5 2016, 21:37) Судя по...   Mar 5 2016, 20:39
- - zombi   Цитата(straighter @ Mar 5 2016, 23:39) Вр...   Mar 5 2016, 21:11
- - controller_m30   Цитата(straighter @ Mar 5 2016, 23:39) По...   Mar 5 2016, 21:53
|- - straighter   Цитата(controller_m30 @ Mar 5 2016, 23:53...   Mar 6 2016, 08:28
|- - zombi   Цитата(straighter @ Mar 6 2016, 00:39) Я ...   Mar 6 2016, 11:52
|- - straighter   Попробую так написать, поставить строб после бита.   Mar 6 2016, 15:02
|- - zombi   Цитата(straighter @ Mar 6 2016, 18:02) ст...   Mar 6 2016, 15:20
|- - straighter   Да, вроде бы понял. Попробую так и написать.   Mar 6 2016, 15:24
- - zombi   Цитата(controller_m30 @ Mar 6 2016, 00:53...   Mar 6 2016, 04:45


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 00:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016