Potrzebuję pomocy w opanowaniu pomiaru: napięcia (3x) i prądu (rezystor 0.1om)
Ciągle wychodzą mi głupoty i nie wiem gdzie popełniam błąd. Chciałbym mierzyć napięcie 0-5.5V i prąd 0-2.5A
Na początek schemat (ze schematu wykroiłem co zbędne) i kod (tu tylko to co potrzeba do pomiarów) aby było wiadomo o czym gadam
- $regfile = "m328pdef.dat"
- $crystal = 11059200
- $hwstack = 64
- $swstack = 64
- $framesize = 128
- Const Korekta_1 = 0.001
- Const Korekta_2 = 0.0054
- Const Korekta_3 = 0.0054
- Const Korekta_4 = 0.0054
- Const Ilosc_probek = 100
- Config Submode = New
- 'konfiguracja timera
- Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
- Enable Compare0a : On Compare0a Timer0_isr Nosave : Compare0a = 107 '10ms @11MHz
- 'konfiguracja przetwornika ADC
- Config Adc = Single , Prescaler = Auto , Reference = Aref
- Start Adc
- 'wyjscia
- Config Portd.2 = Output : Portd.2 = 1
- Config Portd.6 = Output : Portd.6 = 1
- 'zmienne programu
- Dim 10ms As Byte , 100ms As Byte
- Dim Pomiar_wejscia As Word , Odczyt As Single , Krok As Byte
- Dim A As String * 6 , B As String * 6
- Dim C As String * 6 , D As String * 6
- 'konfiguracja i2c
- $lib "i2c_twi.lbx"
- Config Scl = Portc.5
- Config Sda = Portc.4
- Config Twi = 400000
- I2cinit
- 'konfiguracja LCD
- $lib "bl_Lcd_i2c.lib"
- Config Lcd = 16x2
- Const Pcf_d4 = 4
- Const Pcf_d5 = 5
- Const Pcf_d6 = 6
- Const Pcf_d7 = 7
- Const Pcf_rs = 0
- Const Pcf_rw = 1
- Const Pcf_e1 = 2
- Dim _lcd_e As Byte
- Dim Backlight As Byte
- Backlight_on Alias &H08
- Backlight_off Alias &H00
- Backlight = Backlight_on
- _lcd_e = 128
- Const Pcf8574_lcd = &H4E
- Waitms 100 : Cls
- Locate 1 , 1 : Lcd "bla, bla, bla..."
- Wait 2 : Cls
- Sub Pomiary(byval Channel As Byte)
- Local Pomiar As Word : Pomiar = 0
- For Krok = 1 To Ilosc_probek
- Pomiar = Pomiar + Getadc(channel)
- Next
- Pomiar_wejscia = Pomiar / Ilosc_probek
- Select Case Channel
- 'prad
- Case 0
- Odczyt = Pomiar_wejscia * Korekta_1
- A = Fusing(odczyt , "#.###")
- 'napiecie
- Case 1
- Odczyt = Pomiar_wejscia * Korekta_2
- B = Fusing(odczyt , "#.###")
- 'napiecie
- Case 2
- Odczyt = Pomiar_wejscia * Korekta_3
- C = Fusing(odczyt , "#.###")
- 'napiecie
- Case 3
- Odczyt = Pomiar_wejscia * Korekta_4
- D = Fusing(odczyt , "#.###")
- End Select
- End Sub
- 'wlaczenie globalnych przerwan
- Enable Interrupts
- Do
- If 10ms = 1 Then
- 10ms = 0
- Incr 100ms
- End If
- If 100ms = 10 Then
- 100ms = 0
- 'zrob pomiary
- Call Pomiary(0)
- Call Pomiary(1)
- Call Pomiary(2)
- Call Pomiary(3)
- 'wyswietl pomiary na LCD
- Locate 1 , 1 : Lcd "A:" ; A
- Locate 1 , 10 : Lcd "B:" ; B
- Locate 2 , 1 : Lcd "C:" ; C
- Locate 2 , 10 : Lcd "D:" ; D
- End If
- Loop
- End
- 'przerwanie od TIMERA
- Timer0_isr:
- $asm
- !PUSH R16
- !PUSH R24
- !PUSH R26
- !PUSH R27
- !in R24, sreg
- !PUSH R24
- $end Asm
- 10ms = 1
- $asm
- !POP R24
- !out sreg, r24
- !POP R27
- !POP R26
- !POP R24
- !POP R16
- $end Asm
- Return
No i teraz moje obliczenia:
- do obliczeń biorę 1V
- napięcie odniesienia to 2.5V (MCP1525)
- dzielnik 1:2.2
- mierzone 1V da mi 0.45V na pin ADC
0.45V / 2.5V = 0,18 * 1024 = 184,32
- teraz w programie chcę z tego zrobić 1V, więc
1V / 184,32 = 0,005425347
Wartość 0,0054 wpisuję jako "korekta" w kodzie, ale niestety nie chce to działać jak należy. Jeżeli "korektę" ustawię na oko i widzę poprawną wartość na LCD, później zmieni się mierzone napięcie to już na LCD nie ma poprawnej wartości tylko zaniżona/zawyżona wartość.
To tyle odnośnie pomiaru napięcia, a został mi jeszcze pomiar prądu
Proszę o pomoc bo nic z tego wszystkiego nie rozumiem.
