Dzięki za odpowiedź!
Czujników hala mój silniczek nie ma, a motowanie w nim tych że czujników było by zbyt trudne no i znów dodatkowe koszta.
Te sprężenie zwrotne tzw. "Back-EMF" to jest to od indukowania się w niezasilanym uzwojeniu napiecia tak? Dobrze myśle?
1. Napisałem (a właściwie przepisałem) program który generuje PWM na jedną nóżkę, a teraz jak zrobić żeby pojawiło to się na 6ścciu pinach?
A własciwie które rozwiązanie jest najprostrze dla takiego sterowania?
Poniżej przedstawiam program napisany w C
#include<avr/io.h>
void czekaj (unsigned long zt)
{
#define tau 10.38
unsigned char zt1;
for (;zt>0;zt--)
{
for (zt1=255; zt1!=0;zt1--);
}
}
int main (void)
{
unsigned char licznikkl=0; //zmienna wykorzystywana do pomiaru
//czasu naciśnięcia przycisków
char przyrost=20; //przyrost zmiany współczynnika
//wypełnienia sygnału PWM
union
{
unsigned int pwm;
unsigned char pwmc[2];
}volatile upwm; //aktualny współczynnik wypełnienia
//sygn. PWM
DDRB=0x08; //PB3 - wy (OC1 - wyjście PWM)
//pozostałe we
PORTB=0; //bez podciągania
DDRD=0xfc; //PD1 i PD0 - we (obsługa klawiszy SW1
//i SW4), pozostałe wy
PORTD=0x03; //wejścia z podciąganiem (potrzebne dla
//klawiatury)
TCCR1A=0x83; //PWM 10 bitowy
//zerowanie OC1 po spełnieniu warunku
//równości podczas liczenia w górę,
//ustawianie podczas liczenia w dół
TCCR1B=0x03; //preskaler=3, co przy 10-bit PWM daje
//Fwy=ok. 61Hz @8MHz
TCNT1L=0x00; //wstępne ustawianie licznika1
TCNT1H=0x00;
upwm.pwm=0x3ff; //początkowo silnik włączony, wartość TOP
//odpowiada wysokiemu poziomowi na
//wyjściu OC1 (PB3)
while(1) //główna pętla programu
{
if(bit_is_clear(PIND,1)) //czy wciśnięto SW4
{
upwm.pwm+=przyrost; //zwiększ pwm
if(upwm.pwm>0x3ff)
{
upwm.pwm=0x3ff; //jeśli przekroczono wartość TOP, to
//ustaw TOP
}
czekaj(15*tau); //eliminacja drgań i powtórnej
//interpretacji naciśnięcia przycisku
licznikkl++; //mierz długość naciśnięcia przycisku
}
else
{
if(bit_is_clear(PIND,0)) //czy wciśnieto SW1
{
upwm.pwm-=przyrost; //zmniejsz pwm
if(upwm.pwm>0x3ff) //odpowiada to upwm.pwm<0
{
upwm.pwm=0; //jesli przekroczono wartość zero, to
//ustaw zero
}
czekaj(15*tau); //eliminacja drgań i powtórnej
//interpretacji naciśniecia przycisku
licznikkl++; //mierz długość naciśnięcia przycisku
}
else
{
licznikkl=0; //zeruj licznik pomiaru czasu naciśnięcia
//klawisza ponieważ wszystkie przyciski
//są zwolnione
przyrost=20; //ustaw początkową wartość przyrostu
//dla pwm
}
}
if(licznikkl>6)
{
przyrost=160; //wykryto długie naciśnięcie przycisków,
//zwiększ krok regulacji
licznikkl=60;
}
OCR1H=upwm.pwmc[1]; //wpisz aktualnie ustawiony współczynnik
//do rejestrów
OCR1L=upwm.pwmc[0]; //OCR1 timera1
}
}