DECLARE SUB sinewave () DECLARE SUB squarewave () DECLARE SUB sawtoothwave () DIM SHARED waveType AS INTEGER DIM SHARED outputFile AS INTEGER DIM SHARED pi AS SINGLE pi = 3.141593 DIM SHARED A AS SINGLE DIM SHARED B AS SINGLE DIM SHARED D AS SINGLE DIM SHARED E AS SINGLE DIM SHARED F AS SINGLE DIM SHARED K AS SINGLE DIM SHARED X AS SINGLE DIM SHARED arccosX AS SINGLE DIM SHARED average AS SINGLE DIM SHARED totalRMS AS SINGLE DIM SHARED acRMS AS SINGLE DIM SHARED rectAve AS SINGLE DIM SHARED acRectAve AS SINGLE DIM SHARED acRctAveCF AS SINGLE SCREEN 12 CLS 10 PRINT "Enter the type of waveform you want to analyze." PRINT "1 for sine wave, 2 for square wave, " INPUT "3 for sawtooth/triangle wave, 4 to end program."; waveType IF waveType = 4 THEN SYSTEM PRINT " " CLOSE INPUT "Enter 1 if you want to save the output to a file called RMSOUT.TXT"; outputFile PRINT " " IF outputFile = 1 THEN OPEN "RMSout.txt" FOR APPEND AS #1 END IF IF waveType = 1 THEN CALL sinewave ELSEIF waveType = 2 THEN CALL squarewave ELSEIF waveType = 3 THEN CALL sawtoothwave ELSE GOTO 10 END IF PRINT "Average Voltage ="; average PRINT "Total RMS Voltage ="; totalRMS PRINT "AC RMS Voltage ="; acRMS PRINT "Rectified Average Voltage ="; rectAve PRINT "AC Rectified Average Voltage ="; acRectAve PRINT "AC Rectified Average times 1.110721 (AC voltmeter reading) ="; acRctAveCF PRINT " " PRINT " " IF outputFile = 1 THEN PRINT #1, "Average Voltage ="; average PRINT #1, "Total RMS Voltage ="; totalRMS PRINT #1, "AC RMS Voltage ="; acRMS PRINT #1, "Rectified Average Voltage ="; rectAve PRINT #1, "AC Rectified Average Voltage ="; acRectAve PRINT #1, "AC Rectified Average times 1.110721 (AC voltmeter reading) ="; acRctAveCF PRINT #1, " " PRINT #1, " " END IF CLOSE GOTO 10 SUB sawtoothwave 100 INPUT "enter A, (the upper peak voltage)"; A INPUT "enter B, (the lower peak voltage)"; B PRINT " " IF A < B THEN PRINT "A must be greater than or equal to B." GOTO 100 END IF average = (A + B) / 2 totalRMS = SQR((A ^ 2 + A * B + B ^ 2) / 3) E = A - average F = B - average acRMS = E / SQR(3) IF B > 0 OR B = 0 THEN rectAve = average ELSEIF A < 0 OR A = 0 THEN rectAve = -average ELSE rectAve = (A ^ 2 + B ^ 2) / (2 * A - 2 * B) END IF acRectAve = E / 2 acRctAveCF = acRectAve * 1.110721# PRINT "Sawtooth/Triangle Wave" PRINT "Upper Peak Voltage A ="; A PRINT "Lower Peak Voltage B ="; B IF outputFile = 1 THEN PRINT #1, "Sawtooth/Triangle Wave" PRINT #1, "Upper Peak Voltage A ="; A PRINT #1, "Lower Peak Voltage B ="; B END IF END SUB SUB sinewave 200 INPUT "enter A, (the upper peak voltage)"; A INPUT "enter B, (the lower peak voltage)"; B PRINT " " IF A < B THEN PRINT "A must be greater than or equal to B." GOTO 200 END IF average = (A + B) / 2 totalRMS = SQR((((A - B) ^ 2) / 8) + (((A + B) ^ 2) / 4)) E = A - average F = B - average acRMS = E / SQR(2) IF B > 0 OR B = 0 THEN rectAve = average ELSEIF A < 0 OR A = 0 THEN rectAve = -average ELSE X = (B + A) / (B - A) IF X = 1 THEN arccosX = 0 ELSE arccosX = ATN(-X / SQR(1 - X ^ 2)) + pi / 2 END IF K = (1 / pi) * arccosX rectAve = (((A - B) / pi) * SIN(K * pi)) + K * (A + B) - ((A + B) / 2) END IF acRectAve = (2 * E) / pi acRctAveCF = acRectAve * 1.110721# PRINT "Sine Wave" PRINT "Upper Peak Voltage A ="; A PRINT "Lower Peak Voltage B ="; B IF outputFile = 1 THEN PRINT #1, "Sine Wave" PRINT #1, "Upper Peak Voltage A ="; A PRINT #1, "Lower Peak Voltage B ="; B END IF END SUB SUB squarewave 300 INPUT "enter A, (the upper peak voltage)"; A INPUT "enter B, (the lower peak voltage)"; B PRINT " " IF A < B THEN PRINT "A must be greater than or equal to B." GOTO 300 END IF 310 PRINT "enter D, (the duty cycle of the square wave)" PRINT "The duty cycle D is the fraction of a period" PRINT "during which the wave remains at A." INPUT "Therefore D can be from 0 to 1"; D PRINT " " IF D > 1 GOTO 310 IF D < 0 GOTO 310 average = A * D + B - B * D totalRMS = SQR(((A ^ 2) * D) + (B ^ 2) - ((B ^ 2) * D)) E = A - average F = B - average acRMS = SQR(((E ^ 2) * D) + (F ^ 2) - ((F ^ 2) * D)) IF B > 0 OR B = 0 THEN rectAve = average ELSEIF A < 0 OR A = 0 THEN rectAve = -average ELSE rectAve = A * D - B + B * D END IF acRectAve = E * D - F + F * D acRctAveCF = acRectAve * 1.110721# PRINT "Square Wave" PRINT "Upper Peak Voltage A ="; A PRINT "Lower Peak Voltage B ="; B PRINT "Duty Cycle is"; D * 100; "%" IF outputFile = 1 THEN PRINT #1, "Square Wave" PRINT #1, "Upper Peak Voltage A ="; A PRINT #1, "Lower Peak Voltage B ="; B PRINT #1, "Duty Cycle is"; D * 100; "%" END IF END SUB