Regulacja prędkości obrotowej poprzez zmianę częstotliwości


Witam
Buduję sterownik który będzie sterował prędkością obrotową oraz kierunkiem obrotów silnika krokowego.Kierunek to stan 0 lub 1 na linii pinB.1. Prędkość obrotowa ma być zależna od różnicy z odczytu wartości z ADC0 oraz ADC1, ma się zmieniać w zakresie od 0 do około 16KHz. Np gdy różnica wskazań ADC0-ADC1=1023 to częstotliwość 16KHz i proporcjonalnie spadać do zera ADC0-ADC1=0 to 0 Hz. Jak to wykonać na AtMega8 i czy w ogóle idzie tak ją zaprogramować?
Programuje w Bascomie i początek mam taki

$regfile = "m8def.dat"                                      'informuje kompilator o pliku
'dyrektyw mikrokontrolera
 
$crystal = 8000000                                          'informuje kompilator o częstotliwości oscylatora
                                                             'taktującego mikrokontroler
Config Pinb.1 = Output                                      'konfiguracja pinu sterującego kierunkiem
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
                                                             'konfiguracja linii mikrokontrolera, do których dołączono
                                                             'wyświetlacz LCD
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja przewornika ADC
 
Start Adc
Dim N0 As Word                                              'zmienna do której jest zapisywana wartość z 1 czujnika
Dim N1 As Word                                              'zmienna do której jest zapisywana wartość z 2 czujnika
Dim C As Word                                               'zmienna która oblicza różnice między wartościami z ADC
 
   Do
   N0 = Getadc(0)                                           'odczytanie wartości z wejści ADC0 mikrokontrolera
   N1 = Getadc(1)                                           'odczytanie wartości z wejści ADC1 mikrokontrolera
 
   If N0 > N1 Then                                          'warunek zmiany kierunku
      Set Portb.1                                           'warunek spełniony to stan 1
      C = N0 - N1                                           'obliczenie zmiennej C (różnica odczytywanych wartości z ADC)
   Else
      Reset Portb.1                                         'zerowanie kierunku
      C = N1 - N0                                           'obliczenie zmiennej C (różnica odczytywanych wartości z ADC)
   End If
 
   Cls
   Lcd "1-" ; N0 ; "*2-" ; N1
   Lowerline
   Lcd "różnica" ; C
   Waitms 500
Loop
End




Portret użytkownika mirley

Re: Silnik

Nie rozumiem tych 16kHz..... jak prędkość obrotowa 16KHz? chcesz mieć 16000obr/s? to jest niemożliwe. Poza tym silnik krokowy raczej nie pójdzie więcej niż kilka może kilkanaście obrotów na sekundę. Podaj jakieś namiary na ten twój silnik

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: slinik

Witam dokładnie to posiadam silnik krokowy wraz z sterownikiem SMC 63PR. Chcąc sterować jego prędkością obrotową na sterownik musiał bym podawać sygnał o częstotliwości od 0 do 16kHz. Częstotliwość miała by być zależna od różnicy napięć z przetwornika ADC. Dwa czujniki np termistory im większa różnica temperatury tym szybciej silnik by miał chodzić, gdy temperatura równa silnik staje. Jak zrobić aby ATMega generowała sygnał o jakiejkolwiek częstotliwości z tego przedziału? Wiem że robi to się za pomocą timera.
Najlepiej byłoby chyba użyć timer1 ponieważ jest 16 bitowy dzięki czemu będę miał szerszy zakres regulacji częstotliwości. Czyli np przy konfiguracji

Config Timer1 = Timer , Prescale = 8

i wpisywaniu wartości początkowej z przedziału od 67 do 65536 powinienem uzyskać zakres częstotliwości od około 15Hz do 14925Hz czyli przedział który mnie interesuje.Prawdopodobnie i tak będzie trzeba później ustawić jakąś max częstotliwość aby silnik nie gubił kroków i min. aby nie trzeba było czekać w nieskończoność, więc pełnego zakresu i tak nie będę wykorzystywać.
Aby za pomocą Timer1 można było generować daną częstotliwość to trzeba użyć NE555, czy można generować ją dowolnym pinie, czy trzeba użyć któregoś z wyjść OC1A lub OC1B?
Co należy wpisać w podprogram obsługi przerwania aby był generowana odpowiednia częstotliwość? Wiem że częstotliwość zależy od zmiennej A lecz w podprogram należy wpisać rozkazy Set Portx.y poczym Restet Portx.y aby stan na danym porcie był zmieniany z określoną częstotliwością?
Config Timer1 = Timer , Prescale = 8
 
Dim A As Word 'zmienna do której jest zapisywana wartość początkowa timera
 
On Timer1 Czenstot
Enable Interrupts
Enable Timer1
Load Timer1 , A
 
Do
.
.
.
Loop
End
 
Czenstot:
Load Timer1 , A
'???Set Portx.y
'   Restet Portx.y???
Return 

Portret użytkownika matrix

Re: slinik

poczytaj -> TUTAJ <-. nawet gotowiec jest.

Portret użytkownika michal512

Re silnik

Fajny link tylko że tam jest sterowanie bezpośrednie silnikiem krokowym. Czyli poprzez zmianę stanu na odpowiednich pinach są załączanie odpowiednie cewki silnika w wyniku czego wykonuje on obrót szybciej lub wolniej. Mniej więcej o to mi chodzi, tylko że ja chce użyć

Quote:
silnik krokowy wraz z sterownikiem SMC 63PR

gdzie sterownik ma dwa wejścia jednym zmieniam kierunek obrotów dodając odpowiednio 0 lub 1, drugim zmieniam prędkość obrotową gdzie zmiana częstotliwości sygnału powoduje zmianę szybkości obrotowej silnika. Sterownik SMC 63PR wykonuje za mnie załączanie odpowiednich cewek, ja mam mu tylko powiedzieć z jaką częstotliwością ma to robić. Aby otrzymać określoną częstotliwość to muszę użyć np układu NE555. Chodzi o coś takiego jak jest opisane TUTAJ.Tylko że nie wiem jak to przełożyć na program dla atmegi.