logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega16][Bascom] Rozwiązanie z PWM+ADC do sterowania.

Kuczus 30 Gru 2009 16:23 2700 5
REKLAMA
  • #1 7458984
    Kuczus
    Poziom 19  
    Witam. Mój problem przedstawiam następująco:
    Wykonuje platformę mobilną z wykorzystaniem jako napęd silniczków DC z przekładniami.
    Do regulacji szybkości wykorzystuje 2 sygnały PWM idące na wejścia Enable mostka H - L298. By zadanie które sobie postawiłem było cięższe, do określenia regulacji PWM używam wyników pobranych z 2 wejść ADC Atmegi, które uzyskuje dzięki popularnym manipulatorom:
    [ATmega16][Bascom] Rozwiązanie z PWM+ADC do sterowania.
    Początki oprogramowania przeszły spokojnie. Początkowo chodziło o to, by platforma reagowała na jedną Oś manipulatora czyli jazda do przodu i do tyłu z prędkością zależną od położenia gałki (przód-tył). Udało mi się tego dokonać dzięki zastosowaniu kilkuu przekształceń wartości ADC.

    $regfile "m16def.dat"
    $crystal = 16000000
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Dim X As Word
    Dim Xx As Long
    Dim Y As Word
    Dim Yy As Long
    
    Config Pina.0 = Input
    Config Pina.1 = Input
    
    
    Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
    
    Pwm1a = 1023
    Pwm1b = 1023
    Config Pind.5 = Output
    Config Pind.4 = Output
    Portd.4 = 0
    Portd.5 = 0
    
    
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Portc = &B11111010
    
    E0 Alias Portc.0             ' porty służą do sterowania pinami input mostka H
    E1 Alias Portc.1
    E2 Alias Portc.2
    E3 Alias Portc.3
    Cursor Off
    
    
    Do
    
    X = Getadc(0)
    X = Getadc(0)
    Y = Getadc(1)
    Y = Getadc(1)
    
    If X < 530 And X > 500 Then
       Pwm1a = 1023
       Pwm1b = 1023
    End If
    
    If X > 530 Then
       E0 = 1
       E1 = 0
       E2 = 1
       E3 = 0
       Xx = 1023 - X
       Xx = Xx * 2
       Pwm1a = Xx
       Pwm1b = Xx
    End If
    
    If X < 500 Then
       E0 = 0
       E1 = 1
       E2 = 0
       E3 = 1
       Xx = X - 512
       Xx = Xx * 2
       Pwm1a = Xx
       Pwm1b = Xx
    End If
    
    Cls
    Lcd "X:" ; X ; " Y:" ; Y
    Lowerline
    Lcd "P1:" ; Pwm1a ; " P2:" ; Pwm1b
    Waitms 100
    Loop
    End
    


    Problem pojawił się, gdy chciałem obsłużyć drugą oś manipulatora. Nie mam totalnie pojęcia w jaki sposób połączyć te dwie wartości by można było umożliwić skręcanie platformy.
    Wartości ADC zależnie od położenia manipulatora (oś pionowa w programie jest oznaczona jako ADC0 - zmienna X)
    [ATmega16][Bascom] Rozwiązanie z PWM+ADC do sterowania.

    Dlatego zwracam się do was, w jaki sposób można rozwiązać ten problem by za pomocą tego manipulatora dobierać odpowiednie wartości PWM?
    Dodam jeszcze, że gdy wartość pwm równa jest 1023, to silniki są w stanie spoczynku. Wartość 0 odpowiada ich maksymalnej prędkości.
    Ciężko mi było opisać to wszystko w odpowiedni sposób, dlatego będę starał się często tu pojawiać i uaktualniać temat.
  • REKLAMA
  • #2 7461744
    marco47
    Poziom 41  
    Wykozystaj pozostałe PWM w procku OCRO i OCR2

    Dlaczego tak napisałeś?

     X = Getadc(0)
    X = Getadc(0)
    Y = Getadc(1)
    Y = Getadc(1)

    Więcej opisów kodu (skąd ,po co,dlaczego) to ułatwi innym i Tobie rozgryzanie programu.
  • REKLAMA
  • #3 7462567
    Kuczus
    Poziom 19  
    Nie widzę potrzeby wykorzystywania innych PWM niż te z Timera1. Problem tkwi w kwestii programu i jego algorytmu, niżeli w sprzęcie.
    Instrukcje te są podwojone, bo wyczytałem gdzieś, że takie rozwiązanie jest obarczone mniejszym błędem. W samym poleceniu chodzi o to, by do zmiennych X,Y załadować wartości ADC z przetworników.
    Postaram się uzupełnić komentarzami program.
  • REKLAMA
  • #4 7462609
    kamyczek
    Poziom 38  
    Metod rozwiązania jest wiele ale wystarczy zastosować odpowiedni algorytm lub korzystać z tabeli przeliczników by dowolnie kształtować charakterystykę wyjść PWM
  • REKLAMA
  • #5 7463539
    Kuczus
    Poziom 19  
    No właśnie mam problem z wymyśleniem odpowiedniego algorytmu.
    Wykonanie takiej tabeli będzie bardzo pracochłonne i będzie dużo zajmowała miejsca w pamięci uC i może go mocno mulić... takie przynajmniej mam wyobrażenie o tablicowaniu danych w bascomie.
  • #6 7463712
    kamyczek
    Poziom 38  
    To przecież zwykła matematyka nie umiesz wyznaczyć punktu środkowego dla obu ADC i odjąć mniejsza wartość od większej ? czyli albo wartość adc od wartości środka albo wartość środka od wartości adc a wynik pomnożyć przez dwa żeby zachować taką samą rozdzielczość adc i pwm ?
REKLAMA