Witam w swoim projekcie do sterowania silnikami krokowymi wykorzystuję joysticki potencjometryczne. By określić, w którą stronę został on wychylony mierzę napięcie na potencjometrze przetwarzając je w przetworniku analogowo cyfrowym. Silniki działają bez zarzutu, tak jak zakładałem. Problem występuje jedynie przy silniku numer 1. Dokładniej po załączeniu zasilania silnik wariuje, trzęsie się jak oszalały. Sprawdziłem stany wyjść na oscyloskopie i podawane są jakieś śmieci, dlatego taka reakcja silnika. Najciekawsze jest to, że jak poruszę jednym z potencjometrów to problem zanika i można normalnie sterować tym silnikiem, ale gdy znów poruszę innym joystickiem znów wracają wariacje. Problem polega zapewne w przetwarzaniu sygnały analogowego, ale niestety nie mogę sobie z tym poradzić. Zmieniałem porty i nic nie pomogło więc to nie wina wyjść. Nie jest to też wina joysticka bo podłączłem na szybko 4 potencjometry i sterowałem wkrętakiem tymi potencjometrami reakcja była taka sama. Dlaczego tylko na tym jednym wyjściu się tak dzieje?
załączam kod programu:
załączam kod programu:
#include <avr/io.h>
#include <avr/interrupt.h>
/////// SILNIK 1 //////////////// PORT - E
#define OUT1a_ON PORTE |= _BV(0);
#define OUT1a_OFF PORTE &= ~_BV(0);
#define OUT1b_ON PORTE |= _BV(1);
#define OUT1b_OFF PORTE &= ~_BV(1);
#define OUT1c_ON PORTE |= _BV(2);
#define OUT1c_OFF PORTE &= ~_BV(2);
#define OUT1d_ON PORTE |= _BV(3);
#define OUT1d_OFF PORTE &= ~_BV(3);
/////// SILNIK 2 //////////////// PORT - E
#define OUT2a_ON PORTE |= _BV(4);
#define OUT2a_OFF PORTE &= ~_BV(4);
#define OUT2b_ON PORTE |= _BV(5);
#define OUT2b_OFF PORTE &= ~_BV(5);
#define OUT2c_ON PORTE |= _BV(6);
#define OUT2c_OFF PORTE &= ~_BV(6);
#define OUT2d_ON PORTE |= _BV(7);
#define OUT2d_OFF PORTE &= ~_BV(7);
/////// SILNIK 3 //////////////// PORT - B
#define OUT3a_ON PORTB |= _BV(0);
#define OUT3a_OFF PORTB &= ~_BV(0);
#define OUT3b_ON PORTB |= _BV(1);
#define OUT3b_OFF PORTB &= ~_BV(1);
#define OUT3c_ON PORTB |= _BV(2);
#define OUT3c_OFF PORTB &= ~_BV(2);
#define OUT3d_ON PORTB |= _BV(3);
#define OUT3d_OFF PORTB &= ~_BV(3);
/////// SILNIK 4 //////////////// PORT - B
#define OUT4a_ON PORTB |= _BV(4);
#define OUT4a_OFF PORTB &= ~_BV(4);
#define OUT4b_ON PORTB |= _BV(5);
#define OUT4b_OFF PORTB &= ~_BV(5);
#define OUT4c_ON PORTB |= _BV(6);
#define OUT4c_OFF PORTB &= ~_BV(6);
#define OUT4d_ON PORTB |= _BV(7);
#define OUT4d_OFF PORTB &= ~_BV(7);
/////// SILNIK 5 //////////////// PORT - D unipolarny
#define OUT5a_ON PORTD |= _BV(0);
#define OUT5a_OFF PORTD &= ~_BV(0);
#define OUT5b_ON PORTD |= _BV(1);
#define OUT5b_OFF PORTD &= ~_BV(1);
#define OUT5c_ON PORTD |= _BV(2);
#define OUT5c_OFF PORTD &= ~_BV(2);
#define OUT5d_ON PORTD |= _BV(3);
#define OUT5d_OFF PORTD &= ~_BV(3);
/////// SILNIK 6 //////////////// PORT - D unipolarny
#define OUT6a_ON PORTD |= _BV(4);
#define OUT6a_OFF PORTD &= ~_BV(4);
#define OUT6b_ON PORTD |= _BV(5);
#define OUT6b_OFF PORTD &= ~_BV(5);
#define OUT6c_ON PORTD |= _BV(6);
#define OUT6c_OFF PORTD &= ~_BV(6);
#define OUT6d_ON PORTD |= _BV(7);
#define OUT6d_OFF PORTD &= ~_BV(7);
///// LEDY //////
#define LED_ON PORTC |= _BV(0);
#define LED_OFF PORTC &= ~_BV(0);
#define LED_TOGGLE PORTC ^= _BV(0);
volatile uint8_t overflow_ADC=0;
volatile uint8_t overflow1=0;
volatile uint8_t overflow2=0;
volatile uint8_t overflow3=0;
volatile uint8_t overflow4=0;
volatile uint8_t overflow5=0;
volatile uint8_t overflow6=0;
volatile uint8_t overflow_ADC_max=10;
volatile uint8_t overflow1_max=6;
volatile uint8_t overflow2_max=6;
volatile uint8_t overflow3_max=6;
volatile uint8_t overflow4_max=6;
volatile uint8_t overflow5_max=6;
volatile uint8_t overflow6_max=6;
volatile char sw1a=0;
volatile char sw1b=0;
volatile char sw2a=0;
volatile char sw2b=0;
volatile char sw3a=0;
volatile char sw3b=0;
volatile char sw4a=0;
volatile char sw4b=0;
volatile uint16_t value; // zapisywana wartość przetowrnika
volatile unsigned char stan1 = 3;
volatile unsigned char stan2 = 3;
volatile unsigned char stan3 = 3;
volatile unsigned char stan4 = 3;
volatile unsigned char stan5 = 3;
volatile unsigned char stan6 = 3;
volatile unsigned int value; // zmienna przechowują stan wyjścia przetwornika ADC
volatile unsigned int zakres=120; // wartść po jakiej ma nastąpić załączenie
volatile unsigned char licznik_ADC = 2;
ISR (TIMER0_OVF_vect)
{
TCNT0 = 100; // Załaduj wartoś początkową do timera 0
overflow1++;
overflow2++;
overflow3++;
overflow4++;
overflow5++;
overflow6++;
overflow_ADC++;
}
int main (void)
{
DDRB = 255; // Ustawienie rejestru B jako wyjݣie na silnik
DDRD = 255; // Ustawienie rejestru D jako wyjݣie na silniki
DDRE = 255; // Ustawienie rejestru E jako wyjݣie na silniki
DDRF = 0; // Ustawienie rejestru F jako Wejścia z pad'a
PORTF |= _BV(4); //Ustaw PF0 w stan wysoki (podciڧniecie do jedynki)
PORTF |= _BV(5); //Ustaw PF1 w stan wysoki (podciڧniecie do jedynki)
PORTF |= _BV(6); //Ustaw PF0 w stan wysoki (podciڧniecie do jedynki)
PORTF |= _BV(7); //Ustaw PF1 w stan wysoki (podciڧniecie do jedynki)
TIMSK = _BV(TOIE0); // włącz przerwanie od timerem 0
TCCR0 = (_BV(CS00) | _BV(CS01)) ; //Ustawia timer0 z preskalerem 32
ADCSRA = _BV(ADEN)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS2)|_BV(ADFR); // ustaw przetwornik ADC
sei(); // włącz obsługę przerwań
while(1) // Program główny
{
//////////////////////////////////////////////////// Sprawdzanie przetwornika ADC ///////////////////////
if(overflow_ADC>=overflow_ADC_max)
{
licznik_ADC++;
if(licznik_ADC>=5)
licznik_ADC=1;
switch(licznik_ADC)
{
case 1 :
ADMUX = 0; // wybierz kanł0 przetwornika ADC (przetwarzanie 1)
value = ADCW;
if(value<=zakres)
{
sw1a=1;
sw1b=0;
}
else
{
if(value>=1023-zakres)
{
sw1a=0;
sw1b=1;
}
else
{
sw1a=0;
sw1b=0;
}
}
while (bit_is_clear(ADCSRA,ADIF)) {} // czeka na koniec konwersji
break;
case 2:
ADMUX = 1; // wybierz kanł1 przetwornika ADC (przetwarzanie 2)
value = ADCW;
if(value<=zakres)
{
sw2a=1;
sw2b=0;
}
else
{
if(value>=1023-zakres)
{
sw2a=0;
sw2b=1;
}
else
{
sw2a=0;
sw2b=0;
}
}
while (bit_is_clear(ADCSRA,ADIF)) {} // czeka na koniec konwersji
break;
case 3 :
ADMUX = 2; // wybierz kanł2 przetwornika ADC (przetwarzanie 3)
value = ADCW;
if(value<=zakres)
{
sw3a=1;
sw3b=0;
}
else
{
if(value>=1023-zakres)
{
sw3a=0;
sw3b=1;
}
else
{
sw3a=0;
sw3b=0;
}
}
while (bit_is_clear(ADCSRA,ADIF)) {} // czeka na koniec konwersji
break;
case 4 :
ADMUX = 3; // wybierz kanł3 przetwornika ADC (przetwarzanie 4)
value = ADCW;
if(value<=zakres)
{
sw4a=1;
sw4b=0;
}
else
{
if(value>=1023-zakres)
{
sw4a=0;
sw4b=1;
}
else
{
sw4a=0;
sw4b=0;
}
}
while (bit_is_clear(ADCSRA,ADIF)) {} // czeka na koniec konwersji
break;
}
overflow_ADC=0;
}
//////////////////////////////////////////////////// SILNIK 1 ///////////////////////
if(overflow1>=overflow1_max) // silnik 1
{
if(sw2a != 0)
{
stan1++;
if(stan1==5)
stan1=1;
}
if(sw2b != 0)
{
stan1--;
if(stan1==0)
stan1=4;
}
switch(stan1)
{
case 1 :
OUT1a_ON;
OUT1b_OFF;
OUT1c_OFF;
OUT1d_OFF;
break;
case 2 :
OUT1a_OFF;
OUT1b_OFF;
OUT1c_ON;
OUT1d_OFF;
break;
case 3 :
OUT1a_OFF;
OUT1b_ON;
OUT1c_OFF;
OUT1d_OFF;
break;
case 4 :
OUT1a_OFF;
OUT1b_OFF;
OUT1c_OFF;
OUT1d_ON;
break;
}
overflow1=0;
}
//////////////////////////////////////////////////// SILNIK 2 ///////////////////////
if(overflow2>=overflow2_max) // silnik 2
{
if(sw1a != 0)
{
stan2++;
if(stan2==5)
stan2=1;
}
if(sw1b != 0)
{
stan2--;
if(stan2==0)
stan2=4;
}
switch(stan2)
{
case 1 :
OUT2a_ON;
OUT2b_OFF;
OUT2c_OFF;
OUT2d_OFF;
break;
case 2 :
OUT2a_OFF;
OUT2b_OFF;
OUT2c_ON;
OUT2d_OFF;
break;
case 3 :
OUT2a_OFF;
OUT2b_ON;
OUT2c_OFF;
OUT2d_OFF;
break;
case 4 :
OUT2a_OFF;
OUT2b_OFF;
OUT2c_OFF;
OUT2d_ON;
break;
}
overflow2=0;
}
//////////////////////////////////////////////////// SILNIK 3 ///////////////////////
if(overflow3>=overflow3_max) // silnik 3
{
if(sw3a != 0)
{
stan3++;
if(stan3==5)
stan3=1;
}
if(sw3b != 0)
{
stan3--;
if(stan3==0)
stan3=4;
}
switch(stan3)
{
case 1 :
OUT3a_ON;
OUT3b_OFF;
OUT3c_OFF;
OUT3d_OFF;
break;
case 2 :
OUT3a_OFF;
OUT3b_OFF;
OUT3c_ON;
OUT3d_OFF;
break;
case 3 :
OUT3a_OFF;
OUT3b_ON;
OUT3c_OFF;
OUT3d_OFF;
break;
case 4 :
OUT3a_OFF;
OUT3b_OFF;
OUT3c_OFF;
OUT3d_ON;
break;
}
overflow3=0;
}
//////////////////////////////////////////////////// SILNIK 4 ///////////////////////
if(overflow4>=overflow4_max) // silnik 4
{
if(sw4a != 0)
{
stan4++;
if(stan4==5)
stan4=1;
}
if(sw4b != 0)
{
stan4--;
if(stan4==0)
stan4=4;
}
switch(stan4)
{
case 1 :
OUT4a_ON;
OUT4b_OFF;
OUT4c_OFF;
OUT4d_OFF;
break;
case 2 :
OUT4a_OFF;
OUT4b_OFF;
OUT4c_ON;
OUT4d_OFF;
break;
case 3 :
OUT4a_OFF;
OUT4b_ON;
OUT4c_OFF;
OUT4d_OFF;
break;
case 4 :
OUT4a_OFF;
OUT4b_OFF;
OUT4c_OFF;
OUT4d_ON;
break;
}
overflow4=0;
}
//////////////////////////////////////////////////// SILNIK 5 ///////////////////////
if(overflow5>=overflow5_max) // silnik 5
{
if(bit_is_clear(PINF,4))
{
stan5++;
if(stan5==5)
stan5=1;
}
if(bit_is_clear(PINF,5))
{
stan5--;
if(stan5==0)
stan5=4;
}
switch(stan5)
{
case 1 :
OUT5a_ON;
OUT5b_OFF;
OUT5c_OFF;
OUT5d_OFF;
break;
case 2 :
OUT1a_OFF;
OUT1b_ON;
OUT1c_OFF;
OUT1d_OFF;
break;
case 3 :
OUT1a_OFF;
OUT1b_OFF;
OUT1c_ON;
OUT1d_OFF;
break;
case 4 :
OUT1a_OFF;
OUT1b_OFF;
OUT1c_OFF;
OUT1d_ON;
break;
}
overflow5=0;
}
//////////////////////////////////////////////////// SILNIK 6 ///////////////////////
if(overflow6>=overflow6_max) // silnik 6
{
if(bit_is_clear(PINF,6))
{
stan6++;
if(stan6==5)
stan6=1;
}
if(bit_is_clear(PINF,7))
{
stan6--;
if(stan6==0)
stan6=4;
}
switch(stan6)
{
case 1 :
OUT6a_ON;
OUT6b_OFF;
OUT6c_OFF;
OUT6d_OFF;
break;
case 2 :
OUT6a_OFF;
OUT6b_ON;
OUT6c_OFF;
OUT6d_OFF;
break;
case 3 :
OUT6a_OFF;
OUT6b_OFF;
OUT6c_ON;
OUT6d_OFF;
break;
case 4 :
OUT6a_OFF;
OUT6b_OFF;
OUT6c_OFF;
OUT6d_ON;
break;
}
overflow6=0;
}
} //zamyka while
} //zamyka main
