Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[mega8][bascom] Sterownik silnika elektrycznego do łodzi

tzok 25 Aug 2008 14:57 4385 8
  • #1
    tzok
    Moderator of Cars
    Potrzebuję zrobić sterownik do fabrycznego silnika elektrycznego do łodzi. Układ wykonawczy zasadniczo już mam zaprojektowany. Potrzebuję tylko oprogramować moduł sterujący - najchętniej w BASCOM AVR.

    Układ sterujący ma:
    - wejście analogowe 0-5V
    - wyjście PWM
    - wyjście binarne REV
    - wyjście binarne BYP

    Zadaniem programu ma być ustawianie wyjść w/g następujących zasad:
    [Ui]            [PWM]           [REV]   [BYP]
    0-0,25V         1               1       1
    0,26-2,25V      99%-60%         1       0
    2,26-2,75V      0               0       0
    2,76-4,75V      60%-99%         0       0
    4,76-5,00V      1               0       1


    Przedziały napięć nie są krytyczne.

    Wyjście PWM steruje silnikiem poprzez driver na tranzystorze MOSFET, wyjście REVerse załącza przekaźniki odwracające polaryzację zasilania silnika, wyjście BYPass załącza przekaźnik zwierający (obchodzący) tranzystor MOSFET.

    Za pomoc odwdzięczę się punktami. Największym problemem jest dla mnie obsługa przetwornika ADC i wprowadzanie zmian do wypełnienia sygnału PWM, bo sygnał analogowy zapewne będzie trochę szumiał i pływał...
  • #2
    tzok
    Moderator of Cars
    Napisałem takie coś, ale nawet się nie kompiluje, zwraca błędy w miejscach w których w/g mnie ich nie ma:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim Inval As Integer
    Dim Pwm As Integer
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm No_output = Disconnect
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    
    Rev Alias Portb.0
    Byp Alias Portb.1
    
    Start Adc
    
    Do
    
    Inval = Getadc(0)
    Waitms 250
    If Inval < 16 Then
       Set Rev
       Set Byp
       Pwm = 255
       Pwm0a = Pwm
    Elseif Inval < 112 Then
       Set Rev
       Reset Byp
       Pwm = 271 - Inval
       Pwm0a = Pwm
    Elseif Inval < 142 Then
       Reset Rev
       Set Byp
       Pwm = 0
       Pwm0a = Pwm
    Elseif Inval < 239 Then
       Reset Rev
       Reset Byp
       Pwm = Inval + 16
       Pwm0a = Pwm
    Else
       Reset Rev
       Set Byp
       Pwm = 255
       Pwm0a = Pwm
    End If
    
    Loop
    
    End


    Error : 46    Line :    26     Assignment error [PWMOA: 0   PWM: 3]   , in File : 
    Error : 46    Line :    31    Assignment error [PWMOA: 0   PWM: 3]   , in File : 
    Error : 7     Line :    31     IF THEN expected [31]   , in File : 
    Error: 123   Line:    31     END IF expected   , in File : 


    Zdaje się, że mega8 ma inne rejestry od PWM, tylko jakie? Wzorowałem się na programie dla tiny2313.
  • Helpful post
    #3
    snow
    Level 31  
    chyba miales na mysli PWM1A, PWM0A z tegoco mi wiadomo nie istnieje.
  • #4
    tzok
    Moderator of Cars
    Racja - mega8 nie ma pwm0a, a wyjście jest na portb.1 a nie na portb.2

    Program się skompilował, ale czy ktoś "na oko" może ocenić czy będzie działał poprawnie?
  • #5
    snow
    Level 31  
    Nie wiem czy będzie ale jeżeli to silnik prądu stałego to czemu nie zrobisz sterowania na Mostku H? Będziesz mógł sobie zmieniać kierunek obrotów i unikniesz wpływu np. wilgoci na przekaźnik (chociaż nie wiem co to za przekaźniki).
  • #6
    tzok
    Moderator of Cars
    Temu, że to silnik 12DCV o mocy ok 0,4kW a tranzystory na takie prądy są dużo droższe od przekaźników. Przekaźniki to zwykłe przekaźniki samochodowe 40A.

    Używam (tj. planuję użyć) tranzystorów IRFP044 - 2 szt połączone równolegle. W oryginalnym, elektronicznym sterowniku f-my MinnKota jest to zrobione tak samo. Na mostek H potrzebowałbym min 8 tranzystorów i miałbym 2x większe straty na nich, a tak mam 2 przekaźniki za 4zł/szt...

    W moim silniku był mechaniczny przełącznik i odczepy z uzwojenia (chyba), ale niestety przełącznik się stopił i dlatego chcę używać tylko najwyższego "biegu" i sterowania PWM.
  • #7
    Freddy
    Level 43  
    tzok :arrow: zobacz na Allegro np. lub do sklepów modelarskich i rozważ zakup regulatora do silnika taki około 50A kosztuje kilkadziesiąt zł. Czy warto to robić samemu ?
  • #8
    tzok
    Moderator of Cars
    Szukałem, ale nie znalazłem niczego, co zapewniało by regulację w pożądanym zakresie (60-100%) i przełącznie przód-tył, tak jak to chcę zrobić.

    [mega8][bascom] Sterownik silnika elektrycznego do łodzi

    Gotowe, przebieg PWM ma częstotliwość ok 20kHz (przy kwarcu 10MHz):
    $regfile = "m8def.dat"
    $crystal = 10000000
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
    Config Portb = Output
    
    Rev Alias Portb.0
    Byp Alias Portb.2
    
    Start Timer1
    Start Adc
    
    Dim Pwm As Integer
    Dim Inval As Integer
    
    Do
       Inval = Getadc(0) / 4
    Waitms 200
    
    If Inval < 16 Then
       Set Rev
       Set Byp
       Pwm = 255
       Pwm1a = Pwm
    Elseif Inval < 112 Then
       Set Rev
       Reset Byp
       Pwm = 271 - Inval
       Pwm1a = Pwm
    Elseif Inval < 142 Then
       Reset Rev
       Set Byp
       Pwm = 0
       Pwm1a = Pwm
    Elseif Inval < 239 Then
       Reset Rev
       Reset Byp
       Pwm = Inval + 16
       Pwm1a = Pwm
    Else
       Reset Rev
       Set Byp
       Pwm = 255
       Pwm1a = Pwm
    End If
    Loop
    End


    ##############################################

    Po testach zakres modulacji uległ zmianie na 40%-100%.
    Wprowadziłem małe zmiany i prosiłbym o ich optymalizację, bo w tej chwili używam typu Single i funkcji Round, a to nie jest dobry pomysł...

    Elseif Inval < 112 Then
       Set Rev
       Reset Byp
       'Pwm = 271 - Inval
       Pwma = 112 - Inval
       Pwma = Pwma / 96
       Pwma = Pwma * 153
       Pwma = Pwma + 102
       Pwm = Round(pwma)
       Pwm1a = Pwm
    
    (...)
    
    Elseif Inval < 239 Then
       Reset Rev
       Reset Byp
       'Pwm = Inval + 16
       Pwma = Inval - 142
       Pwma = Pwma / 97
       Pwma = Pwma * 153
       Pwma = Pwma + 102
       Pwm = Round(pwma)
       Pwm1a = Pwm


    Chodzi o zamianę wartości ADC z zakresu 16...112 na wartości wypełnienia PWM z zakresu 255...102 oraz ADC 142...239 na PWM 102...255. Można sobie też darować dzielenia ADC przez 4 i pozostać przy wartościach 0...1023.

    ****************************************************

    Dobra, nie było pytania - wystarczy zamienić kolejność mnożenia i dzielenia i już można pozostać przy Int'ach.
  • #9
    tzok
    Moderator of Cars
    Oto ostateczna wersja programu, przebieg PWM ma częstotliwość ok 30kHz, przy taktowaniu układu z wewnętrznego generatora częstotliwością 8MHz (domyślnie jest 1MHz, theba przestawić FB):
    ' ################################################
    ' #  Control programm for Trolling Motor driver  #
    ' #         (C)2008 by Tomasz Orczyk             #
    ' ################################################
    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'CKSEL3..0=0100 - 8MHz Internal (PWM ~30kHz)
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Portb = Output
    
    'Config Timer1 = FastPWM , Prescale = 1 , PWM = 8 , Compare A PWM = Clear Down , Compare B PWM = Disconnect
    Set Tccr1a.wgm10
    Set Tccr1b.wgm12
    Set Tccr1b.cs10
    
    Rev Alias Portb.0
    Pwmo Alias Portb.1
    Byp Alias Portb.2
    
    Start Adc
    
    Dim Pwm As Integer
    Dim Inval As Integer
    
    Do
       Inval = Getadc(0) / 4
    Waitms 250
    
    If Inval < 16 Then                                          ' ### Reverse w/bypass ###
       Reset Tccr1a.com1a1                                      ' Disconnect OC1A from PINB.1
       Set Pwmo                                                 ' Set full throttle, not needed if bypass relay installed
       Set Rev                                                  ' Reverse polarity relays on
       Set Byp                                                  ' Bypass relay on
    Elseif Inval < 112 Then                                     ' ### Reverse w/PWM ###
       Set Rev                                                  ' Reverse polarity relays on
       Reset Byp                                                ' Bypass relay off
       Pwm = 112 - Inval                                        ' ADCmax - ADCCurrent
       Pwm = Pwm * 51                                           ' *= (255 - PWMmin)
       Pwm = Pwm / 32                                           ' /= (ADCmax - ADCmin)
       Pwm = Pwm + 102                                          ' += PWMmin
       Pwm1a = Pwm                                              ' Set desired PWM duty cycle
       Set Tccr1a.com1a1                                        ' Connect OC1A to PINB.1
    Elseif Inval < 142 Then                                     ' ### Stop ###
       Reset Tccr1a.com1a1                                      ' Disconnect OC1A from PINB.1
       Reset Pwmo                                               ' Motor full stop
       Reset Rev                                                ' Reverse polarity relays off, only for power consumption reasons, motor is stopped anyways
       Reset Byp                                                ' Bypass relay off
    Elseif Inval < 239 Then                                     ' ### Forward w/PWM ###
       Reset Rev                                                ' Reverse polarity relays off
       Reset Byp                                                ' Bypass relay off
       Pwm = Inval - 142                                        ' ADCCurrent -  ADCmin
       Pwm = Pwm * 51                                           ' *= (255 - PWMmin)
       Pwm = Pwm / 32                                           ' /= (ADCmax - ADCmin)
       Pwm = Pwm + 102                                          ' += PWMmin
       Pwm1a = Pwm                                              ' Set desired PWM duty cycle
       Set Tccr1a.com1a1                                        ' Connect OC1A to PINB.1
    Else                                                        ' ### Forward w/bypass ###
       Reset Tccr1a.com1a1                                      ' Disconnect OC1A from PINB.1
       Set Pwmo                                                 ' Set full throttle, not needed if bypass relay installed
       Reset Rev                                                ' Reverse polarity relays off
       Set Byp                                                  ' Bypass relay on
    End If
    Loop
    End

    Sam program jest przetestowany i działa. Potencjometr podłączony do wejścia ADC musi być liniowy (A).