Возникла проблема:
двигатель гудит, "поет" на малых оборотах.
За основу взял вот эту статью 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);
}
//===================
}
}
===================
Собрал параллельно регулятор на tl494
с ней никакого шума и "пения" нет не на малых, не на больших оборотах.
схемка во вложении.
!!!!!!В программировании я новичок, подскажите что сделать чтобы пропал гул,шум!!!!!!!
пробовал подключать кварцевые резонаторы 8, 12, 16.результат тоже только тональность пения изменяется.


