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

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

Добавлено: Пн дек 24, 2012 14:44:00
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.результат тоже только тональность пения изменяется.

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

Добавлено: Пн дек 24, 2012 17:03:34
Lyav
Сначала не обратил внимания. Подключил в авто регулятор на ТЛ-ке, машина не хочет заводиться. если же завестись, а потом включить вентилятор то на приборной панели половина индикаторов начинает светится вполнакала.
Я в недоумении.
Подскажите пожалуйста какое нибудь правильное решение.

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

Добавлено: Пн дек 24, 2012 22:05:13
s64
уменьшить частоту ШИМ, герц до 50-70.

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

Добавлено: Пн дек 24, 2012 22:45:20
Lyav
А как это сделать, можете пояснить если вам не трудно.

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

Добавлено: Пн дек 24, 2012 23:02:51
Seriyvolk
Lyav писал(а):Сначала не обратил внимания. Подключил в авто регулятор на ТЛ-ке, машина не хочет заводиться. если же завестись, а потом включить вентилятор то на приборной панели половина индикаторов начинает светится вполнакала.
Я в недоумении.
Подскажите пожалуйста какое нибудь правильное решение.
Схемы ёмкостями принято шунтировать, а мотор диодами. И всё заводиться будет и лампы в полнакала пропадут.

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

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


Добавил в посте выше схему на tl494 с номиналами.

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

Добавлено: Вт дек 25, 2012 11:56:47
MAVr 34
Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
:shock: Это вы параллельно двигателю вентилятора ставите? Двигатель шунтируется только диодом, а вот по питанию схемы ставят электролит и керамику, причем электролит желательно 2-3штуки на 2200мкф., а не один большой.

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

Добавлено: Вт дек 25, 2012 17:39:49
folks
Вот здесь проект специально, под это дело http://chipmk.ru/index.php?option=com_c ... &Itemid=29 . Правда без энкодера .

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

Добавлено: Вт дек 25, 2012 22:47:05
Seriyvolk
Lyav писал(а):Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
Это очень большая ошибка.

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

Добавлено: Ср дек 26, 2012 01:21:40
Lyav
Seriyvolk писал(а):
Lyav писал(а):Параллельно вентилятору ставлю емкость 10000мкф и керамику 0,1мкф.
Это очень большая ошибка.
Понял исправлю.

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

Добавлено: Ср дек 26, 2012 01:35:13
Lyav
Подскажите пожалуйста, а как пощитать частоту в коде приведенном выше.
И какая часть кода за нее отвечает? Я так понял что эта

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


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

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

Может я не правильно пощитал у меня частота получилась около 61Гц при тактовой частоте 4МГц.
Почитав форумы пришёл к выводу что частота должна бить около 15 КГц
Исправте меня Пожалуйста если вчомто ошибаюсь, Я только учусь. :solder: :solder:

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

Добавлено: Пт дек 28, 2012 00:13:10
sheva_s
При сильно большой частоте ШИМа будет сильно большой нагрев защитного диода который шунтирует двигатель в своё время проверил уже диод кипит.

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

Добавлено: Пт дек 28, 2012 00:21:51
Seriyvolk
Шоттки не греется при любой частоте.