Witam
Mam problem nie wiem jak zastosowac kosc 4051 , aby sterowac za pomoca potencjometru PWM . Chodzi mi o to aby miec plynna regulacje predkosci silniczka badz wychylenia servomechanizmu.
Moje zalozenia to tak mam uP np potencjometr+4051+ Attiny2313 + mostek H + silnik
ma to byc potem uzyte do robota RC ,chodzi mi o sam program bo podlaczenie to wiem w zalaczniku przesylam kawalek schematu z aparatury 7 kanałowej . Z podlaczeniem nie bedzie problemy , ale program to juz ciezej , z PWM albo sterowaniem servem to nie bedzie takiego problemu , ale jak polaczyc 4051 z uP aby to dzialalo plynnie i bezproblemu ;/
Pozdrawiam Bartek
BASCOM-> 4051->PWM
-
ZbeeGin
Myślę, że ani 4051 ani Tiny2313 nie będzie w stanie poprawnie podołać temu zadaniu. Sprzętowy PWM i komparator wykorzystanoby do pomiaru napięć analogowych? Nie wydaje Mi się to pomysłem akceptowalnym tutaj. Najlepiej byłoby zmienić mikroporocesor na taki, gdzie będzie sprzętowy przetwornik ADC, a takim w tym wypadku może być ATTiny26.
Jak podłączyć 4051. Linie A, B, C do portów wyjściowych którymi będziesz sobie ustawiał kanał 0-7, a wyjście X do wejścia ADC0 na przykład. Trzeba pamiętać, że najpierw wybieramy kanał, odczekujemy parę milisekund (1 - 2ms) i mierzymy napięcie przez ADC.
Napisz jeszcze ile tych wyjściowych kanałów PWM musisz mieć. Też siedem?
Jak podłączyć 4051. Linie A, B, C do portów wyjściowych którymi będziesz sobie ustawiał kanał 0-7, a wyjście X do wejścia ADC0 na przykład. Trzeba pamiętać, że najpierw wybieramy kanał, odczekujemy parę milisekund (1 - 2ms) i mierzymy napięcie przez ADC.
Napisz jeszcze ile tych wyjściowych kanałów PWM musisz mieć. Też siedem?
Maja byc dwa silniki , a reszte kanalow moze byc np sterowanie serva .Moze byc jakis uP np ATmega8 + na I2C polaczone jakies procki , nie koniecznie musi to byc jeden ATtiny2313 na całość .Myslalem ze sie to zmiesci ale jednak nie 
To Tak:
-uP Atmega8 wystarczy , potem sie latwiej rozbuduje.
To tak , bada 2 PWM + kilka servomechanizmow , wystarczy jeden program do PWM i do servomechanizmow ,a reszte to analogicznie zrobie
Pozdrawiam Bartek
Wybacz za to
juz poprawione mysle ze lepiej 
To Tak:
-uP Atmega8 wystarczy , potem sie latwiej rozbuduje.
To tak , bada 2 PWM + kilka servomechanizmow , wystarczy jeden program do PWM i do servomechanizmow ,a reszte to analogicznie zrobie
Pozdrawiam Bartek
Wybacz za to
Ostatnio zmieniony 07 sie 2007, 21:54 przez Thor, łącznie zmieniany 1 raz.
Witam
wiem juz jak mniejwiecej odczytac to napiecie i wybrac kanal , ale nadal nie wiem jak to przelozyc na PWM . Mysle ze ten kod jest dobry jak nie to czy mozesz go poprawic albo powiedziec co robie zle ??
Pozdrawiam Bartek
wiem juz jak mniejwiecej odczytac to napiecie i wybrac kanal , ale nadal nie wiem jak to przelozyc na PWM . Mysle ze ten kod jest dobry jak nie to czy mozesz go poprawic albo powiedziec co robie zle ??
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 8000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Pinc.5 = Output
Config Pinc.4 = Output
Config Pinc.3 = Output
P1 Alias Portc.5 'Wyjscie C
P2 Alias Portc.4 'wyjcie B
P3 Alias Portc.3 'wyjscie A
Dim Wart As Word
Start Adc
Do
P1 = 0
P2 = 0
P3 = 0
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 1
P1 = 0
P2 = 0
P3 = 1
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 2
P1 = 0
P2 = 1
P3 = 0
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 3
P1 = 0
P2 = 1
P3 = 1
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 4
P1 = 1
P2 = 0
P3 = 0
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 5
P1 = 1
P2 = 0
P3 = 1
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 6
P1 = 1
P2 = 1
P3 = 0
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 7
P1 = 1
P2 = 1
P3 = 1
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 8
Loop
EndPozdrawiam Bartek
-
ZbeeGin
Nie lubię pisać żadnych gotowców. Wolę jak osoba sama będzie rozwiązywać zadania. To tyle tytułem wstępu.
Do sterowania PWM możesz wykorzystać liczniki układu ATMega. Najpierw trzeba je skonfigurować. Przykład dla TIMER1, gdyż posiada on dwa "niezależne" kanały PWM:
Mając już skonfigurowany licznik i ustawione końcóweki OC1A i OC1B (robi się to automatycznie) jako wyjścia. Możesz przystąpić do wpisywania wartości do zmiennych COMPARE1A i COMPARE1B które odczytasz z potencjometrów, które przełożą się na procent wypełnienia przebiegu prostokątnego na tych końcówkach.
Jak zauważyłeś wybrałem tryb pracy PWM 10 bitowy. Dlaczego? Rezultat który otrzymasz z przetwornika A/C także jest 10 bitowy! Zatem nic nie trzeba będzie przeliczać. Możesz to jednak zrobić! Po co? Drobne muśnięcie potencjometru będzie od razu widoczne w przebiegu wyjściowym. Zatem może stanowić to pewien problem, ale wystarczy wartość 10 bitową z przetwornika przesunąć w prawo o dwa za pomocą instrukcji SHIFT i otrzymujesz wtedy wartość 8 bitową, pozbawioną dwóch najmniej znaczących bitów. Oczywiście licznik także powinien pracować w trybie 8-bit, zatem parametr PWM=10 trzeba zamienić na PWM = 8.
Ważny jest parametr PRESCALE. Warto poświecić trochę czasu na przestudiowanie dokumentacji jaką częstotliwość przebiegu będzie miał sygnał przy danej wartości rezonatora kwarcowego i wartości jakiej nadasz temu parametrowi. Dla sporej grupy serwomechanizmów trzeba tak ją dobrać by była w okolicy 100Hz lub 50Hz (w zależności od serva).
Dwa kanały to za mało.
Sprzętowe PWM nie są tak bogate jak można było sądzić. Jest i na to sposób. Sam BASCOM posiada programowy PWM specjalnie napisany do sterowania serwomechanizmami. Opis tego znajdziesz w pomocy wybierając temat CONFIG SERVOS.
Do sterowania PWM możesz wykorzystać liczniki układu ATMega. Najpierw trzeba je skonfigurować. Przykład dla TIMER1, gdyż posiada on dwa "niezależne" kanały PWM:
Kod: Zaznacz cały
CONFIG TIMER1=PWM, PRESCALE = 256, PWM = 10, COMPARE A PWM = CLEAR UP, COMPARE B PWM = CLEAR UPJak zauważyłeś wybrałem tryb pracy PWM 10 bitowy. Dlaczego? Rezultat który otrzymasz z przetwornika A/C także jest 10 bitowy! Zatem nic nie trzeba będzie przeliczać. Możesz to jednak zrobić! Po co? Drobne muśnięcie potencjometru będzie od razu widoczne w przebiegu wyjściowym. Zatem może stanowić to pewien problem, ale wystarczy wartość 10 bitową z przetwornika przesunąć w prawo o dwa za pomocą instrukcji SHIFT i otrzymujesz wtedy wartość 8 bitową, pozbawioną dwóch najmniej znaczących bitów. Oczywiście licznik także powinien pracować w trybie 8-bit, zatem parametr PWM=10 trzeba zamienić na PWM = 8.
Ważny jest parametr PRESCALE. Warto poświecić trochę czasu na przestudiowanie dokumentacji jaką częstotliwość przebiegu będzie miał sygnał przy danej wartości rezonatora kwarcowego i wartości jakiej nadasz temu parametrowi. Dla sporej grupy serwomechanizmów trzeba tak ją dobrać by była w okolicy 100Hz lub 50Hz (w zależności od serva).
Dwa kanały to za mało.
Sprzętowe PWM nie są tak bogate jak można było sądzić. Jest i na to sposób. Sam BASCOM posiada programowy PWM specjalnie napisany do sterowania serwomechanizmami. Opis tego znajdziesz w pomocy wybierając temat CONFIG SERVOS.
Wielkie dzieki . z tym PWm to wiem jak to zrobic ale nie wiedzialemjak to sie ma bo skoki napiecia beda od 0 do 5 V wiec nie wiedzialem czy to wypelni caly pwm czy cos sie stanie . jak sterowac silnikiem poprzez przyciskow i PWm to mam w ksiazce opisane ale nie wiedzialem jak to wyjdzie z potencjometrem teraz juz wiem ze nic nie musze pisac tylko przepisac wartosc z potencjometru do PWM dzieki .
Ja nie chcialem gotowca tylko wskazowki jak to napisac
wole sam sie potrudzic teraz juz wiem jak to zrobic dzieki za wskazówki
Pozdrawiam Bartek
czy on bedzie dzialal poprawnie czy cos jest zle napisane??
Ja nie chcialem gotowca tylko wskazowki jak to napisac
Pozdrawiam Bartek
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 8000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Pinc.5 = Output
Config Pinc.4 = Output
Config Pinc.3 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
P1 Alias Portc.5 'Wyjscie C
P2 Alias Portc.4 'wyjcie B
P3 Alias Portc.3 'wyjscie A
Declare Sub Lewa
Declare Sub Prawa
Dim Wart As Byte
Dim I As Byte
Dim A As Byte
A = 0
I = 0
Pwm1a = A
Pwm1b = I
Start Adc
Do
P1 = 0
P2 = 0
P3 = 0
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 1
Call Lewa
P1 = 0
P2 = 0
P3 = 1
Waitms 2
Wart = Getadc(0)
Writeeeprom Wart , 2
Call Prawa
Loop
End
Lewa:
Readeeprom Wart , 1
Wart = I
I = Pwm1b
Return
Prawa:
Readeeprom Wart , 2
Wart = A
A = Pwm1a
Return