Witam buduje układ dzięki któremu będę mógł sterować silnikiem krokowym za pomocą potencjometru. Wykorzystałem przetwornik A/D. Najpierw sprawdzany jest stan rejestru ADCW a jego wartość zapisywana jest do zmiennej value w postaci dziesiętnej. Następnie program sprawdza o ile zwiększyło się value, oblicza różnicę i zapisuje do zmiennej b jako wartość dodatnią. Wartość w zmiennej b to ilość kroków jakie trzeba wykonać. Następnie wykonywana jest część programu odpowiedzialna za obracanie silnika.
Problem polega na tym że jeżeli wartość rejestru ADCW czyli tym samym wartość value osiągnie wartość 256 lub większą silnik kręci się cały czas i nie wychodzi z for'a odpowiedzialnego za odliczanie ilości kroków, wygląda to tak jak by wartość zmiennej b (ilość kroków) była nieskończona
Problem polega na tym że jeżeli wartość rejestru ADCW czyli tym samym wartość value osiągnie wartość 256 lub większą silnik kręci się cały czas i nie wychodzi z for'a odpowiedzialnego za odliczanie ilości kroków, wygląda to tak jak by wartość zmiennej b (ilość kroków) była nieskończona
// Testowanie przetwornika analogowo/cyfrowego
// konwersja samobieżna
#include <avr/io.h> // dostęp do rejestrów
#include <stdlib.h>
#include <util/delay.h>
#define TR0_ON PORTB |= _BV(1);
#define TR0_OFF PORTB &= ~_BV(1);
#define TR1_ON PORTB |= _BV(2);
#define TR1_OFF PORTB &= ~_BV(2);
#define TR2_ON PORTB |= _BV(3);
#define TR2_OFF PORTB &= ~_BV(3);
#define TR3_ON PORTB |= _BV(4);
#define TR3_OFF PORTB &= ~_BV(4);
int value;
volatile uint16_t value1;
unsigned char y = 1;
unsigned char a = 0;
unsigned char b = 0;
unsigned char i = 0;
int main(void) // program główny
{
TCCR0 |= ((1 << CS00) | (1 << CS02)); //Ustawia timer0 z preskalerem Fcpu/1024
DDRD = 0xFF; // wszystkie linie PORTD jako wyjścia
DDRB = 0xFF; // wszystkie linie PORTB jako wyjścia
ADMUX = 0; // wybierz kanał 0 przetwornika ADC
ADCSR = _BV(ADEN)|_BV(ADIE)|_BV(ADFR)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS1);
// włącz przetwornik ADC w trybie samobieżnym
// uruchom generowanie przerwań
// częstotilwość taktowania F_ADC=F_CPU/64
// przy F_CPU=8MHz : F_ADC=125 kHz
while(1) // pętla nieskończona
{
int value = ((ADCH << 8) | (ADCL)); // czytaj wartość z przetwornika ADC i zapisz ją do value
value1 = ADCW;
PORTD = (value1>>2); // wyślij przetworzoną wartość na LED
b=abs(a-value);
for(i=0;i<=b;i++)
{
if(a<value)
{
y++;
if(y==9)
y=1;
}
if(a>value)
{
y--;
if(y==0)
y=8;
}
switch(y)
{
case 1 :
TR0_ON;
TR1_OFF;
TR2_OFF;
TR3_OFF;
break;
case 2 :
TR0_ON;
TR1_ON;
TR2_OFF;
TR3_OFF;
break;
case 3 :
TR0_OFF;
TR1_ON;
TR2_OFF;
TR3_OFF;
break;
case 4 :
TR0_OFF;
TR1_ON;
TR2_ON;
TR3_OFF;
break;
case 5 :
TR0_OFF;
TR1_OFF;
TR2_ON;
TR3_OFF;
break;
case 6 :
TR0_OFF;
TR1_OFF;
TR2_ON;
TR3_ON;
break;
case 7 :
TR0_OFF;
TR1_OFF;
TR2_OFF;
TR3_ON;
break;
case 8 :
TR0_ON;
TR1_OFF;
TR2_OFF;
TR3_ON;
break;
}
_delay_ms(10); //czekaj 10 ms
}
a=value;
}
}
