Re: Line intersection
Posted: Sun Nov 06, 2022 8:50 am
I don’t understand how this can be applied, but earlier I had the task of creating a tangent to a sinusoid to show a graph of the discharge of a capacitor in a power supply, and it was necessary to create 2 tangent lines, one straight line, and the other exponential. The straight line is the discharge with a current that does not change, and the exponential is the decrease in current through the active resistance of the resistor as the voltage decreases.
From the graph it will be understood what the voltage ripples will be.
screenshot, code AutoIt
Download: yandex upload.ee
From the graph it will be understood what the voltage ripples will be.
screenshot, code AutoIt
Download: yandex upload.ee
Code: Select all
; AZJIO
; https://www.purebasic.fr/english/viewtopic.php?p=590980#p590980
EnableExplicit
Declare Draw_Sinusoid(ColorGr)
Declare Draw_Graph2(ColorGr)
Declare Draw_Graph3(ColorGr)
Declare Draw_Graph31(ColorGr)
Declare Draw_Grid(ColorGr)
Declare Draw_Text(ColorGr)
Declare start()
Declare Reading()
Declare WinCallback(hWin, Msg, wParam, lParam)
;- перечисления
Enumeration
#txt0
#txt1
#txt2
#txt3
#txt4
#txt5
#txt6
#txt7
#txt8
#txt9
#txtUcr
#txtIn
#txtkp
#Um00
#Rn00
#Cf00
#f00
#k200
#k300
#R1rt00
#R2rt00
#ktr00
#Cnv
#btnStart
EndEnumeration
#Window = 0
Global.d Um, Rn, Cf, f, k2, k3, R1rt, R2rt, ktr, IN, Rtr, kp, Ucr, Ud1, Ud2, Ar
Global hGUI
Global kkk
;- GUI
hGUI = OpenWindow(#Window, 0, 0, 590, 530, "Разрядка конденсатора в выпрямительном блоке питания", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
StringGadget(#Um00, 5, 298, 45, 23, "12")
TextGadget(#txt0, 55, 300, 280, 19, "Пиковое напряжение без нагрузки, В.")
StringGadget(#Rn00, 5, 323, 45, 23, "9")
TextGadget(#txt1, 55, 325, 280, 19, "Сопротивление нагрузки, Ом.")
StringGadget(#Cf00, 5, 348, 45, 23, "1370")
TextGadget(#txt2, 55, 350, 280, 19, "Ёмкость конденсатора, мкФ.")
StringGadget(#f00, 5, 373, 45, 23, "100")
TextGadget(#txt3, 55, 375, 535, 19, "Частота пульсаций, Гц (100 Гц при входном переменном токе 50 Гц).")
StringGadget(#k200, 5, 398, 45, 23, "0")
TextGadget(#txt4, 55, 400, 535, 19, "Коэфф. для перемещения графика U2 вверх/вниз. (оранж, экспонента)")
StringGadget(#k300, 5, 423, 45, 23, "0")
TextGadget(#txt5, 55, 425, 535, 19, "Коэфф. для перемещения графика U3 вверх/вниз (зелён. стаб.ток).")
StringGadget(#R1rt00, 5, 448, 45, 23, "0.1")
TextGadget(#txt6, 55, 450, 510, 19, "Сопротивление первичной обмотки трансформатора, Ом.")
StringGadget(#R2rt00, 5, 473, 45, 23, "0.1")
TextGadget(#txt7, 55, 475, 510, 19, "Сопротивление вторичной обмотки трансформатора, Ом.")
StringGadget(#ktr00, 5, 498, 45, 23, "1")
TextGadget(#txt8, 55, 500, 430, 19, "Коэфф. Трансформации (повышающий, если kтр>1).")
Reading()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
TextGadget(#txt9, 335, 303, 1, 63 , "", $11)
CompilerEndIf
TextGadget(#txtUcr, 340, 300, 240, 17, "")
TextGadget(#txtIn, 340, 325, 240, 17, "")
TextGadget(#txtkp, 340, 350, 250, 17, "")
; Создание окна диаграммы
; $FF000000,$FFCEE3E0
CanvasGadget(#Cnv, 25, 10, 551, 275)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
ButtonGadget(#btnStart, 480, 494, 97, 33, "Пересчитать")
CompilerEndIf
;рисуем графики при старте
Start()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
SetWindowCallback(@WinCallback())
CompilerEndIf
Repeat
Select WaitWindowEvent()
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Case #PB_Event_Gadget
Select EventGadget()
Case #btnStart
Reading()
Start()
EndSelect
CompilerEndIf
Case #PB_Event_CloseWindow
CloseWindow(#Window)
End
EndSelect
ForEver
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Procedure WinCallback(hWin, Msg, wParam, lParam)
Protected nNotifyCode, nID
nID = wParam & $FFF ; LoWord
nNotifyCode = wParam >> 16 ; HiWord
Select Msg
Case #WM_COMMAND
Select nID
Case #Um00, #Rn00, #Cf00, #f00, #k200, #k300, #R1rt00, #R2rt00, #ktr00
Select nNotifyCode
Case #EN_CHANGE
Reading()
Start()
EndSelect
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
CompilerEndIf
Procedure Reading() ; читаем комбобоксы, высчитываем коэф.
Um = ValD(GetGadgetText(#Um00))
Rn = ValD(GetGadgetText(#Rn00))
Cf = ValD(GetGadgetText(#Cf00))
f = ValD(GetGadgetText(#f00))
k2 = ValD(GetGadgetText(#k200))
k3 = ValD(GetGadgetText(#k300))
R1rt = ValD(GetGadgetText(#R1rt00))
R2rt = ValD(GetGadgetText(#R2rt00))
ktr = ValD(GetGadgetText(#ktr00))
IN = Um / Rn
Rtr = R1rt * ktr + R2rt
kp = 1 - Rtr / (Rtr + Rn)
Ucr = Um / Sqr(2)
Ud1 = (Um + k3) * kp
Ud2 = Ud1 - (Um - 50000*Um / (f * Rn * Cf) + k3) * kp
Ar = ASin(Ud2 / (Ud1 * 0.025 * #PI))
kkk = 230 / Um
EndProcedure
Procedure Start()
If StartDrawing(CanvasOutput(#Cnv))
Box(0, 0, 501, 251, $E0E3CE) ; закрашываем фон
;----- шкала по оси XY
; _GraphGDIPlus_Set_RangeX(Graph,0,20,10,1,0)
; _GraphGDIPlus_Set_RangeY(Graph,0,Um*1.1,10,1,1)
;----------------------------------------------------------макс, деление, ,округление
;----- сетка по оси XY
; _GraphGDIPlus_Set_GridX(Graph,1,$FF6993BE)
; _GraphGDIPlus_Set_GridY(Graph,Um*1.1/10,$FF6993BE)
; _GraphGDIPlus_Set_PenSize(Graph,1)
; цвет графиков указывается в RGB, т.е. $FF339966=$FF+RGB
Draw_Grid($BE9369) ; сетка
Draw_Graph3($669933) ; U3 разряд стабильным током
Draw_Graph31($800080) ; U31 касательнаяв точке пересечения
Draw_Graph2($0066FF) ; U2 экспонента разряда на постоянное сопротивление
Draw_Sinusoid($FF0000) ; U1 синусоида после диодов
; установка параметров после пересчёта
SetGadgetText(#txtUcr, "Uср.кв =" + StrF(Round(Ucr, 2)) + " B (без конденсатора)")
SetGadgetText(#txtIn, "Начальный ток нагрузки =" + StrF(Round(IN, 2)) + " А")
SetGadgetText(#txtkp, "Коэфф. падения напряжения =" + StrF(Round(kp, 2)) + " %")
Box(0, 251, 501, 35, $FFFFFF) ; закрашываем фон
Box(501, 0, 50, 270, $FFFFFF) ; закрашываем фон
Draw_Text(0)
StopDrawing()
EndIf
EndProcedure
Procedure Draw_Text(ColorGr)
Protected i, z
DrawingMode(#PB_2DDrawing_Transparent)
For i = 1 To 20
z = i * 25
DrawText(z - 5, 253, Str(i), ColorGr)
Next
For i = 1 To 9
z = -i * 25
DrawText(506, z + 243, StrF(i / kkk * 25.1, 1), ColorGr)
Next
EndProcedure
; сетка
Procedure Draw_Grid(ColorGr)
Protected i, z
FrontColor(ColorGr)
For i = 0 To 20
z = i * 25
LineXY(z, 0 , z , 250)
Next
For i = 0 To 10
z = i * 25
LineXY(0, z , 500 , z)
Next
EndProcedure
; Синусоида, синяя
Procedure Draw_Sinusoid(ColorGr)
Protected i, U1, Xold, Yold
FrontColor(ColorGr)
For i = 0 To 500; Step 10
U1 = -Um * Abs(Cos( i * #PI / 500)) * kp * kkk + 250
If i = 0
Yold = U1
EndIf
LineXY(Xold , Yold , i , U1)
Xold = i
Yold = U1
Next
EndProcedure
; экспонента, оранжевая
Procedure Draw_Graph2(ColorGr)
Protected i, U2, tt.d, Xold, Yold
FrontColor(ColorGr)
For i = 0 To 500 Step 25
tt = 2 * i / f
U2 = -(Um * Exp( -1000 * tt / (Rn * Cf)) * kp + k2) * kkk + 250
If i = 0
Yold = U2
EndIf
LineXY(Xold , Yold , i , U2)
Xold = i
Yold = U2
; Plot(i, U2)
Next
EndProcedure
; стабильный ток, зелёная
Procedure Draw_Graph3(ColorGr)
Protected i, U3, tt.d, Xold, Yold
FrontColor(ColorGr)
For i = 0 To 500 Step 500
tt = 2 * i / f
U3 = -((Um - 1000 * Um * tt / (Rn * Cf) + k3) * kp) * kkk + 250
If i = 0
Yold = U3
EndIf
LineXY(Xold , Yold , i , U3)
Xold = i
Yold = U3
Next
EndProcedure
; касательная, фиолетовая
Procedure Draw_Graph31(ColorGr)
Protected i, U31, tt.d, Xold, Yold
FrontColor(ColorGr)
For i = 0 To 500 Step 500
tt = 2 * i / f
U31 = -((Cos(Ar) - Sin(Ar) * (tt * #PI / 10 - Ar)) * Um * kp) * kkk + 250
If i = 0
Yold = U31
EndIf
LineXY(Xold , Yold , i , U31)
Xold = i
Yold = U31
Next
EndProcedure