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

Pomiar trzech faz na ADC atmega8

copernick 12 Sie 2009 12:03 2510 12
  • #1 6884180
    copernick
    Poziom 10  
    Witam
    Mam problemy z fazami w domu. chciałbym mieć stały pomiar wyświetlany na LCD i w przypadku przekroczenia napięcia 240V zapalaną diodę led podpiętą do nóżek procka(docelowo będą to przekaźniki) i sygnał dźwiękowy na syrence.
    Wykonałem w bascomie miernik faz na atmega8, tryb zaokrąglania wyniku zaczerpnąłem z jednego kodu z forum.
    Płytka z układem zasilana jest z prostownika stabilizowanego 5V.
    Napięcie (0-5V) jest podawane na nogi procesora z prostowniczków podpiętych do kolejnych faz. Założenie jest takie by 1V podawany na nogę ADC odpowiadał 100V sieci.
    Mam kilka problemów i na pewno ktoś z większym doświadczeniem je rozwiąże.
    1)Mam problem z wystrojeniem stałej przekształcającej wartość z ADC na wyświetlane volty. Nie wiem jaką stałą dobrać.
    2)Mam problem z wyświetlaniem zmiennej "wys0","wys1","wys3". W zależności od napięcia ma się pojawiać napięcie albo napis "ALARM".
    3)Jeżeli ktoś ma pomysł jak usprawnić program czekam na podpowiedzi.
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Config Pinb.4 = Output                                      ' ,UO
    Config Pind.7 = Output                                      ' ,S2
    Config Pinb.2 = Output                                      ' ,TO
    Config Pinb.1 = Output                                      ' ,IO
    Config Pinc.5 = Output                                      'syr
    Portb.2 = 0
    Portb.1 = 0
    Portd.7 = 0
    Portc.5 = 0
    
    Dim Wart_ac1 As Word , Wart_ac0 As Word , Wart_ac3 As Word
    Dim Usre3 As Single , Usre0 As Single , Usre1 As Single
    Dim Sumwy3 As Integer , Sumwy0 As Integer , Sumwy1 As Integer
    Dim Wyn0 As Byte
    Dim Zaok0 As Single , Zaok1 As Single , Zaok3 As Single
    Dim Zao0 As Integer , Zao1 As Integer , Zao3 As Integer
    Dim Wys0 As String * 5 , Wys1 As String * 5 , Wys3 As String * 5
    Const Alarm = "ALARM"
    
    
    Start Adc
    Start:
    Wyn0 = 0
    Sumwy3 = 0
    Sumwy0 = 0
    Sumwy1 = 0
    Usre0 = 0
    Usre1 = 0
    Usre3 = 0
    Zaok0 = 0
    Zaok1 = 0
    Zaok3 = 0
    Zao0 = 0
    Zao1 = 0
    Zao3 = 0
    
    Do
    
    'POMIAR FAZ
    For Wyn0 = 1 To 100
    Sumwy0 = Sumwy0 + Getadc(0)
    Sumwy1 = Sumwy1 + Getadc(1)
    Sumwy3 = Sumwy3 + Getadc(3)
    Next T
    
    'FAZA1 Uśrednianie
    Sumwy0 = Sumwy0 \ 100
    Sumwy0 = Getadc(0)
    Usre0 = Sumwy0 \ 204.4
    'FAZA1 zaokrąglanie
    Zaok0 = Frac(usre0)
    Usre0 = Int(usre0)
    Zaok0 = Zaok0 * 100
    Zao0 = Int(zaok0) * 10
    'FAZA2 Uśrednianie
    Sumwy1 = Sumwy1 \ 100
    Sumwy1 = Getadc(1)
    Usre1 = Sumwy1 \ 204.4
    'FAZA2 zaokrąglanie
    Zaok1 = Frac(usre1)
    Usre1 = Int(usre1)
    Zaok1 = Zaok1 * 100
    Zao1 = Int(zaok1) * 10
    'FAZA3 Uśrednianie
    Sumwy3 = Sumwy3 \ 100
    Sumwy3 = Getadc(3)
    Usre3 = Sumwy3 \ 204.4
    'FAZA3 zaokrąglanie
    Zaok3 = Frac(usre3)
    Usre3 = Int(usre3)
    Zaok3 = Zaok3 * 100
    Zao3 = Int(zaok3) * 10
    
    
    '-----------CZUJNIK---------------
    Select Case Zao0
       Case Is > 240
       Portb.2 = 1                                              'dioda  1
       Portc.5 = 1                                              'syrena
       Wys0 = Alarm
       Case Is < 240
       Portb.2 = 0
       Wys0 = Zao0
       End Select
    Select Case Zao1
       Case Is > 240
       Portd.7 = 1                                              'dioda 2
       Portc.5 = 1                                              'syrena
       Wys1 = Alarm
       Case Is < 240
       Portd.7 = 0
       Wys1 = Zao1
    End Select
    Select Case Zao3
       Case Is > 240
       Portb.1 = 1                                              'dioda 3
       Portc.5 = 1                                              'syrena
       Wys3 = Alarm
       Case Is < 240
       Portb.1 = 0
       Wys3 = Zao3
    End Select
    
    'WYŚWIETLANIE
    Cls
    Lcd "R=" ; Wys0 ; "V " ; "S=" ; Wys1 ; "V"
    Lowerline
    Lcd "T=" ; Wys3 ; "V"
    
    
    Waitms 100
    Loop
    End                                                         ''koniec programu
    
  • #2 6886299
    cyberdar
    Poziom 31  
    Witam

    Co do wyświetlania to proponuję zrobić warunekw rodzaju: jeżeli napięcie jest większe od zadanej wartości to wys0 = "ALARM" w przeciwnym wypadku wys0 = pomiar.
    Zmienna pomiar byłaby obliczana i konwertowana do odpowiedniego formatu.

    --
    pozdrawiam
  • #3 6887663
    copernick
    Poziom 10  
    Witam.
    Dziękuję za odpowiedź.
    Taka zasada jest wpisana do programu.
    Niestety nie mogę dobrać odpowiedniej zmiennej, która zmieści tekst "ALARM" i wynik obliczenia. String nic nie daje.
  • #4 6888107
    Klima
    Poziom 31  
    Zrób sprawdzanie warunku
    np. jeśli wys1 = 999 (albo inna liczba, która normalnie nie wystąpi) to wyświetl "alarm", a jeśli nie, to wyświetl wys1.
  • #5 6888556
    copernick
    Poziom 10  
    Jeszcze raz powtórzę:warunek jest w sekcji CASE, niestety nie mogę dopasować zmiennej która pomieści wartość tekstową i liczbową...
  • #6 6888690
    Klima
    Poziom 31  
    A chcesz, żeby ci pomóc, czy będziesz się rzucał?
    Można zrobić to co chcesz na milion sposobów, ale proponuję najprostszy.
    Dlatego jeszcze raz powtórzę: sprawdzaj w momencie wyświetlania.
    Masz warunek sprawdzany w złym miejscu.
  • #7 6901473
    copernick
    Poziom 10  
    Ok.Dzięki za zainteresowanie. Przepraszam jeżeli moja odpowiedź brzmiała agresywnie, nie było to moim zamiarem.
    Rozumiem, że mam pierw wyświetlać wynik, sprawdzać go i znów wyświetlać?
    Wciąż czekam na podpowiedź jaką zmienną pomieścić tekst i volty.
    pozdrawiam!
  • Pomocny post
    #8 6901628
    Klima
    Poziom 31  
    copernick napisał:
    Wciąż czekam na podpowiedź jaką zmienną pomieścić tekst i volty.

    Rany boskie, co ty kombinujesz? Nie ma żadnego PROSTEGO rozwiązania, które by takie rzeczy robiło. Tekst to tekst, a wartości liczbowe, to wartości liczbowe.
    Strasznie upierdliwy jesteś, ale spróbuj coś takiego:
    
    Cls
    Lcd "R=" ; 
    If Zao1 >240
       Lcd "ALARM"
    else
       Lcd Zao1; "V"
    endif
    

    I podobnie dla pozostałych faz.
  • #9 6905824
    copernick
    Poziom 10  
    Dzięki za podpowiedź.
    Jestem upierdliwy.
    Chciałem wyświetlać pod jedną zmienną dwie wartości co ułatwiłoby formułowanie warunków i nie musiałbym do każdego podpinać obsługi wyświetlania wszystkich wartości.
    Szkoda, że w bascomie nie można tworzyć klas.
  • #10 6906774
    Klima
    Poziom 31  
    copernick napisał:
    Szkoda, że w bascomie nie można tworzyć klas.

    No takiego argumentu to krytycy Bascoma jeszcze nie wymyślili...

    Jesteś pewien, że nie chodzi ci o unie?
  • #11 6949797
    copernick
    Poziom 10  
    Witam ponownie.
    Proszę o podpowiedź jak opanować szalejący pomiar na ADC. Nie mogę zastosować większego kondensatora ponieważ nie mogę pozwolić sobie na opóźnienie pomiaru.
    Na chwilę obecną odzwierciedlenie wartości napięcia na fazie uzyskuję przez pomnożenie uśrednionego odczytu z ADC...
  • #12 6950121
    Konto nie istnieje
    Poziom 1  
  • #13 6952943
    Klima
    Poziom 31  
    Bez schematu nie pojedziemy. Jak pobierasz napięcie do mierzenia, co znaczy "szaleje"? Wartości zmieniają się chaotycznie od 0 do 1023 czy jak?
REKLAMA