Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.10.2007, 19:57
|
|
Прохожий
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
простой частотометр на 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%.
|
|
|
|
30.10.2007, 20:11
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Может лучше использовать внешнее прерывание и таймеры счетчики?
|
|
|
|
30.10.2007, 20:25
|
|
Прохожий
Регистрация: 07.08.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
действительно, лучше использовать внешние прерывания, потому как с увеличением кода вашей программы будет уменьшаться ваше экспериментальное число.
|
|
|
|
30.10.2007, 22:17
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Частотомеры делаются не так. Тут нужно использовать счетчик, желательно асинхронный, который считает импульсы со входа, а по таймеру генерить прерывания со стабильным интервалом, и считывать каждый раз значение счетчика, после чего обнулять его. А далее все сначала.
|
|
|
|
30.10.2007, 23:44
|
|
Прохожий
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
‹‹Может лучше использовать внешнее прерывание и таймеры счетчики?››
Наверное лучше, только вот пока с прерываниями я не работал. Можно привести какой-нибудь пример использования прерывания по изменению состояния линии какого-нибудь порта?
Да, действительно это будет наверное быстрее, по изменению состояния линии порта мы сможем считывать счётный регистр таймера, а таймер может работать на гораздо большей частоте, в зависимости от кварца и значении делителя.
‹‹действительно, лучше использовать внешние прерывания, потому как с увеличением кода вашей программы будет уменьшаться ваше экспериментальное число.››
Чего-то не совсем понял, в смысле… объёма кода?
"Экспериментальное число" - частота опроса линий что-ли?
Тогда понятно, только вот не понял почему у меня при различных номиналах кварца (8 и 11,0592Мгц), частота опроса линий не изменялась?
‹‹Частотомеры делаются не так. Тут нужно использовать счетчик, желательно асинхронный, который считает импульсы со входа, а по таймеру генерить прерывания со стабильным интервалом, и считывать каждый раз значение счетчика, после чего обнулять его. А далее все сначала.››
Честно говоря, я вообще не знаю как делают частотомеры, просто этот способ первый пришёл в голову.
Конечно можно и так, но я нуждаюсь в высоком быстродействии и высокой точности и при данной частоте (1кГц) этот способ не подходит. Допустим я хочу производить измерения с точностью в 1Гц. Это значит, что мне придётся ждать целую секунду, пока счётчик зарегистрирует 1000 импульсов. Вообще данный способ измерения хорош только для высоких частот, где в основном не требуется такая точность. Кроме того частота моего генератора будет резко изменяться и довольно часто, вплоть до 1 мс, поэтому мне необходимо регистрировать изменение частоты как можно быстрее и как можно точнее.
Я просто предлагаю измерять ширину пиков, или расстояние между двумя соседними пиками. И чем выше частота регистрирующего приёмника, т.е. счётчика тем выше точность измерений.
Был бы очень признателен, если кто-нибудь привёл код программы с прерыванием по изменению состояния уровня на линии какого-нибудь порта.
|
|
|
|
30.10.2007, 23:52
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Советую попробывать писать на CodeVisionAVR, там есть генератор начального кода, в котором очень легко настроить прерывания.
|
|
|
|
31.10.2007, 00:31
|
|
Прохожий
Регистрация: 29.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
‹‹Советую попробывать писать на CodeVisionAVR, там есть генератор начального кода, в котором очень легко настроить прерывания.››
К сожалению у меня пока нет CodeVisionAVR, потом как-нибудь скачаю, да и время нужно чтобы разобраться с ним, а можно привести какой-нибудь готовый пример? Попробую перевести его в WinAVR.
|
|
|
|
31.10.2007, 08:19
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от pirotehnick
|
Конечно можно и так, но я нуждаюсь в высоком быстродействии и высокой точности и при данной частоте (1кГц) этот способ не подходит. Допустим я хочу производить измерения с точностью в 1Гц. Это значит, что мне придётся ждать целую секунду, пока счётчик зарегистрирует 1000 импульсов. Вообще данный способ измерения хорош только для высоких частот, где в основном не требуется такая точность. Кроме того частота моего генератора будет резко изменяться и довольно часто, вплоть до 1 мс, поэтому мне необходимо регистрировать изменение частоты как можно быстрее и как можно точнее.
|
Не совсем так. Секунду ждать надо, но не надо ждать пока счетчик зарегистрирует 1000 импульсов. За секунду счетчик зарегистрирует ровно столько, сколько на него приходит. Просто период 1 секунда удобен тем, что в регистре будет чистое значение частоты входного сигнала, которое не надо больше ни на что умножать или делить. Точность измерения в данном случае будет 1Гц. При частоте 1 кГц - вполне логичный метод измерения. Другое дело период обновления показаний прибора. Он действительно будет равен 1 сек. Если хотите быстрее, можно допустим считать импульсы не секунду, а 0,1 сек. Обновляться показания будут примерно 10 раз в секунду, но полученное число импульсов будет в 10 раз меньше частоты сигнала, и следовательно его надо умножать на 10. А это просто приписать один 0 справа. Точность падает в 10 раз. Тут нужно выбирать компромисс. При частотах 100 кГц и выше 10 Гц не является большой погрешностью, там такие параметры вполне приемлемы.
В случае измерения периода межу соседними импульсами дело еще хуже. Такой метод подходит только для измерения очень низких частот. Период обновления тут будет нестабильным, а равным частоте входного сигнала. При высокой частоте, вам каждое измерение нужно будет проводить операцию деления 1 на 16 и более битное число (чтобы период перевести в частоту). При частоте входного сигнала, контроллеру это будет сделать весьма затруднительно. Еще плюс ко всему не забывайте о таких задачах процессора как вывод результатов на какой-то индикатор, и опрос кнопок, и это только по минимуму. Так что ваш метод не годится, вы уж извините.
|
|
|
|
31.10.2007, 18:03
|
|
Вид на жительство
Регистрация: 13.05.2005
Сообщений: 386
Сказал спасибо: 9
Сказали Спасибо 44 раз(а) в 37 сообщении(ях)
|
Вообще-то частотомеры, (счетчики времени активной фазы, пассивной фазы сигнала) делают чаще на PIC-ах, чем на AVR-ах. По уже отлаженому алгоритму (дольше описывать, проще найти в интернете проект и там посмотреть алгоритм). У АВРа все входы тупо стробируются тактовой частотой, поэтому частотомер только до пол-тактовой будет нормально работать. В то время как у ПИКа предделитель таймера работает в асинхронном режиме, и только его выход, идущий на таймер, стробируется тактовой частотой. до 50 (80) МГц можно измерять сразу ПИКом. хотите выше - ставите внешний 193счетчик. Таже ситуащия и с интервалами времени.
|
|
|
|
31.10.2007, 18:57
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 336
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Chapa
Абсолютно согласен
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:53.
|
|