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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 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
Сообщений: 72
Сказал спасибо: 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
Сообщений: 72
Сказал спасибо: 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, время: 03:07.


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