Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 30.10.2007, 19:57  
pirotehnick
Прохожий
 
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pirotehnick на пути к лучшему
По умолчанию простой частотометр на Atmega8

Вот решил попробовать сделать простой частотомер на Atmega8, для измерения частоты генератора прямоугольных импульсов. Принцип работы следующий… Допустим есть внешний сигнал с определенной частотой и скважностью, частота которого должна в несколько десятков раз быть меньшей чем скорость чтения (для точности) регистрирующего приёмника, т.е. нашего МК. Количество непрерывных зарегистрированных точек высокого (или низкого) уровня и будет зависеть от частоты и скважности (предполагаем что скважность 50%) внешнего сигнала (при постоянной скорости чтения приёмника). Но вот тут у меня возникла некоторая проблема. Максимальная скорость чтения значений порта МК (т.е. регистров PINX) составляет примерно 120кГц (установил экспериментально), а я хочу измерять входной сигнал с точность 1000 точек на пик и с частотой измерения где-то 1000 измерений в секунду, короче говоря мне нужно добиться максимальной скорости опроса состояния линий порта МК.

Как мне это сделать???

Вот примерный код программы (для WinAVR). Прогу ещё не тестировал.

int main (void)
{
unsigned short k=0;//Счётчик
unsigned char status=0;
//2 порта для вывода 10-разрядного результата, т.к. регистрируется до 1000 точек на пик.
DDRD = 0b11111111;//8 младших бит
DDRC = 0b00000011;//2 старших бита
PORTC =0b01000000;//линия для входа измеряемого сигнала
while(1)
{
if (!(PINС&(1‹‹6)))//если на 7 линии "0" значит сигнал высокого уровня
{k++;status =1;goto next_step;}
else if (status) {PORTD=k&255;PORTC=(k››&3;k=0;status=0;}//пик высокого уровня прошёл, записываем число точек попавших на пик
next_step:
}
}


Вообще по хорошему здесь ещё надо учитывать и скважность сигнала, однако с этим я пока заморачиваться не стал, я сам настраиваю свой генератор на скважность 50%.
Реклама:
pirotehnick вне форума  
Непрочитано 30.10.2007, 20:11  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Может лучше использовать внешнее прерывание и таймеры счетчики?
dimonbest вне форума  
Непрочитано 30.10.2007, 20:25  
high_volteg
Прохожий
 
Регистрация: 07.08.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
high_volteg на пути к лучшему
По умолчанию

действительно, лучше использовать внешние прерывания, потому как с увеличением кода вашей программы будет уменьшаться ваше экспериментальное число.
high_volteg вне форума  
Непрочитано 30.10.2007, 22:17  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Частотомеры делаются не так. Тут нужно использовать счетчик, желательно асинхронный, который считает импульсы со входа, а по таймеру генерить прерывания со стабильным интервалом, и считывать каждый раз значение счетчика, после чего обнулять его. А далее все сначала.
Drex вне форума  
Непрочитано 30.10.2007, 23:44  
pirotehnick
Прохожий
 
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pirotehnick на пути к лучшему
По умолчанию

‹‹Может лучше использовать внешнее прерывание и таймеры счетчики?››

Наверное лучше, только вот пока с прерываниями я не работал. Можно привести какой-нибудь пример использования прерывания по изменению состояния линии какого-нибудь порта?
Да, действительно это будет наверное быстрее, по изменению состояния линии порта мы сможем считывать счётный регистр таймера, а таймер может работать на гораздо большей частоте, в зависимости от кварца и значении делителя.


‹‹действительно, лучше использовать внешние прерывания, потому как с увеличением кода вашей программы будет уменьшаться ваше экспериментальное число.››


Чего-то не совсем понял, в смысле… объёма кода?
"Экспериментальное число" - частота опроса линий что-ли?
Тогда понятно, только вот не понял почему у меня при различных номиналах кварца (8 и 11,0592Мгц), частота опроса линий не изменялась?


‹‹Частотомеры делаются не так. Тут нужно использовать счетчик, желательно асинхронный, который считает импульсы со входа, а по таймеру генерить прерывания со стабильным интервалом, и считывать каждый раз значение счетчика, после чего обнулять его. А далее все сначала.››

Честно говоря, я вообще не знаю как делают частотомеры, просто этот способ первый пришёл в голову.
Конечно можно и так, но я нуждаюсь в высоком быстродействии и высокой точности и при данной частоте (1кГц) этот способ не подходит. Допустим я хочу производить измерения с точностью в 1Гц. Это значит, что мне придётся ждать целую секунду, пока счётчик зарегистрирует 1000 импульсов. Вообще данный способ измерения хорош только для высоких частот, где в основном не требуется такая точность. Кроме того частота моего генератора будет резко изменяться и довольно часто, вплоть до 1 мс, поэтому мне необходимо регистрировать изменение частоты как можно быстрее и как можно точнее.
Я просто предлагаю измерять ширину пиков, или расстояние между двумя соседними пиками. И чем выше частота регистрирующего приёмника, т.е. счётчика тем выше точность измерений.



Был бы очень признателен, если кто-нибудь привёл код программы с прерыванием по изменению состояния уровня на линии какого-нибудь порта.
pirotehnick вне форума  
Непрочитано 30.10.2007, 23:52  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Советую попробывать писать на CodeVisionAVR, там есть генератор начального кода, в котором очень легко настроить прерывания.
dimonbest вне форума  
Непрочитано 31.10.2007, 00:31  
pirotehnick
Прохожий
 
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pirotehnick на пути к лучшему
По умолчанию

‹‹Советую попробывать писать на CodeVisionAVR, там есть генератор начального кода, в котором очень легко настроить прерывания.››

К сожалению у меня пока нет CodeVisionAVR, потом как-нибудь скачаю, да и время нужно чтобы разобраться с ним, а можно привести какой-нибудь готовый пример? Попробую перевести его в WinAVR.
pirotehnick вне форума  
Непрочитано 31.10.2007, 08:19  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Сообщение от pirotehnick
Конечно можно и так, но я нуждаюсь в высоком быстродействии и высокой точности и при данной частоте (1кГц) этот способ не подходит. Допустим я хочу производить измерения с точностью в 1Гц. Это значит, что мне придётся ждать целую секунду, пока счётчик зарегистрирует 1000 импульсов. Вообще данный способ измерения хорош только для высоких частот, где в основном не требуется такая точность. Кроме того частота моего генератора будет резко изменяться и довольно часто, вплоть до 1 мс, поэтому мне необходимо регистрировать изменение частоты как можно быстрее и как можно точнее.
Не совсем так. Секунду ждать надо, но не надо ждать пока счетчик зарегистрирует 1000 импульсов. За секунду счетчик зарегистрирует ровно столько, сколько на него приходит. Просто период 1 секунда удобен тем, что в регистре будет чистое значение частоты входного сигнала, которое не надо больше ни на что умножать или делить. Точность измерения в данном случае будет 1Гц. При частоте 1 кГц - вполне логичный метод измерения. Другое дело период обновления показаний прибора. Он действительно будет равен 1 сек. Если хотите быстрее, можно допустим считать импульсы не секунду, а 0,1 сек. Обновляться показания будут примерно 10 раз в секунду, но полученное число импульсов будет в 10 раз меньше частоты сигнала, и следовательно его надо умножать на 10. А это просто приписать один 0 справа. Точность падает в 10 раз. Тут нужно выбирать компромисс. При частотах 100 кГц и выше 10 Гц не является большой погрешностью, там такие параметры вполне приемлемы.
В случае измерения периода межу соседними импульсами дело еще хуже. Такой метод подходит только для измерения очень низких частот. Период обновления тут будет нестабильным, а равным частоте входного сигнала. При высокой частоте, вам каждое измерение нужно будет проводить операцию деления 1 на 16 и более битное число (чтобы период перевести в частоту). При частоте входного сигнала, контроллеру это будет сделать весьма затруднительно. Еще плюс ко всему не забывайте о таких задачах процессора как вывод результатов на какой-то индикатор, и опрос кнопок, и это только по минимуму. Так что ваш метод не годится, вы уж извините.
Drex вне форума  
Непрочитано 31.10.2007, 18:03  
chapa
Вид на жительство
 
Аватар для chapa
 
Регистрация: 13.05.2005
Сообщений: 386
Сказал спасибо: 9
Сказали Спасибо 44 раз(а) в 37 сообщении(ях)
chapa на пути к лучшему
По умолчанию

Вообще-то частотомеры, (счетчики времени активной фазы, пассивной фазы сигнала) делают чаще на PIC-ах, чем на AVR-ах. По уже отлаженому алгоритму (дольше описывать, проще найти в интернете проект и там посмотреть алгоритм). У АВРа все входы тупо стробируются тактовой частотой, поэтому частотомер только до пол-тактовой будет нормально работать. В то время как у ПИКа предделитель таймера работает в асинхронном режиме, и только его выход, идущий на таймер, стробируется тактовой частотой. до 50 (80) МГц можно измерять сразу ПИКом. хотите выше - ставите внешний 193счетчик. Таже ситуащия и с интервалами времени.
chapa вне форума  
Непрочитано 31.10.2007, 18:57  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Chapa
Абсолютно согласен
Drex вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой ШИМ! vasiavetrov10 Производственное оборудование 1 28.04.2009 23:59
Простой детектор радиоволн AlenLegion Автоматика и аппаратура связи 4 30.01.2008 17:45
Частотометр на AVR (Tiny) с авто-диапазоном Gobsek Микроконтроллеры, АЦП, память и т.д 0 30.11.2007 19:25
[Решено] Простой опыт с батарейками noname Incognito Отвлекитесь, эмбеддеры! 10 02.04.2006 20:58
Простой вопрос по транзистору Wowka Информация по радиокомпонентам 7 06.10.2004 22:13


Часовой пояс GMT +4, время: 05:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot