Łap. Działa.
Oryginalnie był tam rezystor 0.1R Przypominam, że to jest opisane iż z takim rezystorem mozesz mierzyć do 0.8A
Znalazłem w szufladzie taki ceramiczny 0.1R i go dolutowałem więc teraz mam 0.05R
Nie ma sensu się bawić i wyliczać ten rejestr konfiguracyjny bo na końcu wszyscy i tak go dopieszczają czy faktycznie kalibrują.
Dodałem więc możliwość kalibracji bezpośrednio z terminala komputera. Wpisujesz sobie "CALIB=2050" + CRLF i patrzysz co tam wypluje.
Może uda mi się załączyć filmik. Chodzi o to że mój program pokazuje zarówno przeliczony amperaż jak i odczytany rejestr.
Na filmie widać że mierzy elegancko, ale.... do 1,6A i to chyba nie dziwi bo rezystor jest po prostu o połowę mniejszy.
Widać jak wszystkie bity rejestru są już ustawione na 1 więc nie ma cudów żeby z tym rezystorem pokazał więcej.
Zamontujesz sobie jaki będziesz chciał i skalibrujesz a potem to przeniesiesz do swojego programu i gotowe.
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 32
$framesize=128
$baud = 38400
Debug On
Config Submode = New
Const _valcheck = 1
Const Bus_voltage_reg = &H02 'read only
Const Current_reg = &H04 'read only
Config Serialin = Buffered , Size = 20
Dim Command As String * 20 , Znak As Byte
Dim Command_timeout As Byte , Got_str As Byte
Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
Compare2a = 155 '10ms @16MHz/1024
$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
Config Twi = 100000
I2cinit
Dim Helpstr As String * 20 , Helpw As Word
Dim Helpb As Byte , Testaddr As Byte , Slave As Byte
Dim Regword As Word
Dim Regbuff(2) As Byte At Regword Overlay
Dim Miliseconds As Word
Dim Mysingle As Single
Sub Read_reg(byval Addr As Byte)
Regbuff(1) = Addr
I2creceive Slave , Regbuff(1) , 1 , 2
Swap Regword
Debug "Reg &H" ; Hex(addr) ; " is " ; Bin(regword)
End Sub
Sub Write_reg(byval Addr As Byte)
Debug "Writing value " ; Bin(regword) ; " at addr &H" ; Hex(addr)
I2cstart
I2cwbyte Slave
I2cwbyte Addr
I2cwbyte Regbuff(2)
I2cwbyte Regbuff(1)
I2cstop
Waitms 100
End Sub
Debug "{013}{010}Debug started"
For Testaddr = 0 To 254 Step 2
I2cstart
I2cwbyte Testaddr
If Err = 0 And Testaddr <> 0 Then
I2cstop
Slave = Testaddr
Debug "Slave found at &H" ; Hex(slave)
Exit For
End If
I2cstop
Next
If Slave = 0 Then
Debug "End scan but no device found"
Do : Loop
End If
'read POR values
Read_reg &H00
Read_reg &H05
Read_reg &HFE
Read_reg &HFF
Debug "" 'space
Enable Interrupts
Do
If Tifr2.ocf2a = 1 Then '10ms
Tifr2.ocf2a = 1
If Ischarwaiting() > 0 Then 'jeśli w buforze czeka znak
Znak = Inkey()
Select Case Znak
Case 10 'zignoruj
Case 13 : Got_str = 1 'nadszedł Enter więc sprawdź komendę
Case Else
Command = Command + Chr(znak) 'jeśli to nie ENTER ani LF to dodaj do stringa
End Select
If Len(command) > 19 Then Got_str = 1 'zabezpieczenie by nie przepełnić zmiennej
If Got_str = 1 Then
Helpb = Instr(command , "CALIB=")
If Helpb > 0 Then
Helpb = Helpb + 6
Helpstr = Mid(command , Helpb)
Helpw = Val(helpstr)
If Err = 0 Then
Debug "New calib value " ; Helpw
Regword = Helpw
Write_reg 5
End If
End If
Command = ""
Got_str = 0
Else
Command_timeout = 30
End If
End If
If Command_timeout > 0 Then
Decr Command_timeout
If Command_timeout = 0 Then Command = ""
End If
If Miliseconds < 99 Then
Incr Miliseconds
Else
Miliseconds = 0
Read_reg Current_reg
Mysingle = Regword * 0.00005
Debug Fusing(mysingle , "#.##") ; " A"
End If
End If
Loop
End
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.