Регулятор оборотов печки ШИМ. Нужна помощь.

Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

Решил сделать плавную регулировку оборотов печки логана с помощью энкодера и atmega8.
Возникла проблема:
двигатель гудит, "поет" на малых оборотах.

За основу взял вот эту статью http://radioparty.ru/index.php/componen ... on-encoder

Подправив получилось вот такое:

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

/*** Принцип работы энкодера.  ***/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>


volatile char pwm_counter,pwm_r,m,n=250,start,g=0,stsrt_too, button = 0,start_three=1;
int pwm_g;
unsigned char eeprom_var EEMEM; // определяем переменную в EEPROM
// Обработчик прерывания int0
ISR(SIG_INTERRUPT0)
{
_delay_us(50);
if((PIND&(1 << PD2))==0)
{
_delay_us(50);
if((PIND&(1 << PD0))==0)
{ 

if(button == 0) // уменьшаем 
{ 
pwm_r=pwm_r-2;
if(pwm_r < 2)
pwm_r = 2;
} 


}

else
{

if(button == 0) // увеличиваем 
{
pwm_r=pwm_r+2;
if(pwm_r > 230)
pwm_r =230;
}


}
}
GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания
return;
}	

// прерывание по переполнению Т0
ISR (TIMER0_OVF_vect)
{
if (pwm_counter++ > 249) 
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > pwm_r)
PORTB |= (1 << PB0);
	
}

//----------------------------------------------------------------------------

//=================

int main (void) 
{

DDRB |= (1 << PB5)|(1 << PB4)|(1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0);// выходы
PORTB = 0x00;
DDRD |= (0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы

TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00); 

MCUCR |= (0 << ISC00)|(1 << ISC01);	// прерывание по заднему фронту INT0(по спаду импульса)

GIFR |= (1 << INTF0);		// очищаем флаг внешнего прерывания
GICR |= (1 << INT0);		// разрешаем внешние прерывания INT0
	
sei(); //глобально разрешаем прерывания

while(1)
{

//==================Плавный пуск=======
if (start_three==1)
{
if (n<eeprom_read_byte(&eeprom_var)) 
 {
   pwm_r = eeprom_read_byte(&eeprom_var);
   start=0;
       g=0;
	   start_three=2;
   }
  else
  {
   _delay_ms(2);
    g++;
   n=250- g;
   pwm_r = n;
  }
 }
 //=================
	        PORTB |= (1 << PB2);
  if((PIND&(1 << PD1))==0)
  {
    _delay_ms(1000);
	if((PIND&(1 << PD1))==0)
	{
      PORTB |= (1 << PB2);
     _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
     _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
      _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
          _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
      _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
	  _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
      _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
          _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
      _delay_ms(200);
	        PORTB |= (1 << PB2);
      _delay_ms(200);
      PORTB &= ~(1 << PB2); //гасим светодиод
      
	  eeprom_write_byte(&eeprom_var, pwm_r); // записываем "pwm_r" в EEPROM
	  }
     else
	 {
	  
/*if((PIND&(1 << PD1))==0) // если нажата кнопка
{
  
while((PIND&(1 << PD1))==0)// ждем отпускания кнопки
 {}
if((PIND&(1 << PD1))==0)
   {pwm_g = pwm_g + 1;
  if (pwm_g > 100)*/
 
   if(button == 0)
 {
  m=pwm_r;
 }

button++;
_delay_ms(50);
if(button == 3)
{
 button = 0;
 start=1; 
 }
 }
}

		


if(button == 1)

{
stsrt_too=1;
}



if(button == 2)
{
stsrt_too=0;
pwm_r = 250;
}

// плавный пуск

if (start==1)
{
 if (pwm_r<m) 
 {
   pwm_r = m;
   start=2;
       g=0;
	
   }
  else
{
   _delay_ms(2);
    g++;
   n=pwm_r - g;
   pwm_r = n;
  }
 }

//============плавный пуск============
 if (stsrt_too==1)
{
  if (pwm_r<10) 
  {
    pwm_r=2;
    g=0;
	stsrt_too=2;
    
  } 
  else
  {
   _delay_ms(2);
    g++;
   n=m- g;
   pwm_r = n;
  }
}
//=============светим светодиодом======
if(pwm_r < 5)
{
PORTB |= (1 << PB1);
}
if(pwm_r < 83)
{
PORTB |= (1 << PB5);
}
if(pwm_r < 190)
{
PORTB |= (1 << PB4);
}
if(pwm_r < 244)
{
PORTB |= (1 << PB3);
}
//===================
}
}
на 14 ногу(PB0) цепляю irf 1324

===================

Собрал параллельно регулятор на tl494
с ней никакого шума и "пения" нет не на малых, не на больших оборотах.
схемка во вложении.

!!!!!!В программировании я новичок, подскажите что сделать чтобы пропал гул,шум!!!!!!!
пробовал подключать кварцевые резонаторы 8, 12, 16.результат тоже только тональность пения изменяется.
Вложения
tl494.jpg
регулятор на tl494
(44.8 КБ) 1615 скачиваний
Реклама
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

Сначала не обратил внимания. Подключил в авто регулятор на ТЛ-ке, машина не хочет заводиться. если же завестись, а потом включить вентилятор то на приборной панели половина индикаторов начинает светится вполнакала.
Я в недоумении.
Подскажите пожалуйста какое нибудь правильное решение.
Реклама
s64
Потрогал лапой паяльник
Сообщения: 321
Зарегистрирован: Пн окт 18, 2010 21:18:21

Сообщение s64 »

уменьшить частоту ШИМ, герц до 50-70.
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

А как это сделать, можете пояснить если вам не трудно.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Lyav писал(а):Сначала не обратил внимания. Подключил в авто регулятор на ТЛ-ке, машина не хочет заводиться. если же завестись, а потом включить вентилятор то на приборной панели половина индикаторов начинает светится вполнакала.
Я в недоумении.
Подскажите пожалуйста какое нибудь правильное решение.
Схемы ёмкостями принято шунтировать, а мотор диодами. И всё заводиться будет и лампы в полнакала пропадут.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Реклама
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

Seriyvolk писал(а):
Lyav писал(а):Сначала не обратил внимания. Подключил в авто регулятор на ТЛ-ке, машина не хочет заводиться. если же завестись, а потом включить вентилятор то на приборной панели половина индикаторов начинает светится вполнакала.
Я в недоумении.
Подскажите пожалуйста какое нибудь правильное решение.
Схемы ёмкостями принято шунтировать, а мотор диодами. И все заводиться будет и лампы в полнакала пропадут.
Схема ёмкостями шунтирована
Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
Параллельно питанию 4700мкф и керамику 0,1мкф.
Диод тоже присутствует на 40 а с компьютерного БП


Добавил в посте выше схему на tl494 с номиналами.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2602
Зарегистрирован: Вт янв 12, 2010 21:11:22
Откуда: Волжский Волгоградской обл.

Сообщение MAVr 34 »

Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
:shock: Это вы параллельно двигателю вентилятора ставите? Двигатель шунтируется только диодом, а вот по питанию схемы ставят электролит и керамику, причем электролит желательно 2-3штуки на 2200мкф., а не один большой.
Собрали и смело включайте, лишнее выгорит!
Открыл глаза
Сообщения: 53
Зарегистрирован: Пт янв 18, 2008 19:59:20

Сообщение folks »

Вот здесь проект специально, под это дело http://chipmk.ru/index.php?option=com_c ... &Itemid=29 . Правда без энкодера .
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Lyav писал(а):Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
Это очень большая ошибка.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

Seriyvolk писал(а):
Lyav писал(а):Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
Это очень большая ошибка.
Понял исправлю.
Родился
Сообщения: 19
Зарегистрирован: Вт дек 21, 2010 12:05:10

Сообщение Lyav »

Подскажите пожалуйста, а как пощитать частоту в коде приведенном выше.
И какая часть кода за нее отвечает? Я так понял что эта

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


TCCR0 |= (1 << CS00);вот эта строчка 

Как можно изменить в данном случае частоту шим

Может я не правильно пощитал у меня частота получилась около 61Гц при тактовой частоте 4МГц.
Почитав форумы пришёл к выводу что частота должна бить около 15 КГц
Исправте меня Пожалуйста если вчомто ошибаюсь, Я только учусь. :solder: :solder:
Грызет канифоль
Аватара пользователя
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог

Сообщение sheva_s »

При сильно большой частоте ШИМа будет сильно большой нагрев защитного диода который шунтирует двигатель в своё время проверил уже диод кипит.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Шоттки не греется при любой частоте.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Ответить

Вернуться в «АвтоМотоВело»