Страница 1 из 1

Индикатор завышенной/заниженной частоты на двух светодиодах

Добавлено: 19 ноя 2013, 11:11
Alex_och
Предлагаю рассмотреть варианты кода, который отображает двумя светодиодами об уходе частоты за допустимые рамки.

Например:
при частоте меньше 20 Гц горит один светодиод,
при частоте более 40 Гц горит другой светодиод,
в диапазоне 20-40 Гц не горят.

Предварительно для Atmega8

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 19 ноя 2013, 12:55
AntonChip
Держи мой проект, пиши если что не так
chastotomer_20_40.rar
AVRStudio4, Proteus
(34.09 КБ) 798 скачиваний

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 19 ноя 2013, 14:59
Alex_och
Все заработало!!!
Спасибо за помощь и за высланные файлики.
У меня частота на МК стояла 1 МГц, поменял на 8 МГц (как у Вас) и все заработало нормально.
Просто в описании статьи увидел 1MHz, а то что на схеме кварц 8MHz значения не предал.
Значит частора 8MHz, предделитель 8 и получаем 1MHz

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 23 фев 2014, 21:08
Alex_och
Продолжу тему, с целью усложнить программу.
Задача в принципе та же, только вместо светодиодов хочу поставить шаговый двигатель (вращение вперед/назад). Простой коллекторный моторчик ставил - работает, а вот с шаговиком пока не получается.
Все по отдельности работает: шаговик по урокам и по этой ссылке работает http://radioparty.ru/forums/viewtopic.php?f=2&t=776 ;
Слежка за частотой по архиву в начале темы работает и со светодиодами и на моторчике (переписал немного)
А вот соединить две программы ни как не могу.
Нужно два таймера в этом случае настраивать или можно обойтись одним? Пробовал и с одним и с двумя, но протеус молчит))

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 24 фев 2014, 07:52
AntonChip
Как я понял надо сделать так:
при частоте меньше 20 Гц шаговый вращается по часовой,
при частоте более 40 Гц шаговый вращается против часовой,
в диапазоне 20-40 Гц шаговый не работает.

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 24 фев 2014, 12:24
Alex_och
Здравствуйте. Да именно так.
Я вник в суть кодов, соединял их в один и с одним таймером и с двумя, но как-то без результата.

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 24 фев 2014, 23:00
Alex_och
Код написал (слепил из двух). Сделал два таймера TIMER0 и TIMER2. Первый для шаговика, второй для подсчета внешних импульсов. А когда прописывал TIMER1 - даже первоначальный код не работал.
Могу скинуть, чтоб услышать коментарии.

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 25 фев 2014, 06:12
AntonChip
Выкладывай код, посмотрим

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 25 фев 2014, 16:01
Alex_och
Выкладываю архив для комментариев. Код в WinAVR, но это не суть важно и схема в протеус.
Сделал для двух моторчиков: коллекторного и шагового биполярного. На практике посмотрю какой будет лучше справляться с задачей.

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 25 фев 2014, 18:40
AntonChip
Я сделал бы так:

Код: Выделить всё

while(1)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
ovftimes = ADCW; // Значение временной задержки

if(counter == 4000)
{
  if(edgecounter < 20) // Если частота меньше 20
   {
   status = 1;
   PORTC |= (1 << PC1); // Включаем зеленый светодиод
   TIMSK |= (1 << TOIE0); // Разрешаем прерывания от таймера
   }
   
   if(edgecounter > 40) // Если частота больше 40
   {
   status = 0;
   PORTC |= (1 << PC2); // Включаем красный светодиод
   TIMSK |= (1 << TOIE0); // Разрешаем прерывания от таймера
   }

   if((edgecounter < 40) && (edgecounter > 20))
   {
   PORTC &= ~(1 << PC2); // Включаем красный светодиод
   PORTC &= ~(1 << PC1); // Выключаем зеленый светодиод 
   TIMSK &= ~(1 << TOIE0); // Запрещаем прерывания от таймера
   }
counter = 0;
edgecounter = 0;	
}
}

Re: Индикатор завышенной/заниженной частоты на двух светодио

Добавлено: 25 фев 2014, 20:57
Alex_och
Спасибо!
Я как раз думал о таком, но не знал как правильно написать эту строчку : if((edgecounter < 40) && (edgecounter > 20))