Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Как померять низкочастотный сигнал на лапке Mega16 ?

Непрочитано 22.07.2006, 23:23  
TiN_TM
Прохожий
 
Регистрация: 19.07.2006
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
TiN_TM на пути к лучшему
По умолчанию Как померять низкочастотный сигнал на лапке Mega16 ?


Нужно измерять сигнал частоты 20-50Hz и выводить в переменную его частоту.

Кварц 6MHz, процессор Mega16, ноги измерительные подтянуты к VCC 10k-резистором.

Компилятор CodeVision AVR

пробовал так:

Код:
get_clock(void)
{
if (PIND.2==0)
	{
        TCNT0=0xd9;
        TCCR0=0x04; //стартуем таймер 0 на частоту 600Гц
	}
if (sec==1) //sec - переменная увеличивается на 1 каждую секунду от таймера 1
	{
	freq=rpm; //скидываем что намерили за секунду
	rpm=0; //обнуляем
	}
}

прерывание:

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xd9;
rpm++;
}
Но получаю только нули, а rpm все увеличивается...

если прекращать подачу сигнала - останавливается.

Помогите добрые люди...
Реклама:
TiN_TM вне форума  
Непрочитано 23.07.2006, 11:14  
avr123-nm-ru
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

наверно вместо if (sec==1) нужно while чтоб МК ждал когда переменная станет 1.

посмтоте "Си для МК" стр 5 курса и задачи на стр 6.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
Непрочитано 24.07.2006, 11:32  
paha1956
Временная регистрация
 
Регистрация: 17.05.2006
Сообщений: 71
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
paha1956 на пути к лучшему
По умолчанию

Я бы сделал по-другому:
1. Запустить таймер один раз в начале программы на частоту 10 кГц (период 0,1 мс).
2. В прерывании от таймера с помощью анализа предыдущего значения сигнала и нынешнего измерить количество тиков между отрицательными (или положительными)фронтами сигнала.
3. Записать полученное количество тиков в переменную Т.
4. В основном теле программы получить частоту, как F=10000/T
5. Порадоваться за полученный результат
paha1956 вне форума  
Непрочитано 24.07.2006, 16:52  
TiN_TM
Прохожий
 
Регистрация: 19.07.2006
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
TiN_TM на пути к лучшему
По умолчанию

Типа так?

Обработчик:
переменные - fan0f - флаг, fan0 - предыдущее значение. rpm - счетчик тиков...

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{  
TCNT0=0;
if (fan0f==0) {fan0=PIND.2;fan0f=1;}
rpm++;
if (fan0f==1) {
              if (PIND.2==!fan0)
              cooler=rpm;
              rpm=0;
              fan0f=0;
							}


}
В мейне вот:

Код:
main....

fan[0]=23438/T; //таймер 0 работает с частотой 23438 (делитель 256)
printf("%d RPM",fan[0]); //вывод в UART
TiN_TM вне форума  
Непрочитано 25.07.2006, 12:53  
paha1956
Временная регистрация
 
Регистрация: 17.05.2006
Сообщений: 71
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
paha1956 на пути к лучшему
По умолчанию

Можно ещё и так попробовать сделать обработчик:
Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
{  
TCNT0=0;

if (fan0 == 1 && PIND.2 == 0)
  {
  cooler=rpm;
  rpm=0;
  }
else
  {
  rpm++;
  }

fan0=PIND.2;
}
Правда, есть сложность: данный алгоритм не обрабатывает дребезг. Сигнал должен быть чистым или с дребезгом не более периода срабатывания таймера.

Кстати, в майне там не fan[0]=23438/T, а fan[0]=23438/cooler.
Удачи!
paha1956 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать сигнал без проводов? (ищу готовые системы) zl3p Автоматика и аппаратура связи 13 27.09.2010 23:16
Как усилить сигнал с микрофона телефона merkur Автоматика и аппаратура связи 8 04.03.2009 12:25
Как усилить сигнал TTL merkur TTL и CMOS логика 13 11.07.2008 10:37
Как завести микрофонный (аналоговый) сигнал в QBASIC 4.5? 66andr Цифровые сигнальные процессоры 0 14.07.2007 16:46
Как померять температуру? kolian6 Измерительное оборудование 57 16.02.2007 13:10


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.