#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Jan 18 22:30:00 2019 @author: oyvind """ import math import matplotlib.pyplot as plt # Name for the saved graph filename = "4b" # RPM RPM = 40000 Hz = RPM / 60 # Tau in microseconds tau = 1/(2 * Hz) * 10**6 # Square wave freq in kHz sqWFreq = 5 # How many taus you want periods = 3 # The resolution of each tau resolution = 1000 # Forwardvoltage of diode diodeVoltage = 0.7 # Calculates the length of each squarewave in taus sqTime = (1/sqWFreq) * 10**3 sqTau = sqTime / tau # Creats the square wave # Default values are in the argument list def CreateSquareWave(amp=2.5, offset=2.5, symetry=0.5): squareWave = [] # Only generates as many datapoints we need while len(squareWave) < periods * resolution: # First generate the first half for r in range(int(resolution*sqTau * symetry)): squareWave.append(amp + offset) # Then the second for r in range(int(resolution*sqTau * (1 - symetry))): squareWave.append(offset - amp) squareWave = squareWave[:(resolution*periods)] return squareWave # Generate all the time-ticks def GenerateTime(): times = [] for t in range(periods * resolution): times.append(t/resolution) print(len(times)) return(times) def CapVoltage(wave, times): cP = wave[0] # Start voltage-supply v0 = 0 # Start voltage cT = 0 #Start time volt = [] for p in range(len(wave)): # If the voltage-supply changes, recalculate startvalues if wave[p] != cP: v0 = volt[-1] # New start voltage, uses the last voltage calculated if wave[p] == 0: v0 = diodeVoltage cP = wave[p] # Variable so the array is not accessed. cT = times[p] # Offset time for each period # Calculate the voltage over the CAPACITOR with the start values volt.append(cP + (v0 - cP) * math.exp(-(times[p] - cT))) return(volt) SquareWave = CreateSquareWave() time = GenerateTime() CapWave = CapVoltage(SquareWave, time) plt.figure(figsize=(15,5)) plt.plot(time, SquareWave, time, CapWave) plt.xlabel("Time [τ]") plt.ylabel("Voltage [V]") plt.legend(["Supply voltage", "Capacitor voltage"], loc="lower right") plt.savefig(filename + ".png", dpi = 300) plt.show()